برنامه ۱۲ عاملی (۹)- عامل هشتم: همروندی

  • یوسف مهرداد بی‌بالان

عامل ۸- همروندی (Concurrency)
برنامه را از طریق مدل پردازش (process model) مقیاس‌پذیر و بزرگ کنید

هر برنامه کامپیوتری پس از اجرا با یک یا چند پردازش (process) در سیستم عامل نمایش داده می‌شود. برنامه‌های وب شکل‌های مختلفی برای اجرای پردازش پیدا کرده‌اند. به عنوان مثال پردازش‌ها یا برنامه‌های PHP می‌توانند به عنوان فرزندی از پردازش‌های آپاچی اجرا می‌شوند البته در صورت نیاز (on demand) و بسته به میزان حجم درخواست (request). پردازش‌های جاوا رویکردی متضادی دارند، این رویکرد به کمک JVM و ابتدا با استفاده از پردازش غول‌پیکری که بخش بزرگی از منابع سیستم مانند CPU و حافظه را در ابتدا در اختیار می‌گیرد و سپس با مدیریت داخلی همروندی (concurrency) به کمک ریسمان‌ها(thread) انجام می‌شود. در هر دو نمونه یعنی PHP و جاوا، امکانِ دسترسی و مشاهده‌‌ی پردازش‌های در حال اجرا برای توسعه‌دهندگان برنامه در پایین‌ترین میزان خود قرار دارد.

پردازش‌ها در برنامه دوازده عاملی اهمیت زیادی دارند و شهروندان درجه‌ یک به حساب می‌آیند. (مترجم؛ در زبان‌های برنامه نویسی، شهروند درجه یک عنصری از زبان است که از تمام عملیات موجود که برای سایر عناصر زبان پشتیبانی می‌کند). خط مشی پردازش‌ها در برنامه دوازده عاملی به شدت از مدل پردازش یونیکس (unix) برای دیمن‌های (deamon) سرویس‌های در حال اجرا اقتباس شده است. (مترجم؛ دیمن، پردازشی از نوع سرویس (service process) که در پس‌زمینه (background) اجرا می‌شود و وظیفه‌ی آن نظارت و رسیدگی به سیستم یا فراهم‌سازی خدماتی برای سایر پردازش‌هاست). توسعه‌دهندگان به کمک این مدل می‌توانند معماری برنامه خود را برای مدیریت اجرای کارهای متنوع و متفاوت به گونه‌ای طراحی کنند که هر نوعی از کارها را به یک نوع پردازش (process type) ویژه‌ محول کنند. به عنوان نمونه، درخواست‌های HTTP توسط یک پردازش وب (web process) مدیریت می‌شود و کاری که در پس‌زمنیه برای طولانی‌مدت باید اجرا شود توسط یک پردازش کارگر(worker process) انجام می‌شود.

چنین رویکردی در مورد تقسیم زمان و تسهیم منابع (multiplexing) داخلیِ پردازش‌های مستقل استثنا قائل نمی‌شود. (مترجم؛ ایجاد منابع متعدد منطقی از یک منبع فیزیکی را مالتی پلکس گویند) . این کار معمولا به کمک ریسمان‌های (thread) داخل ماشین مجازی (VM) یا به کمک مدل async/evented که در ابزارهایی مانند EventMachine، Twisted یا Node.js وجود دارند مدیریت می‌شوند. نکته مهم این است که اندازه‌ی ماشین مجازی می‌تواند تا حد مشخصی افزایش یابد (افزایش عمودی)، بنابراین برنامه باید بتواند با چندین پردازش که روی چندین ماشین فیزیکی در حال اجرا هستند نیز کار کند.

وقتی که زمان مقیاس‌پذیری افقی (scale out) فرا برسد تازه اهمیت مدل پردازش نمایان می‌شود (مترجم؛ scale in به معنای افزایش عمودی منابع و scale out به معنای افزایش افقی آنها است.). اصل «اشتراک‌گذاری صفر»(share-nothing) و ماهیت تقسیم‌پذیری افقیِ پردازش‌های برنامه دوازده عاملی به این معنی است که افزایش همروندی (concurrency) عملیاتی ساده و قابل اتکا است. آرایه ای از نوع پردازش (Process type) و تعداد پردازش‌های موجود از هر نوع با نام شکل گیری پردازش (process formation) شناخته می‌شود.

پردازش‌‌ها در برنامه دوازده عاملی هرگز نباید دیمن‌سازی کنند (daemonize) یا فایل‌های PID (process identifier) را دست کاری کنند (مترجم؛ دیمن‌سازی یک برنامه یا اسکریپت به معنای آماده‌سازی آنها برای اجرا در پس‌زمینه (background) و تبدیل کردن آنها به یک دیمن است).. در عوض، برای مدیریت خروجی‌ها، رسیدگی به پردازش‌های از کار افتاده و مدیریت راه‌اندازی‌های مجدد و خاموش‌ کردن‌هایی که توسط کاربر انجام می‌شوند، باید از مدیریت پردازش‌های سیستم عامل استفاده کنند. از جمله‌ی این ابزارهای مدیریت پردازش‌ می‌توان به systemd در لینوکس، مدیر پردازش توزیع‌شده در پلتفرم‌های ابری یا ابزارهایی که برای توسعه‌دهندگان ساخته‌ شده‌اند مانند Foreman اشاره کرد.

نوشته‌های قبلی:
قسمت هشتم: عامل هفتم: اتصال به پورت

مترجم: حمید آقای خاتمی

گزیده:
«از اژدهای هفت‌سر مترس، از مردم نمام بترس که هرچه وی به ساعتی بشکافد، به سالی نتوان دوخت.» قابوسنامه

یادگیری ماشین برای همه (۷)

  • یوسف مهرداد بی‌بالان

ادامه طبقه‌بندی …

بیایید نمونه‌ی عملی دیگری از طبقه‌بندی را با هم بررسی کنیم. فرض کنید شما می‌خواهید مبلغی از بانک وام یا اعتبار بگیرید. چگونه بانک تشخیص می‌دهد که شما وام‌ را بازپرداخت خواهید کرد یا نه؟ قطعا هيچ راهی برای کسب اطمینان صد در صدی وجود ندارد. اما بانک پرونده تعداد زیادی از مشتریان را دارد که قبلا وام گرفته‌اند. بانک اطلاعات مربوط به سن، تحصیلات، شغل و حقوق و مهم‌تر از همه این‌که وام را بازپرداخت کرده‌اند یا خیر را دارد.
با استفاده از این داده‌ها می‌توانیم روش یافتن الگوها (pattern) و پیدا کردن پاسخ این سوال را به ماشین آموزش دهیم. در اینجا مشکل خاصی برای پیدا کردن پاسخ وجود ندارد. موضوع اصلی این است که بانک نمی‌تواند کورکورانه به پاسخ ماشین اعتماد کند. زیرا ممکن است خرابی سیستم (system failure) یا حمله هکرها اتفاق افتاده باشد یا حتی ممکن است کارمند سالخورده‌ای که در وضعیت سرخوشی (drunk) است با راهکار سریع‌اش برای رفع خطا (quick fix) باعث خرابی سیستم شده باشد.
برای حل این گونه مسائل از درخت تصمیم (Decision Tree) استفاده می‌شود (اینجا را هم ببیند https://bit.ly/3PZNLRl ).
تمام داده‌ها به صورت خودکار به سوالات بله/خیر تقسیم می‌شوند برای مثال «آیا درآمد وام‌گیرنده بیش از ۱۲۸.۱۲ دلار است؟». چنین کاری ‌می‌تواند از نگاه انسان‌ها کمی عجیب به نظر برسد. با این حال، ماشین چنین سوالاتی را مطرح می‌کند تا داده‌ها را در هر گام به بهترین شکل تقسیم کند.


با این روش، درخت تصمیم ساخته می‌شود. هرچه ارتفاع درخت بیشتر باشد (مترجم؛ به شکل نگاه کنید) به این معناست که سوال‌ها گسترده‌تر هستند. هر تحلیلگری می‌تواند درخت را ببیند و آن را توضیح دهد. ممکن است منطق آن را درک نکند اما به راحتی می‌تواند آن را توضیح دهد! (منظور من تحلیل‌گرهای معمولی‌اند)
درخت‌ تصمیم به طور گسترده‌ای در حوزه‌های پرمسئولیتی مانند تشخیص بیماری، پزشکی و امور مالی استفاده می‌شوند.
امروزه به ندرت از درخت تصمیم به تنهایی و بدون ترکیب با سایر تکنیک‌ها استفاده می‌شود. با این حال، آنها معمولا پایه و اساس سیستم‌های بزرگ را تشکیل می‌دهند و ترکیب گروهی از آنها حتی بهتر از شبکه‌های عصبی کار می‌کند. بعداً در این مورد صحبت خواهیم کرد.
وقتی عبارتی را در گوگل جستجو می‌کنید دقیقا گروهی درخت تصمیم وجود دارند که دنبال طیف وسیعی از پاسخ‌ها می‌گردند. موتورهای جستجو به دلیل سرعت بالا، عاشق درخت‌‌های تصمیم هستند.
دو مورد از الگوریتم‌های معروف برای ساختن درخت CART و C4.5 هستند.

مترجم: خانم سپیده مشایخی

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

ست لوید (Seth Lloyd)
منبع: کتاب تراوش‌های ذهنی، ۲۵ شیوه نگرش به هوش مصنوعی

 

یادگیری ماشین برای همه (۶)

  • یوسف مهرداد بی‌بالان

۱-۱-۱-طبقه‌بندی (Classification)
تعریف:‌ طبقه‌بندی عبارت است از تقسیم اشیاء بر اساس یکی از خصیصه‌های (attribute) از پیش تعیین‌شده. برای نمونه تقسیم جوراب‌ها بر اساس رنگ آنها، تقسیم اسناد و مدارک بر اساس زبان نوشتاری یا تقسیم آهنگ‌ها بر اساس ژانر (genre) آنها
کاربردها:
– شناسایی و فیلتر هرزنامه‌ (Spam filtering)
– تشخیص زبان (Language detection)
– پیدا کردن اسناد مشابه (A search of similar documents)
–تحلیل احساسات (Sentiment analysis)
– شناسایی حروف و اعداد دست‌نویس (Recognition of handwritten characters and numbers)
– تشخیص تقلب (Fraud detection)

الگوریتم‌های محبوب:
– بیز ساده (Naive Bayes)
درخت تصمیم (Decision Tree)
رگرسیون لجستیک (Logistic Regression)
کی-نزدیکترین همسایه (K-Nearest Neighbors یا K-NN)
ماشین بردار پشتیبان (Support Vector Machine یا SVM)

از اینجا به بعد می‌توانید با اطلاعات خود در مورد این بخش‌ها اظهار نظر کنید. اگر دوست داشتید می‌توانید نمونه‌ها و مثال‌های خود را درباره‌ی هر یک از کارها و وظایف (task) یادگیری ماشین بیان کنید. این بخش بر اساس تجربیات شخصی‌ام نوشته شده است.

یادگیری ماشین معمولا درباره طبقه‌بندی موضوعات است. در طبقه‌بندی، ماشین مانند کودکی است که در حال یادگیری مرتب کردن اسباب بازی‌های خود است: این یه رباته، این هم یه ماشینه، (با دیدن ماشین بدون راننده) این هم یه … این چیه؟ … اوه! اوه! صبر کنید. اشتباهه! اشتباهه!
در طبقه‌بندی، شما همواره به یک معلم نیاز دارید. داده‌ها‌ باید با ویژگی‌ها (features) برچسب‌گذاری شوند تا ماشین بتواند دسته‌ها (class) را بر اساس آنها تعیین کند. همه چیز را می‌توان طبقه‌بندی کرد: طبقه‌بندی کاربران را بر اساس علایق (مانند کارکرد فیدهای الگوریتمی) (مترجم. فیدهای الگوریتمی یا algorithmic feed، الگوریتم‌های شبکه‌های اجتماعی‌اند که مطالب مورد علاقه‌ی کاربر را پیش‌بینی می‌کنند. به عبارت دیگر به جای نمایش پست‌های جدید به ترتیب زمان انتشار آنها، شبکه اجتماعی مطالبی را به کاربر نشان می‌دهد که بر اساس علایق وی پیش‌بینی و انتخاب کرده است) ، طبقه‌بندی مقالات بر اساس زبان و موضوع (topic) (که برای موتورهای جستجو با اهمیت است) ، طبقه‌بندی موسیقی مبتنی بر ژانر (مانند لیست پخش Spotify) و حتی طبقه‌بندی ایمیل‌های شما.
در شناسایی و فیلتر هرزنامه‌ها از الگوریتم بیز ساده (Naive Bayes ) به شکل گسترده‌ای استفاده شده است. ماشین تعداد تکرار نام یک واژه غیرمجاز را در هرزنامه‌ها و ایمیل‌های عادی می‌شمارد و احتمال (probability) آنها را حساب می‌کند. سپس با استفاده از معادله بیز آنها را ضرب و جمع انجام می‌دهد و تعیین می‌کند که پیام دریافتی هرزنامه است یا یک پیام عادی. خوب تمام شد و ما به یک مدل یادگیری ماشین دست پیدا کردیم (مترجم. اساس معادله بیز، احتمال شرطی است که در آن از داده‌هایی مانند احتمال وجود یک کلمه در پیام‌های عادی و در هرزنامه‌ها و هم‌چنین احتمال اینکه یک پیام، هرزنامه باشد یا پیام عادی استفاده می‌شود).

بعدها ارسال‌کنندگان هرزنامه یاد گرفتند که چگونه با افزودن تعداد زیادی کلمه‌ «خوب» در پایان ایمیل، فیلترهای بیز رو به رو شوند. به کنایه به این روش، مسمومیت بیز (Bayesian poisoning) گفته می‌شود. بیز ساده به عنوان ظریف‌ترین و از نظر کاربردی اولین الگوریتم در تاریخ ثبت شد. اما اکنون از الگوریتم های دیگر برای شناسایی و فیلتر هرزنامه‌ها استفاده می‌شود.

مترجم: خانم سپیده مشایخی

گزیده:
بهترین شطرنج‌بازان جهان، نه رایانه‌ها هستند و نه انسان‌ها، بلکه انسان‌هایی هستند که با رایانه‌ها کار می‌کنند.
جان بروکمن
منبع: کتاب تراوش‌های ذهنی، ۲۵ شیوه نگرش به هوش مصنوعی

گپ و گفت‌های هوش مصنوعی (۲)

  • یوسف مهرداد بی‌بالان

من کاربران بسیاری را دیده‌ام که می‌گویند «خوب [مدل] کار می‌کند اما نمی‌دانم چرا.» اگر یادگیری عمیق را بر روی حجم عظیمی از داده‌ها به کار بندید، پویایی خاص خودش را دارد. خودش را اصلاح و بهینه‌سازی می‌کند و در اغلب اوقات نتایج صحیح را در اختیارتان می‌گذارد. اما اگر چنین نکرد، شما سرنخی ندارید که چه چیزی اشتباه بود و چه چیزی باید درست شود. به ويژه، شما نمی‌دانید که اشتباه در برنامه بود یا در روش و یا به خاطر این که عوامل محیط تغییر کرده‌اند. ما باید نوع دیگری از شفافیت را هدف قرار دهیم.

از دید من، یادگیری ماشین ابزاری است برای رساندن ما از داده‌ها به احتمالات. اما برای رسیدن از احتمالات به درک واقعی، هنوز دو گام دیگر باید برداشته شود – دو گام بزرگ و مهم. یکی پیش‌بینی اثر اقدامات و دیگری تصور خلاف واقع. تا وقتی که دو گام آخر را برنداشته‌ایم، نمی‌توانیم ادعا کنیم که به درک واقعیت نائل آمده‌ایم.

جودیا پرل (Judea Pearl)

منبع: کتاب تراوش‌های ذهنی، ۲۵ شیوه نگرش به هوش مصنوعی، فصل ۲
نوشته جان بروکمن، ترجمه استاد گرامی ابراهیم نقیب‌زاده مشایخ

گپ و گفت‌های هوش مصنوعی (۱)

  • یوسف مهرداد بی‌بالان

در میان بسیاری از موضوعات مطرح شده در کتاب «استفاده انسانی از انسان‌ها» [The Human Use of Human Beings] نوشته وینر (۱۹۵۰) [Norbert Wiener] که هم‌اکنون نیز مربوطند، مهم‌ترین آنها برای پژوهشگران هوش مصنوعی این احتمال است که انسان، کنترل خود بر روی سرنوشتش را به ماشین واگذار کند.

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

استوارت راسل

منبع: کتاب تراوش‌های ذهنی، ۲۵ شیوه نگرش به هوش مصنوعی، فصل ۳
نوشته جان بروکمن، ترجمه استاد گرامی ابراهیم نقیب‌زاده مشایخ

 

یادگیری ماشین برای همه (۵)

  • یوسف مهرداد بی‌بالان

نقشه‌ی دنیای یادگیری ماشین
اگر حوصله خواندن مطالب طولانی را ندارید، برای فهمیدن مفاهیم به تصویر زیر نگاهی بیندازید.

یکی از نکات مهمی که همواره باید به خاطر داشت این است که برای هر مساله در دنیای یادگیری ماشین، فقط و فقط یک راه‌حل وجود ندارد. معمولا چندین الگوریتم مناسب برای مساله وجود دارد و شما باید انتخاب کنید که کدام یک از آنها بهتر است. بی‌شک همه مسائل را می‌توان با شبکه‌های عصبی حل کرد اما چه کسی هزینه‌ی تامین GeForceها را پرداخت کند. [برای استفاده از شبکه‌های عصبی نیاز به پردازنده‌های بسیار قوی است و GeForce یکی از این پردازنده‌ها است که محصول شرکت Nvidia است؛ مترجم].
بیایید با مرور کلی دنیای یادگیری ماشین شروع کنیم. امروزه چهار شاخه اصلی در یادگیری ماشین وجود دارد.

۱- یادگیری ماشین کلاسیک (Classical Machine Learning)
اولین روش‌های یادگیری ماشین در دهه ۵۰ میلادی از آمار نظری پدید آمدند. آنها مساله‌های ریاضی آکادمیک مانند جستجوی الگوها (patterns) در اعداد، محاسبه‌ی نزدیکی نقطه داده‌‌ها ( proximity of data points) و محاسبه جهت بردارها (vectors) را حل کردند.

امروزه نیمی از اینترنت بر اساس این الگوریتم‌ها کار می‌کنند. وقتی موقع خواندن اخبار و مقالات با انتخاب گزینه‌ی “بعدی” فهرستی از اخبار و مقالات به شما نشان داده می‌شود یا وقتی کارت‌تان توسط بانک به دلایل امنیتی و به خاطر استفاده در پمپ بنزینی وسط ناکجاآباد مسدود می‌شود، احتمالا کار یکی از همین رفقای فسقلی است.
شرکت های بزرگ فناوری طرفدار دو آتیشه شبکه‌های عصبی‌اند. برای آنها بهبود ۲ درصدیِ دقت مدل به معنای افزایش ۲ میلیاردیِ درآمد است. اما برای شرکت‌های کوچک چنین موضوعی منطقی به نظر نمی‌رسد. من داستان‌هایی درباره تیم‌هایی شنیده‌ام که یک سال از وقت خود را صرف پیاده‌سازی الگوریتم جدیدی کرده‌اند تا در صفحه‌ی اصلی وب سایت، محصولاتی را برای خرید به کاربران پیشنهاد کند و بعد از یک سال متوجه‌ شده‌اند که ۹۹٪ ترافیک سایت‌ از موتورهای جستجو می‌آید. الگوریتم‌های پیاده‌سازی‌شده عملا بی‌فایده بودند چون بیشتر کاربران حتی صفحه اصلی سایت را باز نمی‌کردند.
با وجود محبوبیت، رویکردهای کلاسیک آن قدر ساده‌اند که می توان آنها را به راحتی به کودکان توضیح داد. آنها شبیه ریاضیات پایه‌اند و ما بدون آنکه فکرمان را درگیر آنها کنیم، هر روز از آنها استفاده می کنیم.

۱.۱- یادگیری تحت نظارت (Supervised Learning)
یادگیری ماشین کلاسیک اغلب به دو دسته تقسیم می‌شود: یادگیری تحت نظارت (Supervised Learning) و یادگیری بدون نظارت (Unsupervised Learning)
در یادگیری تحت نظارت،‌ ماشین یک «سرپرست»(supervisor) یا «معلم»(teacher) دارد که تمام پاسخ‌ها را در اختیارش قرار می‌دهد برای مثال برای هر عکس مشخص می‌کند که این عکسِ گربه است یا عکس سگ. معلم قبلاً داده‌ها را به دو دسته‌ی عکس گربه‌ها و عکس سگ‌ها تقسیم‌ کرده است (برچسب‌ یا label زده است ). و ماشین از این نمونه‌ها برای یادگیری استفاده می‌کند: يکی يکی و سگ‌ها جدا گربه‌ها جدا.
یادگیری بدون نظارت به این شکل است که انبوهی از عکس حیوان‌ها را در اختیار ماشین قرار می‌دهیم و وظیفه‌ی ماشین این است که به تنهایی و بدون معلم،‌ عکس هر حیوانی (عکس‌های مشابه) را پیدا کند. در این روش، داده‌ها برچسب‌ (label) ندارند و معلمی هم وجود ندارد، ماشین تلاش می‌کند تا به تنهایی الگوها را پیدا کند. در مورد این روش‌ها در ادامه صحبت خواهیم کرد.
بدیهی است که ماشین با کمک معلم سریع‌تر یاد خواهد گرفت از این رو در کارهای (task) واقعی بیشتر از یادگیری تحت نظارت استفاده می‌شود. این کارها (tasks) به دو دسته‌ تقسیم می‌شوند: طبقه‌بندی (classification) که در آن، دسته‌ای که یک شی (object) به آن تعلق دارد پیش‌بینی می‌شود و رگرسیون (regression) که در آن، نقطه‌ای معین روی محور‌های عددی پیش‌بینی می‌شود.

مترجم: خانم سپیده مشایخی

گزیده:
«اگر بخواهم پیام این کتاب را در یک عبارت مختصر و مفید بیان کنم این است که شما باهوش‌تر از داده‌هایتان هستید. داده‌ها نمی‌توانند علت و معلول (causes and effects) را درک کنند، اما انسان‌ها می‌توانند.»
– جودیا پرل، کتاب چرا: علم جدید علت و معلول

به شکوفه‌ها ، به باران، برسان سلام ما را

  • یوسف مهرداد بی‌بالان

 

این عکس زیبا و پیام پایین آن را یکی از دوستان بسیار عزیزم که جنوبی است برای من فرستاده. این عکس ورودی جاده بی‌بالان است. این دوست باصفا در سفری که به شمال داشت وقتی از اینجا رد می‌شده بزرگوارانه به یادم بود و این عکس را گرفته‌ و از طریق شبکه‌های اجتماعی برایم فرستاده‌ تا باعث خوشحالی‌ام شود. قابل گفتن نیست که با دیدن این عکس چقدر حالم خوب شد.
و اما بخوانید ادامه پیام‌های ما را:
من:‌ به‌به، به سلامتی و خوشی. کجا رفته بودید؟‌ ویزا داشتید؟ 🙂 🙂 (من به شوخی به دوستانم می‌گویم که برای ورود به بی‌بالان باید ویزا داشته باشید 🙂 )
دوستم: با ری‌بن بودم. کسی چیزی نپرسید 🙂 😉 . (برای دوست جنوبی و خونگرم من،‌ عینک ری‌بن جایگاهی ویژه دارد)
من: می‌خواهم این عکس را در وبلاگ منتشر کنم. می‌توانم با اسم یا اسم خانوادگی یا هیچ‌کدام منتشر کنم.
دوستم:‌ می‌دونید که اسم کوچک من unique identifier است. فقط در قیاس با ترکیب اسم و فامیل که guid است، کمی بهتره ????. هر جور صلاح می‌دونید.

توضیح: من تا حالا کسی همنام با دوستم ندیده‌ام! تو دنیای من واقعا «تکه» و «لنگه نداره»، هم از نظر شخصیت و هم از نظر اسم!

گزیده:
گیلان، ای سرزمین سبزه خوش‌رنگ
دورم من از تو، گر هزاران فرسنگ
زیر بلندآسمانِ آبی و زیبا
نیست دلم دور از آن بهشتِ دلارا

گلچین گیلانی

برای خروج از جستجو کلید ESC را بفشارید