<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های توحید ارسطو</title>
        <link>https://virgool.io/feed/@arastu</link>
        <description>توسعه‌دهنده نرم‌افزار</description>
        <language>fa</language>
        <pubDate>2026-06-10 15:11:41</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/594/avatar/NdUldF.png?height=120&amp;width=120</url>
            <title>توحید ارسطو</title>
            <link>https://virgool.io/@arastu</link>
        </image>

                    <item>
                <title>نوشتن نرم‌افزار در ۴۰ سال پیش چگونه بود؟</title>
                <link>https://virgool.io/@arastu/%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D9%86%D8%B1%D9%85%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%AF%D8%B1-%DB%B4%DB%B0-%D8%B3%D8%A7%D9%84-%D9%BE%DB%8C%D8%B4-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D9%88%D8%AF-uqajaimktrn3</link>
                <description>شرایط اینگونه است: سال ۱۹۸۴ میلادی است، وظیفه نوشتن یک Spellchecker برای یک نرم‌افزار Word proccessor در سیستم‌عامل MS-DOS به شما سپرده شده است، بعضی از کاربران و نه همه آنها ۶۴۰ کیلوبایت رم در کامپیوتر‌هایشان دارند. شما باید سیستم‌های با رم کمتر یعنی با کمتر از ۲۵۶ کیلوبایت رم را نیز ساپورت کنید، این یعنی با یک چهارم یک مگابایت یک نرم‌افزار ویرایش متن، محتوای در حال ویرایش و حافظه مورد نیاز برای سیستم عامل را تامین کنید. و البته که spellchecker!برای مقایسه در مک بوک من، دیشکنری استاندار مورد استفاده برای غلط‌یابی در سیستم عامل در مسیر usr/share/dict/words که شامل ۲۳۵٬۸۸۶ کلمه است دارای حجم ۲٬۴۹۳٬۱۰۹ بایت می‌باشد.یکی از اولین و جذابترین راه‌حل‌هایی که به ذهن هر کسی می‌رسید پیدا کردن فرمتی بود که نسبت به متن خام فشرده‌تر باشد. دیکشنری UNIX برای مثال هم شامل stop هست هم شامل stopped و هم شامل stopping، بنابراین تعداد زیادی تکرار قابل حذف در اینجا داریم، شاید با پیاده‌سازی هوشمندانه یک trie بتوان این تریک را انجام داد... عاما! ما نیاز به کاهش حجم خیلی زیادی داشتیم که از بیشتر از دو مگابایت به چندصد کیلوبایت برسیم.در حقیقت اگر ما بتوانیم هر کلمه را در دیکشنری غلط‌یاب را در صرفا یک بایت ذخیره کنیم، ما تقریبا به همه ۲۵۶ کیلوبایت رم یک کامپیوتر برای صرفا کار کردن غلط یاب نیاز داریم، و البته آدرس‌دهی هر کلمه با یک بایت امکان‌پذیر نخواهد بود. بنابراین نه تنها نگهداری کل دیکشنری در رم ناامیدکننده است بلکه نگه‌داشتن دیکشنری در دیسک و صرفا نگه داشتن یک فهرست (ایندکس) در رم هم به راه‌حل به درنخوری است.می‌توان بخشی از دیکشنری شامل کلمات مهم را انتخاب کرد و با فشرده‌سازی سنگین آن را در بخش کوچکی از حافظه نگه‌ داشت، سپس روش کندتر و مبتنی بر دیسک (هارد دیسک و ...) برای جستجو در بقیه دیکشنری که در رم نیست را پیاده سازی کرد. یا شاید بتوان یک روش کاملا مبتنی بر دیسک با استفاده از یک دیتابیس اختصاصی را انتخاب کرد. (یاداوری: در سال دهه ۸۰ میلادی نمی‌توان انتظار داشت هر کامپیوتری هارد دیسک داشته باشد، بنابراین دیکشنری هنوز باید بتواند در یک فلاپی ۳۶۰ کیلوبایتی جا بگیرد!)به غیر از چالش پیاده سازی صرف ما نیاز داشتیم امکاناتی نظیر اضافه کردن کلمه جدید به دیکشنری توسط کاربر را نیز پیاده سازی می‌کردیم!بله نوشتن یک غلط‌یاب در اواسط دهه هشتاد میلادی یک مسئله به شدت مشکل بود. برنامه‌نویس‌ها برای حل چالش غلط‌یاب در آن دوران چندین روش فشرده سازی داده چشمگیر ارائه دادند. به همین ترتیب تعدادی ساختار داده (Data Structure) بسیار هوشمندانه برای یافتن سریع کلمات در یک فرهنگ لغت فشرده وجود داشت. این مشکلی بود که ممکن است حتی با تمرکز بالا هم ماهها طول بکشد تا بتوان برای حل آن تلاش کرد. (و برای مثال ، کاهش اندازه فرهنگ لغت از 200،000 به 50،000 یا حتی 20،000 کلمه ای گزینه معقولی بود ، اما حتی این کار کمک چندانی به حل این چالش نمی‌کرد و مشکلات قبلی پابرجا بود.)امروز اما نوشتن برنامه‌ای برای لود کردن usr/share/dict/words در یک هش‌تیبل دو یا سه خط کد به زبان پایتون یا پرل یا ... می‌باشد. جستجوی هر کلمه‌ای در این هش تیبل هم کاری بسیار پیش پا افتاده در این زبان‌ها است ، معمولا هر زبانی بصورت نیتیو این نوع عملیات جستجو را دارد. با وجودی که شما می توانید چند روش برای کاهش زمان اجرا یا کاهش حافظه مورد استفاده ارائه دهید ، اما معمولا اصلا لازم نیست. در واقع پیاده سازی کامل همچین چالشی چنان پیش پا افتاده است که می تواند تمرینی برای هر کسی در اوایل آموزش پایتون باشد. خلاصه دنیا و کار ما عجیب پیشرفت کرده است.ترجمه‌ای از اینجا.اگر مثل من به تاریخچه spelling correction و جزئیاتش و مسائل حل شده و نشده‌اش علاقه‌مند هستید یا شدید این مقاله خیلی خوب و کامل هست.یه پیاده سازی جالب در پایتون و توضیحات خوب رو هم اینجا می‌تونید بخونید و ببینید.</description>
                <category>توحید ارسطو</category>
                <author>توحید ارسطو</author>
                <pubDate>Fri, 04 Dec 2020 05:54:07 +0330</pubDate>
            </item>
                    <item>
                <title>خلق دوباره یک رویا، از Node به Deno</title>
                <link>https://virgool.io/@arastu/%D8%AE%D9%84%D9%82-%D8%AF%D9%88%D8%A8%D8%A7%D8%B1%D9%87-%DB%8C%DA%A9-%D8%B1%D9%88%DB%8C%D8%A7-%D8%A7%D8%B2-node-%D8%A8%D9%87-deno-po4wvuwujmyz</link>
                <description>اگر با Node.js کار کرده باشید یا داستانش را دنبال کرده باشید احتمالا Ryan Dahl را می‌شناسید، او به عنوان خالق Node.js شناخته می‌شود، او در سال ۲۰۰۹ در کنفرانس JSConf پدیده Node.js را به دنیا معرفی کرد، امروزه کدهای مرتبط با پلتفرم Node.js در بیش از ۱۲ میلیارد ماشین در سراسر جهان روزانه اجرا می‌شوند، داستان خلق Node.js و مسیر پیشرفت آن و تبدیل شدنش به یک موضوع مورد علاقه و فراگیر اگر چه جذاب است ولی موضوع بحث این نوشته نیست. ریان سالها پس از پیشرفت Node.js امروز در حال خلق دوبارهٔ رویای قبلی خود است.برای هر برنامه‌نویسی دیدن کدهای قدیمی که خود او خلق کرده همیشه دردناک و عذاب آور است، تصور کنید شش سال قبل با دانشی که به مراتب از امروز کمتر بوده و نیازسنجی که احتمالا واقع بینانه نبوده کدی را توسعه دادید، امروز به آن نگاه می‌کنید احتمالا موهای خود رو می‌کنید و سریع آن را از صفحه روزگار حذف می‌کنید، اگر کمی صبورتر باشید که ۱۰۰ درصد آن را بازنویسی می‌کنید، حال تصور کنید به جای تکه‌ای کد پلتفرمی به بزرگی Node.js را توسعه داده‌اید، تمام تصمیم‌های دیزاینی و معماری آن را گرفته‌اید درست ده سال قبل و اصلا تصور نمی‌کردید روی به این حجم از محبوبیت و استفاده برسد، امروز همه آن اشتباهات رو می‌بینید و امکان تغییر آن را هم ندارید (به دلیل backward compatibility و این داستانها)! الان به خوبی شرایط ریان قصه ما را درک می‌کنید. آقای Ryan Dahl چند سال در همین شرایط بود، عملا روند توسعه Node.js دیگر به اختیار شخص اون نبود و توسط یک بنیاد تبیین و کنترل می‌شد و اصلا هم امکان تغییر بنیادی نداشت، میلیون‌ها وب‌سایت و وب اپلیکیشن از Node.js استفاده می‌کنند و امکان هر تغییری نیست.او به جای تغییر غیرقابل امکان پلتفرم Node.js پلتفرم جدید به نام Deno را دوباره خلق کرد، با کلی ایده جذاب و جدید، Deno در ظاهر شباهت‌های به Node.js دارد ولی در ساختار و معماری زمین تا آسمان متفاوت است، شاید تنها شباهت مهم این دو این باشد که هر دو ران تایمی برای اجرای کدهای جاوا اسکریپت باشند. Deno برخلاف Node.js که با زبان cpp نوشته شده است با استفاده از زبان Rust و بر بستر فریم‌ورک Tokio نوشته شده است، در این نوشته به تشریح و توضیح این پلتفرم جدید Ryan Dahl می‌پردازم.در سایت Deno این پلتفرم را اینچنین معرفی می‌کند: A secure runtime for JavaScript and TypeScript. مهمترین تفاوت‌ها در همین جا مشخص می‌شوند، براستی منظور از secure اینجا چیست؟ چه چیزی باعث می‌شود که Deno یک رانتایم امن باشد، ساده است، شما وقتی یک کد Node.js را در کامپیوتر خود یا سرور اجرا می‌کنید آن کد با توجه به کاربری که آن را اجرا می‌کند دسترسی به فایل‌ها و لایه شبکه ماشین شما را دارد و می‌تواند هر تغییری در آن بدهد، وقتی پکیجی را از npm دانلود می‌کنید (هیچ بررسی انسانی بر روی پکیج‌های npm وجود ندارد) با استفاده از آن در کدتان و اجرای آن کد به آن هر اجازه‌ای برای تغییر و خرابکاری احتمالی داده اید، این خیلی مهم است، در پلتفرم Deno هنگام اجرای هر کدی باید بصورت واضح با استفاده از فلگهایی به آن کد دسترسی خواندن و نوشتن فایل یا استفاده از شبکه را بدهید. برای مثال کد زیر که یک echo سرور ساده است را در نظر بگیرید از آنجایی که هنگام اجرا به آن دسترسی شبکه نداده‌ایم، آن کد هرگز اجرا نخواهد شد.همانظور که در تصویر و متن ارور مشخص است برای اجرای این کد نیاز به دسترسی به شبکه است که با فلگ allow-net می‌توانیم به Deno بگوییم که دسترسی به شبکه برای این کد بلامانع است. و اینگونه Deno یک پلتفرم امن است.خب سراغ ادامه معرفی Deno که در سایت آن آمده است می‌رویم: A secure runtime for JavaScript and TypeScriptکلمه typescript اینجا به ما چشمک زیبایی می‌زند، تایپ اسکریپت محصولی اوپن سورس از مایکروسافت یک زبان برنامه‌نویسی شبیه جاوااسکریپت (در واقع تایپ اسکریپت یک سوپرست از جاوا اسکریپت است، یعنی همه ویژگی‌های جاوااسکریپت را دارد در عین حال چیزهایی اضافه‌تر هم دارد) است که به جاوااسکریپت ترنسپایل می‌شود ولی یک ویژگی جذاب دارد و آن هم اضافه کردن یک تایپ سیستم قوی به جاوا اسکریپت است. معرفی تایپ اسکریپت در ویکی پدیا:TypeScript is an open-source programming language developed and maintained by Microsoft. It is a strict syntactical superset of JavaScript and adds optional static typing to the language. TypeScript is designed for development of large applications and transcompiles to JavaScript.[5] As TypeScript is a superset of JavaScript, existing JavaScript programs are also valid TypeScript programs. پلتفرم Deno به صورت Native و بدون نیاز به هیچ ترنسپایلر و کمپایلری از تایپ اسکریپت پشتیبانی می‌کند، شما می‌توانید به جای جاوااسکریپت از تایپ اسکریپت در Deno استفاده کنید.ویژگی جذاب دیگر Deno استفاده از APIهای web standards است، Deno تا جایی که امکان داشت از این استانداردها پیروی کرده است، شما اگر در مرورگر از web apiها استفاده کردید به راحتی می‌توانید از همانها در Deno نیز استفاده کنید، برای مثال fetch را در نظر بگیرید، شما به راحتی از آن در مرورگر استفاده می‌کنید ولی برای استفاده از آن در Node.js باید از یک ترد پارتی لایبرری (نمی‌دونم چی ترجمش کنم!) استفاده کنید، ولی در Deno این api به صورت native و built in و با همان ساختار مرورگر در اختیار شماست، Deno از apiهای زیر به صورت built in و native پشتیبانی می‌کند:addEventListeneratobbtoaclearIntervalclearTimeoutdispatchEventfetchqueueMicrotaskremoveEventListenersetIntervalsetTimeoutAbortSignalBlobFileFormDataHeadersReadableStreamRequestResponseURLURLSearchParamsconsoleisConsoleInstancelocationselfwindowAbortControllerCustomEventDOMExceptionErrorEventEventEventTargetMessageEventTextDecoderTextEncoderWorkerImportMetaLocation اگرچه همه این APIها در Deno به صورت صد درصد مطابق با همطراز آنها در وب نیستند، اما این هنوز یک خبر خوب برای توسعه دهندگان فرانت اند است که می‌توانند از دانش قبلی‌شان در Deno برای توسعه استفاده کنند.ویژگی مهم دیگر Deno ابزارهای built in آن است، Deno دارای test runner متعلق به خود است، برای تست کدهایی که برای Deno می‌نویسید نیاز به ابزار اضافه‌ای ندارید خود cli دینو دارای یک تست رانر است، دیگر ابزارهای درونی Deno شامل یک file watcher، باندلر اختصای و سیستم کد فرمت کننده اختصاصی است، تصور کنید برای اجرا، تست و فرمت کردن کدهایتان نیازی به نصب webpack، jest و pretier ندارید، ابزار Deno همه اینها را برای شما فراهم کرده است. Deno به صورت کامل از golang در این مورد ایده گرفته است. Deno شامل ابزارهای بیشتری است که اینجا اشاره نکرده‌ام و تقریبا نیاز شما را به اکثر ابزارهای فعلی که در node از آنها استفاده می‌شود را پوشش می‌دهد. این ویژگی از آنجا مهم است که تمام پروژه‌ها از ابزار یکسان استفاده می‌کنند و برای هر پروژه‌ای نیاز به یادگیری ابزار جدیدی وجود ندارد.ویژگی دیگر Deno عدم استفاده از یک پکیج منیجر مرکزی مثل NPM است، در واقع مدیریت پکیج‌ها در Deno به صورت decentralized انجام می‌شود (شبیه مدل golang)، هر کسی می‌تواند هر جایی کدهای Deno رو قرار دهد (برای مثال در یک ریپازیتوری گیت‌هاب) و شما صرفا با دانستن آدرسش آن را به کدهایتان اضافه کنید.استفاده از پکیج منیجر مرکزی معایب و مزایایی دارد و این بخش از Deno یعنی استفاده از پکیج منیجر غیرمرکزی احتمالا بحث برانگیز باشد (مثل مشکلات go get در golang)، در هر صورت وقتی Deno کد ما را اجرا می‌کند فایل یا پکیج را دانلود کرده و در جایی (بصورت global) ذخیره می‌کند و از آن در runtime استفاده می‌کند. اگر می‌خواهید فایلها و پکیج‌ها در کنار پروژه شما ذخیره شوند می‌توانید مقدار متغیر $Deno_DIR را تغییر دهید.موضوع مهم دیگری که باید اشاره کنم سیستم ماژولار Deno می‌باشد، Node.js از ورژن‌های ابتدایی از استاندارد Commonjs استفاده کرده بود (همون require و ...) و تا الان از سیستم استاندارد ماژول‌های ECMAScript پشتبانی کاملی ندارد، ماژول سیستم دیفالت Deno به طور کامل منطبق بر ECMAScript module standard می‌باشد، این موضوع اگرچه خبر خوبی است چون که این استاندارد به مراتب بهتر از Commonjs است ولی باعث می‌شود پورت کردن هزاران پکیج فعلی Node.js به Deno به سختی امکان پذیر باشد و نیاز به بازنویسی کامل داشته باشد.دیگر ویژگی‌ها و اهداف پروژه Deno:تولید یک باندل قابل اجرا، بعد از اجرای deno bundle شما یک فایل با پسوند .deno خواهید داشت که می‌توانید هر جایی آن را اجرا کنید.توانایی سرو کردن درخواست‌های http به صورت بهینه و سریعساخت لایه‌ای ابسترکت و جدا از مفاهیم V8 سمت کاربر (دولوپر)دیگر تفاوت‌ها با Node.js:عدم استفاده از فایل package.jsonدر Deno همانند Node.js همه عملکردهای آسینک یک پرامیس برمی‌گردانند اما api پرامیس در Deno متفاوت می‌باشد.کدهایی که در Deno اجرا میشوند اجرایشان در صورت برخورد به خطایی که هندل نشده است متوقف می‌شوداطلاعات بیشتر و دقیقتر:سایت پروژه Denoسخنرانی Ryan Dahl با موضوع Ten Things I Regret About Node.js در JSConfمعرفی Deno در JSConf 2019نظر شما چیه؟ به نظرتون پلتفرم Deno پلتفرم موفقی خواهد شد؟ آیا با اقبال کامیونیتی JavaScript مواجه خواهد شد؟ تو بخش نظرات بنویسید.</description>
                <category>توحید ارسطو</category>
                <author>توحید ارسطو</author>
                <pubDate>Sat, 09 May 2020 06:31:40 +0430</pubDate>
            </item>
                    <item>
                <title>عقاب</title>
                <link>https://virgool.io/@arastu/%D8%B9%D9%82%D8%A7%D8%A8-kdlh8opngxah</link>
                <description>نوشته‌ای که در ادامه می‌آید را امروز از یادداشت‌های قدیمی‌ام پیدا کردم، پاییز یا زمستان ۸۸ این یادداشت رو نوشتم، یادم نمی‌آید که جایی منتشر کرده باشم. این یادداشت به بررسی شعر عقاب دکتر پرویز ناتل خانلری می‌پردازد و دید سالها پیش من به این موضوع و شعر را بیان می‌کند، ممکن است تمام یا بخشی از متن با تفکرات امروز من جور درنیاید.مقدمهمرگ و نیستی، یکی از مایه‌های اصلی و پربار ادبیات همهٔ جوامع و ملل بوده است، انسان از دیرباز به دنبال جاودانگی و حفظ بقای خود بوده است، به صورتی که اکثر کارهای انسان را می توانیم از رهگذر مرگ و نیاز به حفظ بقا توجیه کنیم، در ادبیات همهٔ ملل تلاشهایی از این دست که بیشتر به صورت تلاش برای یافتن آب حیات است به چشم می‌خورد، به طوری که اگر این مضمون را حذف کنیم، بسیاری از شاهکارهای ادبی جهان را از دست خواهیم داد. مرگ و نیستی و در مقابلش جاودانگی در ادبیات ملل قدمتی به طول تاریخ ادبیات ملل دارند، «گیلگمش»، «ایلیاد و ادیسه هومر» و داستان «اسفندیار» در شاهنامه فردوسی گریزهایی به موضوع مرگ و جاودانگی داشته‌اند، در ادبیات فارسی به جز داستانهای شاهنامه، رباعیات خیام نیز بن‌مایه‌هایی از مرگ و جاودانگی دارند.به راستی مرگ چیست؟ فلاسفه، علمای دین، دانشمندان، ادیبان و شعرا هر کدام به زبانی وصف این پدیده ناشناخته و سهمناک را کرده‌اند، آیا مرگ پایان زندگی است یا دریچه‌ای است که روبروی ما گشوده می‌شود برای سفر به جهانی جاویدان.مرگ هر چه هست، دشمن زندگی است، پدیده‌ای است که ما را از دنیا با همه‌ٔ زیبایی‌هایش جدا می‌کند، مرگ نماینده‌ٔ «جدایی» است که ما را از محبوب‌هایمان(جوانی، قدرت، زیبایی و ...) جدا می کند، این بسیار غم‌انگیز است. در ادبیات معاصر ما همانند ادبیات قدیم‌مان مرگ باز هم یکی از بن‌مایه‌های آثار ادبی بوده است، در میان آثار ادبیات داستانی آثار صادق هدایت، غلام‌حسین ساعدی و دیگران گریزهایی به پدیدهٔ مرگ داشته‌اند. ولی به عقیدهٔ بسیاری از ادب دوستان شعر عقاب یکی از نمونه های زیبایی است که به موضوع مرگ پرداخته است. توصیف شاعر از عقاب در شعرعقاب در شعر عقاب نمادی است از ارزش‌های متعالی انسان، و تصویری است پویا و زنده از آدمیانی که جان بر سر ارزش‌هایشان می‌نهند ولی به ذلت و پستی تن در نمی‌دهند، آزاد مردمانی که جان بر سر آزادگی خود می گزارند ولی هرگز تن به خفت وحقارت نمی‌دهند، «شهید» به معنای واقعی کلمه، کسی که زندگی دنیوی و پست را وا می‌نهد و به سمتی می‌رود که وجدان بیدارش دستور می‌دهد، عقاب در شعر خانلری نماد کسانی است که عمر کوتاه ولی با عزت را بر زندگی طولانی توام با پستی و زشتی و حقارت ترجیح می‌دهند، آنها زندگی را در گنداب حقارت و رزالت‌های پستی‌آور سپری نمی‌کنند.چنین آدمهایی در تاریخ قهرمانانی شدند فراموش نشدنی و جاودان، کسانی که لحظه‌ای کوتاه از جهان زشتی‌ها و پلیدی‌ها بریدند و بر اوج فلک جای گرفتند، در مفاهیم دینی اسلام هم این موضوع که از آن به آزادگی و شهادت یاد می شود، بسیار ستوده شده است. جملهٔ «مرگ با عزت بهتر از زندگی با ذلت است!» که منصوب به امام حسین هست گواه این موضوع هست.در ادبیات شیرین فارسی نیز کسانی هستند که در لحظه ای سرنوشت ساز دل از زندگی ننگین و با ذلت بریدند و به مرگ با عزت لبخند زدند. سیاوش در شاهنامه فردوسی یکی از این افراد است. دکتر یوسفی در بررسی این داستان می گویند: «بزرگی سیاوش در مردانه زیستن اوست، یک طرف پاکی و کامرانی است، یک سو پاکمردی و بهتان و در آتش رفتن. جانبی پیمان شکستن و از دشواری رستن را می بیند و سوی دیگر وفای به عهد و مردی و در آخر در راه آزادگی سر دادن» سیاوش آزاده ای است که نمی تواند چون زاغ‌های بداندام و پلشت روزگار زندگی کند و از این رو جان بر سر آرمانش می نهد و به کوهی از آتش وارد می شود... آتش رفتن سیاوشعقاب خانلری نیز همچنین موجودی است، موجودی که عمر دراز در ازای«خواری»، «وحشت»، «نفرت» و «بیزاری» را بر مردن در اوج فلک و سرشار از مردانگی ترجیح نمی دهد. کفهٔ ترازو در شعر به سود عقاب است، شاعر تمام تلاشش را کرده تا قدرت، بلند پروازی، تیزبینی و شوکت عقاب را نشان دهد، تعداد ابیاتی که سعی و کوشش در این مورد را دارند به حدود ۹ بیت(ابیات ۵ تا ۹ و ۶۵ تا ۶۸) می‌رسد. شاعر با فضاسازی زیبا و نشان دادن واکنش سایر موجودات ویژگی های شخصیتی عقاب را به ما منتقل می کند.توصیف شاعر از پرواز عقاب بسیار زیبا و زنده است تمام ویژگی های مثبت عقاب را نشان می دهد. فضای شعر لذت و زیبایی در اوج بودن را به خوبی به مخاطب القا می کند. شعر تقابل آسمان و زمین، پستی و بلندی، فراز و نشیب را به زیبایی نشان می‌دهد، گویی عقاب قهرمانی است که از آسمان، بلندی و فراز منشا گرفته است.در زندگی انسان لحضات و روزهایی فرا می‌رسد که بر سر دو راهی قرار می‌گیرد، اصولا زندگی آوردگاهی است بین خیر و شر! تردیدی همیشگی بر سر پذیرفتن حقارت یا پرواز در اوج! عقاب نیز اگر او را موجودی فرا حیوانی و نمادی در شعر بببینیم با همین دغدغه‌ها روبروست، او مردد و نگران است که چه راهی را انتخاب کند، پیری و مرگ یا عمر طولانی. آنچه عقاب با آن روبرو است سوالی فلسفی و شناختی برامده از فطرت انسان است که اینک موجودی چون عقاب مطرح می کند. ز عقاب در لحظات حساس زندگیش ابتدا عمر طولانی را طلب می کند و به سمت زاغ می رود تا دین و آیین این موجود کثیف و خوار را به جا آورد، شاید باید به عقاب حق بدهیم لحظه ای به درستی های برآمده از فطرتش شک کند چرا که در مقابل زندگی طولانی و عمر شیرین است او چنین چیزهایی را می خواهد پس به سمت زاغ می‌رود آنچه عقاب می‌بیند فقط و فقط عمر طولانی است و از پشت پرده زندگی زاغ اطلاعی ندارد. عقاب هنگام مواجهه با زندگی سرشار از نکبت زاغ و راز عمر طولانی او باز همان ندای درونی و تردید برآمده از فطرت به سراغش می آید، یک طرف عمر دراز است و گندزار و تن دردادن به بیچارگی و در برابر آن همان عمر کوتاه و طبیعی و پرواز در اوج فلک و محشور شدن با مهر. عقاب در مواجهه با این صحنه رقت‌آور قدر آزادگی و آزادی را می فهمد و ذهنش به همان ماوای زیبایش به پرواز در می آید، عقاب با مقایسه آن زندگی پر از زیبایی و پرواز و پیروزی با این «زندگی مانند» پر از خواری تصمیمش را می‌گیرد شاید عقاب به تلنگر نیاز داشت تا زیبایی هایش و شیرینی با مهر فلک همسر شدن را دریابد او تصمیمش را می گیرد...اگر چه عقاب برای لحظاتی به خاطر رو آوردن به زاغ و راهنمایی خواستن از چنین موجودی از اوج به حضیض فرود آمده بود ولی تصمیم آخرش باز او را به همان بزرگی می‌رساند که در ابتدا بود و شایسته آن...توصیف شاعر از زاغ در شعرتوصیف زاغ با اشعاری آغاز می شود که تماما حقارت و پستی زاغ را می‌رساند و ذهن و اندیشه را از این موجود زشت و بداندام و پلشت متنفر می کند، فضا سازی شاعر و تعابیری چون «شکم آکنده ز گند و مردار» به همراه «سالها زیسته افزون ز شمار» نمودار زندگی طولانی و پر از نکبت زاغ است، استفاده از این دو تعبیر در شعر باعث می شود ذهن ناخودآگاه بین عمر طولانی و پرنمودن شکم از گند و مردار رابطه ای برقرار کند و سپس ذهن عمر طولانی را صفتی بد بداند، بله این قدرت شاعر است! صفات دیگر زاغ در شعر هنگام گفت و گوی زاغ با عقاب نمودار می شود، و زاغ را پیش چشم خواننده منفورتر از قبل می‌کند. زاغ ابتدا با تملق و پاچه خواری وارد می‌شود، خود را از ترس کوچک می کند و خطاب به عقاب از تعابیری چبون «هواخواه»، «جان به راه»، «بندهٔ درگاه» و جملاتی مانند «دل چو در خدمت تو شاد کنم/ننگم آید که ز جان یاد کنم» استفاده می‌کند. سوال اینست که تواضع و فروتنی خوبست و شاید بگوییم زاغ فروتن و متواضع با عقاب برخورد کرده است، شاعر خود به این جنجال فکری ما پاسخ می دهد، او در ابیات بعدی - ۲۲ تا ۲۶ - ویژگی دیگر زاغ را آشکار می کند، خانلری با ورود به درونیات ذهنی زاغ ترس و نفاق در ذهن بیمار این حیوان پست را نشان می‌دهد و فروتنی و تواضعی که به خاطر ترس باشد و ریشه در نفاق داشته باشد دیگر تواضع و فروتنی نیست.زاغ برای حفظ موقعیت خویش دست به هر کاری می‌زند، اصولا برای او چیزی مهمتر از حفظ خودش وجود ندارد و او باید به هر ترتیبی زنده بماند و زندگی کند خواه با ننگ و ذلت. در پرده ی بعدی زاغ هنگامی که به عجز و درماندگی عقاب از درک عامل عمر طولانی او پی می‌برد لباس وعظ برتن می کند تا جهانیان را ارشاد کند و مفاهیم والی خویش را انتقال دهد، شاعر نیز با دادن اختیارات و فصاحتی جالب به زاغ این پرده را زیبا می‌پروراند.زاغ چون دانشمندی بزرگ بر روی سن می رود و سمیناری در روش‌های طولانی کردن عمر ارائه می‌دهد، نخست منتقدی می‌شود زبردست و عقاب را ملامت می کند که چرا هیچ وقت از آسمان فرود نمی‌آید و این همه پرواز در اوج فلک چه سودی به حالت دارد. زاغ زمینی چون از درک آسمان به خاطر سختی‌هایش عاجز است، آسمان و اوج را به باد انتقاد می گیرد، او اولین تیرش را می زند، موجود برخاسته از پستی به جایی می رسد که اوج را نکوهش می کند.در ابیات بعدی زاغ برای اثبات حقانیت حرفهایش در رد اوج پرستی به سخنان پدرش که به عقیدهٔ زاغ مخزن اندرز و پند و دانش است استناد می‌کند، از نظر من پدر زاغ نمایندهٔ تاریخ و اندیشه های کورکورانهٔ زاغ است چه شاید اگر زاغ کمی فکر کند به بطلان اندیشه‌های پیشینیانش پی می‌برد. زاغ برای اثبات درستی حرفهایش استدلال می‌کند ولی نه استدلال عقلی، چرا که نمی تواند، بلکه استدلال نقلی زیرا استدلال نقلی نیاز به اثبات ندارد و ساده‌تر است.او به چیزهایی استناد می کند که از پدرش شنیده و پدرش احتمالا از پدربزرگش و الخ. و او بدون چون و چرا پذیرفته و انتظار دارد عقاب نیز قانع شود. سخنان پدر زاغ در اثبات زندگی حقیر و پست زاغ صفتان است. به عقیده او فاصله گرفتن از حضیض و رفتن به اوج، نیستی می آورد، زاغ عقاب را به فرود آمدن بر فراز ناودان و کنج حیات و لب جوی و جستجوی هر طعمه‌ای که در آنجاست دعوت می کند. و سرانجام عقاب را با افتخار به خوان گسترده الوانش دعوت می کند. زاغ صفتی در جامعهخیام در یکی از رباعیات شیوایش چنین می فرمایند: «قومی به گمان فتاده در راه یقین»، تعبیر بسیار زیبایی است، جماعت زاغ‌های جامعه کسانی هستند که پیش خودشان فکر می کنند، بهترین راه را آنها انتخاب کرده‌اند، اگر منصف باشیم شاید به اینها حق بدهیم، تفکرات این گروه از غفلت و کوته‌بینی آنها ناشی می شود. اگر چه انسان موجودی است صاحب عقل و اندیشه و خرد، عقل و اندیشه انسان را از زندگی زاغ گونه برحذر می‌دارد، ولی چه چیزی باعث می شود حتی در طبقه اندیشمند جامعه ما زاغ صفت داشته باشیم؟ برای پاسخ به این سوال باید بدانیم که گاهی همین حوزه اندیشه و تفکر زمینه بسیاری از مشکلات را برای فرد پدید می آورد؛ بر این اساس که عقل و اندیشه بشری به سادگی دچار خطا و اشتباه می شود. آری انسان بسیار ساده تر از آن که فکر کنیم دچار خطا و بداندیشی می‌شود. گویی که خطا و اشتباه و شاید کج روی از انسان جدا نیست، اگر به گذشته برگردیم می بینیم که هُبوط حضرت آدم خود نتیجه یک خلف و خطا بوده است و نباید انتظار داشت در جامعه بشری کسی دچار خطا و اشتباه نشود، امکان خطا در تفکر وجود دارد.  برو زاهد برای خود ملک باش / من از حوا و آدم ریشه دارمالبته این موضوع برای توجیه رفتار این افراد نیست، بلکه برای درک این نقصان در وجود آنهاست، که با شناخت به کمک این افراد رفت.زاغ صفتی یعنی زندگی محافظ‌کارانه، شنا در مسیر رودخانه، راضی بودن به وضع موجود و نفی هرگونه اوج و اوج گرفتن؛ زاغ صفت بودن یعنی اینکه متملق باشیم، نفاق در وجودمان ریشه داشته باشد و فقط به فکر پر کردن شکم هایمان و افزودن سکه‌ای به ثروت‌مان باشیم.شعر عقاب با صدای دکتر ناتل خانلر https://www.youtube.com/watch?v=trzS8OFBx-M </description>
                <category>توحید ارسطو</category>
                <author>توحید ارسطو</author>
                <pubDate>Wed, 27 Dec 2017 15:43:26 +0330</pubDate>
            </item>
                    <item>
                <title>مدیریت و اجرای یک process به کمک launchd در سیستم عامل macos</title>
                <link>https://virgool.io/pullrequest/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%88-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DB%8C%DA%A9-process-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-launchd-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B9%D8%A7%D9%85%D9%84-macos-emzayejpavar</link>
                <description>معمولا در سیستم‌های شبه یونیکس و تقریبا همه سیستم عامل‌ها برای مدیریت، راه‌اندازی و توقف اجرای یک process، سرویس یا اسکریپت در سیستم عامل از ابزارهای به نام operating system service management استفاده می‌شود.مثالهایی از این ابزارها در سیستم عامل‌های مختلف در لیست زیر آماده است:سیستم عامل ویندوز: Service Control Managerسیتم عامل Mac Os اپل: launchdسیستم عامل کروم گوگل: Upstartبسیاری از توزیع‌های لینوکس: systemdسولاریس: Service Management Facilityاندروید: Android initسیستم عامل‌های شبه یونیکس قدیمی: sysvinitجنتو: OpenRCبه زبان ساده‌تر همه این سیستم‌ها کمک می‌کنند process ها برای مدت طولانی بدون نیاز به ما اجزا شوند و در صورت ریستارت شدن ماشین و بقیه مشکلات خود بخود دوباره اجرا شوند. با توجه به اینکه این processها برای مدت طولانی به حال خود رها می‌شوند باید Log و Error های خود را در جایی(مثلا فایل) ذخیره کنند تا در هنگام بروز مشکلات و یا برای بررسی صحت اجرای آن پروسس به آن مراجعه کنیم. این سیستم‌ها همه این کارها را انجام می‌دهند و با داشتن ابزارهایی برای کنترل و مانیتور کردن processها به ما کمک بسیاری می‌کنند.شیوه کارکرد اکثر این ابزارها بدین صورت است که شما در یک فایل process خود را توصیف می‌کنید. توصیف می‌کنیم یعنی چیکار می‌کنیم؟ یعنی مثلا می‌گیم فایل اجرایی این process کجاست، لاگ‌ها و اررورها را در چه مسیری ذخیره کند. برای اجرای process چه آرگیومنت‌هایی هنگام اجرای process به آن بدهد. و هر کاری برای اجرای درست آن process لازم است.در سیستم عامل مثلا :) شبه یونیکس مک هم ابزاری به نام launchd این کار را انجام می‌دهد.در این نوشته ما می‌خواهیم اجرای یک process فرضی به نام crushanalyzer که ابزاری است که به طور مرتب شبکه‌های اجتماعی را برای رصد کردن فعالیت‌های کراش شما و اطلاع دادن آنها به شما پایش می‌کند را به ابزار launchd بسپاریم تا خود را از دردسر‌های اجرا و مدیریت آن رها کنیم.فرض کنید این ابزار را شما با زبان c++ در مسیر $HOME/Workspace/crushanalyzer ایجاد کرده اید. بعد از کامپایل شدن خروجی این کد یک فایل باینری به نام crushfinderd در همین مسیر است. شما معمولا برای اینکه راحت باشید و به اصطاح این فایل در $PATH باشد معمولا بعد از کامپایل آن را در مسیر/usr/local/bin کپی می‌کنید و در ترمینال آن را به شکل زیر اجرا می‌کنید:export TWITTER_TOKEN=&quot;mdjnfh89therbge9urtye9rht95ty3840ty3890ty3&quot;

export FACEBOOK_TOKEN=&quot;kdjhfsldhfaildhfsdlfhsjkfhsjkadfhaowiruyt48yeuryw984yr&quot;

export INSTAGRAM_TOKEN=&quot;kejhrohio4uy5384953ty98nto389yt9v235ty59tby4958by49&quot;

crushfinder start --config $HOME/.crushfinder.yaml --interval 40 --alert sms

وقتی این کد را اجرا می‌کنید لاگ و خروجی و اررور‌های این process را در ترمینال می‌بینید. اگر ترمینال را ببندید یا «مک بوک پرو ۲۰۱۶ اسپیس گریتان» ریستارت شود یا حتی خود این پروسس کرش کند مجبورید همه این مراحل را دوباره انجام دهید.اینجاست که ابزار launchd به دادتان می‌رسد شما توضیحاتتان و روش اجرای این پروسه را به launchd می‌دهید و این موجود خودش مانند پلیس فتا حواسش به همه چی و همه جا هست و اجرای درست آن را کنترل می‌کند.برای تعریف مشخصات و روش اجرای پروژه باید یک فایل xml با پسوند plist ایجاد کنید و با یک سینتکس مشخص مشخصات پروسس را در آن تعریف کنید.&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
    &lt;key&gt;Label&lt;/key&gt;
    &lt;string&gt;ir.arastu.crushanalyzer&lt;/string&gt;
    &lt;key&gt;EnvironmentVariables&lt;/key&gt;
    &lt;dict&gt;
        &lt;key&gt;TWITTER_TOKEN&lt;/key&gt;
        &lt;string&gt;mdjnfh89therbge9urtye9rht95ty3840ty3890ty3&lt;/string&gt;
        &lt;key&gt;FACEBOOK_TOKEN&lt;/key&gt;
        &lt;string&gt;kdjhfsldhfaildhfsdlfhsjkfhsjkadfhaowiruyt48yeuryw984yr&lt;/string&gt;
        &lt;key&gt;INSTAGRAM_TOKEN&lt;/key&gt;
        &lt;string&gt;kejhrohio4uy5384953ty98nto389yt9v235ty59tby4958by49&lt;/string&gt;
    &lt;/dict&gt;
    &lt;key&gt;ProgramArguments&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/usr/local/bin/crushanalyzer&lt;/string&gt;
        &lt;string&gt;start&lt;/string&gt;
        &lt;string&gt;--config&lt;/string&gt;
        &lt;string&gt;$HOME/.crushfinder.yaml&lt;/string&gt;
        &lt;string&gt;--interval&lt;/string&gt;
        &lt;string&gt;40&lt;/string&gt;
        &lt;string&gt;--alert&lt;/string&gt;
        &lt;string&gt;sms&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;StandardOutPath&lt;/key&gt;
    &lt;string&gt;/tmp/crushfinder-stdout.log&lt;/string&gt;
    &lt;key&gt;StandardErrorPath&lt;/key&gt;
    &lt;string&gt;/tmp/crushfinder-stderr.log&lt;/string&gt;
    &lt;key&gt;Debug&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;KeepAlive&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;RunAtLoad&lt;/key&gt;
   &lt;true/&gt;
    &lt;key&gt;Disabled&lt;/key&gt;
    &lt;false/&gt;
&lt;/dict&gt;
&lt;/plist&gt;خب در این فایل Environment variableهای لازم و کامند لازم برای اجرای این process را به launchd معرفی کردیم. همانطور که مشاهده می‌کنید فایلهای مربوط به error و log را نیز به آن معرفی کردیم.چیزهای اضافی تری نیز به launchd در این فایل توصیف داده ایم مثلا:&lt;key&gt;KeepAlive&lt;/key&gt;
&lt;true/&gt;
&lt;key&gt;RunAtLoad&lt;/key&gt;
&lt;true/&gt;این خطوط به launchd می‌فهماند که این process را بعد از هر اتفاقی که منجر به از کار افتادن آن شد دوباره راه اندازی کند و همینطور در ابتدای راه اندازی سیستم عامل نیز آن را راه اندازی کند.برای اینکه launchd کنترل این process که در فایل plist توصیف شد را به دست بگیرد از ابزار launchctl در مک استفاده می‌شود. ابتدا این فایل را در مسیر $HOME/Library/LaunchAgents کپی کنید و سپس برای اجرای آن دستور زیر را در کامند لاین مک بزنید:launchctl load $HOME/Library/LaunchAgents/ir.arastu.crushanalyzer.plistاگر همه چیز به درستی پیش رفته باشد با زدن دستور launchctl list باید این process را در لیست پراسس‌های فعلی ببینید، خروجی چیزی شبیه به این خواهد بود:363 0 ir.arastu.crushanalyzer
387 0 homebrew.mxcl.persiancalendar
327 0 com.apple.Spotlight
346 0 com.apple.soagent
528 0 com.apple.accessibility.mediaaccessibilitydصفر به معنای موفقیت آمیز بودن شروع اجرای این process خواهد بود.در اکثر operating system service management کار به همین شیوه و سبک انجام می‌شود اگر چه ممکن است دستورات و فرمت توصیف process متفاوت باشد.امیدوارم از این نوشته لذت برده باشید.</description>
                <category>توحید ارسطو</category>
                <author>توحید ارسطو</author>
                <pubDate>Thu, 11 May 2017 14:49:06 +0430</pubDate>
            </item>
            </channel>
</rss>