تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

در اكشن اسكریپت نقطه برای نشان دادن خواص یا متدهای وابسته به یك شیی یا سمبل مووی كلیپ استفاده میشود . همچنین برای تعیین target path در یك مووی كلیپ یا متغیر ، فانكشن یا آبجكت ها استفاده میشود . عبارت نقطه دار با نام شیئ یا كلیپ موردنظر آغاز شده ، نقطه میگذاریم و در آخر با یك المان كه توسط شما تعیین میشود پایان می یابد .
بطور مثال خاصیت
x
كه برای مووی ها میباشد مكان افقی مووی را روی صحنه مشخص میكند . مثلا عبارت
ball.x
نشان دهنده مشخصه
x
از كلیپ
ball
میباشد .
مثال دیگر :
submit
یك متغیر در كلیپ
Form
است كه در كلیپ
shop
قرار دارد . عبارت
shop.form.submit=True
مقدار متغیر
submit
از
form
را
True
میكند .
مثال دیگر : عبارت
ball.play();
را داریم .
play
یك متد از كلیپ
ball
است كه باعت اجرای این كلیپ میشود .
نقطه همچنین با شیی مجازی _root و _parent كار میكند . شیی مستعار _root به Timeline اصلی بر میگردد. شما از این شیی میتوانید برای خلق Target path های مطلق استفاده كنید . بطور مثال عبارت زیر باعث فراخوانی فانكشن Buildgameboard در مووی كلیپ functions در Timeline اصلی میشود .
_root.functions.buildgameboard();
از شیی مجازی _parent برای مراجعه یه یك كلیپ كه كلیپ كنونی در آن قرار دارد استفاده میشود . همچنین میتوانید برای ساخت target path وابسته استفاده اش كنید .
آكولاد:
عبارات اكشن اسكریپت توسط آكولاد ها گروه میشوند .به مثال زیر توجه كنید .
on(release) {
myDate = new Date();
currentMonth = myDate.getMonth();
{
سمی كالن :
عبارات زبان اكشن اسكریپت با سمی كالن پایان میابد . مثال:
column = passedDate.getDay();
row = 0;
اگر شما سمی كالن پایانی را فراموش كنید هیچ مشكلی برای اسكریپت شمل پیش نمی آید اما بهتر است برای شیوایی اسكریپت خود آنرا همیشه بگذارید .
پرانتز ها :
وقتی شما یك فانكشن تعریف میكنید ، باید پارامتر های فرستاده شده در فانكشن را در پرانتز قرار دهید . مثال :
function myFunction (name, age, reader){
...
}
همچنین برای آسانتر شدن عبارات ریاضی در اسكریپت نیز از پرانتز ها بصورت ذیل استفاده میشود .
(در زبان های برنامه نویسی اعمال ریاضی بترتیب خاصی در پراسیجر تفسیر میشوند . وقتی یك عبارت ریاضی داخل پرانتز باشد محاسبه آن قبل از بقیه عبارت صورت میگیرد . به مثال زیر دقت كنید :
Total =2+3*5 ;
Total =(2+3)*5 ;
در عبارت اولی ابتدا عمل ضرب و سپس جمع صورت میگیرد و پاسخ عدد 17 است
در عبارت دوم بعلت وجود پرانتز ابتدا پرانتز محاسه و سپس ضرب صورت میگیرد و جواب 25 است .
از پرانتز همچنین برای مقدار دهی عبارات استفاده میشود . قالب كلی آن مانند مثال زیر است :
(new Color(this)).setRGB(0xffffff);
اگر بخواهید از پرانتز استفاده نكنید باید از 2 عبارت استفاده كنید :
myColor = new Color(this);
myColor.setRGB(0xffffff);
حساسیت به حروف كوچك و بزرگ :
فقط كلمات كلیدی اكشن اسكریپت به حروف حساسند و در بقیه موارد میتوانید از هر دو حالت استفاده كنید .
شما نمیتوانید از اسم های رزرو شده اكشن اسكریپت بجای نام اشیای خود استفاده كنید .
اگر كلمات كلیدی اسكریپت را از لحاظ كوچكی و بزرگی اشتباه بنویسید اسكریپت حاصل دچار مشكل خواهد شد . keyword ها در حالت پیش فرض در پنجره اكشن به رنگ آبی هستند
كامنت نویسی :
كامنت ها كد نیستند بلكه جملاتی اند كه طراح در میان كد ها برای توضیح درباره كد مینویسد تا در رجوع بعدی خود كاری كه انجام داده را بیاد آورد . در اكشن اسكریپت از دو بك اسلش پشت سر هم ، برای نوشتن كامنت استفاده میشود . خطی كه با // شروع شود جزو كد ها به حساب نمی آید و در كامپایل فایل فلش نادیده گرفته میشود . در نوشتن كامنت محدودیت لغتی وجود ندارد .
كلمات كلیدی :
اكشن اسكریپت تعدادی از لغات خاص را برای استفاده های خاص زبان اسكریپت برای خود رزرو كرده كه شما نمیتوانید این لغات را بعنوان اسم متغیر ، فانكشن یا اسامی لیبل استفاده كنید .
این كلمات عبارتند از :
| break |
else |
instanceof |
typeof |
| case |
for |
new |
var |
| continue |
function |
return |
void |
| default |
if |
switch |
while |
| delete |
in |
this |
with |
ثابت ها :
ثابت ها چیز هایی مانند متغیر ها هستند با این تفاوت كه مقدارشان هرگز تغییر نمیكند . بطور مثال ثابت های BACKSPACE, ENTER, QUOTE, RETURN از ثابت های شیی key هستند كه به كلید های كیبورد مربوطند . مثلا برای اینكه بفهمید كاربر كدام كلید را فشار داده از كد زیر استفاده میكنیم .
if(Key.getCode() == Key.ENTER) {
alert = "Are you ready to play?";
controlMC.gotoAndStop(5);
}
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

کاردینال بیگلز، اریک بی ایمان را بیش از چهار ساعت روی صندلی راحتی نشاند تا سرانجام این اعترافات را از او گرفت ...
اولین نگاه من به پیتون یک تصادف بود، و علاقه چندانی به چیزی که در آن زمان دیدم پیدا نکردم. اوایل سال 1997 بود و کتاب "برنامه نویسی پیتون" نوشته مارک لوتز از انتشارات O'reilly به تازگی بیرون آمده بود. کتابهای O'reilly به ندرت به در خانه من می رسند، که در آن مورد هم توسط یک فرد ذینفع درون سازمان طی یک فرآیند تصادفی که من تصمیم گرفته ام دیگر سعی در فهمیدن آن نکنم، از بین تازه های چاپ برای من فرستاده می شوند.
یکی از این کتابها "برنامه نویسی پیتون" بود. از آنجا که من زبان های رایانه ای را جمع آوری می کنم، این موضوع برایم جالب بود. من بیش از دوجین زبان همه منظوره بلدم، برای تفریح مفسر و مترجم های زیادی نوشته ام و شخصا تعدادی زبان های یک منظوره و فرمهای نشانه گذاری ( Markup ) مختلف طراحی کرده ام. تازه ترین پروژه ای که من در زمان نوشتن این مقاله به پایان رسانده ام، یک زبان یک منظوره به نام SNG برای کار کردن روی تصاویر PNG یا Portable Network Graphics است. خوانندگان علاقمند می توانند صفحات خانگی SNG را در آدرس http://www.catb.org/~esr/sng مشاهده کنند. من همچنین چند نسخه پیاده سازی شده از چند زبان همه منظوره عجیب را در صفحه Retrocomputing Museum خود به آدرس http://www.catb.org/retro قرار داده ام.
من قبلا آنقدر درباره پیتون شنیده بودم که بدانم از آن چیزهایی است که امروزه به آنها زبانهای اسکریپت می گویند، یک زبان تفسیری با مدیریت داخلی (built-in ) حافظه و تسهیلاتی خوب برای فراخوانی و همکاری با دیگر برنامه ها. بنابراین در هنگام شروع پیتون یک سوال بالاتر از همه مسائل برای من مطرح بود: این زبان چه چیزی دارد که پرل ندارد؟
البته، پرل گوریل ۸۰۰ کیلویی زبان های اسکریپت امروزی است. این زبان تا حدی به لطف کتابخانه های یونیکس و اعلان های جامع خود و تا حدی به دلیل مجموعه بزرگ ماژول های به وجود آمده توسط جامعه برنامه نویسان پرل ، به نسبت زیادی جایگزین زبانهای اسکریپت انتخابی مدیران و ناظران سیستم ها شده است. این زبان، زبان CGI پنهان در پشت حدود ۸۵% محتوای "زنده" بر روی شبکه به شمار می رود. سازنده آن، Larry Wall ، به درستی یکی از مهمترین رهبران جامعه متن باز به شمار می رود و اغلب پس از Linus Torvalds و Richard Stallaman در مکان سوم جایگاه خدایان قرار می گیرد.
در آن زمان من پرل را برای تعدادی از پروژه های کوچک استفاده کرده بودم. من این زبان را بسیار قدرتمند یافتم گرچه به نظر من می رسید سینتکس و بعضی جنبه های دیگر این زبان می توانند تا حدی برای شخصی که به آن عادت نداشته باشد، خطرناک باشند. به نظر من می رسید که پیتون به عنوان یک زبان اسکریپت باید گام مهم دیگری بردارد، بنابراین درحال خواندن به دنبال چیزی می گشتم که به نظر برسد آن را از زبان پرل مجزا می کند.
من به سرعت مطالب غیرعادی اصلی ای که ممکن است در پیتون به نظر هر کسی برسد را مرور کردم: این واقعیت که فضای خالی (indentation ) در سینتکس این زبان بامعنی است؛ این زبان هیچ سنخیتی با ساختار آکولادی C و پرل ندارد، در عوض تغییرات در توگذاری (indentation ) محدودیت گروه های عبارات را از بین می برند؛ و مثل اکثر هکرها پس از فهمیدن این مطلب با بی علاقگی عقب کشیدم.
آنقدر از عمر من گذشته است که برای چند ماهی در دهه ۷۰ با FORTRAN برنامه نویسی کرده باشم. اکثر هکرهای این دوره چنین نیستند ولی به نظر می رسد فرهنگ ما به گونه ای ، خاطره ای دقیق وسنتی از اینکه آن زبان های قدیمی با محدوده ثابت چقدر عذاب آور بودند حفظ کرده باشد. "فرمت آزاد"، که درآن زمان برای توصیف حالت جدیدتر سینتکس token-oriented زبان های C و پاسکال استفاده می شد، تقریبا فراموش شده است؛ چندین دهه است تمامی زبان ها اینگونه طراحی شده اند، یا تقریبا تمام زبان ها. بسیار سخت است کسی را، پس از دیدن این ویژگی پیتون، به خاطر عکس العمل اولیه ای مانند اینکه به صورت غیرمنتظره در انبوهی از بی ادبی! دایناسور قدم گذاشته است سرزنش کرد.
این احساس من در آن زمان بود. من بدون علاقه چندانی از کنار بقیه توضیحات این زبان گذاشتم. من دلیل چندان دیگری برای توصیه پیتون پیدا نکردم به جز اینکه احتمالا سینتکس آن تا حدی شسته و رفته تر از پرل بود و امکانات موجود برای اجرای CGI های ابتدایی مانند دکمه ها و منوها بسیار خوب به نظر می رسید.
من کتاب را با این یادآوری ذهنی که باید زمانی یک پروژه کوچک با محوریت GUI انجام دهم، تا مطمئن شوم که واقعا این زبان را می فهمم، در قفسه گذاشتم. ولی باور نداشتم چیزی که دیده ام هرگز بتواند به طور موثر با پرل رقابت کند.
اتفاقات زیادی باعث شدند این یادآوری ذهنی ماه ها در فهرست اولویت های من در مکان آخر قرار بگیرد. بقیه سال ۱۹۹۷ برای من پر از اتفاقات بود، در کنار بقیه اتفاقات، این سالی بود که من نسخه اصلی "کلیسای اعظم و بازار" را نوشته و منتشر کردم. در عین حال من فرصت یافتم تا چندین برنامه پرل بنویسم، از جمله دو برنامه با حجم و پیچیدگی قابل توجه. یکی از آنها، keeper ، برنامه دستیاری است که همچنان برای بایگانی پرونده های ارسالی وارده در شرکت نرم افزاری Metalab به کار می رود. این برنامه تولیدکننده صفحات وبی است که شما در http://metalab.unc.edu/pub/Linux/!INDEX.html مشاهده می کنید. برنامه دیگر، anthologize ، با هدف تولید خودکار PostScript برای ششمین ویرایش لینوکس از آرشیو "چگونه ها" ی پروژه مستندسازی لینوکس استفاده شد. هر دوی این برنامه ها در Metalab موجود هستند.
نوشتن هر دوی این پروژه ها مرا بیشتر و بیشتر از پرل ناراضی کرد. به نظر می رسید پروژه های با اندازه بزرگتر یک نارضایتی ساده از پرل را تبدیل به مشکلات جدی و مداوم می نمایند. سینتکسی که در صد خط ابتدایی بسیار راضی کننده به نظر می رسید، با گذشت زمان تبدیل به توده ای از خارهای غیرقابل نفوذ می شد. "بیش از یک راه برای انجام کار" که حال و هوا و تاثیرگذاری خاصی به آن می بخشید، نگهداری یک استیل خاص در یک محدوده کد وسیعتر را به مقدار قابل توجهی مشکل می ساخت. و بسیاری قابلیت هایی که بعدا به منظور جوابگویی به نیاز برای کنترل پیچیدگی در برنامه های بزرگتر (اشیاء، lexical scoping ،use strict و ...) به پرل اضافه شده بودند حالتی شکننده و نه چندان دلچسب داشتند.
تمامی این مشکلات دست به دست یکدیگر داده بودند تا خواندن و درک حجم زیادی از کدهای پرل به عنوان یک کلیت را تنها پس از چند روز به صورت غیرمنطقی ای مشکل کنند. علاوه بر این، من دریافتم که روز به روز زمان بیشتری را به جای ور رفتن با برنامه خود، صرف ور رفتن با قابلیت های این زبان می کنم و بدتر از همه اینکه کد من زشت شده بود ، ... این مساله واقعی بود. برنامه های زشت مثل پل هایِ معلقِ زشت هستند، واژگون شدن آنها بسیار محتمل تر از انواع زیبای آنها است، زیرا نحوه ادراک انسان ها (به خصوص مهندس- انسانها) از زیبایی رابطه بسیار نزدیکی با قابلیت ما برای پردازش و فهم پیچیدگی دارد. زبانی که کار نوشتن کد باوقار و باشکوه را سخت کند در حقیقت نوشتن کد خوب را مشکل کرده است.
با وجود یک دو جین زبان که به آنها تسلط داشتم، من می توانستم به تمامی علامات مشهود یک طراحی زبان که به منتهای قابلیت خود رسیده است و چیز بیشتری برای عرضه ندارد پی ببرم. من فکر کردم "باید راه بهتری وجود داشته باشد" و شروع به گشتن به دنبال یک زبان اسکریپت باشکوه تر کردم.
موردی که من حتی به آن فکر نکردم بازگشت به C به عنوان یک زبان پیش فرض بود. دوره ای که انجام مدیریت حافظه در یک برنامه به صورت شخصی معنا داشت، به جز در بعضی زمینه ها مانند طراحی هسته سیستم عامل (kernel hacking ) ، برنامه نویسی علمی و گرافیک ۳ بعدی که در آنها شما نیاز دارید بیشترین سرعت و کنترل کامل بر روی استفاده از حافظه به منظور حداکثر استفاده از سخت افزار را داشته باشید، مدتهاست که گذشته است.
در اکثر موارد دیگر پذیرفتن بار اضافه debug کردن [ چندین اصطلاح را در این قسمت حذف کردم م.] و دیگر مشکلات از این دست در ماشین های امروزی دیوانگی است. بسیار عاقلانه تر است که چندین چرخه و چندین کیلوبایت حافظه برای نیازهای مدیر حافظه یک زبان اسکریپت فدا کنیم و در وقت گرانبهای انسان صرفه جویی کنیم. در حقیقت استفاده از این راهبرد (استراتژی) دقیقا همان چیزی است که باعث رشد انفجاری پرل از اوایل دهه ۹۰ شده است.
مدتی با Tcl ور رفتم تا متوجه شدم که در مقیاس های بالا حتی از پرل هم ضعیفتر عمل می کند. به عنوان یک برنامه نویس قدیمی LISP ، همچنین نگاهی به اشکال ( dialects ) مختلف رایج LISP و Scheme انداختم ولی همانگونه که از نظر تاریخی در مورد LISP معمول است، طراحی های هوشمندانه متعدد آن به دلیل عدم وجود یا ناقص بودن مستندات، دسترسی ناقص به امکانات POSIX/UNIX و یک جامعه کوچک و در عین حال بسیار پراکنده کاربران، بی استفاده شده بودند. پرطرفدار بودن پرل به هیچ عنوان یک تصادف نیست؛ اکثر رقبای آن یا برای پروژه های بزرگ بدتر از پرل هستند یا اصلا و ابدا به آن مفیدی که ساختار نظری برتر آنها انتظارش را ایجاد می کند نیستند.
نگاه دومی من به پیتون تقریبا همانقدر تصادفی بود که نگاه اول. در اکتبر ۱۹۹۷، یک سری سوالات در فهرست نامه های الکترونیک افراد استفاده کننده از fetchmail این موضوع را کاملا مشخص کرد که افراد برای ایجاد فایل های تنظیمات برنامه fetchmail دچار مشکلات فزاینده ای می شوند. این فایل دارای ساختاری ساده و کلاس به سبک فرمت آزاد یونیکس است ولی می تواند هنگامی که کاربر دارای چندین حساب از نوع POP3 و IMAP باشد، به شدت پیچیده شود. به عنوان نمونه، برای دیدن یک مثال ساده شده از برنامه من به لیست ۱ نگاه کنید.
Listing 1. fetchmail Configuration File
set postmaster ``esr ''
set daemon 300
poll imap.ccil.org with proto IMAP and options no dns
aka snark.thyrsus.com locke.ccil.org ccil.org
user esr there is esr here options fetchall dropstatus warnings 3600
poll imap.netaxs.com with proto IMAP
user "esr" there is esr here options dropstatus warnings 3600
skip imap.21cn.com with proto IMAP
user esr here is tranxww there options fetchall
skip pop.tems.com with proto POP3 :
user esr here is ed there options fetchall
skip mail.frequentis.com with proto IMAP :
user esr here is imaptest there with options fetchall
من تصمیم گرفتم برای حل مشکل از یک ویرایشگر تنظیمات با حالتی کاربر پسند ( End-User-Friendly ) به نام fetchmailconf استفاده کنم. هدف از طراحی fetchmail مشخص بود؛ پنهان کردن کامل سینتکس فایل کنترل در پشت ظاهر شیک و صحیح از نظر ارگونومی یک رابط گرافیکی کاربر ( GUI ) با کلیدهای انتخاب، منوهای کشویی و فرم های مختلف.
فکر پیاده کردن این برنامه با پرل چندان مرا ذوق زده نکرد. من کدهای GUI را در پرل دیده بودم که ترکیبی ناهمگون بود از پرل و Tcl که حتی از کد پرل خود برنامه هم زشت تر بود. در این لحظه بود که قولی را که ۶ ماه قبل داده بودم یادم آمد. این می توانست فرصتی برای کسب یک تجربه عملی با پیتون باشد.
البته این موضوع مجددا من را با بامعنی بودن فضای خالی در پیتون روبرو کرد. البته این بار تخته گاز پیش رفتم و مقداری کد برای انبوهی از عناصر GUI نوشتم. جدا ّ حیرت آور بود که تنها پس از ۲۰ دقیقه، استفاده پیتون از فضای سفید دیگر امر عجیبی به نظر نمی آمد. من همانقدر از فرورفتگی متن در پیتون استفاده می کردم که امکان داشت در C از آن استفاده کنم و این روش جواب هم می داد.
این اولین حیرت من بود. حیرت دومی ، حدود ۲ ساعت بعد (با احتساب زمان های توقفی که برای نگاه کردن به قابلیت های پیتون در کتاب Learning Python صرف شد) ، وقتی پیش آمد که متوجه شدم با همان سرعتی مشغول نوشتن برنامه های به دردبخور هستم که می توانم تایپ کنم. وقتی متوجه این موضوع شدم تقریبا مبهوت شدم. یکی از معیارهای مهم عملکرد در برنامه نویسی تعداد دفعاتی است که شما چیزی می نویسید که واقعا با درک شما از مساله همخوانی ندارد و ناچارید پس از فهمیدن این موضوع که چیزی که تایپ کرده اید، به زبان آنچه را شما فکر می کنید نمی گوید به عقب برگردید. یکی از معیارهای مهم طراحی مناسب زبان اینست که درصد چنین اشتباهاتی با تجربه پیدا کردن شخص در آن زبان با چه سرعتی کاهش می یابند.
هنگامی که شما با بیشترین سرعتی که قادرید تایپ کنید، برنامه به دردبخور می نویسید و اشتباهات شما در انتخاب مسیر تقریبا صفر است، این به آن معناست که شما در آن زبان به استادی رسیده اید. ولی این بی معنی بود، چون به زحمت یک روز از این موضوع گذشته بود و من هنوز مجبور بودم امکانات مربوط به زبان و کتابخانه ها را از روی کتاب نگاه کنم.
این اولین چیزی بود که به من فهماند من در پیتون با یک طراحی عالی سروکار دارم. اکثر زبانها آنقدر دارای تداخل و ضعف در طراحی خود هستند که شما قبل از اینکه ضریب اشتباهاتتان در آنها حتی نزدیک به صفر شود بسیاری از امکانات آنها را فرا گرفته اید. پیتون تنها زبان همه منظوره ای بود که من تا آن روز استفاده کرده بودم و این فرآیند را معکوس می کرد.
البته یادگیری مجموعه امکانات آن نیز چندان وقت گیر نبود. من یک برنامه fetchmailconf کارآ و قابل استفاده، به همراه GUI ، را در ۶ روز کاری نوشتم که از این ۶ روز احتمالا ۲ روز آن تماما صرف یادگیری خود پیتون شد. این موضوع نشان دهنده یک خاصیت مفید دیگر این زبان است: این زبان حالت اختصاری دارد، شما می توانید تمامی مجموعه امکانات آن (حداقل یک ایده فهرست وار از کتابخانه های آن) را در ذهن نگه دارید. C زبانی است که به اختصار معروف است. پرل در این زمینه شهرت خوبی ندارد. یکی از چیزهایی که عبارت معروف "بیش از یک راه برای انجام آن وجود دارد!" قربانی می کند توانایی مختصر بودن پرل است.
ولی هنوز رویایی ترین کشف من باقی مانده بود. طراحی من یک مشکل داشت: من قادر بودم به راحتی فایل های تنظیم را با استفاده از عملهای GUI کاربر تولید کنم ولی ویرایش آنها مشکل بزرگتری بود. یا بهتر است بگویم خواندن آنها به یک شکل قابل ویرایش کار مشکلی بود.
Parser به کار رفته برای سینتکس فایل تنظیماتfetchmail بسیار کاربر بود. این برنامه در حقیقت با استفاده از YACC و Lex ، دو ابزار کلاسیک یونیکس برای تولید کد parsing زبان در C ، نوشته شده بود. تصور من این بود که برای اینکه قادر به ویرایش فایلهای تنظیمات در fetchmail باشم ناچار به تکرار همان parser وقت گیر در پیتون خواهم بود. من برای انجام این کار بسیار دودل بودم، تا حدودی به دلیل حجم کار و تا حدودی هم به دلیل اینکه نمیدانستم از کجا باید مطمئن باشم که دو parser در دو زبان مختلف مثل یکدیگر عمل خواهند کرد. کار فوق العاده زیاد همخوان نگاه داشتن دو parse آخرین چیزی بود که ممکن بود من با تحول زبانها به آن نیاز داشته باشم.
این مشکل برای مدتی مرا متوقف کرد. بعد از این فکری به ذهنم رسید: من به fetchmailconf اجازه می دادم از parser خود استفاده کند. من یک گزینه –configdump به fetchmail اضافه کردم و نتیجه را در یک خروجی استاندارد با فرمت یک initializer پیتون تخلیه کردم. برای فایل بالایی، نتیجه تقریبا شبیه به لیست ۲ بود (برای صرفه جویی در فضا بعضی داده های غیرمرتبط با مثال حذف شده اند).
Listing 2. fetchmailrc
fetchmailrc = {
'poll_interval':300 ,
"logfile":None ,
"postmaster":"esr ",
'bouncemail':TRUE ,
"properties":None ,
'invisible':FALSE ,
'syslog':FALSE ,
# List of server entries begins here
'servers’:[
# Entry for site `imap.ccil.org' begins :
{
"pollname":"imap.ccil.org ",
'active':TRUE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':FALSE ,
"aka":["snark.thyrsus.com", "locke.ccil.org", "ccil.org " ]
'users’: [
{
"remote":"esr ",
"password":"Malvern ",
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `imap.netaxs.com' begins :
{
"pollname":"imap.netaxs.com ",
'active':TRUE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
"aka":None ,
'users ': [
{
"remote":"esr ",
"password":"d0wnthere ",
'localnames':["esr " ] ,
'fetchall':FALSE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `imap.21cn.com' begins :
{
"pollname":"imap.21cn.com ",
'active':FALSE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
"aka":None ,
'users ': [
{
"remote":"tranxww ",
"password":None ,
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `pop.tems.com' begins :
{
"pollname":"pop.tems.com ",
'active':FALSE ,
"via":None ,
"protocol":"POP3 ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
'uidl':FALSE ,
"aka":None ,
'users ': [
{
"remote":"ed ",
"password":None ,
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `mail.frequentis.com' begins :
{
"pollname":"mail.frequentis.com ",
'active':FALSE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
"aka":None ,
'users ': ]
{
"remote":"imaptest ",
"password":None ,
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, ]
}
]
}
پیتون سپس قادربود خروجی fetchmail--configdump را ارزیابی کند و سپس تنظیمات را به صورت مقدار متغیر "fetchmail " ارائه کند.
حتی این هم آخرین حرکت رقص من نبود. چیزی که من می خواستم صرفا این نبود که fetchmail تنظیمات فعلی خود را داشته باشد بلکه می خواستم آن را تبدیل به یک ساختار درختی از اشیا زنده (live objects ) کنم. احتمالا در این درخت سه نوع شی وجود داشت: تنظیمات ( که شیء واقع در بالاترین مرتبه و نشان دهنده کل تنظیمات بود)؛ سایت (نشان دهنده یکی از سایتهایی که باید به رای گذاشته می شد.) و کاربر ( نشان دهنده داده های کاربران که به سایت متصل می شود). فایل های مثال پنج شیء از نوع سایت که به هر کدام یک شیء از نوع کاربر متصل شده است را نشان می دهد.
تا اینجا من سه شیء کلاس را طراحی کرده و نوشته بودم (این همان چیزی بود که چهار روز از وقت من را گرفت که اکثر آن هم صرف چیدن درست و مناسب کنترلهای صفحه شد). هر یک از این کلاسها یک متد داشت که باعث می شد برای ویرایش داده های آن instance خاص یک صفحه GUI باز شود. تنها مشکل باقیمانده من یافتن روشی برای تبدیل اشیاء مرده این برنامه initializer پیتون به اشیاء زنده بود.
چیزی که به نظر من رسید نوشتن کدی بود که به وضوح راجع به ساختار هر سه کلاس بداند و از این دانش برای پلکیدن در initializer و ایجاد اشیایی که پاسخگوی نیازها باشند استفاده کند ولی این ایده را رد کردم زیرا اعضای این کلاس جدید احتمالا با اضافه شدن امکانات جدید به تنظیمات زیاد می شدند. اگر من کد ایجاد اشیا را با این روش مشهود می نوشتم، احتمال زیادی وجود داشت که کد حالت شکننده پیدا کند و با تغییر تعریفهای کلاس یا ساختار initializer از حالت به روز خارج شود.
چیزی که من واقعا به دنبالش بودم کدی بود که شکل و اعضای initializer را تجزیه و تحلیل کند، از تعریفهای کلاس برای پرس و جو درباره اعضای آن کلاس استفاده کند و سپس خودش را با این دو مجموعه هماهنگ کند.
به این گونه چیزها در اصطلاح هک کردن metaclass گفته می شود و در حالت عمومی چیزی به ترسناکی جادوی سیاه به شمار می روند. اکثر زبانهای برنامه نویسی شیءگرا مطلقا از این قابلیت پشتیبانی نمی کنند و در آنهایی که این کار را می کنند (که پرل هم یکی از آنهاست)، این موضوع امری پیچیده و ظریف و شکننده است. تا همان زمان من از ضریب بسیار پایین اشکال سازی پیتون متعجب شده بودم ولی این یک آزمایش واقعی بود. برای اینکه این زبان را مجبور به انجام چنین کاری کنم چقدر باید با آن کشتی می گرفتم؟ با استفاده از تجربیات قبلی می دانستم که ، حتی با این فرض که من ببرم، این می تواند تجربه دردناکی باشد ولی روی کتاب شیرجه رفتم و شروع به مطالعه امکانات metaclass پیتون کردم. تابع به دست آمده در لیست ۳ نشان داده شده است و کدی که فراخوانی می کند در لیست ۴ آمده است.
Listing 3. Metaclass Function
def copy_instance(toclass, fromdict) :
# Initialize a class object of given type from a conformant dictionary .
class_sig = toclass.__dict__.keys(); class_sig.sort ()
dict_keys = fromdict.keys(); dict_keys.sort ()
common = intersect(class_sig, dict_keys)
if 'typemap' in class_sig :
class_sig.remove('typemap ' )
if tuple(class_sig) != tuple(dict_keys) :
print "Conformability error "
# print "Class signature: " + `class_sig `
# print "Dictionary keys: " + `dict_keys `
print "Not matched in class signature: " + `setdiff(class_sig, common) `
print "Not matched in dictionary keys: " + `setdiff(dict_keys, common) `
sys.exit(1)
else :
for x in dict_keys :
setattr(toclass, x, fromdict[x])
Listing 4. Code that Calls Metaclass Function
# The tricky part--initializing objects from the
# configuration global
# `Configuration' is the top level of the object
# tree we're going to mung
Configuration = Controls ()
copy_instance(Configuration, configuration)
Configuration.servers = [];
for server in configuration[`servers ' ] :
Newsite = Server ()
copy_instance(Newsite, server)
Configuration.servers.append(Newsite)
Newsite.users = [];
for user in server['users ' ] :
Newuser = User ()
copy_instance(Newuser, user)
Newsite.users.append(Newuser)
برای جادوی سیاه چندان بد به نظر نمی رسد، اینطور نیست ؟ سی و دو خط با احتساب توضیحات. فقط با توجه به چیزهایی که من درباره ساختار کلاسها گفتم، حتی کد فراخوان نیز قابل خواندن است. ولی اندازه این کد موضوع شوکه کننده نیست. خودتان را کنترل کنید: نوشتن این کد تنها ۹۰ دقیقه وقت گرفت و در اولین باری که من آن را اجرا کردم به خوبی کار کرد.
تنها گفتن این که من حیرت زده شده بودم می تواند کم لطفی باشد. درست و به خوبی کار کردن پیاده سازی حتی ساده ترین تکنیکها در اولین بار همانگونه که انتظار می رفته می تواند امری قابل توجه باشد؛ ولی اولین هک کردن metaclass من تنها پس از ۶ روز از یک شروع بی مقدمه؟ حتی اگر به اغراق بگوییم که من یک هکر با استعداد هستم این یک موفقیت بزرگ برای پیتون در زمینه شفافیت و شکوه و عظمت طراحی است.
تقریبا هیچ راهی وجود نداشت که من بتوانم با وجود تجربه بسیار زیادترم در پرل عمل مشابهی را با استفاده از آن انجام دهم. در این زمان بود که احساس کردم که احتمالا پرل را ترک خواهم کرد.
این رویایی ترین لحظه من در پیتون بود. ولی حالا که همه اینها تمام شده باید بگویم تمام اینها یک هک هوشمندانه بود. مفید بودن یک زبان برنامه نویسی در بلند مدت بستگی به پشتیبانی آنها از هک های هوشمندانه ندارد بلکه به چند و چون پشتیبانی آن از امور روزمره برنامه نویسی مرتبط است. کار روزمره برنامه نویسی اکثرا به جای نوشتن برنامه های جدید، از خواندن و تغییر دادن برنامه های موجود تشکیل می شود.
مساله تکان دهنده اینجاست: هفته ها و ماه ها پس از نوشتن fetchmailconf ، من هنوز قادر بودم کد آن را بخوانم و بدون هیچ تلاش فکری جدی ای متوجه بشوم که چکار می کند و دلیل واقعی این موضوع که من دیگر برای هیچ چیزی جز پروژه های کوچک از پرل استفاده نمی کنم این است که این موضوع هرگز در مورد پرل صادق نبود. من حتی از تصور این موضوع که زمانی ناچار شوم keeper یا anthologize را تغییر دهم به وحشت می افتم در حالیکه برای انجام چنین کاری در مورد fetchmailconf ککم هم نمی گزد.
پرل همچنان کاربردهای خود را دارد. برای پروژه های کوچک (۱۰۰ خط یا کمتر) که شامل مقدار زیادی جور کردن الگوی متن است، من احتمالا بیشتر از یک راه حل با استفاده از پرل استقبال می کنم تا پیتون. برای دیدن چندین مثال خوب، برنامه های timeseries و growplot را در فهرست توزیع fetchmail مشاهده کنید. در حقیقت، این ها تا حد زیادی شبیه کاری هستند که پرل در نقش اصلی خود، قبل از اینکه دارای توابع و دسترسی مستقیم به API سیستم عامل باشد، به عنوان نوعی ترکیب awk/sed/grep/sh انجام می داد. برای هر چیز بزرگتر یا پیچیده تر، من عادت کرده ام که ارزشهای لطیف پیتون را ترجیح بدهم و فکر کنم شما نیز همین کار را انجام بدهید.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

تاریخچه زبان دلفی
دلفی در واقع یک کامپایلر پاسکال است. دلفی 6 نسل جدید کامپایلر های پاسکال است که شرکت Borland از زمان ایجاد اولین نسخه پاسکال توسط Andres Hejlsberg در 15 سال پیش به بازار عرضه کرد.
برنامه نویسی به زبان پاسکال در سالیان سال از استواری و ثبات، زیبایی و ظرافت و البته سرعت بالای کامپایل سود برده است. دلفی هم از این قاعده مستثنی نیست. کامپایلر دلفی ترکیبی از بیش از یک دهه تجربه طراحی کامپایلر پاسکال و معماری بهبود یافته کامپایلر های 32 بیتی است. اگرچه قابلیت های کامپایلرها با گذشت زمان پیشرفت قابل توجهی داشته است ولی سرعت آن چندان کاهش نیافته و همچنان از سرعت بالایی برخوردار است. به علاوه استحکام و قدرت کامپایلر دلفی معیاری برای سنجش دیگر کامپایلر هاست.
در اینجا به بررسی تفصیلی روند حرکتی دلفی در هر یک از نسخه های آن می پردازیم و مشخصات مهم آن را بررسی می کنیم.
سال 1995 - Delphi1
در زمان استفاده از سیستم عامل DOS برنامه نویسان مجبور بودند از بین زبان پر قدرت ولی کم سرعت Basic و زبان کارآمد ولی پیچیده و نامفهوم Assembly یکی را انتخاب کنند. پاسکال با ارائه یک زبان ساخت یافته و یک کامپایلر سریع و کم نقص این شکاف را پرکرد. برنامه نویسان Windows 3.1 هم با تصمیم گیری مشابهی رو برو شدند. یکی زبان قدرتمند و سنگین ++C و یکی زبان ساده و محدود کننده Visual Basic .
ارائه Delphi1 در این مورد هم راه حل خوبی برای برنامه نویسان بود. دلفی مجموعه متفاوتی برای برنامه نویسی بود . طراحی و توسعه برنامه های کاربردی، ایجاد DLL ها، پایگاههای داده و ... که یک محیط ویژوال وسیع را تشکیل می داد. Delphi1 اولین ابزار برنامه نویسی ویندوز بود که محیط طراحی ویژوال، کامپایلر بهینه کد برنامه و دسترسی قوی به پایگاههای داده را در یک جا جمع کرد که آن را به یکی از بهترین ابزارهای روش نوین توسعه سریع نرم افزار (Rapid Application Development ) تبدیل کرد. این مجموعه قدرتمند باعث شد که در همان زمان بسیاری از برنامه نویسان زبانهای دیگر به Delphi روی بیاورند و این موفقیت بزرگی برای Borland به حساب می آمد. همچنین بسیاری از برنامه نویسان پاسکال دلفی را ابزاری یافتند که توسط آن هم از توانایی و تجربه خود در برنامه نویسی پاسکال استفاده می کردند و هم توانایی کار در ویندوز را به دست آوردند. همچنین زبانی که در آن زمان با نام پاسکال شیئی (ObjectPascal ) در دانشگاهها ایجاد شده بود یک زبان بسیار خشک و محدود کننده بود که اصلاٌ حالت کاربردی پیدا نکرد.
ویژگیهای دلفی مثل طراحی ظاهری حساب شده و کاربر پسند آن باعث شد که زبان پاسکال شیئی عملاٌ از رده خارج شود. تیم طراحی VB در Microsoft قبل از حضور دلفی هیچ رقیب مهمی برای خود نمی دید. VisualBasic در آن زمان زبانی نا کارآ ، کم سرعت و کند ذهن بود. Visual Basic 3 در عمل اصلا توانایی رقابت با Delphi 1 را نداشت. در این سال شرکت Borland گرفتار یک سری مشکلات قضائی با شرکت Lotus بود که در نهایت هم متخلف شناخته شد. همچنین درگیری مشابهی هم با Microsoft بر سر تلاش در تغییر دادن فضای نرم افزار های Microsoft پیدا کرد. همچنین Borland مشغول طراحی و فروش طرح Quatro به شرکت Novell و طراحی پایگاه های داده dBase و Paradox بود که با استقبال قابل توجهی مواجه نشد.
در این زمان که Borland مشغول فعالیتهای قضایی و تجاری بود Microsft توانست گوی سبقت را از Borland برباید و قسمت اعظم بازار ابزار های برنامه نویسی تحت Windows را در اختیار بگیرد و سعی می کرد تا این طرز فکر را اشاعه دهد که چون Windows را طراحی کرده صلاحیت و توانایی تهیه بهترین ابزار های برنامه نویسی تحت آن را نیز در دست دارد. در این شرایط Borland با عرضه Delphi و نسخه جدید ++Borland C سعی کرد خدشه ای در فرمانروایی Microsoft وارد کند و سهمی در بازار بزرگ این محصولات داشته باشد.
سال 1996 - Delphi2
یک سال بعد Delphi2 تمام مزایای نسخه قبلی را تحت سیستم های جدید 32 بیتی (Windows 95,Windows NT ) ارائه داد. همچنین Delphi2 با ارائه خصوصیات اضافه و کارکرد های قویتری نسبت به Delphi1 توانایی های خود را افزایش داد. (ازجمله ارائه کامپایلر 32 بیتی که سرعت بالایی به نرم افزار ها می بخشید، کتابخانه بزرگ و کاملی از اشیای مختلف، شیوه جدید و تکامل یافته ای برای اتصال به پایگاه های داده مختلف، ادیتور پیشرفته، پشتیبانی از OLE ، توانایی وراثت در فرمهای ویژوال و سازگاری با پروژه های 16 بیتی Delphi1 ). Delphi2 به معیاری برای سنجش و مقایسه همه ابزارهای توسعه نرم افزار در آن زمان تبدیل شد.
در آن زمان با ارائه سیستم 32 بیتی Windows95جهش بزرگی در سیستم عامل Windows رخ داد و Borland بسیار مشتاق بود که Delphi را به بهترین ابزار برنامه نویسی سیستم جدید تبدیل کند. نکته این که در آن زمان به منظور تاثیر در افکار عمومی و تاکید بر قدرت Delphi در سیستم عامل 32 بیتی قرار بود که نرم افزار با نام جدید Delphi32 به بازار عرضه شود ولی در آخرین مراحل به خاطر اینکه نشان دهند این زبان زبانی رشد یافته و تکامل یافته نسخه قبلی یعنی Delphi1 است نام Delphi2 را برای آن انتخاب کردند.
Microsoft تلاش کرد که با Visual Basic 4 با Delphi مقابله کند ولی از ابتدا کیفیت پایین آن و ضعف آن در انتقال برنامه های 16 بیتی به سیستم 32 بیتی و بروز اشکالات ساختاری در طراحی آن موجب شکست زودهنگام Visual Basic 4 شد. در این زمان هنوز تعداد زیادی از برنامه نویسان به Visual Basic وفادار بودند. Borland هنچنین روشها و ابزارهای قدرتمندی همچون PowerBuilder برای طراحی نرم افزار های Client/Server ارائه داد ولی Delphi هنوز آن قدر قدرتمند نشده بود که بتواند نرم افزارهایی که جایی در بین توسعه گران پیدا کرده اند را براندازد.
سال 1997 - Delphi3
از زمان تهیه و توسعه Delphi1 تیم توسعه Delphi در فکر گسترش و ایجاد یک زبان قدرتمند جهانی بود. برای Delphi2 این تیم تمام نیروی خود را صرف اعمال مربوط به انتقال تواناییها و کارکرد ها به سیستم 32 بیتی و همچنین اضافه کردن خصوصیات Client/Server و پایگاه داده کرد. در زمان تهیه Delphi3 تیم توسعه فرصت لازم برای گسترش مجموعه ابزار موجود را یافت و در این راستا کیفیت و کمیت ابزارهای Delphi بهبود یافت. به علاوه راه حل هایی برای مشکلات عمده و قدیمی برنامه نویسان تحت ویندوز ارائه شد. به ویژه استفاده از برخی فناوری های پیچیده و نا مفهوم (مثل COM و ActiveX وتوسعه نرم افزار های تحت Web وکنترل پایگاههای داده چند کاربره). روش نمایش کد برنامه همچنین توانایی کامل کردن خودکار کد (Code Completion ) عملیات کد نویسی را راحت تر کرد. ضمن این که همچنان در بیشتر موارد اساس و متدولوژی برنامه نویسی مانند Delphi1 بود و بر پایبندی به قوانین اصولی Pascal تاکید می شد.
در این زمان رقابت شرکت های تولید کننده ابزار های برنامه نویسی بسیار تنگاتنگ شده بود. Microsoft با ارائه Visual Basic 5 به پیشرفت های خوبی دست یافت ازجمله پشتیبانی قوی از COM و ActiveX و ایجاد برخی خصوصیات و تغییرات کلیدی و اساسی در کامپایلر VB . ضمن این در همین سال Borland با پشتوانه قوی Delphi و با استفاده از ساختار موفق آن ابزارهای دیگری همچون Forte و BC++ Builder به بازار عرضه کرد.
تیم Delphi در زمان طراحی Delphi3 چند تن از اعضای کلیدی خود را از دست داد. Andres Hejlsberg معمار اصلی Delphi در اقدام غیر منتظره ای Borland را ترک کرد و تصمیم گرفت به رقیب دیرینه یعنی Microsoft بپیوندد. اما حرکت تیم Delphi متوقف نشد و معاون Hejlsberg که سالها تجربه همکاری با او را داشت توانست رهبری این تیم را به خوبی در دست بگیرد. همچنین مسئول فنی تیم (Paul Gross ) هم در اقدام مشابهی به گروه Microsoft ملحق شد. این تغییرات بیشتر به خاطر اختلافات شخصی بین افراد تیم بود و نه به خاطر مسائل حرفه ای.
سال 1998 - Delphi4
Delphi4 بیشتر بر روی راحتتر کردن کار با دلفی متمرکز شد. مرورگر روال ها (Module Explorer ) بهبود یافت و مرور و ویرایش Unit ها را راحت تر کرد. کنترل کد و کامل کردن خودکار کلاسها این فرصت را به کاربر داد که فکر و زمان خود را روی ساختار اصلی برنامه بگذارد و در وقت صرفه جویی کند. طراحی رابط کاربر هم کاملاٌ عوض شد و بهبود یافت و اشکال زدا (Debugger ) نیز پیشرفت قابل توجهی داشت. Delphi4 قابلیتهای برنامه نویسان را در استفاده از تکنولوژیهای چند منظوره خارجی مثل MIDAS ، DCOM ، MIS و Corba افزایش داد.
در این سال Delphi جایگاه خود را در رقابت با دیگران مستحکم کرده بود و کم کم به سمت دست یابی به سودآوری مالی مورد نظر خود پیش می رفت. در واقع در این زمان بود که حاصل کار سنگین چند ساله تیم نمایان می شد. بعد از سالها آزمایش Delphi شهرت و محبوبیت خاصی پیدا کرد و دیگر برنامه نویسان Delphi توانایی جدا شدن از آن را نداشتند. در این زمان Borland به کار سوٌال برانگیزی دست زد و به منظور تبلیغ بیشتر و برتری در جنگ روانی با دیگر شرکتها نام Inprise را برای فعالیتهای تجاری خود برگزید.
ابزار های مربوط به فن آوری Corba را گسترش داد تا راه جدیدی برای سودآوری ایجاد کند. برای موفقیت در این زمینه Corba نیاز به رابط کاربر قدرتمندی داشت که در کنار توانایی های آن کار کردن با آن نیز راحت باشد. دقیقاٌ همان کاری که در سالهای قبل در مورد COM و برنامه نویسی تحت Web انجام شده بود و به موفقیت دست یافته بود. با این وجود بنا به دلایل مختلفی این گسترش و توسعه Corba هیچ وقت تکامل و موفقیتی که مورد نظر بود را به دست نیاورد و بر خلاف تبلیغات و سرمایه گذاری های انجام شده فن آوری Corba تنها توانست نقش کوچکی در روند رو به جلوی Delphi ایفا کند.
سال 1999 - Delphi5
Delphi5 در برخی زمینه ها پیشرفت های قبلی را ادامه داده است. اولاٌ مسیری را که Delphi4 با اضافه کردن ویژگیهای زیادی شروع کرده بود ادامه داد. Delphi4 باعث شد کارهایی که قبلاٌ به صرف وقت زیادی احتیاج داشت بسیار سریعتر انجام شود. Delphi به شکل امیدوار کننده ای به برنامه نویس این امکان را می دهد که بیشتر به برنامه ای که میخواهد بنویسد توجه کند و نه به قواعد برنامه نویسی و نوشتن کد های تکراری و خسته کننده. این ویژگیهای سودمند شامل رابط کاربر بهبودیافته و سیستم اشکال زدایی(Debugger ) توانمند ، امکانات برنامه نویسی تیمی و ابزار های ترجمه می شود.
ثانیا Delphi5 خصوصیات جدیدی را در بر می گیرد که توسعه برنامه های تحت وب را واقعاٌ راحت کرده است. این ویژگیها شامل طراح اشیای مربوط به ASP برای ساختن صفحات (Active Server Page )، اشیایی موسوم به Internet Express برای پشتیبانی از XML و خصوصیات جدید MIDAS که آن را به یک ابزار همه کاره در پایگاه های داده تحت Web تبدیل کرد. در نهایت با صرف وقت ، هزینه و صبر زیاد توانست Delphi5 قدرتمند را عرضه کند. این فعالیت مدتها به طول انجامید و قبل از عرضه عمومی، Delphi5 بارها در بازبینی ها و آزمایشهای داخلی قسمتهای مختلف آن تغییر کرد و بهبود یافت.
Delphi5 در نیمه دوم سال 1999 به بازار عرضه شد و به نفوذ و تسلط بر بازار ادامه داد. در این زمان Visual Basic که کم کم به عضوی تحقیر آمیز برای Microsoft تبدیل می شد هم با پیشرفتهایی توانست در رقابت دوام بیاورد و از صحنه خارج نشود. در اقدام درست و به جایی نام Inprise دوباره به Borland بازگشت. این اقدام از سوی طرفداران و مشتریان قدیمی Borland با استقبال خوبی مواجه شد.
سال 2001 – Delphi6
در هنگام تهیه Delphi6 ساختار Delphi در زمینه های مختلف شکل گرفته بود و به یک تکامل نسبی رسیده بود. این مسئله باعث شد که تیم طراحی بتواند وقت خود را بر روی طرحی که مدتها تنها در حد یک نظریه بود بگذارد و آن را بسیار زودتر از آن که انتظار می رفت عملی کند: گام نهادن به محیط های فراتر از Windows . بیشتر نیروی توسعه گران Delphi در این مدت صرف رهانیدن Delphi از بند Windows شد که این خود در درجه اول مبارزه ای آشکار با سلطه Microsoft بود و ثانیاٌ راه برنامه نویسان را به سوی فضا های دیگر برنامه نویسی باز کرد. در ابتدا این عمل ریسک بزرگی بود و بیم آن می رفت که جایگاه Delphi در Windows هم به خطر بیفتد ولی در نهایت به نقطه رشد و قوتی بدل شد که Delphi را به یکی از بهترین ابزار برنامه نویسی Multi Platform تبدیل کرد.تکنولوژی CLX روالهای مختلف Delphi را با Kylix (عضو جدید خانواده Borland که در فضای Linux کار می کند) به اشتراک گذاشت و استفاده از سیستم بایت Java باعث شد که Delphi حتی از قید سخت افزار هم رها شود.
به نظر می رسد که این فعالیتها باعث ثبات Delphi در دنیای برنامه نویسان شود و نگرانی های Borland و برنامه نویسان که همیشه می ترسیدند که مبادا با ضعیف شدن Windows جایگاه خود را از دست بدهند حال به افتخار و آرامش برای آنان و نگرانی برای طرفداران Microsoft تبدیل شده است.
مدیریت حافظه در دلفی
تخصیص خودکار حافظه
وقتی شما از نوع های پایه (Integer ،real ،word و…) برای ایجاد متغییرهای خود استفاده می کنید، هیچ نگرانی درباره تخصیص حافظه آن وجود ندارد چون دلفی خودش آنرا تخصیص حافظه می کند و سپس آزاد میکند.
type
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
var
Name : String; {256 Bytes}
X, Y : Integer; {4 + 4 = 8 Bytes}
List : array [0..10] of Double; {8 * 11 = 88 Bytes}
Today : TDay; {1 Byte}
دراین نمونه پس از پایان برنامه، تمام حافظه تخصیص داده شده فراخوانی و آزاد می شود.
تخصیص حافظه دینامیکی
در این حالت برنامه نویس احتیاج دارد تا انباره حافظه را شخصا" تخصیص و آزاد کند.
نوع Pointer
اشاره گرها در دلفی می توانند شکل های مختلفی را در برگیرد. نخست، نوع اشاره گری که یک آدرس حافظه را برای نوع ویژه ای از داده، همانند صحیح، رشته و غیره نگه میدارد (Typed
Pointer ()
var
Number : ^Integer;
Name : ^String;
دوم، اشاره گرهای بدون نوع. اشاره گرهای بدون نوع (Untyped Pointers ) خیلی به نوع معمولی خود شبیه هستند. اما محدودیت هایی مثل اینکه باید به نوع خاصی اشاره (Point ) کند را ندارد.
var
Something : Pointer;
حال اشاره گر بدون نوع ما می تواند به هر نوعی از داده اشاره کند. برای تخصیص حافظه آن، از کمپلکس بیش از یک بیت استفاده میکنیم. برای مثال برنامه زیر کامپایل می شود ولی در زمان اجرا حافظه ای تخصیص نمیشود.
begin
New(Something) ;
Dispose(Something) ;
end ;
برای تخصیص حافظه کامپایلر باید بداند که نوع داده ما برای تخصیص حافظه چیست:
type
IntPtr = ^Integer ;
var
Something : Pointer ;
begin
Something := New(IntPtr) ;
Integer(Something^) := 10 ;
Dispose(Something) ;
end ;
تخصیص بلاکی از حافظه
ما می توانیم از اشاره به بلاک هایی از تخصیص حافظه در سیستم استفاده کنیم. این کار را با رویه های GetMem و FreeMem برای تخصیص و آزاد سازی حافظه استفاده میکنیم.
var
Something : Pointer
begin
GetMem(Something, 100) ;
FreeMem(Something, 100) ;
end ;
اشاره به حافظه از قبل تخصیص داده شده
هر دو نوع اشاره گرها می توانند به هر جایی از حافظه اشاره بکنند. این بدان معناست که آنها می توانند اشاره به فضای اشغال شده با داده هایی که در حال حاضر موجودند داشته باشند. این نمونه اشاره گر احتیاجی به تخصیص حافظه ندارد.
var
Something : Pointer ;
MyString : PChar; // type PChar = ^Char ;
begin
GetMem(Something, 100) ;
MyString := Something ;
StrCopy(Something, 'Hello World’) ;
FreeMem(Something, 100) ;
end ;
حافظه Heap
Heap شامل قسمتی از حافظه موجود در یک برنامه است که آنرا حافظه پویا می نامیم. Heap بخشی است که در آن تخصیص و تعریف حافظه به صورت تصادفی (Random ) اتفاق می افتد. این به آن معناست که اگر شما سه بلاک از حافظه را به طور متوالی تخصیص دهید، می توانید بعد از هر دستور آنرا از بین ببرید. مدیر Heap جزئیات را برای شما نگهداری می کند. بنابراین شما به سادگی می توانید یک حافظه جدید را با GetMem و یا بوسیله صدا زدن constructor هنگام ساختن یک شی درخواست کنید و دلفی به شما یک بلاک جدید را برخواهد گرداند. Heap یکی از سه فضای موجود در برنامه کاربردی را استفاده کرده و دوتای دیگر به صورت فضای یکپارچه (Global ) و پشته قرار می گیرند.
حافظه Stack
Stack شامل قسمتی از یک بخش از حافظه موجود یک برنامه است که دینامیکی است اما برای تخصیص و آزادسازی فرامین مخصوص دارد. تخصیص Stack به صورت LIFO می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین های نوعی استفاده می شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

نكات مفید كار در محیط دلفی
محیط دلفی برای برنامه نویسی یکی از بهترین محیطهای برنامه نویسی است گذشته از کارکرد داخلی و کمپایلر آن که بسیار قوی و سریع است، محیط آن یعنی IDE آنهم قدرت بسیار زیادی دارد که باعث شده یکی از بهترین ادیتورها باشد. در این مقاله من سعی بر این داشته ام تا با ارائه یک سری از نکات و کلیدهای میانبر که می توانند برای کار در دلفی بسیار مفید و کارا باشند، کمک کنم تا شما بتوانید با قدرت بیشتر به برنامه نویسی و کار در این محیط قدرتمند ادامه دهید.
جستجو در متن بصورت مستقیم:
برای اینکار کلیدهای Ctrl+E را بفشارید و بدنبال آن شروع به تایپ کلمه مورد نظر کنید نتیجه آن را خود ببینید. برای اینکه به کلمه بعدی بروید کافیست کلید F3 را بزنید.
ایجاد فرورفتگی در کد:
بعضی اوقات - که خیلی هم پیش می آید - لازم است که یک مقداری از متن را بصورت بلوک شده به جلو و یا عقب ببریم. منظور دندانه دار کردن متن است که به خوانایی برنامه کمک می کند. برای اینکار می تونید از کلید Ctrl +Shift+I برای جلو بردن و Ctrl+Shift+U برای عقب برگرداندن متن بلوک شده استفاده کنید.
پرش به قسمت تعریف یک شی (Object ):
ببنید شی مورد نظرتون (از قبیل VCL, Procedure, Function ,...) در کجا و چطور تعریف شده می توانید کلید Crtl رو پایین نگه داشته و روی شی مورد نظر Click کنید.
برای تغییر حالت کاراکترها:
شما می توانید یک قسمت از متن (که ممکن است با حروف بزرگ و یا کوچک تایپ شده باشد) را انتخاب کنید و با زدن کلیدهای Ctrl+O+U به ترتیب تمامی حروف کوچک آن قسمت از متن را به حروف بزرگ و تمامی حروف بزرگ آنرا به حروف کوچک تبدیل کنید. برای تعییر حالت یک کلمه نیز میتوانید روی کلمه مورد نظر رفته و کلیدهای Ctrl+K+F برای بزرگ کردن و کلیدهای Ctrl+K+E را برای کوچک کردن حروف آن کلمه بکار برد.
درست کردن ماکرو متنی:
این امکان بسیار مفید است و می تواند بسیاری از کارهای نوشتاری را کاهش دهد با اینکار شما میتوانید یک سری از کارهای تکراری که روی متون انجام می دهید را بصورت ماکرو در آورده و از آنها به راحتی استفاده کنید. برای شروع به ضبط ماکرو کلیدهای Ctrl+Shift+R را بفشارید و آن سری کارهایی را که می خواهید را انجام دهید و سپس برای اینکه به کار ضبط ماکرو پایان دهید کلیدهای Ctrl+Shift+R را دوباره بزنید. حال برای استفاده از ماکرو کافیست در هر جا که لازم بود کلیدهای Ctrl+Shift+P را بفشارید.
انتخاب متن بصورت مربعی:
اگر شما از کهنه کارهای کامپیوتر باشید حتما از زمان داس یادتون هست که برنامه ای بود به نام PE2 که یکی از امکانات بسیار جالبش این بود که یک مربع از متن رو میتوانستین انتخاب کنید و آنرا کپی یا حذف کنید. بله درست متوجه شدید در محیط دلفی هم شما اینکار را میتوانید انجام دهید اما نه به مشکلی PE2 بلکه اینکار را میتوانید فقط با گرفتن کلید Alt و کشیدن موس روی متن انجام دهید. هر چند ممکن است در نگاه اول زیاد این امکان مفید به نظر نیاید ولی بعضی وقتهای خیلی کار را راحت میکنه، که حتماً تجربه خواهید کرد.
گذاشتن علامت روی متن:
این کار که به BookMark معروف است بسیار مفید و کارا می باشد. در هنگامی که شما روی قسمتی از متن برنامه کار میکنید و می خواهید به یک قسمت دیگر بروید ممکن است برای برگشتن به مکان اول خود کمی مشکل پیدا کنید. ولی شما میتوانید با زدن چند دکمه به محل مورد نظرتون باز گردید. برای اینکار در خطی که قصد دارید علامت بگذارید کلیدهای Ctrl+Shift+0..9 را بفشارید. منظور اینست که کلیدهای Ctrl+Shift را نگه دارید و یکی از اعداد 0 تا 9 را وارد کنید تا آن خط به همان شماره علامت گذاری شود و سپس هر جا که خواستید بروید و سپس هر بار که کلید Ctrl را نگه دارید و شماره مورد نظر را وارد کنید به همان خط باز خواهید گشت. البته توجه داشته باشید که فقط می توانید 10 خط را با این روش علامت گذاری بکنید و برای برداشتن علامت ها کافیست روی همان خط دوباره کلید Ctrl+shift و شماره ای که برای آن خط وارد کرده اید را بفشارید با اینکار علامت آن خط برداشته می شود.
ایجاد کلاس مورد نظر:
شما هنگامی که در قسمت Private و یا Public یک type ، روال یا تابع درست کردید لازم دارید که قسمتی را برای قرار دادن کدهای مربوط به آن روال یا تابع را ایجاد کنید. برای اینکار شما پس از اینکه نام تابع را تایپ کردید می توانید کلیدهای Ctrl+Shift+C را فشار دهید تا دلفی یک قسمت برای نوشتن کدهای مورد نظرتان ایجاد کند.
ظاهر کردن پنجره Code insight :
شما حتما به اهمیت و مفید بودن این قسمت دلفی واقفید که در هنگام کد نویسی تا چه حد می تواند کارها را راحت کند. بله در هنگام وارد کردن کدها بعد از وارد کردن نام یک کلاس و یا Object با زدن یک نقطه (.) پنجره Code Insight ظاهر می شود. حال در بعضی وقتها شما ممکن است که نقطه را قبلا وارد کرده باشید و یا در مواقع دیگر این پنجره ظاهر نشود. در این صورت برای اینکه پنجره را ظاهر کنید باید دوباره نقطه را وارد کنید ولی راه آسانتری هم وجود دارد و آن اینست که کلیدهای Ctrl+Speacebar را فشار دهید.
ظاهر کردن پنجره Code Parameter :
همانند بالا در هنگام ظاهر شدن Hint مربوط به راهنمای توابع که معمولاً بعد از گذاشتن پرانتز مربوط ظاهر میشود و در مورد پارامترهای لازم می باشد نیز می توانید از کلیدهای Ctrl+Shift+SpaceBar استفاده کنید.
رفتن از قسمت تعریف توابع و روالها به قسمت کد آنها:
همیشه این نیاز وجود خواهد داشت که شما در هنگامی که دارید به دنبال یک روال در قسمت type میگردید بعد از پیدا کردن نام آن می خواهید که خود آن تابع یا روال را نیز ببنید. برای اینکار خوب حتما نام آن را جستجو میکنید ولی یک راه آسانتر اینست که شما روی نام آن تابع قرار گیرید و کلیدهای Ctrl+Shift+Up/Down را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.
آرایه ها در دلفی
دلفی به ما امکان می دهد آرایه هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
var
array[indexType1, ..., indexTypen] of baseType ;
در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.
نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:
d(.i.):= 3 + i; // Equivalent d:= 3 + i ;
نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:
var
A : array [Boolean] of integer ;
begin
A[True] := 50 ;
A[False] := 100 ;
end ;
نکته: توابع Low و High کران های پایین وبالای یک متغییر آرایه ای یا نوعی یا ترتیبی را بر میگردانند:
for I := 0 to High(X) do S := S + X ;
آرایه های ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشته ها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.
type
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) ;
const
DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday’ ,
'Wednesday', 'Thursday’ ,
'Friday', 'Saturday’) ;
var
Today : TDay ;
begin
Today := TDay(DayOfWeek(Date) – 1) ;
ShowMessage('Today is ' + DayNames[Today] + '!' ) ;
end ;
آرایه های دینامیکی:
آرایه های دینامیکی، آرایه های تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:
var MyFlexibleArray: array of Real ;
قبل از به کار گیری آرایه های دینامیکی، ابتدا باید از رویه SetLength برای تخصیص حافظه آرایه استفاده کرد:
SetLength (MyFlexibleArray, 2) ;
نکته: آرایه های دینامیکی همیشه مبتنی بر صفر می باشند.
نکته: شما می توانید آرایه های دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید:
MyFlexibleArray := nil ;
نکته: مقدار حافظه ای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایه ای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص می یابد.
فشرده سازی آرایه ها:
در دلفی شما هنگامی که ساختار خود را تعیین کردید می توانید با استفاده از کلمه کلیدی packed اطلاعات ذخیره شده خود را متراکم کنید:
type TNumbers = packed array[1..100] of Real ;
نکته: استفاده از packed سرعت دسترسی به اطلاعات را کند میکند. در مورد آرایه ای از کاراکترها این مورد سازگارتر می باشد.
آرایه های چند بعدی دینامیکی:
برای تعریف آرایه های چند بعدی دینامیکی، تنها کافی است ...array of را در ساختار خود تکرار کنید. به طور مثال:
type
TMessageGrid = array of array of string ;
var
Msgs: TMessageGrid ;
این تعریف یک آرایه دو بعدی از رشته ها می باشد. سپس باید به آرایه خود فضا نسبت داد:
SetLength(Msgs, I, J) ;
شما می توانید آرایه های چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular ) ایجاد کنید. ابتدا رویه SetLength را صدا زده و پارامتر بعد اول را بدهید:
var
Ints: array of array of Integer ;
SetLength(Ints, 10) ;
ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازه های مختلف) تخصیص دهید:
SetLength(Ints[2], 5) ;
تغییر Hint برای هر ستون از DBGrid در دلفی
ابتدا باید یک عنصر جدید مبتنی بر TDBGrid ایجاد کنید و رویداد OnMouseMove را فراخوانی کنید:
type
TMyDBGrid = class(TDBGrid)
published
property OnMouseMove ;
end ;
اگرچه شما در رویداد OnMouseMove مختصات X و Y را بدست خواهید آورد، اما شما باید ستون مورد نظر را پیدا کنید. برای ادامه کار لازم است که سطر زیر را در قسمت protected قرار دهید:
procedure WMMouseMove(var Message : TWMMouse); message WM_MOUSEMOVE ;
همچنین متغیر های زیر را در قسمت public اضافه نمایید:
MouseRow : integer ;
MouseCol : integer ;
بنابراین متد WMMouseMove بصورت ریر خواهد بود:
procedure TMyDBGrid.WMMouseMove(var Message : TWMMouse) ;
var
t : TGridCoord ;
begin
t := MouseCoord(Message.XPos, Message.YPos) ;
MouseCol := t.x ;
MouseRow := t.y ;
inherited ;
end ;
ما ابتدا فیلدهای XPost و YPos را از ساختار WMMouseMove تنظیم میکنیم:
procedure TForm2.MyDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y :
Integer) ;
begin
if (((dgIndicator in MyDBGrid1.Options) and (MyDBGrid1.MouseCol > 0)) or
((not (dgIndicator in MyDBGrid1.Options)) and (MyDBGrid1.MouseCol <> -1)))
and (MyDBGrid1.MouseCol <> OldMouseCol) then begin
OldMouseCol := MyDBGrid1.MouseCol ;
if dgIndicator in MyDBGrid1.Options then
MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol - 1].FieldName
else
MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol].FieldName ;
end ;
end ;
حالا مجددا" تعریف زیر را در قسمت public قرار دهید:
HintMouseMessage(Control : TControl; var Message : TMessage)
در قسمت OnMouseMove از TDBGrid نیز فرامین زیر را اضافه نمایید:
var
r : TMessage ;
begin
Application.HintMouseMessage(self, r) ;
TWMMouse(r).XPos := X ;
TWMMouse(r).YPos := Y ;
Application.HintMouseMessage(MyDBGrid1, r) ;
end ;
همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

رای چندین نسخه اصلی پایگاه داده، پایگاه داده اوراكل ، لیست كنترل امنیتی را برای مشتریان ارائه كرده تا بتواند امنیت پایگاه داده را بهبود بخشد.از اوراكل نسخه 9i ، اوراكل برای شناخت بهترنیازهای پیش فرض كاربران و محكم سازی پایگاه داده خود همكاری نزدیك تری را شروع كرد. پایگاه داده اوراكل نسخه 10g ، دارای بسته مدیریتی قدرتمندی است كه به راحتی می تواند سیاست های لازم را بیان كرده و علاوه بر آن توانایی پویش پایگاه داده را برای پیدا كردن تنظیماتی كه با امنیت پایگاه داده مرتبط است دارا می باشد .اوراكل به این بسته مدیریت قدرتمند، هر روز قابلیت های بیشتری را در جهت كمك به مدیران پایگاه داده اضافه می كند . از جمله این قابلیت ها ، می توان به پویش نحوه نصب اوراكل اشاره كرد كه می توان مواردی را كه دارای نواقص امنیتی است تشخیص و برطرف سازد. از جمله این حفره های امنیتی می توان به فعال كردن دسترسی های از پیش تعریف شده اوراكل اشاره كرد. استفاده از ابزار EM policy manager می تواند تا حد زیادی امنیت اوراكل را بهبود بخشد .
اوراكل ابزارهایی نظیر :
Client identifier
Secure application roles
Oracle database auditing
را برای پیشبرد اهداف امنیتی خود در دسترس كاربران قرار داده است . اگرچه برای رسیدن به حداكثر امنیتی كه اوراكل پیشنهاد كرده است، لازم است خود پایگاه داده نیز امنیت مورد قبول داشته باشد .
ده قدم برای امنیت پایگاه داده پیشنهاد شده است ، كه عنوان و توضیح كوتاهی در مورد هر كدام آورده شده است .
Step ۱ : Install only what is required
Step ۲ : Lock and Expire Default User Accounts
Step ۳ : Change Default User Passwords
Oracle Database ۱۰g enables you to use the same or different passwords for administrative accounts such as SYSTEM, SYSMAN and DBSNMP. Use different passwords for each: in any Oracle environment (production or test), assign strong and distinct passwords to these administrative accounts .
Step ۴ : Enable Data Dictionary Protection
Oracle recommends that customers implement data dictionary protection to prevent users having the ANY system privileges from using such privileges on the data dictionary.
To enable dictionary protection, set the following configuration parameter to FALSE, in the init.ora control file:
O ۷ _DICTIONARY_ACCESSIBILITY = FALSE
Step ۵ : Practice the principle of least privilege
Step ۶ : Enforce access controls effectively and authenticate clients stringently
Step ۸ : Restrict Network Access
Step ۹ : Apply all security patches
http://www.oracle.com/technology/deploy/security/alerts.htm
http://metalink.oracle.com
Step ۱۰ : Contact Oracle Security products if you come across vulnerability in Oracle Database
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri
بانك اطلاعاتی معروف MySQL كه اپنسورس است، طرفداران زیادی در بین برنامهنویسان دارد. MySQL علاوه بر آنكه یكی از نمونههای بسیار موفق نرمافزارهای منبع باز محسوب میشود
طرفداران زیادی در بین برنامهنویسان دارد. MySQL علاوه بر آنكه یكی از نمونههای بسیار موفق نرمافزارهای منبع باز محسوب میشود، مثالی از نرمافزاری است كه در اروپا (سوئد) پا به عرصه گذاشته است. نخستین نسخه این بانك اطلاعاتی توسط دو نفر از برنامهنویسان سوئدی نوشته شد و از آن پس بر اساس مدل نرمافزارهای منبع باز توسعه یافت. البته در میانه راه (یعنی در زمان عرضه نسخه سوم این نرمافزار) بر اساس توافقی میان شركت MySQL AB از یك سو و شركت معظم SAP (كه دارای خط تحقیق و توسعه بانك اطلاعاتی اختصاصی خود بود) از طرف دیگر، نسخه ویژهای موسوم به MaxDB از تلفیق تكنولوژیهای این دو شركت در فهرست محصولات MySQL قرار گرفت. اما شركت MySQL همچنان كار توسعه نسخه قبلی و منبع باز نرمافزار MySQL را تا این لحظه به موازات MaxDB ادامه داده است. طرفداران فلسفه نرمافزارهای منبع باز همواره از MySQL به عنوان نمونهای یاد میكنند كه توانسته است بهخوبی با نمونههای بانكهای اطلاعاتی اختصاصی همانندSQL server كه سرمایهگذاریهای سنگینی برای توسعه آن انجام میشود، رقابت كند (هر چند كه مایكروسافت بر اساس یك سیاست كلی تنها رقیب خود را در زمینه بانكهای اطلاعاتی، محصولات اوراكل میداند و اصولاً توجهی به نرمافزارهای منبع باز نمیكند). اما واقعیت آن است كه در دنیای برنامهنویسی این دو نرمافزار در رقابت تنگاتنگ قرار دارند. آخرین نسخه MySQL همراه مجموعهای از قابلیتها و امكانات عرضه شده است كه آنرا بیش از پیش بهسمت كاربردهای <بزرگ مقیاس> سوق میدهد. برخی از ناظران معتقدند هدف اولیه تغییرات و پیشرفتهای ارائه شده در نسخه ۵ این نرمافزار، بیش از هر چیز دیگری معطوف برنامهنویسی پیشرفته در كاربردهای گسترده و بزرگ است. یكی از منابع مورداستفاده در تهیه این مقاله در این زمینه چنین بیان میكند: <آیا زمان آن فرا رسیده است كه اوراكل باز گردد و به پشتسر خود نگاه كند؟> جالب است كه نویسنده در نوشته خود اصلاً اسمی از مایكروسافت و SQL server نیاورده است!
بانكاطلاعاتی سرور از نوع Embedded
اگرچه قابلیت استفاده از این بانك اطلاعاتی به صورت سرور Embedded موضوع جدیدی محسوب ن-م-یش-ود و از نسخه ۴ MySQL به بعد همواره وجودداشته است، اما این ویژگی از سوی كاربران همچنان نسبتاً ناشناخته باقیمانده است. استفاده از موتور نرمافزاری این بانك اطلاعاتی به صورت Embedded با توجه به آنكه این نرمافزار از نظر توابع API بهطور كامل با مدل Client/Server سازگاری دارد، بسیار ساده است. در واقع برای بهكارگیری این نرمافزار به صورت Embedded تنها كافی است تا یك تغییر كوچك در سورس كد (نسبت به روش معمول) اعمال شود. نمونهای از یك قطعه كد به زبان C (كه در گوشه و كنار اینترنت به فراوانی یافت میشود) این مطلب را بهخوبی نمایش میدهد. (به قطعه كد شماره یك مراجعه نمایید)
Unionها
یونیونها موجوداتی هستند كه امكان تركیب دو یا چند Query را در یك DataSet فراهم میكنند (البته با فرض این كه اسامی ستون، نوع داده و ترتیب فیلد مطابقت داشته باشند). یونیونها مكانیسم بسیار قدرتمندی برای انواع گوناگون جستجوهای پیشرفته محسوب میشوند. بهطور معمول زمانی یونیونها بهكار برنامهنویسان میآیند كه در كاربردهای مورد نظر آنها، دو جدول شامل اطلاعات نسبتاً مرتبط وجود داشته باشند. به عنوان مثال، در صورتیكه در ساختار یك بانك اطلاعاتی، یك جدول شامل اطلاعات فروشندگان باشد و جدول دیگری برای ثبت دادههای شركتهای فروشنده لوازم ساختمانی بهكار رفته باشد، میتوان از یونیون برای جستجوی همزمان در دو جدول و بهدست آوردن یك مجموعه پاسخ یا result set بهره گرفت.
SubQueryها
از SubQueryها و جداول مشتق شده برای قرار دادن عبارات انتخابی در یك SQL Statement دیگر استفاده میشود. مثلاً اگر در بخش FROM عبارت جستجوی خود از یك عبارت SELECT دیگر استفاده كنید، در این صورت، عبارت SELECT خارجی از نتایج بهدست آمده از عبارت SELECT بهكار رفته در بخش FROM كلی جستجو، استفاده خواهد كرد. این ویژگی هم یكی از ابزارهای قدرتمندی است كه در كاربردهای پیشرفته به كمك برنامهنویسان میآید.
عبارات از قبل آماده
برنامهنویسان آشنا با گرامر عبارات ODBC ازپیش آماده (ODBC Prepared statement) از این پس میتوانند %
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

امروزه نگهداری بانک های اطلاعاتی مختلف، یکی از عمده ترین کاربردهای سرویس دهنده های موجود بر روی شبکه ها می باشد. بانک های اطلاعاتی اختصاصی زیادی بر روی دبیان گنو/ لینوکس قابل استفاده هستند، ولی دو سیستم سرویس دهنده بانک اطلاعاتی آزاد و بازمتن که معمولا به همراه توزیع های رایج گنو/ لینوکس ارائه می شوند، عبارتند از بانک های اطلاعاتی MySQL و PostgreSQL .
سرویس دهنده بانک اطلاعاتی PostgreSQL سرویس دهنده ای با قابلیت های فنی بسیار بالاست که می تواند با سرویس دهنده های اختصاصی مانند Oracle رقابت کند. سرویس دهنده MySQL یک سرویس دهنده سبکتر و با سرعت بسیار بالاست که امروزه در سطوح گسترده ای به عنوان سرویس دهنده نرم افزارهای تحت وب و سایت های وب بکار گرفته می شود. در این مقاله، ما به سرویس دهنده بانک اطلاعاتی MySQL بر روی توزیع دبیان گنو/لینوکس خواهیم پرداخت. سایت رسمی MySQL در آدرس http://www.mysql.org قرار دارد که در آن می توانید به تعداد زیادی مستندات راهنما به همراه یک انجمن فعال کاربران دسترسی داشته باشید.
نصب سرویس دهنده MySQL
نسخه پیش گزیده سرویس دهنده MySQL که بر روی دبیان گنو/ لینوکس ۳.۱ موجود است، نسخه ۴ می باشد که پایدار بوده و بسیاری از نرم افزارهای کاربردی با آن سازگاری دارند. نسخه جدیدتر این سرویس دهنده که نسخه ۴.۱ می باشد نیز به همراه دبیان گنو/ لینوکس ۳.۱ ارائه شده که در صورت نیاز می توانید از آن استفاده کنید. نصب سرویس دهنده بانک اطلاعاتی MySQL بسیار آسان می باشد. کافی است دستور apt-get install mysql-server را وارد نمایید. در هنگام نصب، هشداری در مورد کلمات عبور نمایش داده شده و سوالاتی در مورد اجرای خودکار سرویس دهنده در هنگام بوت سیستم و حذف بانک های اطلاعاتی قدیمی موجود بر روی سیستم پرسیده خواهد شد.
# apt-get install mysql-server
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed :
mysql-server
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded .
Need to get 0B/3641kB of archives .
After unpacking 8806kB of additional disk space will be used .
Preconfiguring packages ...
Selecting previously deselected package mysql-server .
(Reading database ... 130011 files and directories currently installed . )
Unpacking mysql-server (from .../mysql-server_4.0.23-4_i386.deb) ...
Setting up mysql-server (4.0.23-4) ...
Starting MySQL database server: mysqld .
Checking for crashed MySQL tables in the background .
برای نصب نسخه ۴.۱ نیز می توانید از دستور apt-get install mysql-server4.1 استفاده نمایید. البته توجه داشته باشید که در یک زمان تنها یکی از نسخه های ۴ یا ۴.۱ را می توانید بر روی سرویس دهنده خود داشته باشید.
پیکربندی و مدیریت سرویس دهنده MySQL
بسته دبیان سرویس دهنده MySQL حاوی بسیاری از تنظیمات لازم می باشد. فایل پیکربندی اصلی سرویس دهنده MySQL در مسیر etc/mysql/my.cnf / قرار دارد و در آن تنظیماتی از قبیل شماره درگاه، نام کاربری که سرویس دهنده با استفاده از آن اجرا می شود، مسیر قرار گیری فایل های مربوط به بانک های اطلاعاتی، فایل های ثبت رخداد و غیره می باشد. بسته MySQL دبیان طوری تنظیم شده است که پس از نصب سرویس دهنده، امکان اتصال به درگاه آن از خارج از سیستم سرویس دهنده امکان پذیر نخواهد بود. این گزینه در امنیت کلی سرویس دهنده بسیار موثر می باشد. نام کاربر و گروهی که هنگام نصب بسته دبیان سرویس دهنده MySQL بر روی سیستم ساخته می شود است.
هنگامی که سرویس دهنده MySQL نصب می شود، بطور پیش گزیده، هیچ کلمه عبوری برای کاربر ریشه که مدیر سرویس دهنده می باشد، در نظر گرفته نشده است. به عنوان مدیر سرویس دهنده، نخستین و تنها تنظیم ضروری که باید بر روی سرویس دهنده MySQL انجام دهید، ایجاد یک کلمه عبور برای کاربر ریشه می باشد. به این منظور، باید با استفاده از کنسول سرویس دهنده، به آن وارد شوید. از این پس نیز برای انجام تمامی کارها و امور مدیریتی خود بر روی سرویس دهنده مانند ایجاد و مدیریت بانک های اطلاعاتی، ایجاد کاربران جدید، تنظیم مجوزهای دسترسی و غیره از این کنسول استفاده خواهید کرد که جلوتر به آنها خواهیم پرداخت. برای ورود به کنسول سرویس گیرنده MySQL ، دستور زیر را وارد کنید:
# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or g .
Your MySQL connection id is 823 to server version: 4.0.23_Debian-4-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer .
Mysql>
پس از تایپ دستور، همانطور که در کد نمونه بالا مشاهده می کنید، اعلان فرمان سرویس دهنده MySQL به نمایش در خواهد آمد. گزینه u - در دستور بالا نمایانگر نام کاربری است. در دستور بالا با استفاده از کاربر ریشه وارد سرویس دهنده شده ایم. همانطور که مشاهده می کنید، هیچ کلمه عبوری از ما در خواست نشده است. نحوه استفاده از این دستور به شکل زیر می باشد:
# mysql [OPTIONS] [database]
گزینه های مهم قابل استفاده با این دستور عبارتند از گزینه u - که در بالا شرح داده شد و نمایانگر نام کاربری است که مایل هستید با استفاده از آن به سرویس دهنده متصل شوید، گزینه p - که برای ارسال کلمه عبور و یا نمایش اعلان درخواست کلمه عبور بر روی سرویس دهنده به کار می رود. پس ا زاین دو گزینه نیز می توانید نام بانک اطلاعاتی را که مایل هستید بر روی آن کار کنید را وارد کنید.
در نخستین قدم، برای اینکه کلمه عبور ریشه را بر روی سرویس دهنده تنظیم کنیم، در کنسول MySQL باید دستورات زیر را وارد کنیم:
# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or g .
Your MySQL connection id is 9 to server version: 4.0.23_Debian-4-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer .
mysql> grant all privileges on *.* to root@localhost identified by 'password ';
Query OK, 0 rows affected (0.19 sec)
Mysql>
در دستور بالا به سرویس دهنده می گوییم که تمامی مجوزهای دسترسی را به تمامی بانک های اطلاعاتی، به کاربر root که از ماشین محلی به سیستم متصل می شود و دارای کلمه عبور password است، اعطاء کن. توجه داشته باشید که بجای password باید کلمه عبور مورد نظرتان را برای کاربر ریشه، وارد نمایید. با تایپ دستور quit از کنسول خارج شده و به پوسته فرمان باز خواهید گشت. توجه داشته باشید که در پایان تمامی دستوراتی که در کنسول MySQL وارد می کنید، باید علامت سمی کالن یا «;» را قرار دهید. اکنون مجددا سعی می کنیم تا با دستور قبل به سرویس دهنده متصل شویم:
# mysql -u root
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO )
همانطور که مشاهده می کنید، این بار دیگر امکان دسترسی به سرویس دهنده، بدون استفاده از کلمه عبور وجود ندارد. برای اینکه سرویس دهنده هنگام ورود از ما تقاضای کلمه عبور نماید، گزینه p - را به دستور فوق اضافه می کنیم. به مثال زیر توجه کنید:
# mysql -u root -p
Enter password :
این امکان وجود دارد تا کلمه عبور خود را بلافاصله و چسبیده به گزینه p - برای سرویس دهنده ارسال کنید. فقط در این صورت، کلمه عبور بر روی صفحه نمایش قابل مشاهده خواهد بود که انجام این کار را از نظر امنیتی توصیه نمی کنم.
آشنایی بیشتر با کنسول MySQL
کنسول MySQL خود دارای تعدادی فرمان داخلی می باشد که از آنها برای امور مدیریتی خود استفاده خواهید کرد. با تایپ دستور help در این کنسول، لیستی از این فرامین نمایش داده خواهد شد. به نمونه زیر توجه کنید:
mysql> help
For the complete MySQL Manual online visit :
http://www.mysql.com/documentation
For info on technical support from MySQL developers visit :
http://www.mysql.com/support
For info on MySQL books, utilities, consultants, etc. visit :
http://www.mysql.com/portal
List of all MySQL commands :
(Commands must appear first on line and end with ';' )
help (h) Display this help .
? (?) Synonym for `help '.
clear (c) Clear command .
connect (r) Reconnect to the server. Optional arguments are db and host .
edit (e) Edit command with $EDITOR .
ego (G) Send command to mysql server, display result vertically .
exit (q) Exit mysql. Same as quit .
go (g) Send command to mysql server .
nopager (n) Disable pager, print to stdout .
notee (t) Don't write into outfile .
pager (P) Set PAGER [to_pager]. Print the query results via PAGER .
print (p) Print current command .
prompt (R) Change your mysql prompt .
quit (q) Quit mysql .
rehash (#) Rebuild completion hash .
source (.) Execute a SQL script file. Takes a file name as an argument .
status (s) Get status information from the server .
system (!) Execute a system shell command .
tee (T) Set outfile. Append everything into given outfile .
use (u) Use another database. Takes database name as argument .
Connection id: 812 (Can be used with mysqladmin kill)
mysql >
دستورات مهم عبارتند از:
exit و quit برای خروج از اعلان فرمان MySQL .
system برای اجرای دستورات سیستمی و خط فرمان از داخل اعلان MySQL ,
use برای تغییر بانک اطلاعاتی قابل استفاده و فعال که فرامین SQL بر روی آن اجرا خواهد شد. برای مثال use test بانک اطلاعاتی test را آماده دریافت دستورات خواهد کرد.
دستورات دیگری را که در کنسول MySQL می توانید وارد کنید، دستورات زبان SQL می باشد. برای این منظور باید با این زبان آشنا باشید. در زیر چند مثال نمایش داده شده است:
برای ایجاد بانک های اطلاعاتی جدید:
mysql> create database mydatabase ;
برای ایجاد کاربران جدید و دادن مجوز بر روی یک بانک اطلاعاتی:
mysql> grant all privileges on mydatabase.* to user@localhost identified by 'password ';
برای نمایش بانک های اطلاعاتی موجود بر روی سیستم:
mysql> show databases ;
برای نمایش جداول موجود بر روی یک بانک اطلاعاتی خاص:
mysql> use mydatabase ;mysql> show tables ;
برای حذف یک بانک اطلاعاتی:
mysql> drop database mydatabase ;
برای حذف یک جدول موجود بر روی یک بانک اطلاعاتی خاص:
mysql> use mydatabase ;mysql> drop table mytable ;
برای حذف دسترسی یک کاربر بر روی یک بانک اطلاعاتی خاص:
mysql> revoke all privileges on mydatabase.* from user@localhost ;
همانند آنچه که در پوسته فرمان سیستم دیدید، کنسول MySQL نیز دستورات تایپ شده را در یک تاریخچه نگهداری می کند. با استفاده از کلیدهای مکان نما در این کنسول، می توانید بین این دستورات حرکت کرده و در صورت لزوم از آنها استفاده کنید.
علاوه بر کنسول MySQL ، دستوری نیز به نام mysqladmin وجود دارد که از آن می توانید برای امور مدیریتی مانند ایجاد بانک های اطلاعاتی، تنظیم مجوزهای دسترسی، تنظیم کلمات عبور و غیره استفاده کنید. برای اطلاعات دقیق تر می توانید به مستندات این دستور مراجعه کنید.
مدیریت سرویس دهنده MySQL
برای راه اندازی و توقف سرویس دهنده MySQL خود در مواقع لزوم می توانید از دستور زیر استفاده کنید. گزینه start برای راه اندازی، گزینه stop برای توقف و گزینه restart جهت راه اندازی مجدد سرویس دهنده بکار می روند:
# /etc/init.d/mysql
Usage: /etc/init.d/mysql start|stop|restart|reload|force-reload
# /etc/init.d/mysql start
Starting MySQL database server: mysqld .
Checking for crashed MySQL tables in the background .
کلیه فرامینی که در سرویس دهنده MySQL اجرا می شوند، در یک فایل ثبت رخداد به نام mysql.log که در مسیر var/log/mysql / قرار دارد، ثبت می شوند. بنابراین در مواقع لزوم می توانید این فایل را زیر نظر داشته باشید.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

امروزه با همه گیر شدن سایت های پویا، بسیاری از سرویس دهنده های وب که این نرم افزارهای کاربردی وب را اجرا می کنند، دارای تعداد زیادی بانک اطلاعاتی هستند که همانند فایل های دیگر نیاز است تا بصورت مرتب از آنها نسخه های پشتیبان تهیه شود. گاهی اهمیت نسخه های پشتیبان از بانک های اطلاعاتی از نسخه های پشتیبان فایل سیستم بیشتر است. دلیل آن هم روشن است، بسیاری از اطلاعات مهم در بانک های اطلاعاتی ذخیره می شوند نه در فایل سیستم!
در مقاله حاضر اسکریپتی را ایجاد خواهیم کرد که عمل پشتیبان گیری را بطور خودکار بر روی یک سرویس دهنده ثالث در ساعات خاصی از روز انجام دهد. اتصال به سرویس دهنده ثالث می تواند بصورت اشتراک های nfs و یا از طریق ssh صورت پذیرد.
در قدم نخست باید موارد ابتدایی و لازم برای انجام پشتیبان گیری را فراهم کرد. نخست باید بر روی سرویس دهنده بانک اطلاعاتی MySQL کاربری را ایجاد کرد که دارای حداقل دسترسی برای خواندن و ذخیره اطلاعات باشد. برای این منظور دستورات زیر را وارد می کنیم:
mainserver# mysql -u root -p
mysql> grant select,lock tables on *.* to bkuser@localhost identified by 'bkpass ';
بجای bkuser و bkpass می توانید نام کاربر و کلمه عبور مورد نظر خودتان را استفاده نمایید.
در صورتی که بخواهید تا فایل های نسخه های پشتیبان از طریق ssh در سرویس دهنده مقصد کپی شوند، باید چند کار اضافه تر نیز انجام دهید. بدلیل اینکه ارتباط باید بصورت خودکار و بدون دخالت کاربر صورت گیرد، باید عملیاتی را انجام داد تا باعث شود تا سرویس دهنده اصلی بتواند بدون نیاز به کلمه عبور به سرویس دهنده مقصد متصل گردد. برای این کار از روش ارسال کلید عمومی ssh سرویس دهنده مقصد بر روی سرویس دهنده اصلی استفاده می شود. برای ایجاد کلیک عمومی ssh بر روی سرویس دهنده مقصد، دستور زیر را وارد نمایید:
backupserver$ ssh-keygen -t dsa -f $HOME/.ssh/id_dsa -P ''
backupserver$ chmod -R 700 .ssh /
سپس فایل id_dsa.pub موجود در شاخه ssh . را در شاخه root/.ssh / سرویس دهنده اصلی با نام authorized_keys2 کپی نمایید:
backupserver$ scp .ssh/id_dsa.pub root@mainserver:/root/.ssh/authorized_keys2
بسته به شماره نسخه سرویس دهنده ssh ای که بر روی سرویس دهنده اصلی در حال اجراست، ممکن است نیاز داشته باشید تا نام فایل authorized_keys2 به authorized_keys تغییر داده شود. برای این منظور می توانید یک لینک از آن به فایل authorized_keys ایجاد کنید:
mainserver# ln -s /root/.ssh/authorized_keys2 /root/.ssh/authorized_keys
نکته مهمی که باید رعایت کنید این است که کلید عمومی یک کاربر غیر از کاربر ریشه را بر روی سرویس اصلی قرار دهید تا در صورتی که احتمالا سرویس دهنده اصلی شکسته شود، امکان دسترسی کامل نفوذگر بر روی سرویس دهنده پشتیبان فراهم نگردد. برای مثال می توانید یک کاربر با نام backup بر روی سرویس دهنده مقصد ایجاد کنید. پس از کپی کلید بر روی سرویس دهنده اصلی، مجوز آنرا برای امنیت بیشتر بر روی 600 تنظیم کنید:
mainserver# chmod 600 /root/.ssh/authorized_keys *
در مرحله بعدی شاخه ای را که فایل های پشتیبان در آن ذخیره خواهد شد را بر روی سرویس دهنده مقصد ایجاد می کنیم:
backupserver$ mkdir /home/backup/bkstore /
اکنون تمامی مقدمات برای بکارگیری اسکریپت پشتیبان گیری از بانک اطلاعاتی انجام شده است. اسکریپت مورد استفاده ما دارای ساختاری به شکل زیر است:
# !/bin/sh
DATESTAMP="`date +%Y-%m-%d ` ”
echo -n "Processing Auto DB Backup...”
echo
cd /var/lib/mysql /
for x in *
do
if [ $x = "my.cnf" ]; then
echo $x
echo "invalid DB...”
else
echo $x
echo "valid DB...”
mysqldump -u bkuser -pbkpass $x > /root/dbs/tmp/$x.$DATESTAMP.sql
fi
done
cd /root/dbs /
rm `find tmp/ -size 0 `
echo "Compressing DB Backups...”
tar -czf dbs.$DATESTAMP.tar.gz tmp / *
rm tmp/*.sql
echo "Copying DBs...”
scp dbs.$DATESTAMP.tar.gz backup@backupserver:/home/backup/bkstore /
cd
همانطور که مشاهده می کنید، نحوه عمل این اسکریپت بسیار ساده است. اسکریپت وارد شاخه var/lib/myslq / که در آنجا بانک های اطلاعاتی ذخیره می شود شده و با استفاده از یک حلقه ساده for و دستور mysqldump شروع به پشتیبان گیری از بانک های اطلاعاتی می کند. در نهایت نیز تمامی فایل ها را بصورت فشرده در آورده و با استفاده از دستور scp بر روی سرویس دهنده مقصد کپی می کند. در صورتی که سرویس دهنده مقصد با استفاده از اشتراک nfs به سرویس دهنده اصلی متصل بود، تنها به یک دستور cp اکتفا می کردیم و نیازی به بکارگیری کلیدهای عمومی ssh وجود نداشت ولی امنیت در هنگام انتقال اطلاعات در حالت دوم یعنی بکارگیری ssh بیشتر است.
اسکریپت بالا را با نامی مانند mysqlbk در مسیر root / ذخیره کرده و مجوز اجرا به آن می دهیم:
mainserver# chmod +x mysqlbk
برای اینکه عملیات پشتیبان گیری بصورت خودکار و در ساعت خاصی از روز انجام گیرد، می توانیم از cron استفاده کنیم. دستور زیرا را تایپ کرده:
mainserver# crontab -e
سپس خط زیر را وارد می کنیم:
0 3 * * * /root/mysqlbk
از این پس هر روز در ساعت ۳ صبح عملیات پشتیبان گیری و کپی بر روی سرویس دهنده مقصد بصورت خودکار انجام خواهد شد.
برای افزایش ضریب اطمینان می توان اسکریپت خودکاری را بر روی سرویس دهنده مقصد تعبیه کرد که فایل های پشتیبان را به محل امن دیگری انتقال دهد.
با ایجاد تغییرات کوچکی در اسکریپت فوق می توان از آن برای پشتیبان گیری دایرکتوری های خانگی کاربران نیز استفاده کرد.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri
مقدمه
مدیریت پایگاه داده ها (چه داده های متنی یا تصویری یا غیره) شاید مهمترین كاربردی بوده است كه همواره از كامپیوترهای تجاری خواسته شده است. به همین دلیل در چند سال گذشته قبل از ظهور محیطهای مبتنی بر رابط گرافیكی شاهد حكومت زبان cobol بر امپراطوری كامپیوتر بودیم.
بعد از این امر ظهور برنامه dBase و فروش حیرت آور آن خبر از همین احتیاج مبرم به پایگاه داده ها می داد.
باز در این عرصه نیز شركت مایكروسافت بیكار ننشست و Access كه كاستیها و اشكالات برنامه های قبلی را برطرف نموده و كار با داده ها را به صورت فوق العاده ای راحت تر میکند عرضه کرد.
این برنامه كه همراه با كار در محیط كاملا گرافیكی ویندوز حتی قابلیت نصب در شبكه و internet را نیز دارد بدون شك یك نیاز شركتهای تجاری, برنامه نویسان, طراحان صفحات وب و حتی برای اشخاص معمولی برای كنترل داده ها و اطلاعات خود بوده است.
ما در این دوره آموزشی شما را با قابلیت access آشنا كرده و شاید اگر اغراق نكرده باشم شما را استاد این برنامه بی نظیر خواهیم كرد شما نیز لحظه به لحظه به آشنایی با قابلیتهای این برنامه مطمئنا مشتاق یاگیری هرچه سریع آن خواهید شد.
قابل ذكر است كه ما در این دوره برنامه اكسس 2000 را برای آموزش انتخاب كرده ایم كه البته نسخه های دیگر این برنامه فرق چندانی با نسخه 2000 آن ندارد و شما می توانید با یادگیری این نسخه با ان نیز به راحتی كار كنید. (البته توصیه خود من به استفاده از نسخه 2000 است) آشنایی با اكسس
اكسس كه یكی از برنامه های موجود در بسته نرم افزاری آفیس( Microsoft Office ) است برای ساماندهی و كنترل و مدیریت پایگاه داده ایجاد شده است.
این برنامه دارای قابلیتهای بسیار است , مانند ایجاد صفحه ورود اطلاعات به شكل دلخواه.
به عنوان مثال وقتی شما می خواهید اطلاعات موجود در یك چك را در كامپیوتر خود ذخیره كنید شما با استفاده از برنامه اكسس می توانید صفحه ای درست همانند صفحه چك ایجاد كنید و اطلاعات را به صورت كاملا گرافیكی در آن وارد كنید.
شما پس از ایجاد پایگاه داده هایتان حتی می توانید از آنها گزارش گرفته و یا در بین اطلاعات خود جستجو كرده البته تمامی این امكانات را شما با دستان قدرتمند خود ایجاد خواهیدكرد.
از موارد استفاده برنامه اكسس به طور شهودی می توان به استفاده آن در قسمت حسابداری یك شركت و یا نگهداری اطلاعات اشخاص عضو در سایتتان و حتی نگهداری اطلاعات كارمندان (حتی عكس آنها) و موارد بسیار متنوع دیگر اشاره کرد.
شما پس از ایجاد این پایگاه داده حتی می توانید آن را در شبكه در اختیار دیگران قرار داده یا بر روی آن كلید رمز گذاشته یا حتی در سطح كاربران مختلف مقدار دسترسی هر كاربر را تعیین كنید.
روش ادامه درس ما در جلسات بعدی به صورت زیر خواهد بود:
ابتدا آشنایی با محیط اكسس و تسلط كامل بر آن
كار با help برنامه(به صورت مختصر)
آشنایی با پایگاه داده های نمونه
بررسی و كار با اجزای اصلی
طراحی یك پایگاه داده جدید
كار با جدولها
كار با داده ها
كار با بازجست ها ( Query )
كار با فرمهای ورود اطلاعات
كار با گزارشها
خودكارسازی با ماكروها
برنامه نویسی با مدولها
كاربرد پیشرفته اجزای اكسس
حفظ امنیت در پایگاه داده
كار با برنامه های كمكی اكسس
برای مطالعه ی این دوره ی آموزشی نیاز است کاربران محترم آشنایی مقدماتی با محیط Windows داشته باشند .
جهت نصب و اجرای نرم افزارهای Office که اکسس نیز شامل آن می شود ، نیاز به سیستمی با مشخصات ذیل می باشد :
- حداقل سیستم مورد نیاز پنتیوم 233
- 16 مگابایت Ram
- حدود 600 مگا بایت فضای آزاد
شروع کار با اکسس
در درس قبل با قابلیتها و كاربردهای اكسس آشنا شدید و ضرورت استفاده از این برنامه در جهات مختلف زندگی آشنا شدید و با توجه به كاركرد راحت اكسس و شی گرا بودن آن اكسس نسبت به برنامه های دیگر مدیریت پایگاه داده ها امتیازات بیشتری دارد.
مفهوم شی گرائی:
وقتی كه در مورد یك برنامه از مفهوم شی گرایی صحبت می كنیم یعنی در هنگام كار با آن همواره با شی های مختلف سروكار دارید و حتما لازم نیست كه زبان برنامه نویسی خاصی بلد باشید یعنی در واقع شی گرایی كنترل و مدیریت اشیا و نحوه قرارگیری آنها به جای استفاده از دستورات است. به عنوان مثال وقتی ما می خواهیم در محیطی مانند faxpro یك دكمه ایجاد كنیم كه هنگام فشاردادن آن اطلاعات كاربری مشتری در جدول ثبت شود باید دستورات بسیار پیچیده و ویژه ای بنویسیم ولی در محیط اكسس كافی است از قسمت ابزار با استفاده از شی دكمه (وسیله ای جهت ساخت دكمه های مختلف) این دكمه را به راحتی ایجاد می كنیم .
آغاز كار با اكسس:
شما بعد از نصب بسته نرم افزاری آفیس می توانید با رفتن به قسمت start سپس قسمت programs و انتخاب microsoft access وارد محیط اكسس شوید. البته بسته به نحوه نصب شدن برنامه ممكن است برنامه اكسس در قسمت ذكر شده نباشد و به صورت معمول این برنامه در این قسمت قرار می گیرد.
با وارد شدن به محیط اكسس با پنجره ای مانند شكل 21 ظاهر می شود كه به شما امكان می دهد تا آنچه را كه می خواهید انجام دهید انتخاب كنید.گزینه های موجود در این قسمت به ترتیب زیر است:
1- Blank access database : با استفاده از این گزینه شما می توانید یك پایگاه داده جدید ایجاد كنید. 2
- access database wizards : با استفاده از این گزینه شما می توانید با استفاده از جادوگر اكسس كه كار شما را بسیار آسانتر می كند یك پایگاه داده بسازید (بعدا به طور مفصل توضیح خواهم داد)
3- open an exiting file: با این گزینه شما می توانید پایگاه داده ای را كه قبل ایجاد كرده اید برای ایجاد تغییرات دوباره باز كنید.
4- از كادر زیر قسمت 3 شما می توانید پایگاه داده ای را كه به تازگی برروی آن كار كرده اید باز كنید. بعد از انتخاب گزینه مورد نظر شما باید با زدن Ok به مرحله بعدی بروید. اگر هر خواستید با زدن دكمه Cancel به محیط اكسس وارد شوید. (فعلا برای آشنایی با محیط اكسس Cancel را بزیند)
ضمن قابل ذكر است كه برای ساختن پایگاه داده جدید آنرا باید در همان ابتدا ذخیره كنید و اینگونه نیست كه بعد از پایان كار آنرا ذخیره كنید.
آشنایی با محیط كار:
محیط كار اكسس همانطور كه در شكل 22 می بینید بسیار شبیه محیطهای دیگر ویندوز است و كار با آن بسیار آسان است. حال به صورت كوتاه به معرفی قسمتهای مختلف محیط كار می پردازیم:
- میله عنوان (Title bar): عنوان پایگاه داده در حال كار در این قسمت ثبت می شود و همچنین كنترل پنجره اكسس از همین قسمت صورت می گیرد(چون فرض ما بر این است كه شما بر محیط ویندوز و كنترل پنجره ها مسلط هستید نیاز به توضیح بیشتر نیست)
2- میله منو (Menu bar): در این میله شما به وسیله منوهای مختلف اقدام به ایجاد. كنترل و ویرایش پایگاه داده می كنید. در زیر توضیح كوتاهی در مورد هر منو آمده است.
------------------
الف) File (فایل): فرامین لازم برای بازكردن و بستن پایگاه داده. دریافت داده از سایر پایگاه داده ها. ذخیره داده ها. تغییر خصوصیات پایگاه داده. چاپ و غیره ب) Edit (ویرایش): فرامین لازم برای ویرایش و وارد كردن داده ها
پ) View (مشاهده): فرامین لازم برای انتخاب اجزا مختلف پایگاه داده. تغییر خصوصیات پایگاه داده فعال و غیره را در اختیار شما می گذارد.
ت) Insert (درج): فرامین لازم برای درج اقلام مختلف پایگاه داده
ج) Tools (ابزارها): فرامین لازم برای اجرای برنامه های كمكی مختلف. تحلیل پایگاه داده. امنیت و گزینه های متفاوت پیشرفته پایگاه داده
چ) Windows (پنجره ها): فرامین لازم برای تغییر آرایش پنجره ها در محوطه كاری پایگاه داده
ح) Help (كمك): دسترسی به كمك مستقیم
-------------------
3- میله ابزار (Tool bar): در این قسمت تعدادی از فرامین ضروری و پراستفاده در برنامه قرار دارد. 4- محوطه كاری پایگاه داده: در این محوطه بزرگ شما بر روی پایگاه داده كار می كنید و داده ها را به آن می افزایید و آنها را ویرایش می كنید.
5- دستیار: این دستیار برای آن است كه شما سوالات احتمالی ممكن خود را به طور مستقیم از او پرسیده و او با جستجو در خود برنامه و همچنین اینترنت تا حد ممكن جواب شما را پیدا كند(البته به صورت انگلیسی)
6- میله وضعیت: در میله وضعیت اطلاعاتی راجع به كاری كه انجام می دهید. نمایش داده می شود. و همچنین خطاها را مشاهده خواهید كرد.
توجه به این نكته ضروری است كه در بعضی مواقع كه امكان استفاده از بعضی از فرامین موجود نمی باشد آنها به صورت غیر فعال در می آیند.
در اینجا باید تین نكته هم ذكر شود كه شما در هنگام انتخاب فرامین از منوها هم می توانید با استفاده از ماوس آنها را انتخاب كنید و هم از كلیدهای میانبر استفاده كنید. روش كار كلیدهای میانبر با استفاده از كلیدهای Ctrl و Alt و حرفی كه در هر فرمان زیر آن خط كشیده شده است شما می توانید به صورت خیلی سریع به فشار همزمان آنها به فرمان دسترسی پیدا كنید. این قابلیت هنگامی مفید است كه شما در محیط اكسس بسیار ماهر شده اید كه دیگر نیاز به استفاده از ماوس ندارید. خروج از محیط اكسس:
شما می توانید با انتخاب فرمان Exit از منو File از محیط اكسس خارج شوید.
دسترسی به راهنما:
راهنمای برنامه برای كسانی كه آشنایی كامل به زبان انگلیسی دارند می تواند مانند یك مرجع كامل و معتبر باشد مثلا هرگاه در مورد عملكرد پایگاه داده. طراحی جدول. یا تعریف بازجست مشكل داشتید می توانید از راهنمای برنامه كه به زبان انگلیسی ساده و روان نوشته شده استفاده كنید و مسلما در مورد سوال شما چه در خود برنامه یا تحت وب جوابی پیدا خواهد شد. در اكسس راههای مختلفی برای دسترسی به راهنما وجود دارد كه متداولترین آنها استفاده از منو Help است.كه فرمامین موجود در این منو را شرح می دهیم:
1- Microsoft access Help : این فرمان دستیار را فعال می كند در صورتی كه دستیار فعال باشد وارد سیستم راهنمایی می شود. شما می توانید با انتخاب این گزینه سوالات خود را از دستیار بپرسید و او نزدیكترین جواب را به سوال شما خواهد داد این امكان بسیار می تواند برای شما مفید باشد و دستیار مانند یك شخص ماهر به تمامی سوالات شما به طریقی پاسخ خواهد داد.
2- Hide The Office Assistant: شما می توانید با استفاده از این فرمان دستیار را مخفی كنید و این در مواقعی به كمك شما می آید كه دستیار قدرت دید شما در محیط را كاهش دهد.
3- What`s This: با استفاده از این گزینه ماوس شما به یك علامت سوال تبدیل می شود و هر كجایی از محیط كه كلیك كنید در مورد آن شما را راهنمایی می كند.
4- Office On The Web: به كمك این گزینه می توانید به سایت ماكروسافت رجوع كنید و آخرین امكانات و اصلاحات در برنامه و همچنین متداولترین سوالها را بپرسید.
5- Detect and Repair: با استفاده از این گزینه اگر در برنامه اكسس شما ایرادی باشد به صورت اتوماتیك رفع می شود.
6- About Microsoft Access: در مورد نسخه فعلی اكسس اطلاعاتی در اختیار شما می گذارد.
یكی دیگر از راهنمایی ها كه در اكسس موجود است راهنمای شناور است به این ترتیب كه با نگه داشتن نشانه ماوس بر روی یك فرمان به مدت چند ثانیه اسم و شاید راهنمایی كوچكی در مورد آن فرمان ظاهر شود. با توجه به اینكه بیشتر خوانندگان این درس با محیط ویندوز و راهنمای آن آشنا هستند و راهنمای اكسس نیز مانند آن است من نیاز بیشتری به توضیح نمی بینم.
سیری در پایگاه داده های نمونه:
در اكسس چهار پایگاه داده نمونه وجود دارد كه می توانید آنها را باز كرده. بررسی نموده و یا مورد استفاده قرار دهید.(البته این نكته قابل ذكر است كه شما حتما باید در موقع نصب این پایگاهها را انتخاب كرده باشید تا نصب شوند وگرنه با قراردادن CD در درایو و نصب دوباره آنها كار را دنبال كنید) این پایگاهها برای كسانی كه تازه شروع به كار با اكسس می كنند بسیار مفید است و چیزهای مفیدی را در برمی گیرد.
بعد از نصب پایگاه داده نمونه شما می توانید با استفاده از منو File و گزینه Open به پوشه Samples در جایی كه اكسس را نصب كرده اید رفته و پایگاه داده را بازكنید(امكان دارد این پایگاه داده به صورت پیش فرض در پایین ترین قسمت منو File موجود باشد) ما در این درس به توضیح پایگاه داده Northwind خواهیم پرداخت.
قبل از شروع كار باید این نكته را ذكر كنم كه تمامی فایلها و جدولهای اكسس در فایلی با پسوند MDB ذخیره می شود.
پایگاه داده Northwind امكان تمرین با یك نرم افزار پایگاه داده كامل را به شما می دهد. این پایگاه داده یك نرم افزار كنترل موجودی برای شركت فرضی Northwind Traders است. بعد از باز كردن این پایگاه داده كه ممكن است مدتی طول بكشد. صفحه ابتدایی ظاهر می شود كه شما می توانید با كلیك روی Ok این پنجره را رد كنید. بعد از این كار پنجره Database این پایگاه نشان داده خواهد شد. این پنجره جایی است كه اكثر كارهای اكسس در آن انجام می شود. این پنجره هفت شاخص دارد كه شما را به شش جز اصلی Access می برد. این پنجره در شكل 31 نشان داده شده است.
برای حركت در صفحات پنجره Database با ماوس برروی شاخصهای كناری پنجره كلیك كنید. كلماتی كه در هر صفحه مشاهده می كنید. معرف جداول. پرسانه ها. فرمها. گزارشها. ماكروها و برنامه های خاص این پایگاه است. مثلا نام یكی از جداول پایگاه داده Shippers است. اگر برروی هر یك از جداول دوبار كلیك كنید جدول مورد نظر باز می شود.
دیگر موارد را نیز می توانید با دوبار كلیك باز كنید به جز ماكروها كه این اشیا به دلیل اینكه شما تازه كار هستید از دسترسی شما حفاظت می شوند و من پیشنهاد می كنم زیاد با آنها ورنروید و این كار را به زمانی كه به طور كامل با عملكرد آنها آشنا شدید موكول كنید.
هنوز انتظار درك پایگاه داده های نمونه را به طور كامل نداشته باشید مثلا با كلیك زدن مكرر به روی جدولOrders. Access جدول مورد نظر را نشان می دهد كاری كه با این جدول می توانید انجام دهید این است كه به سفارشات نگاه كنید. جدول مانند یك صفحه گسترده الكترونیكی كه سطر و ستون دارد كار می كند. با جدول كارهای متنوعی می توانید انجام دهید اما در این مقطع فقط سعی كنید با اكسس. منوهای آن و صفحه رابط آن آشنا شوید. در ادامه دروس جزئیات لازم برای تسلط شما بر هر یك از این موارد ذكر خواهد شد. شما در این مرحله به تمامی فرمها و جدول یك نگاهی بیاندازید و سعی كنید كه با انها بیشتر از قبل آشنا شوید.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : چهارشنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

این مقاله نحوه ایجاد قابلیتی را می آموزد که ضوابط فیلتر کردن را از طریق یک فرم جدولی اکسس 2003 وارد کنید و دکمه ای بنام Query داشته باشید تا فیلتر اعمال شود.
این فیلتر 4 تکست باکس بنام های txtFirstName ، txtMiddleInitial ، txtLastName وtxtSSN دارد که جدول دیتابیس member نام دارد و فیلد هایی بنام های First ، Mi ، Last و SSNدارد .
فانکشن
AttachAnd
که برای ساخت جمله فیلتر کننده
SQL
استفاده میشود :
"First='David' and Last='Nishimoto'".
ساخت فانکشن :
Option Compare Database
Dim ssql
1- کاربر دکمه query را فشار داد
2-یا اینکه شما میتوانید یک دکمه برای رویداد exit قرار دهید.
Private Sub cmdQuery_Click()
BuildQueryCommand
End Sub
3- فانکشن BuildQueryCommand یک فیلتر با ضوابطی که از تکست باکس ها دریافت کرده میسازد
4 – قوانین فیلتر اعمال شد .
Private Function BuildQueryCommand()
sSQL = ""
Call AttachAnd("First", "'" & txtFirstName & "'")
Call AttachAnd("Mi", "'" & txtMiddleInitial & "'")
Call AttachAnd("Last", "'" & txtLastName & "'")
Call AttachAnd("SSN", "'" & txtSSN & "'")
Filter = sSQL
FilterOn = True
End Function
ضوابط چندگانه یا تکی را بررسی کنید
Single: "first='David'"
Multiple:"First='David' and Last='Nishimoto'"
Private Function AttachAnd(sField, sValue)
If sValue = "''" Or sValue = "" Then
Exit Function
End If
If Occurances(sSQL, "=") = 0 Then
sSQL = sSQL & sField & "=" & sValue
Else
sSQL = sSQL & " and " & sField & "=" & sValue
End If
End Function
رخدادهای یک طرح را در عبارت SQL بشمارید
Private Function Occurances(sSQL, sOperator)
Dim offset
Dim iCount
offset = 1
While offset 0
offset = InStr(offset + 1, sSQL, sOperator)
If offset > 1 Then
iCount = iCount + 1
End If
Wend
Occurances = iCount
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
|
|