backup گرفتن اتوماتیک از mysql

بک آپ گرفتن از دیتابیس یکی از مهترین کارهایی که ادمین دیتابیس باید انجام بده، این روشی که الان می خوام معرفی کنم برای دیتابیس های کوچک و متوسط MySQL خیلی خوبه.

اسکریپت bash بک آپ گرفتن از دیتابیس چند سال پیش نوشتم و گذاشتم تو گیت ها، می تونید این اسکریپت دانلود کنید و بزارید روی سرور و با cron برای بک آپ گرفتن اتوماتیک ازش استفاده کنید.

45 5 * * *     root /backup/mysql.sh >> /backup/mysql_backup.log&

کد بالا اگر توی cron بزارید هر روز ساعت ۵:۴۵ صبح از دیتابیس شما بک آپ میگیره .

با استفاده از متغیر skip بعضی از دیتابیس ها و با متغیر skiptable تیبل خاصی از دیتابیس، از پروسه بک آپ گرفتن استثناء کنید. متغیر dest مسیر ذخیره سازی فایل ها مشخص می کنه، چون به ازای هر روز و هر دیتابیس یک فولدر ایجاد می کنه و به هر دیتابیس جدا توی فایل بک آپ میگیره و البته فایل هارو فشرده هم میکنه.
البته ورژن جدیدتری که فایل هارو به سرور FTP انتقال بده نوشتم که یه روز push می کنم. و البته برای بک آپ گرفتن از دیتابیس های بزرگتر هم راه هایی مثل Percona XtraBackup وجود داره که یه مطلبی هم در مورد اون می نویسم.

پروژه های وطنی

یکی از همکارامون تو دانشگاه شریف درس خونده (و میخونه) امروز با هم صحبت میکردیم ، شخصی به نام آیدین نصیری‌شرق معرفی کرد که از دانشجوهای دانشگاه شریف بوده (یا هست) که TA  (Teacher Assistant) بوده.

ایشون چند تا پروژه ی شخصی هم نوشته که Phormer یکی از اونهاست. Phormer یک گالری عکس با PHP که بدون استفاده از دیتابیس نوشته شده و همه ی اطلاعات تو فایلهای XML ذخیره میکنه(FlatPress که یادتون هست).اینارو گفتم که بگم بعد از مدتها یک کد PHP خوب دیدم که تقریبا همه ی قسمتهاش توسط یک ایرانی نوشته شده (خسته شدم اینقدر فریم ورک های پیچیده و  سیستم های مدیریت محتوا دیدم).

چون آخرین ورژن این گالری سال ۲۰۰۷ منتشر شده و تو اون تاریخ  OOP تو PHP شاید کاربرد کمی داشته، ولی تقریبا ریزترین موارد تو این پروژه رعایت شده. جدای از اینکه نوشتن یه پروژه ی مجزا به این شکل تو دوره ای که همه سعی می کنند پروژه های کوچیک به CMS های بزرگ لینک کنند درست هست یا نه ولی شدیدا به همه ی دوستانی که تجربه ی کمی تو کد نویسی دارند توصیه میکنم به کدهای این پروژه دقت کنند.

کد قبلی که دیده بودم و خیلی ساده و تمیز نوشته شده بود و نمونه ای پایه ای! برای آموزش OOP بود پروژه ی CMS Detector که حامد افشار زحمت کشیدند و کدهای جاوا اسکریپت اکستنشن Chrome Sniffer گوگل کروم به PHP تبدیل کردند.

اگه شما هم پروژه ای میشناسید که قسمت زیادیش توسط یک ایرانی نوشته شده و Open Source هم هست، خوشحال میشم اسمشو بدونم.

تگ select در دوجو

تولکیت دوجو برای تگ<select> معادلهای گوناگونی  داره که تفاوتشون توی مقادیر option-ها و نحوه ورود اطلاعات از سمت یوزر هست:
<select  style="width: 150px;" data-dojo-type="dijit.form.Select" >

این ویجت مثل تگ <Select> عمل می کنه یعنی لیبل option-ها با value آنها تفاوت داره.

width:
در حالت پیش فرض عرض ویجت برابر با عرض option-ی هست که انتخاب شده ولی برای فیکس کردن عرض باید از style استفاده کنیم.مثلا:
maxHeight:
یکی از مهمترین attribute این ویجت  maxHeight هست که ارتفاع لیست حاوی option-ها رو مشخص می کنه برحسب پیکسل ولی نباید لفظ px را نوشت.
اگر  ارتفاع لیست حاوی option-ها بلندتر از مقدار مشخص شده در maxHeight  بود  ، scroll کنار لایه ظاهر میشه.
forceWidth:
این attribute پهنای  لیست option-هارو مشخص می کنه .یعنی  اگه می خواین پهنای لیست option-ها دقیقا برابر با پهنای ویجت باشه این attr را true می کنید و اگه می خواین پهنای لیست option-ها در حالت حداکثری باشه و همه option-ها به طور کامل دیده شوند،false (به صورت پیش فرض هم false هست)
emptyLabel:
اگر emptyLabel را ست کرده و ویجت select-ی بدون هیچ option-ی بسازیم، emptyLabel نمایش داده می شود.
separator:
برای افزودن جداکننده بین option-ها (خطی شبیه <hr>)از این کد استفاده می کنیم:
<option type="separator"></option>
Styled options:
در این ویجت برعکس <select> می تونیم option-هایی با رنگ یا فونت متفاوت بسازیم یعنی داخل <option> می تونیم از <li> <strong> <font> یا … استفاده کنیم و option-هایی با استایل متفاوت داشته باشیم.
addOption:
برای اضافه کردن یک یا چند option ، می تونیم از این متد استفاده کنیم
dijit.byId('myId').addOption({value: 'myValue',label: 'Displayed'});
:get
مقدار انتخاب شده توسط کاربر بوسیله دستور
dijit.byId('myId').get('value')
و لیبل گزینه انتخاب شده توسط کاربر
dijit.byId('myId').get('displayedValue')
:set
برای تنظیم attribute های این ویدجت از این تابع استفاده میشه.
متدهای closeDropDown و openDropDown و toggleDropDown برای باز و بسته کردن لیست option-ها توسط جاوا اسکریپت و چند متد دیگه مثل toString و watch و onBlur و onChange و onClick و onClose و onDblClick و onFetch و onFocus و onHide و onKeyDown و onKeyPress و onKeyUp و onMouseDown و onMouseEnter و onMouseLeave و onMouseMove و onMouseOut و onMouseOver و onMouseUp بسیار مفید هستند.

dijit.form.FilteringSelectapi

این ویجت مثل تگ <Select> عمل می کنه یعنی لیبل option-ها با value آنها تفاوت داره و فرق اصلی اون با تگ <select> و ویدجت Select در نحوه انتخاب مقادیر توسط کاربر هست که می تونه از لیست option-ها هم با موس و هم با کیبورد مقداری انتخاب کنه.

همه ی attribute-های قبلا گفته شده برای این ویجت به درستی عمل می کنه و چند attribute مفید دیگه:

hasDownArrow:

این attribute که پیش فرض مقدار true دارد برای نمایش “فلش رو به پایین” هست،در صورتی که مقدار  false وارد شود این ویدجت مثل یک textbox ساده به نظر میاد که خاصیت autoComplete دارد.

highlightMatch:

برای هایلایت کردن مقادیر وارد شده ی کاربر در لیبل option-های موجود،که به صورت پیش فرض first تنظیم شده (و تقریبا شبیه field like string% در mysql عمل می کند)

اگر مقدار all ست شود و queryExpr=”*${0}*” نیز اضافه گردد شبیه field like %string% در mysql عمل می کند.

intermediateChanges:

فرض کنید به  onChange این ویدجت تابعی connect شده باشد،اگر intermediateChanges برابر true باشد با هر بار تغییر مکان در لیست option-ها تابع connect شده اجرا می شود.مقدار پیش فرض این false ، attribute  است.

searchDelay:

تاخیر بر حسب میلی ثانیه بین زمانیکه کاربر چیزی تایپ می کنه و دوجو شروع به جستجو در option-ها می کند.

attribute-های مفید دیگری مثل trim و selectOnClick و scrollOnFocus و ignoreCase وجود دارد.


dijit.form.ComboBox – api

این ویجت مخلوطی از تگ Select و input هست،یعنی option-های این ویجت value ندارد

این سه ویدجت تقریبا همه ی نیازهای یک برنامه نویس تامین میکنه ولی من شخصا ویدجتی می خوام که option-هاش value داشته باشند و در عین حال یوزر بتونه مقدار جدید اضافه کنه.که تو نوشته بعدی این کار انجام میدیم.

dojo.keys

دیروز داشتم با docs.google.com کار می کردم که طبق عادت Ctrl+s زدم و خیلی قشنگ صفحه ذخیره شد و پنجره ی Save as مرورگر ظاهر نشد. به نظرم خوب اومد که برای CRM جدید شرکت از short cut های کیبورد استفاده کنم.
دوجو دستوری به نام dojo.keys داره که وظیفش دادن کد کلیدهای کیبورد و میتونید با کلید فشرده شده مقایسه کنید.

خروجی onkeypress event ،آبجکتیست که چند متغیر ( ctrlKey, altKey, shiftKey, metaKey ) همیشه داره و با مقادیر true یا false  مشخص میکنه اون کلید ها همزمان فشار داده شده یا نه.

	dojo.ready(function () {
		var handleEnterKey = function (e) {
			console.log(e);
			if (e.ctrlKey == true && e.charOrCode == 'f') {
				alert('Ctrl+f');
				dojo.stopEvent(e);
			}else if (e.ctrlKey == true && e.charOrCode == 's') {
				alert('Ctrl+s');
				dojo.stopEvent(e);
			}else if (e.charOrCode == dojo.keys.ENTER) {
				alert('ENTER');
				dojo.stopEvent(e);
			}

		}
		dojo.connect(dojo.doc, "onkeypress", handleEnterKey);
	});

استفاده از dojo.keys:

jquery.one در دوجو

در جی کوئری تابعی به نام one داریم که باعث اجرا شدن کد فقط برای یکبار می شود.این تابع متاسفانه در دوجو موجود نیست ولی براحتی با چند خط ساده پیاده سازی می شود.

var handle = dojo.connect(dojo.byId("Button1"),"onclick",function(e){
    alert("Button1 : This will be displayed only once.");
    dojo.disconnect(handle);
});

jquery.one with dojo toolkit:

 

dojo.disconnect <->  jquery.unbind

dojo.connect <->  jquery.bind

jquery.one