تبليغاتX
برنامه نویس کوچولو

برنامه نویس کوچولو

یادداشتهای یه برنامه نویس خیلی ^ 100 کوچولو

سهمیه بندی

حالا بعد از سهمیه بندی بنزین به نظر میرسه که نوبت سهمیه بندی دیسک سخت باشه اینم تبصره ۱۳ برای دیسک سخت.

سهمیه بندی دیسک سخت در لینوکس

+ نوشته شده در  پنجشنبه بیست و چهارم آبان 1386ساعت 14:32  توسط علیرضا مسکین ملک  | 

تریگرها در MySQL

تریگرها امکان جدیدیست که از نسخه 5.0 به MySQL اضافه شده ولی در این نسخه محدودیتهایی وجود داشت که در نسخه 5.1 برطرف شده است بهتر است از نسخه 5.1 استفاده کنید , امکاناتی که تریگرها در اختیار ما قرار می دهند رو میشه به 3 قسمت تقسیم بندی کرد :

 

  • شما از اینها می توانید برای چک کردن و یا لغو کردن ورود اطلاعات غیر مفید به بانک اطلاعاتی خود استفاده کنید .
  • می توانید از این امکان برای تغییر دادن و یا بی اثر کردن جملات INSERT , UPDATE و یا DELETE استفاده کنید .
  • امکان مفیدی است برای مانیتور کردن تغییرات اعمال شده روی بانک اطلاعاتی .

برای بهتر کارکردن با این امکان شما باید ابتدا اطلاعاتی در مورد روالهای ذخیره شده ( Stored Procedures ) داشته باشید زیرا نحوه نوشتن تریگرها تا حدود زیادی مشابه نوشتن رواللهای ذخیره شده است به طور مثال :

  • استفاده از جملات ترکیبی (BEGIN / END) ( که برای مشخص کردن شروع و پایان دستورات می باشد) مجاز است .
  • استفاده از عبارات کنترلی همانند IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE, ITERATE مجاز می باشد.
  • تعریف متغیر (DECLARE) و مقدار دهی آن ( امکان پذیر است .

نحوه نوشتن تریگرها :

	CREATE TRIGGER 
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON
FOR EACH ROW
 

مشخصات تریگرها :

نام : تریگرها می بایست حتما دارای نام باشند و البته کمتر از 64 حرف و می توانید از جدا کننده هایی استفاده کنید همانند نامهای دیگر در MySQL.
می توانید از ساختار مشابه زیر استفاده کنید :
نام جدول + '_' + نوع تریگر . به طور مثال اگر اسم جدول t29 بوده و می خواهید این تریگر در زمان قبل(BEFORE) از UPDATE اجرا شود از نام t29_bu برای تریگر خود استفاده کنید که البته ابن اختیاریست و می توانید از هر نام دیگری نیز استفاده کنید.

زمان : تریگرها دارای زمان فعالیت می باشند که می توانند قبل و یا بعد از یک عملی اجرا شوند که توسط قسمت { BEFORE | AFTER } INSERT | UPDATE | DELETE } زمان آن مشخص می شود .
به طور مثال اگر بخواهید آن را قبل از عمل حذف اجرا کنید از " BEFORE DELETE " استفاده می کنید.

رویداد : که یکی از اعمال INSERT , UPDATE و یا DELETE است که در قسمت قبل توضیح داده شد.

جدول : تریگرها می باست مربوط به جول باشند که در هر INSERT , UPDATE و یا DELETE اجرا شده روی آن جدول تریگر مربوطه آن اجرا شود . البته به خاطر داشته باشید که نمی توانید دو تریگر برای یک جدول و یک زمان مشابه بسازید.

سطرهای جدول : عبارت FOR EACH ROW حاکی از این است که تریگرها روی سطرهای جدول اجرا می شوند نه روی تمام جدول.

عبارات : تریگرها می توانند شامل هیچ عبارتی نباشند و هم می توانند شامل عبارت باشند و شامل همه آن محدودیتای توابع که قبلا گفته شد.

ستونهای NEW و OLD : در تریگر میتوانید به هر سطر جدول ارجاع داشته باشید ولی نمی توانید فقط نام ستون را مشخص کنید چون باعث ابهام خواهد شد . به همین خاطر از NEW و OLD استفاده می کنیم . NEW مقدار جدید و OLD نمایانگر مقدار قدیمی است. و به صورت زیر از آنها استفاده می کنیم:
NEW | OLD "." نام ستون

در موقع INSERT فقط NEW و در موقع DELETE فقط OLD مجاز است ولی در موقع UPDATE استفاده از هر دو اینها مجاز است . در زیر یک مثال از نحوه استفاده آن آمده :

	CREATE TRIGGER t21_au 
BEFORE UPDATE
ON t22
FOR EACH ROW
BEGIN
SET @old = OLD. s1;
SET @new = NEW.s1;
END;//

حال اگر جدول t22 شامل یک سطر با مقدار 55 در ستون s1 خود باشد بعد از اجرای دستور " UPDATE t21 SET s1 = s1 + 1 " و وقتی بروزرسانی به پایان برسد متغیر @old مقدار 55 و متغیر @new مقدار 56 را دارا خواهد بود.

مثال :

	DELIMITER // 
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE INSERT
ON t22
FOR EACH ROW
BEGIN
SET @x = 'Trigger was activated!';
SET NEW.s1 = 55;
END;//

ابتدا جدولی به نام t22 ایجاد کرده که شدارای یک ستون از نوع عددی بوده به نام s1 و تریگری که قبل از انجام هر INSERT اجرا شده و مقدار ستون s1 را 55 قرار می دهد .

حال یک sql را اجرا کرده تا نحوه کار این تریگر را بهتر متوجه شوید:
INSERT INTO t22 VALUES (1)//

حال اگر با دستور SELECT اطلاعات این جدول را خراج کنید می بینید که مقدار ستون s1 همیشه 55 خواهد بود.

	SELECT @x, t22.* FROM t22//
+------------------------+------+
| @x | s1 |
+------------------------+------+
| Trigger was activated! | 55 |
+------------------------+------+
1 row in set (0.00 sec)

این تنها آشنایی مختصری با تریگرها بوده و برای اطلاعات بیشتر می توانید از منوالهای MySQL که در سایت آن http://www.mysql.com موجود است استفاده کنید.

در پایان مثالی که در منوال MySQL آمده است را قرار داده تا با یک نمونه عملی آشنا شوید.

	CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,b4 INT DEFAULT 0 );

DELIMITER |


CREATE TRIGGER testref
BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;|


DELIMITER ;

INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL),
(NULL), (NULL);


INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);



mysql> INSERT INTO test1 VALUES
-> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM test1;
+------+
| a1 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test2;
+------+
| a2 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test3; +----+ | a3 | +----+ | 2 | | 5 | | 6 | | 9 | | 10 | +----+ 5 rows in set (0.00 sec) mysql> SELECT * FROM test4;
+----+------+
| a4 | b4 |
+----+------+
| 1 | 3 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 0 |
| 6 | 0 |
| 7 | 1 |
| 8 | 1 |
| 9 | 0 |
| 10 | 0 |
+----+------+
10 rows in set (0.00 sec)
+ نوشته شده در  جمعه چهارم آبان 1386ساعت 11:56  توسط علیرضا مسکین ملک  | 

زندگي دوم در فضاي مجازي

در دنياي مجازي زندگي دوم هر شهروند قادر است در محيطي سه بعدي جنسيت خود را انتخاب كند و آنگونه كه مورد علاقه اوست چهره، رنگ پوست و مو، لباس، شغل، محل سكونت، وسايل زندگي و هرچيزي كه مورد نياز يا علاقه‌اش است را ايجاد نمايد. هر شهروند اين امكان را دارد كه ازفضاي گسترده‌اي از صفات بهره‌مند شود. شهروند زندگي دوم قادر است با وسيله مورد علاقه‌اش رانندگي كند، در ارتفاع چهار هزارمتري از سطح زمين پرواز كند، به قايقراني بپردازد، به سفرهاي ماجراجويانه برود و... .
ادامه ....
+ نوشته شده در  پنجشنبه سوم آبان 1386ساعت 15:57  توسط علیرضا مسکین ملک  | 

انواع جداول در MySQL

در این مقاله قصد داریم با انواع جداول موجود در MySQL آشنا شویم. طراحی بانکهای اطلاعاتی همانند سایر کارهای طراحی نیاز به یک سری اطلاعات پیش نیاز دارد، برای مثال در بعضی از موارد کار با بانک اطلاعاتی به نحوی است که transaction-safe بودن جدول را طلب می کند، اما استفاده از جداول transaction-safe موجب افزایش زمان اجرا، فضای دیسک و حافظه می شود. توجه داشته باشید که در این مقاله تنها هدف آشنایی با انواع جداول موجود در MySQL است و به طور کامل با هر کدام آشنا نخواهیم شد!. انواع جداول موجود در MySQL عبارتند از:

● ISAM
● MyISAM
● InnoDB
● BerkeleyDB (BDB)
● MERGE
● HEAP

جداول ISAM :

این نوع جداول تنها برای پشتیبانی از جداول قدیمی در MySQL وجود دارد، تمام کارایی و قابلیتهای آن در MyISAM وجود دارد، پس دلیلی برای توضیح این نوع جداول در اینجا وجود ندارد، بر اساس برنامه کاری برنامه نویسان MySQL قرار است این نوع جدول از نسخه ۵ این RDBMS از آن حذف شود. جداول ISAM ذخیره ای سریع اما غیر transaction-safe به شما ارائه می دهد، جداول ISAM یک سری محدودیتها دارند که همین محدودیتها باعث جایگزینی آنها با MyISAM و حذف این جداول در آینده ای نزدیک شده است، محدودیتهایی که در ISAM وجود داشتند اما در MyISAM برطرف شده اند عبارتند از:

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

جداول ISAM به شما حداکثر اجازه ذخیره تا 4 GB را می دهند، در حالی که محدودیت شما در جداول MyISAM بستگی به سیستم عاملی که MySQL روی آن نصب است دارد. پس در انتخاب سیستم فایل خود دقت کنید، بعضی از این سیستم ها فقط تا 2GB برای یک فایل را پشتیبانی می کنند، هر چند که شما می توانید با استفاده از جداول MERGE این محدودیت را برطرف کنید اما شما امکان استفاده از MERGE را در جداول ISAM ندارید.

همچنین استفاده بهینه از فضای دیسک که در جداول ISAM وجود ندارد.

جداول ISAM به شما اجازه استفاده از ۱۶ کلید به ازای هر جدول را می دهند و حداکثر طول یک کلید هم ۲۵۶ بایت است، اما جداول MyISAM به شما اجازه استفاده از ۶۴ کلید با هر یک طول حداکثر ۱۰۲۴ بایت را میدهند.

بررسی تمام محدودیتهای جداول ISAM از حوصله این مقاله خارج است اما با نگاهی گذرا می بینیم که این نوع جدول از برنامه های مفیدی مثل CHECK TABLE یا REPAIR TABLE یا BAKCUP TABLE و یا حتی OPTIMIZE TABLE پشتیبانی نمی کند.

هر چند که جداول ISAM وجود دارند اما نباید از آنها برای ساخت جداول جدید استفاده کرد و اگر شما جداول ISAM دارید شدیدا به شما توصیه می شود تا آنها را به MyISAM تبدیل کنید، کاری ساده با نتایجی چشمگیر!

جداول MyISAM:

بسیاری از مردم از MySQL برای سالها استفاده می کنند بدون اینکه متوجه شوند که این RDBMS انواع جداول دیگری را نیز در اختیار آنها قرار می دهد، این افراد از MyISAM استفاده می کنند بدون اینکه بدانند چون این نوع جدول، نوع پیش فرض MySQL است.
این نوع جداول ذخیره ای سریع اما غیر transaction-safe را به شما ارائه می دهند، در اکثر موارد کارایی بالایی از خود نشان می دهند حتی اگر طراح بانک اطلاعاتی در طراحی خود دچار مشکل شود. این نوع جداول در دست یک مدیر حرفه ای توانایی Handle کردن بانکهای طلاعاتی بزرگ و پرمشغله را نیز دارند. جداول MyISAM می توانند در سه حالت: compressed و dynamic, static باشند. یک جدول بر حسب نحوه تعریف ستونهایش به طور خودکار dynamic و یا static می شود اما جداول compressed با استفاده از ابزار myisampack تولید می شوند.
جداولی با سطرهای با طول ثابت به صورت یک جدول static در می آیند اما جداول با طول متغیر سطرها به صورت dynamic در می آید، چگونه می توانیم بگوئیم که یک جدول سطرهای با طول ثابت و یا طول متغیر دارد؟

نوع char و تمام انواع عددی طول ثابت دارند، اما انواع text ، varchar و یا blob طول متغیر بر حسب اطلاعات ذخیره شده در انها دارند ، جدولی که فقط از ستونهای char و یا عددی داشته باشد به صورت static ساخته می شود و هر جدولی که هر یک از حالتهای متغیر را داشته باشد به صورت dynamic ساخته می شود. جداول static برای جستجو کردن از جدوال dynamic و compressed سریعتر است اما خوب بدی این روش هم در این است که اطلاعاتی که ممکن است با هم از نظر طول بسیار متفاوت باشند را در سطرهایی با طول ثابت بریزیم که باعث هدر رفتن فضای دیسک می شود.

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

امکان دیگری که به نظر می رسد تنها از طریق جداول MyISAM در MySQL در دسترس FullText Searching است ، اندیسهای معمولی برای پیدا کردن سطرهایی خاص از جدول به خوبی کار می کنند اما جستجو برای یک کلمه یا رشته در یک متن هم امکان جالبی به نظر می رسد. شما با استفاده از کد SQL زیر می توانید یک جدول MyISAM با FullText یک اندیس بسازید.

CREATE TABLE articles (
articleID int not null auto_increment primary key,
title varchar(2MERGE),
body text,
fulltext (title,body)
);

و با استفاده از query زیر به دنبال هر رکورد حاوی miniprogrammer بگردید!

SELECT title
FROM article
WHERE MATCH (title, body) AGAINST ('miniprogrammer');

شما امکان گرفتن query های پیچیده تر را هم دارید:

SELECT title
FROM article
WHERE MATCH (title, body) AGAINST ('miniprogrammer apache php
web');

حالا ما به دنبال هر رکوردی هستیم که حاوی هر یک از کلمات فوق باشد. متاسفانه در حال حاضر MySQL از Stemming پشتیبانی نمی کند ، Stemming امکان فوق العاده جالبی است که در خیلی از سیستمهای جستجوی fulltext وجود دارد و با استفاده از آن مثلا اگر شما کلمه acquire را جستجو کنید کلمه acquisitions هم که از همان رده معنایی است بازگردانده می شود، هر کدام از این کلمات برحسب میزان وابستگی معنایی مقدار دهی می شوند و بعد از آن بر همین میزان مرتب می شوند و نتایج بازگشت داده می شوند.

قابلیت بسیار جالب دیگری که در حالت Full-Text به دست می آورید Boolean Full-Text Search است که بسیار جالبتر از Full-Text خالی است!

SELECT title
FROM article
WHERE MATCH (title,body)
AGAINST ('+linux+”Open Source” -desktop Java ~Oracle' IN
BOOLEAN MODE);

در query بالا شما به دنبال رکوردهایی می گردید که دارای کلمه Open Source و linux باشند اما کلمه desktop را نداشته باشند، کلمات Oracle و Java به دلخواه وجود داشته باشند اما هنگام مرتب سازی رکوردها برای مشخص شدن میزان وابستگی به مورد جستجوی ما وجود کلمه Java باعث افزایش امتیاز و Oracle باعث کاهش امتیاز شود.

جداول InnoDB :


این نوع جداول امکانات زیر را در اختیار شما قرار می دهند:

  • Transaction-safe بودن.

  • Row-level locking به این معناست که فقط سطری که در حال استفاده است از دسترس کاربران دیگر خارج است در حالیکه در بسیاری از انواع جداول دیگر جدولی که در حال کار کردن با آن هستیم از دسترس دیگر کاربران خارج است.

  • Support for foreign keys


InnoDB روش خاص خودش رو برای ذخیره اطلاعات دارد، شاخه خاص خود و نیز تنظیمات خاص خود. در جایی که جداول MyISAM هر جدول را در یک فایل ذخیره می InnoDB ممکن است یک جدول را در چندین فایل متفاوت ذخیره کند و همین امر به InnoDB این امکان را می دهد که بدون وابستگی به فایل سیستم سیستم عامل هر چقدر که می خواهد بزرگ شود. توجه داشته باشید که برای یک پروژه مشخص جداول InnoDB به مراتب بیشتر از همان جداول در حالت MyISAM فضا اشغال می کنند.
بسیاری از سایتهای بزرگی که از MySQL استفاده می کنند مثل Slashdot، Google و یا Yahoo! finance از جداول InnoDB استفاده می کنند . InnoDB یکی از سریعترین Transaction-safe در دنیاست.
InnoDB توسط یک کمپانی جداگانه به نام InnoBase Oy توسعه داده می شود که برای به دست آوردن آخرین اطلعات می توانید از وب سایت آنها در www.innodb.com دیدن کنید.

جداول BerkeleyDB :

انتخاب دیگری که برای جداول Transaction-safe وجود دارد BerkeleyDB یا به اختصار BDB است، این جداول توسط شرکت نرم افزاری Sleepycat ارائه شده که از طریق نشانی www.sleepycat.com قابل دسترسی است. این نوع جداول در حالتی که به transaction-safe احتیاج است به اندازه رقیب خود یعنی InnoDB مورد استفاده قرار نگرفته است. موتور BDB مدت زمان زیادی است که وجود دارد اما یکپارچگی آن با MySQL امر تازه ای است. تمام جداول BDB نیاز به یک کلید دارند چیز بدی نیست چون شدیدا به شما توصیه می کنم که برای هر جدول یک کلید مشخص کنید اما اینجا اجباری است و اگر شما یک کلید مشخص نکنید خود BDB اینکار را انجام خواهد داد.

جداول MERGE :


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

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

  • عدم پشتیبانی از auto_increment
  • عدم پشتیبانی از TEXT یا BLOB
  • محدود بودن عبارت جستجو به تنها استفاده از عملگرهای >=< و ...

+ نوشته شده در  پنجشنبه سوم آبان 1386ساعت 15:42  توسط علیرضا مسکین ملک  | 

لینوکس شاپ ایران آغاز به کار نمود

پس از بحث و بررسی های فراوان در انجمنها و جلسات مختلف، به همت گروهی از کاربران علاقه مند، لینوکس شاپ ایران با هدف دسترسی آسان و ارزان کاربران و علاقه‌مندان به انواع محصولات حوزه نرم افزارهای آزاد/متن باز مانند انواع توزیعهای لینوکس و انواع سیستم عاملها و مجموعه های تکمیلی دیگر فعالیت رسمی خود را آغاز نمود. محصولات این فروشگاه را صرفا نرم‌افزارهای آزاد-متن‌باز و سایر محصولاتی که طبق قوانین متداول اپن سورس تهیه و اجازه فروش داشته باشند تشکیل خواهند داد.
ضمنا این فروشگاه در حال حاضر امکاناتی مانند نظردهی درباره محصولات عرضه شده و همچنین یک خبرنامه برای اطلاع از محصولات جدید اضافه شده نیز دارد.
این فروشگاه در آدرس اینترنتی http://linuxshop.ir در دسترس علاقه مندان میباشد.
+ نوشته شده در  پنجشنبه سوم آبان 1386ساعت 13:38  توسط علیرضا مسکین ملک  |