PDA

View Full Version : ایجاد سیستم چت با استفاده از Comet



SimRFE
پنج شنبه 01 آبان 1393, 12:35 عصر
با سلام.
من میخواستم با php و javascript-jquery یه سرویس چت بسازم بدون اینکه بخوام هر چند میلی ثانیه یبار به سرور درخواست بفرستیم و بدون این که تنظیمات سرور رو دستکاری کنم ، با تحقیقاتی که کردم بهترین راه استفاده از Comet هست ،
من یه مثال ساده ایـــــــــنجا (http://barnamenevis.org/showthread.php?301779-Comet-%DA%86%DB%8C%D8%B3%D8%AA-%D8%A8%D9%87-%DA%86%D9%87-%D8%AF%D8%B1%D8%AF%DB%8C-%D9%85%DB%8C%D8%AE%D9%88%D8%B1%D9%87!-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%85%DB%8C%D8%B4%D9%88%D8%AF) پیدا کردم و یه سری تغییرات توش دادم مثل سیو کردن مسیج ها در دیتابیس ،
حالا مشکلم اینه که وقتی صفحه رو با دو تا مرورگر باز میکنم ، وقتی یه مسیج سند میکنم ، هر دو مرورگر با هم آپدیت نمیشن و مسیج رو نشون بدن ، گاهی فقط یکیشون آپدیت میشه ، گاهی هم هیچکدم نمیشن.

این هم کدامه:


<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");


header('Content-Type: text/html; charset=utf-8');
?>
<html>
<head>
<title>sss</title>
<script src="jquery.js" type="text/javascript"></script>
<script>
$( document ).ready(function() {
var comet_xhr;


function create_xhr() {
var xhr;
if(window.XMLHttpRequest) xhr = new XMLHttpRequest();
else if (window.ActiveXObject) xhr = new ActiveXObject("Microsoft.XMLHTTP");
return xhr;
}


function receive_state() {
if(comet_xhr.readyState!=4) return;
msgg=comet_xhr.responseText;
txt=document.getElementById('txt');
if(msgg.indexOf('_-_')==0) {
msgga = msgg.substring(msgg.indexOf('_-_')+3);
txt.innerHTML = msgga;
}
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);
}




txt.value='';


comet_xhr=create_xhr();
comet_xhr.onreadystatechange=receive_state;
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);


function send() {
var msg = $('#msg').val();
var name = $("#name").val()
$.post( "save.php", { name: name, msg: msg });
}


$("#msg").keyup(function (e) {
if (e.which == 13) {
send();
}


});
});
</script>
</head>
<body>
<div style="margin: auto; width:500px;">
<span style="vertical-align: top">Messages:</span>
<div id="txt" style="width: 500; height: 500;border:1px solid black;overflow: scroll;padding-left: 15px;"></div>
<br />
name:
<input type="text" name="name" id="name" style="display:block" />
message:
<input type="text" name="msg" id="msg" style="display:block;" />


</div>
</body>
</html>

این فایل ایندکس هست که هم باکس چت توش هست و هم ایجکس و جاوا اسکری‍ت.




<?php

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");

header('Content-Type: text/html; charset=utf-8');


$msg_file='msg.txt';
$name_file='name.txt';

clearstatcache();
while(filesize($msg_file)==0) {
usleep(10000);
clearstatcache();
}

$fp=fopen($msg_file, "r+");
//flock($fp, LOCK_EX);
$msg=fread($fp, filesize($msg_file));
ftruncate($fp, 0);
fclose($fp);

$fpn=fopen($name_file, "r+");
//flock($fpn, LOCK_EX);
$name=fread($fpn, filesize($name_file));
ftruncate($fpn, 0);
fclose($fpn);

$server = mysql_connect('localhost', 'root', '');
$database = mysql_select_db('aa');
$sendinfos = mysql_query("INSERT INTO `aa`.`msg` (`id`, `name`, `msg`) VALUES (NULL, '{$name}', '{$msg}');");

function records($query) {
$record = array();
GLOBAL $queries;
$queries = mysql_query($query);
if($queries && mysql_num_rows($queries) > 0) {
while($queryrow = mysql_fetch_assoc($queries)) {
$record[] = $queryrow;
}
}
return $record;
}

clearstatcache();

$gets = records("SELECT * FROM `msg`");
echo '_-_';
foreach($gets as $theget) {
echo $theget['name']. ': ' . $theget['msg'] . '<br />';
}


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




<?php
session_start();
if(isset($_POST['msg']) && isset($_POST['name'])) {

$open = fopen('msg.txt', 'w');
$write = fwrite($open, $_POST['msg']);
fclose($open);

$openn = fopen('name.txt', 'w');
$write = fwrite($openn, $_POST['name']);
fclose($openn);

}


این هم فقط اسم طرف رو میگیره و توی یه فایل سیو میکنه که بعد از توی فایل get بگیریمش (اول با session انجامش دادم خیلی دیر جواب میداد ، نمیدونم چرا)

به نظرتون مشکلش چیه؟

پ.ن: این کد رو فعلا فقط برای تست نوشتم ، میدونم استاندارد نیست و به هم ریختس و...!

eshpilen
جمعه 02 آبان 1393, 00:01 صبح
بنظر بنده نوشتن اینطور برنامه ها کار واقعا شاقی هست و حتی برای حرفه ایها هم چالش و فشار زیادی داره. اینو یه بار در پیام خصوصی در پاسخ کسی که در این زمینه کمک خواسته بود گفتم و صادقانه گفتم پروژه ای نیست که برای افراد عادی توصیه بشه و اگر نمیتونی خودت تنهایی مسائلش رو حل کنی بنظر من باید بذاریش کنار و بری دنبال یادگیری بیشتر و چند سالی زحمت برای این امر، چون اینطور برنامه ها اون برنامه های کلیشه ای و همه جایی نیست که هرکسی بتونه با کمک کپی پیست و وصله و پینه و سوال و کمک های دیگران از اینور و اونور که طبیعتا درحد حوصله و انتظار محدودی هست به جایی برسونشون! طرف در جوابم عصبانی شد و بد و بیراه گفت و گفتش که فکر میکنی کی هستی و این حرفا! بنده همون نمونه برنامه چت کامت نسخهء خیلی ساده دو نفره و صرفا نمایشی و آزمایشی برای تست و درک طرز کار کلی و پایه رو که نوشتم (اونی که در وبلاگم هست و در برنامه نویس هم ارائه کردم) کار سختی بود حتی برای یک خوره ای مثل بنده و عرقم رو درآورد و دهنم سرویس شد. تست و دیباگ اینطور برنامه ها کار سختی هست چون خیلی جاها با برنامه ها و روشهای و ابزارهای عادی که ما میشناسیم و استفاده میکنیم و برای کاربردهای معمول طراحی و بهینه شدن کاملا سازگار و قابل استفاده نیستن. مثلا خیلی جاها مجبور میشدم بصورت غیرمستقیم از وضعیت اجرای پردازشهاش مطلع بشم و از طریق تسک منیجر پراسس ها رو بررسی و kill بکنم و پیامهای خطای برنامه رو توی برنامه توی یک فایل سیو بکنم که بعد بتونم بخونمش و وضعیت و خروجی برنامه طوری نبود که توی مرورگر بشه دید و کنترلش کرد. تازه خیلی مسائل رو که ذهنی حل میکردم و خیلی باگها و شرایط و دلایل پیچیده رو بصورت صرفا ذهنی راحتتر و سریع تر میفهمیدم که خوشبختانه در این توانایی فکر میکنم یکی از برترین ها باشم تاجاییکه تاحالا دیدم (یعنی خیلی چیزها رو ذهنی میتونم پیشبینی کنم یا دلیل مشکلات و باگها رو اینطوری کشف کنم که اکثر افراد دیگه واسش باید عملا ببینن و تست کنن)، که اون موارد رو شما اینقدر باید تست کنی و سرت رو بکوبی به دیوار که از کردهء خودت پشیمون بشی! بعضی چیزا اصلا بصورت تستی و تجربی نیست و باید توی ذهنت تمام کارکرد سیستم و ارتباطها و مسائل همزمانی و غیره رو simulate کنی و باید اینقدر اطلاعات گسترده و دقیق و عمیق از همه چیز داشته باشی که بتونی در این زمینه بقدر کافی کامل باشی. بخصوص اینطور برنامه ها چون شرایطشون نسبت به برنامه های دیگر غیرعادی و بعضا غیر استاندارد و خارج از محدوده است و کمتر کسی باهاشون برخورد کرده و بنابراین کمتر کسی میتونه کمک کنه یا مطلبی راجع به این موارد در نت هست، با مسائل و جزییات فنی و سطح پایین تر و ظاهرا نامربوطی میتونن درگیر بشن که همه رو باید بدونید یا حدس بزنید و بررسی و تست و حل کنید. مثلا همین کامت یک چیزی تقریبا غیراستاندارد هست و در وب و برنامه های عادی ما یک کانکشن رو بطور نامحدود یا برای مدت طولانی باز نگه نمیداریم و اینطوری ازش استفاده نمیکنیم و نرم افزارهای مختلف اعم از سرویس دهنده و کلاینت برای این حالت بقدر حالتهای استاندارد و متداول طراحی و بهینه سازی و تست نشدن، بنابراین انتظار خیلی مسائل غیرمنتظره ای رو میشه داشت که در برنامه های عادی تاحالا باهاشون برخورد نکردیم یا خیلی کم برخورد کردیم و عمدتا هم مسئلهء جدی و چیزی که باید توسط برنامه نویس پیشبینی و حل میشدن نبودن.

eshpilen
جمعه 02 آبان 1393, 01:02 صبح
یه مشکلات دیگری شاید پیش بیاد در تست مثلا محدودیت اینکه بخوای تعدادی کاربر همزمان رو روی سیستم خودت تست کنی که شاید بعضی وقتا عملا بخاطر محدودیت منابع سخت افزار و نرم افزار غیرممکن باشه. مثلا مرورگرها در تعداد کانکشن های همزمان که برقرار میکنن عمدا محدودیت دارن و شما باید اینو بدونی و اگر لازم شد و ممکن بود یجوری حلش کنی (شاید گاهی با استفاده همزمان از چند نوع مرورگر مختلف) وگرنه مثلا میبینی دوتا صفحه/درخواست دارن درست کار میکنن و یکی دیگه همینطور روی هوا مونده معلوم نیست منتظر چیه بعد یکی دیگه که کارش تموم میشه به هر دلیلی میبینی تازه این یکی از خواب بیدار میشه، و خلاصه حسابی گیج میشی و اعصابت میریزه بهم و وقتت تلف میشه سر همین مسئله. همینطور خب سیستم شما چقدر منابع سخت افزاری داره و سیستم عامل و برنامه های مربوط به وب سرور محلی شما چقدر ظرفیت دارن و چقدر درخواست و پردازش رو بر اساس محدودیت سخت افزار و همچنین تنظیمات پیشفرض خودشون بطور همزمان و موازی و واقعا در عمل بقدر کافی همزمان انجام میدن، این خودش میتونه مسئله و موجب سردرگمی باشه و تست های کامل و دقیق رو مشکل تر بکنه.
حالا شما در برنامه های عادی کجا با چنین مسائلی مواجه هستی؟
از اونور باز اون کانکشن های HTTP که باز نگه میداری خودش یک کار غیرمعمول و غیراستانداردی هست که حتی توی پروتکل HTTP هم ندیدم پیشبینی شده باشه، ممکنه اون محیط و برنامه های سمت سرور و سمت کلاینت و مرورگر که شما داری تست میکنی در این زمینه یک رفتاری داشته باشن ولی اون رفتار در یک مواقع و شرایط یا محیط و کانفیگ دیگری کاملا تفاوت بکنه. حالا شما باید همهء اینا رو پیشبینی و تست بکنی تا مطمئن بشی. مثلا ممکنه تعداد و زمان کانکشن های طولانی در سمت سرور یا حتی از سمت مرورگر، بسته به نوع و کانفیگ این نرم افزارها، برای مدت نامحدودی، برای مدت طولانی، یا فقط برای مدت کوتاهی باز بمونن! بنابراین شما باید تمام این موارد رو تحقیق و تست بکنی و ببینی روی کدوم میتونی اتکا کنی و برای کدوم حالت برنامت رو طراحی و بهینه کنی و یا اینکه برنامه هوشمند باشه و تمام این موارد رو تشخیص بده و هندل بکنه.

Veteran
جمعه 02 آبان 1393, 09:52 صبح
اشپیلن زیادی بزرگ کردی کارو!
لطفا کل پروژه رو پیوست کنید با دیتابیس و... تا بررسی کنیم.

Mohammadsgh
جمعه 02 آبان 1393, 10:34 صبح
حتما باید comet باشه؟با nodejs هم میتونید اینکارو انجام بدید.این لینکو (https://www.google.com/search?q=how+to+create+chat+system+in+nodejs&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb)ببینید

2undercover
جمعه 02 آبان 1393, 11:54 صبح
حتما باید comet باشه؟با nodejs هم میتونید اینکارو انجام بدید.این لینکو (https://www.google.com/search?q=how+to+create+chat+system+in+nodejs&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb)ببینید

مشکل NodeJS اینجاست که پیدا کردن یک میزبان مناسب سخته براش. یا باید از شرکت های غیر ایرانی میزبانی بگیرید یا این که یک VPS داشته باشید که هزینه اش بالا میره.

Mohammadsgh
جمعه 02 آبان 1393, 13:11 عصر
درسته ولی nodejs قوی تره.حالا هر جور میدونن:لبخندساده:

***BiDaK***
جمعه 02 آبان 1393, 13:14 عصر
درسته ولی nodejs قوی تره.حالا هر جور میدونن:لبخندساده:
دلایلت چیه که پافشاری میکنی؟

SimRFE
جمعه 02 آبان 1393, 16:50 عصر
منم اول node.js رو پیدا کردم و با تحقیقاتی که کردم فهمیدم node.js خیلی هم سرعت بالاتره ، ولی مشکل اینجاس که اولا این سیستمی که من میخوام بسازم قراره یه اسکریپت باشه که هر کسی بتونه روی هاستش نصب کنه ینی ما به تنظیمات سرور دسترسی نداریم ، و همینطور دنگ و فنگ زیاد هم نداشته باشه که افراد مبتدی هم بتونن راحت نصب کنن.
تحقیق که میکردم خیلی جاها گفته بودن انجام این کارها روی apache و همینطور با php خیلی سخته ، ولی با جاوا خیلی راحت تر میشه پیاده سازیش کرد ، اما یه مثال دیگه من ایــــــنجا (http://www.zeitoun.net/articles/comet_and_php/start) پیدا کردم که دیگه اون مشکل رو نداشت ، البته نتونستم دقیق بفهمم که چیکار کرده که درست شده ولی ظاهرا که هیچ مشکلی نداشت.

peymang
جمعه 02 آبان 1393, 17:54 عصر
http://www.rezaonline.net/blog/comet-simple-chat.html

Mohammadsgh
جمعه 02 آبان 1393, 21:00 عصر
دلایلت چیه که پافشاری میکنی؟
قوی تره و حرفه ای تر.از comet حرفه ای تره.باهاش میشه یه سیستم چت حرفه ای درست کرد.نمونه کارهاشو تو لینکی که دادم میتونید ببینید

eshpilen
جمعه 02 آبان 1393, 21:52 عصر
اشپیلن زیادی بزرگ کردی کارو! لطفا کل پروژه رو پیوست کنید با دیتابیس و... تا بررسی کنیم. البته من یه سیستم چت کامل واقعی رو گفتم که کاربران همزمان قابل توجهی رو پشتیبانی بکنه، بعلاوهء احتمالا امکانات جانبی که اینطور سیستمها معمولا دارن. شک نکن که نوشتن همچین سیستمی از صفر تا 100% فقط توسط یک نفر برنامه نویس مبتدی یا حتی متوسط، کار بسیار دشواریه. شما خودت مگه تاحالا نظیر چنین سیستمی رو خودت نوشتی که فکر میکنی اونقدر سخت نیست؟ اون لینک ها و منابعی هم که میذارید تاجاییکه دیدم همشون درحد همون مثالهای پایه و اصول کار کلی و نهایت برنامه های خیلی کوچک و ساده تستی مثل همون مورد چت دو نفره که خودم قبلا نوشتم و گذاشتم هستن. یه چیزی کامل و عملیاتی و بدون محدودیت بخوای درست کنی کار خیلی گسترده تر و سخت تریه و با این دوتا مثال و کد و برنامه های کوچک نمایشی، از عهدهء یک مبتدی برنمیاد.

eshpilen
جمعه 02 آبان 1393, 22:53 عصر
بهرحال هم یک چت کامل بنظرم باید یکسری امکانات تکمیلی مثل امکان نظارت و مدیریت توسط یک ادمین، احتمالا تاریخچه و لاگینگ، و هر دوی چت خصوصی و عمومی رو داشته باشه و یکسری امکانات دیگه که توی سیستمهای چت که کاربران ازش استقبال بکنن میبینیم. فکر کنم روی تعداد کاربران همزمان هم باید تنظیم محدودیت بذاریم، همچنین شاید بعضی حمله ها و سوء استفاده ها، مثلا اینکه یک کلاینت با بیش از یک مرورگر/پنجره و لاگین توی چت نیاد و چت رو نترکونه و حملهء DOS و اسپم نکنه و این حرفا. طراحی و پیاده سازی و هندل کردن همهء اینا توی یک سیستم چت کامت که همینطوریش و پایش هم غیراستاندارد و دشوار و دچار محدودیت هست بنظرم به هیچ وجه کار یه برنامه نویس غیرخبره نیست. با توجه به اینکه کانکشن های باز همزمان توی این سیستم وجود داره، بنابراین میتونه منابع سرور رو با شدت خیلی بیشتر نسبت به برنامه های دیگه تحلیل ببره و بنابراین با تعداد کاربران خیلی کمتری به زانو دربیاد و در مقابل حمله های DOS هم بسیار آسیب پذیره و براحتی شاید حتی یک کاربر میتونه با روشهای ساده بهش حمله کنه. البته اینا که میگم خودم ازشون مطمئن نیستم و شاید مسئله جدی باشن یا نباشن، بهتر باشن یا بدتر، ولی مسئله اینه که همهء این مسائل درمورد اینطور برنامه ها و روشهای غیرعادی خیلی بیشتر از برنامه های معمولی محتمل هستن و باید همه دقیقا تحلیل و تست گسترده ای بشن که خود همین کلی کار و دردسره و نیاز به سواد و مهارت خودش هم داره. اینطور برنامه ها فقط این نیست که یه چیزی بنویسی و توی لوکال دو سه تا مرورگر و پنجره باز کنی و تستش کنی، بلکه چون مسئلهء تعداد قابل توجهی کاربران آنلاین بصورت همزمان و کانکشن های باز همزمان است، تست کردنش نیاز به شرایط واقعی تری داره و خودمم نمیدونم دقیقا چطور میشه انجامش داد یا حداقل روی سیستم خودمون تاحد ممکن شبیه سازیش کنیم! یعنی تا شما روی یک سرور واقعی نیاری و کارکرد کل سیستم و تمام کاربران در حال چت رو بطور همزمان تحت نظر نگیری و کوچکترین مشکلی که برای سیستم یا بعضی از کاربران پیش بیاد متوجه نشی و وضعیت کل سیستم رو در اون لحظه ندونی که بعد هم بتونی دلیل اشکالات رو تشخیص بدی و رفع کنی، چطور میتونی از کارکرد برنامه مطمئن باشی و بگی تستش کردی و تحت چه شرایطی و واسه چه تعداد کاربری جواب میده و چه قدرت سروری میخواد؟ روی لوکال هم که مثل سرور نیست لزوما از نظر تعداد هسته ها و قدرت پردازش و همچنین امکان تست و تحت نظر گرفتن تجربهء کاربران بطور کاملا همزمان خیلی دشواره (اینکه چندتا پنجرهء چت رو شبیه سازی کنی و تحت نظر بگیری که همه همزمان دارن تایپ و ارسال میکنن). ما کجا توی برنامه ها و سایت های معمولی همچین مسائل و محدودیت هایی رو داریم؟ من خودم بارها در سایتهای مختلف که سیستم چت داشتن اشکالات زیادی رو دیدم و گاهی اصلا چتشون قابل استفاده نبوده، چه بسا به دلیل همین پیچیدگی ها و اینکه برنامه نویسان اونا گستردگی و پیچیدگی این مسائل رو متوجه نبودن یا بهرصورت نتونستن یا نخواستن که تست های گسترده کامل و دقیقی بکنن و مطمن بشن. حالا اونایی که از اسکریپت های آماده معروف استفاده میکردن معمولا کمتر مشکل داشتن، ولی یکسری ها که ظاهرا خودشون نوشتن اشکال هم زیاد دارن. بعد این مشکلاتی که در استفاده توسط کاربر پیش میاد نمیدونم آیا از صدتا یکیش هم اصلا متوجه میشن یا نه و به گوششون میرسه یا نه، چون خود منکه مثلا حال و انگیزه ای نداشتم که باهاشون تماس بگیرم و بگم سیستم چت شما واسه من اصلا کار نمیکنه یا فلان مشکل رو در فلان شرایط درش دیدم! بنظر من یک سیستم چت باید امکانات نظارت و لاگ حسابی داشته باشه که وقتی مشکلی پیش میاد این ثبت و اطلاع رسانی بشه به افرادی که مسئولش هستن تا بتونه بررسی و برطرف بشه. تازه یه امکانی همون جا دم دست هم بذارن برای کاربران که بنویسن برای کاربران که مشکلات سیستم چت رو از این طریق گزارش کنید، فکر میکنم کار مفیدی باشه.

Mohammadsgh
شنبه 03 آبان 1393, 00:34 صبح
شما زیادی سخت گرفتید چت ف ی س ب و ک که نیست یه سیستم چت ساده تره

eshpilen
شنبه 03 آبان 1393, 08:42 صبح
همون ساده که میگی بازم چیز کمی نیست و برای مبتدی ها نیست.
شما خودت مگه یه سیستم چت درست و حسابی رو از صفر تا صد نوشتی؟
اگر ننوشتی نمیتونی ادعا کنی که ساده است (حداقل برای مبتدی ها). معلومه مسائلی رو که اشاره کردم نگرفتی و درک نکردی. در عمل که بری متوجه میشی چی میگم. البته من دارم یک چت درست و حسابی با اون امکانات لازمی که گفتم رو میگم که با همین JS و PHP خودمون و احتمالا با استفاده از comet نوشته بشه. با چیزهای دیگری مثل node.js نمیدونم شاید خیلی ساده تر بشه کار.

eshpilen
شنبه 03 آبان 1393, 08:57 صبح
مطمئن باش اگر اونقدر ساده بود تا الان هر جوجه ای یه مدل برنامه چت داده بود بیرون و کلی از این برنامه ها داشتیم و همه جا ریخته بود و دیگه اینقدر دنبالش نبودن. اما من شخصا مواردی که تاحالا دیدم خیلی کم بوده و اکثرا معروف ها و بدردبخورهاش یکسری برنامه های شناخته شده و با سابقه بوده که توسط برنامه نویسان وطنی هم نوشته نشده! والا ظاهرا CMS بیشتر داریم و انگار برای مبتدی ها راحتتره (در سطح محدود و سادش البته) تا نوشتن برنامه چت!
چند وقت پیش هم یه نفر باهام تماس گرفت و توی همون اوایل کار گیر کرده بود سر مسائل و پیچیدگی هایی که گفتم اینطور برنامه ها دارن.