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

۹ مرداد ۱۳۹۰

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

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

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

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

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

تگ select در دوجو

۱ اردیبهشت ۱۳۹۰
تولکیت دوجو برای تگ<select> معادلهای گوناگونی  داره که تفاوتشون توی مقادیر option-ها و نحوه ورود اطلاعات از سمت یوزر هست:
dijit.form.SelectAPI
این ویجت مثل تگ <Select> عمل می کنه یعنی لیبل option-ها با value آنها تفاوت داره.

width:
در حالت پیش فرض عرض ویجت برابر با عرض option-ی هست که انتخاب شده ولی برای فیکس کردن عرض باید از style استفاده کنیم.مثلا:
<select  style="width: 150px;" dojoType="dijit.form.Select" >

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.ComboBoxapi

این ویجت مخلوطی از تگ 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);
	});

Try It:

jquery.one در دوجو

۲ خرداد ۱۳۸۹

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

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


Try It:






dojo.disconnect <->  jquery.unbind

dojo.connect <->  jquery.bind

jquery.one

برنامه نویس کیست؟

۲۲ بهمن ۱۳۸۸

نوشته های طنز مختلفی در مورد ویژگیهای شخصیتی و رفتارهای عمومی برنامه نویس ها منتشر شده که بیشتر با نگاه نویسنده اصلی اون مطلب به خودش و یا همکاراش بوده ، البته رفتارهای عجیب مختص برنامه نویس ها نیست و تقریبا در خیلی از افرادی که برای چیره دست شدن درزمینه ی کاری خود در اوایل کار احتیاج به تمرینات مداوم که اغلب در تنهایی انجام می گیرد دیده می شود.خیلی از شعرا یا نویسنده ها ظاهر مناسبی ندارند و شاید تا دیر وقت بیدار بمانند ، اغلب نقاش ها به ظاهر خود اهمیتی نمی دهند ، نوازنده های زیادی هستند که در شب و در زیر زمین ها تمرین می کنند و بعضی از نوازنده ها تیک ها ی خیلی خاصی در موقع اجرای موسیقی دارند.

همه ی این افرادی که گفتم در محیط های کاری نامرتب فعالیت می کنند و اغلب به چیزی اعتیاد دارند مثل چای ، قهوه ، سیگار یا … ، روابط اجتماعی آنها ضعیف و شاید به سلامت و غذای خود اهمیت نمی دهند و احتمالا هیچ فعالیتی از نظرشان نمی تواند مهمتر از تمرین آنها باشد.

اکثر ویژگیهای ذکر شده برای اغلب برنامه نویسان صدق می کند:

برنامه نویس موجودیست زنده که اغلب بصورت نشسته با کمی خمیدگی روبروی خود را نگاه می کند. این موجود توانایی بسیار زیادی در گیر دادن به یک موضوع و پلک نزدن را داراست. بیشتر طول عمر خود را بدون تحرک سپری می کند و فقط انگشتانش دارای فعالیت بسیار زیاد هستند. غالبا بصورت انفرادی یافت می شود و در پاسخ به مخاطب همواره می گوید: چی؟ ??? آنها شب زیست هستند. بین یک شاخه گل رز و یک تکه پارآجر تفاوتی قائل نمی شود و دنیای وی فقط نیم متر جلوتر از چشمان است.


دست نوشته های صالح سوزنچی > چگونه یک برنامه نویس موفق شویم

برنامه نویس موفق هیچ وقت سر وقت در محل کارش پیدایش نمیشود
معنای نیمه شب ها برای یک برنامه نویس با نیمه شب انسان های عادی تفاوت دارد . نیمه شب برای یک برنامه نویس یعنی ۱۰ صبح برای یک انسان عادی
یک برنامه نویس همیشه تعدادی لغات تخصصی در آستین دارد که میتواند با سر هم کردن آنها دیگران را گیج کند
برای یک برنامه نویس هیچ راه حلی بالاتر از Restart کردن وجود ندارد
نام بیل گیتس برای هر برنامه نویس موفق مقدس است و معبدش مایکروسافت و گوگل میباشد.
برنامه نویس موفق فقط و فقط با لب تاپ خود عشق بازی میکند.
یک برنامه نویس موفق میداند طعم قهوه وقتی سیگاری بر گوشه لب خود داری چه مفهمومی دارد.
یک برنامه نویس موفق اکثراً قهوه و چایی ولرم مینوشد.
برنامه نویسی موفق است که کلمه نظم را خودش معنا کرده باشد
اتاق و محل کار یک برنامه نویس موفق هیچگاه مرتب نیست بلکه تابع معنای نظم زندگیش است
یک برنامه نویس موفق میداند که فست فود تنها غذای جسم اوست و یک موزیک متالیکا بخصوص مال ۱۹۹۲ غذای روحش
یک برنامه نویس موفق به ندرت عصبانی میشود ولی وای به آن لحظه که عصبانی شود.
یک برنامه نویس موفق دختران زیادی را در زندگی خود داشته است ولی فقط یکی از آنها بوده که او را میفهمیده ولی او اکنون نیست
برنامه نویس موفق در هر لحظه میتواند کل کل کند ولی معنای باخت را هرگز نچشد.
برنامه نویس موفق هیچگاه خواب زن های برهنه را نمیبیند
همیشه مشکوک است ولی خود را آرام نشان میدهد.
یک برنامه نویس موفق همیشه با دیوان شمس لاس میزند ولی همیشه هم فاصله اش را با آن حفظ میکند
اوج زندگیش را در سن ۱۸ تا ۲۶ سالگی میداند.
برنامه نویس موفق همه بچه ها را دوست دارد تا وقتی گریه نکنند.
فقط یک برنامه نویس موفق است که معنای ۵۴ ساعت بیداری و کار مداوم را درک میکند.
برنامه نویس موفق همیشه تنهاست. زندگی او در برنامه هایش خلاصه شده است.
۴۰ سالگی زمان بازنشستگی برنامه نویس موفق است ، یعنی زمانی که به خود میگوید: میخواهم زن بگیرم
مردم برای یک برنامه نویس موفق نقش ابلهانی را دارند که فقط میتوانند سفارش پروژه ای را بدهند که خودشان هم دقیقا نمیدانند هدفشان از سفارش آن پروژه چیست
برنامه نویس موفق زود از دختران خسته میشود ، گاهی در تنهایی فقط به آنها فکر میکند.
کابوس او شرکت در جلسه ای با حضور کاربران عوام است و بلاهای طبیعیش بهم ریختن ویندوز
اینترنت را قطع کنید تا ببینید او چه رفتارهای ناهنجاری انجام میدهد.
بدترین دعوا را فقط او میتواند با مدیر عامل داشته باشد ولی ککش هم نگزد
برنامه نویس موفق OOP را هضم کرده و با SOA رقص تانگو میکند.
همیشه عجله دارد ولی مرد یک دو سه نیست.

.Net tips > تفاوت‌های یک برنامه نویس کارمند با یک برنامه نویس علاقمند

اگر در یک محیط کاری به برنامه نویس‌ها دقت کنید دو گروه را به وضوح می‌توان تمایز داد. کسانی که برنامه نویسی می‌کنند تا اموراتشان بگذرد و کسانی که واقعا علاقمند به کارشان و دنیای برنامه نویسی هستند. به گروه اول می‌توان IT worker نام داد و گروه دوم را Software developer نامید.

جدول ذیل تفاوت‌های این دو گروه را بر می‌شمارد:

IT Workers Software developers
عموما ۵ تا ۹ ساعت در یک شرکت کار می‌کنند. عموما ۵ تا ۹ ساعت در یک شرکت کار کرده و پس از مراجعت به منزل بر روی پروژه‌های شخصی کار می‌کنند.
با اینکه هنوز در همان شرکت مشغول به کار است همیشه مشغول نق زدن است. احتمالا شاید بتواند همان موقعیت کاری را در یک شرکت دیگر نیز کسب کند. تا زمانیکه شغل فعلی برای او جذابیت دارد به آن ادامه خواهد داد و ترسی از حضور در شرکت‌های دیگر ندارد.
تنها محل یادگیری او همان پروژه‌هایی است که در شرکت وجود دارند یا مشغول به کار بر روی آن‌ها است. دید کاری و آموزشی او تنها به همین موارد خلاصه می‌شود. به صورت مداوم مشغول خواندن بلاگ‌ها، کتاب‌های جدید و فراگیری نحوه‌ی استفاده از برنامه‌های جدید می‌باشد.
عموما و اکثریت آن‌ها فقط به خاطر کلاس کاری به این رشته روی آورده‌اند و نه اصل کار مربوطه. به شدت علاقمند به بهبود روش‌های توسعه کاری و همچنین بهبود وضعیت خویش هستند.
اگر احتمالا بلاگی داشته باشند تنها به توضیح همان نق زدن‌های رایج در محیط کار می‌پردازند. از بلاگ خود در جهت توضیح تجارب کاری و کمک به ارتقای سایر همکاران خود استفاده می‌کنند.
اگر دانشی را کسب می‌کنند تنها محل عرضه‌ی آن جهت پز دادن پیش مدیر پروژه خواهد بود. بسیار با معلومات اما افتاده حال هستند.
از تغییرات مداوم دنیای IT که در آن قرار دارند هراسان هستند. مدام نق می‌زنند که مگر فاکس پروی ۲٫۶ چه مشکلی دارد که باید از NHibernateاستفاده کنند؟!
این نوع افراد همیشه می‌گویند که وقت ندارند مطالب جدید را بیاموزند و میل به تحجر و مقاومت در برابر تغییرات در آن‌ها بسیار زیاد است.
در تغییرات روی داده در دنیای IT سهیم بوده و جزئی از آن هستند.
زمانیکه قرار است یک قطعه کد اس کیوال را نمایش دهند از یک برچسب ساده یا یک تکست باکس استفاده می‌کنند. در حدی که فقط به قولی برنامه “کار کند”. در همان حدی کار می‌کنند که به آن‌ها حقوق می‌دهند. نه بیشتر. چند روز وقت می‌گذارند و با روش‌های مختلف syntax highlighting و نمایش زیبای کد آشنا می‌شوند تا کاری را که ارائه می‌دهند مزه‌ی غذای مانده‌ی چند روز قبل را ندهد.


راهنمای نصب php بر روی سرور

۷ بهمن ۱۳۸۸

چند روز قبل در سایت رسمی php راهنمای کاملی برای نصب php بر روی سرورهای یونیکس ، ویندوز و  Mac OS X با وب سرورهای لایتی و آپاچی نسخه ۱ و ۲ و IIS نسخه ۵ و ۶ و ۷  و نصب اکستنشن های PECL و …

Installation and Configuration

object <=> Json با دوجو

۱۰ دی ۱۳۸۸

در برنامه هایی که با تکنولوژی ای جکس نوشته میشن استفاده از Json به خاطر حجم کم  و … (دلایل دیگه ای که من نمیدونم) امری بدیهی شده. بعضی از مواقع باید آبجکت به رشته و یا رشته به آبجکت تبدیل گردد. دو تابع مفید در دوجو:

dojo.toJson : ورودی این تابع ، آبجکت است و رشته ای Json را به عنوان خروجی ارسال می کند.

 // a simple object
 var obj = { a:"one", b:3, c:true };

 // convert it to a string:
 var data = dojo.toJson(obj);
 console.log(data, typeof data);
 >>> {"a":"one","b":3,"c":true} string



dojo.fromJson: وروردی تابع ،رشته است و آبجکتی را به عنوان خروجی ارسال می کند.

var json = '{"a":"one","b":3,"c":true}';
var obj = dojo.fromJson(json);
console.log(obj.a, obj.b, obj.c);
>>> one 3 true



dojo.objectToQuery: همونطور که در مثال می بینید این تایع آبجکتی را به عنوان ورودی گرفته و آن را تبدیل به کوئری کرده و به خروجی می دهد.

(کوئری رشته ای  است که در موقع ارسال فرم با تکنیک GET در مرورگر دیده میشود)

  var uri = "http://some.server.org/somecontext/";
  var query = {
    foo: ["bar", "baz"],
    bit: "byte"
  };

  //Assemble the new uri with its query string attached.
  var queryStr = dojo.objectToQuery(query);
  uri = uri + "?" + queryStr;

  //The uri should look like:
  // http://some.server.org/somecontext/?foo=bar&foo=bar2&bit=byte



و تابع dojo.queryToObject که دقیقا برعکس بالا عمل میکند:

var uri = "http://some.server.org/somecontext/?foo=bar&foo=bar2&bit=byte";
var query = uri.substring(uri.indexOf("?") + 1, uri.length);
var queryObject = dojo.queryToObject(query);

//The structure of queryObject will be:
// {
//   foo: ["bar", "bar2],
//   bit: "byte"
// }



و توابع دیگری مانند formToJson و formToQuery [که قبلا توضیح دادم]

و اگر به بحث Object references در Json علاقه دارید باید از اکستنشن dojox.json.ref استفاده کنید.

دوجو ۱٫۴

۲۸ آذر ۱۳۸۸

میتونم بگم دوجو مفیدترین چیزی که من تو طراحی وب یاد گرفتم.این اصلا مهم نیست ، مهم اینه بعد از چند ماه انتظار ورژن ۱٫۴ این ابزار منتشر شد.

ojo 1.4 is hot off the presses, with more than seven months of significant improvements to performance, stability, and features.
Of particular interest:
IO Pipeline topics
dojo.cache
dojo.contentHandlers
dojo.hash with native HTML5 onhashchange event support where available
Traversal and manipulation for NodeLists (the return value for dojo.query)
dojo.ready (easier to type than dojo.addOnLoad)
Hundreds of refinements to the Dijit API and collection of Dijits, and a few new widgets in DojoX
DataChart widget and other improvements to charting
dojox.drawing lands!
Editor improvements and new plug-ins in both Dijit and DojoX
Grid is faster, and the EnhancedGrid lands!
ForestStoreModel for the TreeGrid
GFX improvements
dojox.jq, a very experimental module aimed at trying to match the jQuery API as close as possible, but using Dojo underneath
Dojo build system optionally supports the Google Closure Tools compiler
Significant speed improvements, especially in IE
Read the full Dojo 1.4 release notes for more details! And thanks to everyone in the Dojo community that helped make this release great!

Dojo 1.4 is hot off the presses, with more than seven months of significant improvements to performance, stability, and features.

Of particular interest:

IO Pipeline topics

dojo.cache

dojo.contentHandlers

dojo.hash with native HTML5 onhashchange event support where available

Traversal and manipulation for NodeLists (the return value for dojo.query)

dojo.ready (easier to type than dojo.addOnLoad)

Hundreds of refinements to the Dijit API and collection of Dijits, and a few new widgets in DojoX

DataChart widget and other improvements to charting

dojox.drawing lands!

Editor improvements and new plug-ins in both Dijit and DojoX

Grid is faster, and the EnhancedGrid lands!

ForestStoreModel for the TreeGrid

GFX improvements

dojox.jq, a very experimental module aimed at trying to match the jQuery API as close as possible, but using Dojo underneath

Dojo build system optionally supports the Google Closure Tools compiler

Significant speed improvements, especially in IE

Read the full Dojo 1.4 release notes for more details! And thanks to everyone in the Dojo community that helped make this release great!

فیلترهای php و چگونه از آنها استفاده کنیم

۲۶ آذر ۱۳۸۸
فیلتر ها در php چه هستند؟
اگر شما هر اسکریپت php نوشته باشین و به استفاده عموم گذاشته باشید باید بدونید که به کاربران نباید اعتماد کرد،فیاترهای php گامیست برای حل این مشکل.فیلترهای php توسط اکستنشن فیلترهای php اجرا می شوند.اکستنشن فیلتر قوانین از پیش تعریف شده ایست برای تمیز کردن ورودی های کاربر و آماده کردن اطلاعات برای ذخیره در دیتابیس و یا هر کار دیگر…
فیلرتهای php چگونه کار می کنند؟
فیلترهای php یک جفت از توابع داخلی هستند که filter_var() و filter_var_array() نامیده می شوند و شما پرچمهایی به این متدها می توانید عبور دهید.فیلترهای عبور داده شده به این توابع فیلترهایی که شما می خواهید را اجرا خواهد کرد.
دو نوع فیلتر وجود دارد :فیلترهای اعتبار سنجی که شبیه چک کردن true/false هستند.وقتی از فیلترهای اعتبار سنجی استفاده می کنید و تابع داده ی اصلی را بر می گرداند یعنی چک کردن اطلاعات انجام شده.و وقتی از تمیز کاری ( sanitization)  استفاده می کنید برای با موفقیت عبور کردن از تست ، اطلاعاتی مهم از اطلاعات ]عبور داده شده  |وارد شده به تابع[ حذف  شده و بعد  مقدار نهایی برگدانده می شود.
برای اینکه ببینید چه فیلترهایی در محیط شما پشتیبانی میشود یک تایع جذاب به نام filter_list() وجود دارد:
این فیلترهایی است که در سرور من پشتیبانی میشود و ممکن است برای شما فرق داشته باشد،حالا نگاهی به چند مثال می کنیم تا ببینیم با این توابع چه کار میتوانیم انجام دهیم.
اگر در مورد توابع filter_var() و filter_var_array() اطلاعات بیشتری میخواهید به راهنمای php مراجعه کنید.
اعتبار سنجی اعداد صحیح
شما میتوانید صحت اعداد صحیح با فلگ FILTER_VALIDATE_INT بسنجید.اگر به تابع عددی صحیح بفرستید همان را بر می گرداند و اگر عددی اعشاری یا رشته بفرستید NULL یا FALSE  برخواهد گشت.
شما می توانید برای فلگ  FILTER_VALIDATE_INT اختیاراتی مشخص کنید.مثل کمترین min بیشترین max و مقدار پیش فرض.البته در تعریف آرایه ی $option باید دقت کنید چون یک آرایه ی چند بعدی است.
توجه کنید که دستور filter_var() دوم مقدار ۳ را بر می گرداند،چون مقدار default در متغیر $option تعیین شده است.
اعتبار سنجی اعداد اعشاری
اعتبار سنجی اعداد اعشاری مانند اعداد صحیح است ،ولی از فلگ FILTER_VALIDATE_FLOAT استفاده می شود و اگر اطلاعات داده شد عدد اعشاری باشد همان مقدار بازگردانده می شود.
اعتبار سنجی آدرس ایمیل
همچنین از این متد میتوانید برای هر نوع داده  ی مطلق دیگری استفاده کنید،مثل آدرس های ایمیل.
البته این متد نمیتواند به خوبی یک عبارت منظم سفارشی عمل کند.یک آدرس ایمیلی مثل a@a.a به طور واضحی نا معتبر است،ولی در این تابع معتبره!؟عبارت منظم زیر میتونه راه حل بهتری باشه:
اعتبار سنجی URLها
اعتبار سنجی url ها به طور معمول سخت است،filter_var یک روش بسیار زیباست.چیز جالب در مورد این فلگ ، آپشن های اضافیست که میتواند اعتبار سنجی بهتری فراهم کند.این اضافات اینها هستند:
FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED
به این مثال نگاه کنید:
اعتبار سنجی آی پی آدرس ها
اعتبار سنجی آی پی ها بسیار سادست و فلگ  FILTER_VALIDATE_IP به شما اجازه استفاده از چند آپشن اضافه را می دهد ، آنها در زیر لیست شده و حتی میتوانید آی پی های ورژن ۶ را هم چک کنید.
توجه کنید که ۵۴۳٫۱۵۲٫۳٫۹ مقدار false را بر گردانده است چون بزرگترین آدرسی که قابل قبول است ۲۵۵٫۲۵۵٫۲۵۵٫۲۵۵
FILTER_FLAG_NO_PRIV_RANGE و FILTER_FLAG_NO_RES_RANGE برای چک کردن ip خصوصی و رزو شده می باشد.
فیلترهای تمیزکاری مفید در php
تمیز کاری یک رشته
تمیز کاری داده ها به آسانی اعتبار سنجی آنهاست.به خاطر داشته باشید که تمیز کاری و اعتبار سنجی ، با هم تفاوت دارند چون در تمیز کاری ما کاراکترهای غیر دلخواه را حذف کرده و داده معتبر جدیدی را بر می گردانیم.حالا نگاهی به تمیزکاری یک رشته می کنیم.
تمیز کاری اعداد صحیح
فیلتر callback
شاید یکی از بهترین چیزها در مورد تابع  filter_var() فلگ FILTER_CALLBACK هست که به شما اجازه تعریف                                              قانون خودتون را به وسیله callback function می دهد.اگر نمیتوانین یک قانون که حتما به اون برمی خورید پیدا کنید ،

PHP Filters and How to Use Them

فیلتر ها در php چه هستند؟

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

فیلرتهای php چگونه کار می کنند؟

فیلترهای php یک جفت از توابع داخلی هستند که filter_var() و filter_var_array() نامیده می شوند و شما پرچمهایی به این متدها می توانید عبور دهید.فیلترهای عبور داده شده به این توابع فیلترهایی که شما می خواهید را اجرا خواهد کرد.

دو نوع فیلتر وجود دارد :فیلترهای اعتبار سنجی که شبیه چک کردن true/false هستند.وقتی از فیلترهای اعتبار سنجی استفاده می کنید و تابع داده ی اصلی را بر می گرداند یعنی چک کردن اطلاعات انجام شده.و وقتی از تمیز کاری ( sanitization)  استفاده می کنید برای با موفقیت عبور کردن از تست ، اطلاعاتی مهم از اطلاعات ]عبور داده شده  |وارد شده به تابع[ حذف  شده و بعد  مقدار نهایی برگدانده می شود.

برای اینکه ببینید چه فیلترهایی در محیط شما پشتیبانی میشود یک تایع جذاب به نام filter_list() وجود دارد:

print_r(filter_list());

//prints...

Array
(
    [0] => int
    [1] => boolean
    [2] => float
    [3] => validate_regexp
    [4] => validate_url
    [5] => validate_email
    [6] => validate_ip
    [7] => string
    [8] => stripped
    [9] => encoded
    [10] => special_chars
    [11] => unsafe_raw
    [12] => email
    [13] => url
    [14] => number_int
    [15] => number_float
    [16] => magic_quotes
    [17] => callback
)

این فیلترهایی است که در سرور من پشتیبانی میشود و ممکن است برای شما فرق داشته باشد،حالا نگاهی به چند مثال می کنیم تا ببینیم با این توابع چه کار میتوانیم انجام دهیم.

اگر در مورد توابع filter_var() و filter_var_array() اطلاعات بیشتری میخواهید به راهنمای php مراجعه کنید.

اعتبار سنجی اعداد صحیح

شما میتوانید صحت اعداد صحیح با فلگ FILTER_VALIDATE_INT بسنجید.اگر به تابع عددی صحیح بفرستید همان را بر می گرداند و اگر عددی اعشاری یا رشته بفرستید NULL یا FALSE  برخواهد گشت.

$var = 473;

filter_var($var, FILTER_VALIDATE_INT); //returns 473

$var = 'hello';

filter_var($var, FILTER_VALIDATE_INT); //returns FALSE

$var = 71.4;

filter_var($var, FILTER_VALIDATE_INT); //returns FALSE

شما می توانید برای فلگ  FILTER_VALIDATE_INT اختیاراتی مشخص کنید.مثل کمترین min بیشترین max و مقدار پیش فرض.البته در تعریف آرایه ی $option باید دقت کنید چون یک آرایه ی چند بعدی است.

$var_1 = 73;
$var_2 = 246;

$options = array(
    'options' => array(
        'default' => 3,
        'min_range' => 0,
        'max_range' => 99,
    )
);

filter_var($var_1, FILTER_VALIDATE_INT, $options); //returns 73

filter_var($var_2, FILTER_VALIDATE_INT, $options); //returns 3

توجه کنید که دستور filter_var() دوم مقدار ۳ را بر می گرداند،چون مقدار default در متغیر $option تعیین شده است.

اعتبار سنجی اعداد اعشاری

اعتبار سنجی اعداد اعشاری مانند اعداد صحیح است ،ولی از فلگ FILTER_VALIDATE_FLOAT استفاده می شود و اگر اطلاعات داده شد عدد اعشاری باشد همان مقدار بازگردانده می شود.

$var_1 = 45.3;
$var_2 = 246;

filter_var($var_1, FILTER_VALIDATE_FLOAT, $options); //returns 45.3

filter_var($var_2, FILTER_VALIDATE_FLOAT, $options); //returns 246

اعتبار سنجی آدرس ایمیل

همچنین از این متد میتوانید برای هر نوع داده  ی مطلق دیگری استفاده کنید،مثل آدرس های ایمیل.

$var_1 = "jordan@17webshop.com";

$var_2 = "some data that is obviously not an e-mail address;

filter_var($var_1, FILTER_VALIDATE_EMAIL); //returns jordan@17webshop.com

filter_var($var_2, FILTER_VALIDATE_EMAIL); //returns FALSE

البته این متد نمیتواند به خوبی یک عبارت منظم سفارشی عمل کند.یک آدرس ایمیلی مثل a@a.a به طور واضحی نا معتبر است،ولی در این تابع معتبره!؟عبارت منظم زیر میتونه راه حل بهتری باشه:

$pattern = '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/';

$email_1 = 'jordan@17webshop.com';

$email_2 = 'a@a.a';

preg_match($pattern, $email_1); // returns TRUE

preg_match($pattern, $email_2); //returns FALSE

اعتبار سنجی URLها

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

FILTER_FLAG_SCHEME_REQUIRED

FILTER_FLAG_HOST_REQUIRED

FILTER_FLAG_PATH_REQUIRED

FILTER_FLAG_QUERY_REQUIRED

به این مثال نگاه کنید:

$var_1 = 'http://www.17webshop.com';

$var_2 = 'http://www.17webshop.com/path/to/some/file';

$var_3 = 'http://www.17webshop.com/path/to/some/file/?foo=bar';

$var_4 = 'www.17webshop.com';

$var_5 = 'some_file.html';

$var_6 = "/path/to/some/file";

filter_var($var_1, FILTER_VALIDATE_URL); // returns http://www.17webshop.com

filter_var($var_1, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED); // returns FALSE

filter_var($var_2, FILTER_VALIDATE_URL); // returns http://www.17webshop.com/path/to/some/file

filter_var($var_2, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED); // returns FALSE

filter_var($var_3, FILTER_VALIDATE_URL); // returns http://www.17webshop.com/path/to/some/file/?foo=bar

filter_var($var_4, FILTER_VALIDATE_URL); // returns FALSE

filter_var($var_5, FILTER_VALIDATE_URL); // returns FALSE

filter_var($var_6, FILTER_VALIDATE_URL); // returns FALSE

اعتبار سنجی آی پی آدرس ها

اعتبار سنجی آی پی ها بسیار سادست و فلگ  FILTER_VALIDATE_IP به شما اجازه استفاده از چند آپشن اضافه را می دهد ، آنها در زیر لیست شده و حتی میتوانید آی پی های ورژن ۶ را هم چک کنید.

$var_1 = '192.168.0.1';

$var_2 = '543.152.3.9';

$var_3 = '3ffe:1900:4545:3:200:f8ff:fe21:67cf';

echo filter_var($var_1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // returns 192.168.0.1

echo filter_var($var_2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // returns FALSE

echo filter_var($var_3, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); // returns 3ffe:1900:4545:3:200:f8ff:fe21:67cf

توجه کنید که ۵۴۳٫۱۵۲٫۳٫۹ مقدار false را بر گردانده است چون بزرگترین آدرسی که قابل قبول است ۲۵۵٫۲۵۵٫۲۵۵٫۲۵۵

FILTER_FLAG_NO_PRIV_RANGE و FILTER_FLAG_NO_RES_RANGE برای چک کردن ip خصوصی و رزو شده می باشد.

فیلترهای تمیزکاری مفید در php

تمیز کاری یک رشته

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

$var_1 = '<tag>some string data</tag>';

$var_2 = '<tag>"some string data"</tag>';

filter_var($var_1, FILTER_SANITIZE_STRING); //returns some string data

filter_var($var_2, FILTER_SANITIZE_STRING); //returns "some string data"

تمیز کاری اعداد صحیح

$var_1 = 123214;

$var_2 = '213h34bh312';

filter_var($var_1, FILTER_SANITIZE_NUMBER_INT); //returns 123214

filter_var($var_2, FILTER_SANITIZE_NUMBER_INT); //returns 21334312

فیلتر callback

شاید یکی از بهترین چیزها در مورد تابع  filter_var() فلگ FILTER_CALLBACK هست که به شما اجازه تعریف قانون خودتون را به وسیله callback function می دهد.اگر نمیتوانین یک قانون که حتما به اون برمی خورید پیدا کنید ،

function my_rule($str) {
  return str_replace(" ", "+", $str);
}

$var_1 = "some string data with spaces in it";

$options = array(
    'options' => 'my_rule'
);

filter_var($var_1, FILTER_CALLBACK, $options); //returns some+string+data+with+spaces+in+it

flatpress وبلاگی با دیتابیس فایلی

۱۳ آذر ۱۳۸۸

flatpress وبلاگی اپن سورس هست که روی php4 به بعد بدون احتیاج به mysql بدرستی کار میکند.بله بدون احتیاج به mysql!!

این سیستم تمام اطلاعات وبلاگ در فایل های txt ذخیره می کند،مسیر ذخیره اطلاعات طبق محتویات فایل  flatpress\docs\spb_db.txt به صورت زیر هست:

    - SimplePHPBlog flat "db" structure

    [$content][flatpress\fp-content\content]
        |
        |-- [$year] // two-digit year ID (05 stands for 2005)
        |       |
        |       |-- [$month]  //two-digit month ID (01 stands for January)
	|               |
	|               |-- entryYYMMDD-HHMMSS.txt
	|               |-- [entryYYMMDD-HHMMSS]
	|	                    |
	|			    |-- rating.txt
	|			    |-- view_counter.txt
	|			    |-- [comments]
	|			             |
	|				     |-- commentYYMMDD-HHMMSS.txt
	|
	|-- [static]
	        |
		|-- $filename.txt

فلت پرس پلاگین ها را پشتیبانی و برای تم از smarty استفاده می کند و سیستم ابزارک (Widget) نیز دارد .

- SimplePHPBlog flat “db” structure
[$content]
|
|– [$year] // two-digit year ID (05 stands for 2005)
|       |
|       |– [$month]  //two-digit month ID (01 stands for January)
|               |
|               |– entryYYMMDD-HHMMSS.txt
|               |– [entryYYMMDD-HHMMSS]
| |
| |– rating.txt
| |– view_counter.txt
| |– [comments]
| |
| |– commentYYMMDD-HHMMSS.txt
|
|– [static]
|
|– $filename.txt