<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های پرنیان راد</title>
        <link>https://virgool.io/feed/@parnian_rad</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 06:03:33</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1067263/avatar/XpFixA.jpeg?height=120&amp;width=120</url>
            <title>پرنیان راد</title>
            <link>https://virgool.io/@parnian_rad</link>
        </image>

                    <item>
                <title>نقاط ضعفت رو نام ببر</title>
                <link>https://virgool.io/@parnian_rad/%D9%86%D9%82%D8%A7%D8%B7-%D8%B6%D8%B9%D9%81%D8%AA-%D8%B1%D9%88-%D9%86%D8%A7%D9%85-%D8%A8%D8%A8%D8%B1-erzazktao1gm</link>
                <description>زمانی که دنبال کار جدید میگشتم یکی از سوالات پرتکرار مصاحبه ها این بود که نقاط ضعفت رو بگو, جوابی که من میدادم خیلی مواقع باعث تعجب فرد مصاحبه کننده میشد و سعی میکرد به انواع روش ها قانعم کنه این نقطه ضعف نیست! و حتی یک بار توی یکی از مصاحبه ها بهم گفته شد &quot;داری نقطه قوتت رو به عنوان نقطه ضعف بهمون قالب میکنی!&quot;کمال گرایی! رنج بزرگی که بسیاری از ما درگیرشیم و به واسطه ی اون نمیتونیم در زندگی به رضایت و شادی برسیم.متاسفانه تصوری که از کمال گرایی برای خیلی ها وجود داره انجام دادن با نهایت کیفیت کارها و پیشرفت گراییست و این به نوعی در تضاد با مفهوم واقعی کمال گرایی هست! کمال گرایی یعنی تعیین استانداردهای دست نیافتنی و رنج کشیدن در فاصله ی بین واقعیت وجودی تا امید ذهنی تعریف شده!  افراد کمال گرا عموما دچار نشخوار ذهنی هستند و مدام موقعیتی که نتونستن در اون بهترین باشند یا کاری رو اشتباه انجام دادن در ذهنشون مرور میکنند و رنج میکشن! و این بر خلاف تصور و باور عموم مردم منجر به درست انجام ندادن کارها میشه!به نوعی میتوان گفت افراد کمال گرا دچار نفرین تانتالوس هستند, افراد کمالگرا وقتی در پله اول برای انجام کاری قرار دارند به جای پله دوم, پله دهم رو هدف قرار میدهند و در فاصله ی بین پله ی یک و ده هیچ پیشرفتی به چشمشون نمیاد و ترسناک ترین نکته اینجاست که وقتی به پله ده هم میرسن رضایت ندارند, چون الان چیزی خیلی بیشتر از چیزی که دارند رو میخوان و این چرخه مدام تکرار میشه و هیچ موقع دستاوردهاشون رو نمیبینن و به شادی درونی نمیرسند..! به بیانی دیگر خوشحالی این افراد دوامی نداره چون هدف های بالاتری هست که باید بهش برسن.گاهی افراد کمال گرا از ترس اینکه کارشون رو به بهترین شکل ممکن انجام ندن و به استانداردهای دست نیافتنی که برای خودشون مشخص کردن نرسن, کار رو به تاخیر میندازن و نهایتا شاید هیچ موقع انجامش نمیدن!  درواقع همیشه در انتظار شنبه رویایی هستند که تمام شرایط محیا باشه..! افراد کمال گرا خودشون رو بیش از حد در برابر همه چیز و همه کس مسول میدونن و به جایی میرسه که زیر بار انواع مسولیت ها دفن میشن و درنتیجه واضحه که بین کمال گرایی با انواع اختلالات مثل افسردگی, اضطراب, انزوای اجتماعی و انواع وسواس رابطه مستقیم وجود داره.برای افراد کمال گرا تمام موقعیت ها برد و باخت هست, و هرچیزی جز پیروزی اونها رو دچار رنج روحی شدیدی میکنه.. جمله ای که پدرم همیشه بهم میگفت, این بود که یا توی هر مسیری که قدم میذاری صد باش, یا اصلا توی اون مسیر نباش! بسیاری از پاسخ هایی که افراد کمال گرا به بحران ها و چالش های پیرامونشون میدن ۰ یا ۱ و نه چیزی بین این دو عدده! یعنی یا تمام اون مشکل رو حل میکنیم یا اصلا اقدامی برای اون انجام نمیدیم! در حالیکه باید بدونیم میلیون ها میلیون عدد دیگه بین این ۰ و ۱ وجود داره و این نگاه کمال گرایانه بسیاری از توانمندی ها در بهبود اوضاع رو در میان این ۰ یا ۱ مطلق از بین میبره و نادیده میگیره! و درنتیجه کمال گرایی خیلی مواقع باعث میشه نتونیم بهترین خودمون باشیم و ۰ بودن رو به ۰.۹۹ بودن ترجیه بدیم, درواقع همیشه باید برای خوب بودن و تعالی تمام تلاشمون رو بکنیم ولی نکته ای که باید بدونیم اینه که خوب بودن با کمال فرق اساسی دارن!یه سری راهکارهایی ارایه شده که میتونه کمک کنه مقداری از این رنج کم کنه, برای مثال اینکه اصلا دنیارو همین ۰ و ۱ ببینم ولی ۰ نماد اقدام نکردن برای انجام کار و ۱ شروع کردن کار باشه فارغ از نتیجه ای که قراره داشته باشه, درواقع باید به این باور برسیم که شروع کردن و انجام دادن کار, بر عالی انجام دادن کار اولویت داشته باشه, اینطوری از اهمال توی خیلی از کارها جلوگیری میشه..میتونیم ددلاین مشخصی رو برای انجام کار درنظر بگیریم و بعد از اون زمانی رو به بهبود کار انجام شده اختصاص بدیم!باید بدونیم که مسایلی که در زندگی باهاشون مواجه هستیم دو دسته هستند, مسایلی که میتونیم حلشون کنیم و مسایلی که به هزار دلیل نمیتونیم حلشون کنیم یا حداقل &quot;الان&quot; نمیتونیم حلشون کنیم! این تفکیک برای افراد کمال گرا مفهومی نداره و در هر موقعیتی خودشون رو مسول به بهترین شکل ممکن انجام دادن اون کار میدونن و باعث رنجش و اسیب خودشون میشن, باید بدونیم به همون میزانی که برای انجام کاری قدرت نیاز داریم, برای پذیرش این نکته که یه سری از کارهارو نمیتونیم انجام بدیم یا اصلا نباید همه چیز رو اصولی و درست انجام بدیم هم قدرت نیاز داریم, و سعی کنیم این نکته رو بپذیریم و خیلی مواقع خیلی چیزها رو راحت تر رها کنیم! باید بپذیریم ناقص بودن ضعف ما انسان ها نیست بلکه واقعیت ماست!&quot;پروردگارا! به من آرامشی عطا فرما تا بپذيرم آنچه را كه نمي توانم تغيير دهم و شهامتی،تا تغيير دهم آنچه را که مي توانم و بينشی تا تفاوت اين دو را بدانم&quot;برخی از ما در مواجهه با برخی از ادم های خاص یا موقعیت های خاص وسواس کمال گرایانه مون بیشتر میشه, برای مثال والدینی که به دنبال بهترین نسخه از ما هستند, یا افرادی که مدام مارو تشویق میکنند خوشحال تر, سالم تر, بهتر, باهوش تر, چابک تر, جذاب تر, سازنده تر, کامل تر و… باشیم و تمام این تر و ترین ها مارو مدفون میکنه در انتظاراتی که از خودمون داریم و هرگز نمیتونیم محققشون کنیم. ضمن اینکه تمام این انتظارات بر نداشته های ما تمرکز میکنه و اون چیزایی رو نشونه میگیرن که الان کمبودهای شخصی و شکست های ما تلقی میشه... برای مثال وقتی به ما گفته میشه زیباتر باشین ینی الان به اندازه کافی زیبا نیستیم, و تمام این توصیه ها یاداوری میکنن چه چیزی نیستیم و تصویری رو نشونمون میدن که نمیتونیم باشیم و باعث میشن از چیزی که الان هستیم هم لذت نبریم و نتونیم خودمون رو بهبود بدیم و به تعالی برسیم. در فلسفه چین داستانی هست که نجاری درخت ها رو میبریده تا از چوب اونها استفاده کنه, به یک درختی میرسه که شاخه هاش اونقدر پایین اومدن که نمیتونه ازش استفاده کنه, با خودش میگه عجب درخت بی ثمری! و شب اون درخت با هزاران موجودی که در اون زندگی میکردن مثل قارچ ها, حشرات, پرندگانی که در اون درخت لانه داشتن, حیوانات و هزاران موجودی که در اون زندگی میکردن به خواب اون نجار میره و میگه بی ثمر برای کی؟شاید گاهی ثمر در بی ثمری هست! خیلی مواقع افرادی وجود دارن که این وسواس و سخت گیری کمال گرایانه ای که دارن در مورد دیگران هست و این رنج رو به اطرافیاشنون تحمیل میکنن و بهترین اونهارو میخوان, در حالیکه دستاوردها و استعدادهای دیگر اونها رو نمیبینن و انگ بی ثمری به اونها میزنن! شاید بهتر باشه با این افراد گفتگو کنیم و رابطه مون رو مجدد باهاشون تنظیم کنیم یا حتی از این افراد و این موقعیت ها دوری کنیم!در نوشتن این مطلب از پادکست &quot;انسان کافی- مجتبی شکوری&quot; کمک زیادی گرفتم و درواقع مطلبی که مطالعه کردید چکیده ای از این پادکست هست. همچنین ویدیوی زیر حرف آدم های کمال گرا و بیان تجربیات و رنج هایی که کشیدن هست که شنیدنش خالی از لطف نیست! پیشنهاد میکنم هم پادکست رو گوش کنید و هم و ویدیو رو ببینید.پادکست:https://podcasts.google.com/feed/aHR0cHM6Ly9hbmNob3IuZm0vcy8xMzQwNWRiOC9wb2RjYXN0L3Jzcw/episode/YmY0ZDc5MWMtOGRlYS00NGQxLTllZjUtOTFiMTYwMzIzYmE0?sa=X&amp;amp;amp;amp;amp;amp;ved=0CAUQkfYCahcKEwjoj9P09JD0AhUAAAAAHQAAAAAQAQویدیو:https://www.instagram.com/tv/CShbViVgSqR/?utm_medium=copy_linkطی صحبتی که با مدیر مجموعه مون در جلسه فیدبک ماهانه داشتم متوجه شدم که وسواس و رنج کمال گرایی به چالشی در محیط کاری من تبدیل شده و ناخواسته فشار زیادی رو دارم تحمل میکنم.. اگه شما هم با این مشکل دست و پنجه نرم میکنید برام از تجربیات یا راهکارهایی که برای مقابله باهاش استفاده کردید بنویسید!</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Thu, 11 Nov 2021 22:35:04 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی ردیس به عنوان یک دیتابیس key-value</title>
                <link>https://virgool.io/@parnian_rad/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D8%B1%D8%AF%DB%8C%D8%B3-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%DB%8C%DA%A9-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-key-value-uo8jel7o7kv0</link>
                <description>در مقاله دسته بندی دیتابیس ها, به بررسی انواع دیتابس های NoSql پرداخته شد, یک دسته از دیتابیس های ارایه شده, دیتابیس های key value بودند که به عنوان مثال از این دسته, ردیس را نام بردیم. در ادامه این ابزار را دقیق تر بررسی میکنیم.ابتدا جهت یادآوری به ارایه خلاصه ای از مفهوم دیتابیس های key-value می پردازیم.همانطور که از نام این دیتابیس ها برمی آید از یک استرینگ به عنوان کلید (key) و یک مدل دلخواه داده,  برای مثال اینتیجر, داده جیسون, لیست, BLOB و... به عنوان مقدار (value) استفاده میکنند که کلید باید همیشه یکتا باشد, به این دلیل که سرچ روی آن(key) انجام میشود و به value اشاره میکند.استفاده ی این نوع دیتابیس ها برای برخی اپلیکیشن هایی است که در آنها عملیات read و write و به طور متوالی و به دفعات انجام میشود, که این دیتابیس های memory-based این کار را به سرعت انجام میدهند, برای اپلیکیشن هایی که نیاز به عمل update به صورت پی دی پی, یا کویری های پیچیده برای رفع نیازشان ندارند و همچنین برای زمانی که نیاز به ذخیره برخی اطلاعات پایه ای داریم برای مثال اطلاعات مشتریان, یک وب پیج بر اساس url  و… .ردیس یکی از این نوع دیتابیس ها می باشد. ردیس که املای انگلیسی آن به صورت Redis است مخفف Remote Dictionary Server می باشد و امروزه به عنوان دیتابیس, کش, message broker و queue و … کاربرد دارد. این ابزار قدرتمند, زمان پاسخگویی بسیار کم - در حد کسری از میلی ثانیه - دارد و میلیون ها رکویست در هر ثانیه را برای اپلیکیشن های real-time فراهم میکند و در صنایع مختلفی چون بازی سازی, سرویس های مالی, اینترنت اشیا, ماشین لرنینگ و… استفاده میشود و به دلیل performance عالی که دارد در کش کردن, تحلیل بلادرنگ, کاربردهای جغرافیایی, ابزارهای چت و… هم به عنوان یکی از محبوب ترین انتخاب ها شناخته شده است.از مزایای استفاده از ردیس, که ابزاری open source است, میتوان به پرفورمنس بسیار عالی آن اشاره کرد. ردیس یک دیتابس in-memory است و برعکس دیتابیس های قدیمی دیتا را در دیسک نگه نمیدارد -دیتا در مموری است- که این منجر به تاخیر کم برای دسترسی به دیتا میشود و به همین دلیل مشابه, قادر است عملیات بیشتری را در زمان کمتری انجام دهد. همچنین ردیس برخلاف بقیه دیتابیس های key-value  انواع مختلفی از ساختارهای داده را پشتیبانی میکند برای مثال strings, list, set, sorted lists, hashes, bitmaps, hyperloglogs, streams, geospatial و … . از دیگر مزایای آن میتوان به سادگی و خوش دستی اشاره کرد :) با استفاده از این ابزار میتوان دستورات پیچیده را به سادگی و کوتاهی نوشت. همچنین ردیس از معماری primary-replica پشتیبانی میکند که این منجر به بهبود پرفورمنس برای عمل read میشود و برای persistancy, دیتا را میتوان در دیسک نیز ذخیره کرد. همچنین ردیس از transaction نیز پشتیبانی میکند و با استفاده از آن میتوان عملیات اتمیک انجام داد و … .در لینک زیر میتوانید اطلاعات مفصل در مورد انواع ساختارهای داده ای که ردیس از آنها پشتیبانی میکند و همچنین شیوه ی استفاده از آنها را به دست آوردید:https://redis.io/topics/data-types-intro</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Tue, 21 Sep 2021 09:53:33 +0430</pubDate>
            </item>
                    <item>
                <title>مفاهیم و تعاریف پایه ای شبکه</title>
                <link>https://virgool.io/@parnian_rad/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%88-%D8%AA%D8%B9%D8%A7%D8%B1%DB%8C%D9%81-%D9%BE%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-m2jjqth5hnn1</link>
                <description>در این متن که برگرفته از کتاب dockerinaction می باشد تعدادی از مفاهیم پایه ای شبکه(پروتکل, interface, آدرس IP, پورت و...) به زبان ساده و بسیار مختصر بیان میشود.پروتکل که به صورت protocol نوشته می شود به معنای قرارداد, شیوه و اصول, راهکار و سیاست می باشد و به نوعی میتوان آن را  به عنوان ابزاری برای ارتباط دانست. نقش پروتکل در کامپیوتر مثل نقش زبان برای انسان است. برای برقراری یک ارتباط موفقیت آمیز بین مبدا و مقصد, طرفین باید از یک پروتکل (زبان) یکسان استفاده کنند و لذا دو موجودیت که بر یک پروتکل توافق کرده اند میتوانند با یکدیگر ارتباط برقرار کنند و مفهوم این ارتباط را درک کنند.سه نوع پروتکل در بستر شبکه وجود دارد:1- پروتکل هایی که وظیفه برقراری ارتباط را بر عهده دارند . ( communication)2- پروتکل هایی که وظیفه حفظ امنیت داده ها را بر عهده دارند . ( security )3- پروتکل هایی که وظیفه مدیریت شبکه را بر عهده دارند . ( Network management )در ادامه از تعریفی که برای پروتکل ارایه شد در جهت تفهیم مطالب دیگر استفاده میشود.  یک network interface یک آدرس دارد و یک مکان خاص را مشخص میکند. میتوان آن را به عنوان یک صندوق پستی درنظر گرفت; به این صورت که پیام ها از طرف فرستنده به صندوق پستی فرد گیرنده ارسال میشوند و از آنجا به دست فرد مورد نظر میرسند و همچنین از طرف فرستنده ابتدا به صندوق پستی ارسال میشوند و از آنجا به دست گیرنده ی مورد نظر میرسند. همانطور که هر صندوق پستی دارای یک کد پستی مشخص و یکتا هست که مکان صندوق را مشخص میکند و درواقع حاوی اطلاعاتی درمورد صندوق پستی است, network interface هم یک IP دارد که توسط پروتکل اینترنت شناخته شده می باشد. در شبکه, port همان گیرنده یا فرستنده خاص در یک ادرس را مشخص میکند; برای مثال ممکن است  چندین نفر از یک صندوق پستی اقدام به ارسال یا دریافت نامه های پستی شان را کنند که البته گیرنده یا فرستنده دقیق پیام ها باید مشخص باشد و هر فرد فقط باید پیام های مربوط به خودش را باز کند و به آنها دسترسی داشته باشد.کامپیوترها معمولا دو نو ع interface دارند; Ethernet Interface و  loopback interface. از ethernet interface برای ارتباط با دیگر procss و interface ها استفاده میشود. در حالی که loopback interface  با هیچ interface در ارتباط نیست(از این interface برای ارتباط با دیگر برنامه ها در یک کامپیوتر استفاده میشود).</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Wed, 15 Sep 2021 09:13:18 +0430</pubDate>
            </item>
                    <item>
                <title>داکر و namespace</title>
                <link>https://virgool.io/@parnian_rad/%D8%AF%D8%A7%DA%A9%D8%B1-%D9%88-namespace-hyaodpqqakl3</link>
                <description>لینوکس به هر برنامه در حال اجرا یا process یک عدد یکتا با عنوان process identifier اختصاص میدهد. مجموعه ای از این pid ها که هر کدام به برنامه ای خاص اختصاص دارند pid namespace را تشکیل میدهند; لینوکس ابزاری برای ساخت این pid namespace ها دارد و هرکدام از آنها مجموعه ی کامل از pid ها را دارند به این معنی که در هر namespace میتوانیم pid های 1و2و3و…. را داشته باشیم.داکر که پیش تر درمورد آن صحبت شده, ابزاری است که با زبان Go نوشته شده و از برخی قابلیت های لینوکس برای پیشبرد اهدافش استفاده کرده است. یکی از این قابلیت ها همین مفهوم namespace است. داکر برای هر container که ساخته میشود namespace جداگانه تعریف میکند, این کار باعث ایزوله سازی پروسس های یک کانتینر از کانتینر دیگر میشود. بدون pid namespace جداگانه, فرایندهایی که داخل یک کانتینر فعال هستند id شان را با فرایندهایی که داخل کانتینرهای دیگر یا حتی در سیستم میزبان فعال هستند به اشتراک میگذارند; در این صورت فرایندی که داخل یک کانتینر فعال است متوجه کاری که فرایندی دیگر در یک کانتینر دیگر, یا حتی سیستم میزبان میکند میشود و حتی میتواند آن را تحت کنترل خود درآورد -که این دقیقا برخلاف وجودیت داکر است!- البته داکر امکان ساخت کانتینری بدون namespace اختصاصی را نیز فراهم میکند که کاربردش برای مواقعی که یک فرایند اعمال system administrator انجام میدهد می باشد.برای فهم بهتر موضوع یک software conflict ساده را بررسی میکنیم. فرض کنید که یک وب سرور NGINX را بر روی سیستم خود ران کرده اید و در یک پروژه در حال استفاده از آن هستید, حال فراموش کرده اید که پروژه ای در حال استفاده از این وب سرور است و وقتی میخواهید دوباره از آن استفاده کنید به این دلیل که منابع در حال استفاده پروژه ی اول است این امکان برای شما فراهم نمیشود و به خطا برمیخورید!داکر این موضوع را با تعریف کانتینر و namespace اختصاصی برای هر کدام حل کرده است.در واقع conflict های زیادی وجود دارند که اغلب به دلیل وابستگی برنامه ها به هم و عدم توانایی آنها در اشتراک گذاری منابع به وجود می آید; برای مثال دو برنامه که میخواهند روی یک پرت اجرا شوند(مانند همین مثالی که بررسی کردیم), دو برنامه میخواهند از دو ورژن مختلف از یک کتابخانه که به صورت سراسری(global) تعریف شده استفاده کنند, برنامه ای نصب و اجرا شده که environment variable هایی که برنامه ی دیگری از آن استفاده میکند را تغییر داده و اکنون برنامه ی اول به مشکل برمی خورد! و مثال های دیگر که با استفاده از مفهوم کانتینر و اختصاصی بودن namespace برای آن, میتوان جلوی این مشکلات را گرفت.</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Sun, 29 Aug 2021 19:15:03 +0430</pubDate>
            </item>
                    <item>
                <title>container vs. virtual machine</title>
                <link>https://virgool.io/@parnian_rad/container-vs-virtual-machine-jha5gktc5y8y</link>
                <description>در مقاله ای که دوست و همکار عزیزم خانم حانیه مهدی آبادی با عنوان &quot;چرا داکر؟&quot; در انتشارات کاوان به اشتراک گذاشته اند, معرفی مختصری از داکر ارایه شده است, در این مقاله به دو مفهوم container و virtual machine اشاره شد که قصد داریم در اینجا این دو مفهوم را از هم تمییز دهیم و متوجه تفاوت های آنها بشویم.ماشین مجازی یا همان Virtual Machine تفاوت زیادی با یک کامپیوتر فیزیکی مانند لپ تاپ, گوشی هوشمند یا حتی سرور ندارد. همانند کامپیوتر های دیگر حاوی cpu, مموری و دیسک برای ذخیره است و حتی در صورت لزوم میتواند به اینترنت هم متصل بشود. تنها تفاوت این است که کامپیوترهای ما فیزیکی و محسوس هستند در حالیکه ماشینهای مجازی, مجازی هستند :))مجازی سازی فرایند ساخت یک ورژن مجازی از محیط کامپیوتری که داریم می باشد که cpu, مموری, و حافظه را از کامپیوتر یا سرور میزبان قرض میگیرد. به عبارتی ماشین مجازی یک فایل است که به آن image گفته میشود و مانند کامپیوتری مستقل عمل میکند. این کامپیوتر مجازی مستقل, میتواند به عنوان یک محیط محاسباتی جداگانه وجود داشته باشد که روی آن سیستم عامل های مختلف اجرا میشوند. ماشین مجازی جدا از بقیه بخش های سیستم عمل میکند; به این معنی که نرم افزاری که داخل یک ماشین مجازی در حال اجراست ارتباطی با ماشین های مجازی دیگر یا حتی کامپیوتر یا سرور میزبان ندارد.ماشین مجازی کاربردهای زیادی دارد و ممکن است بر حسب نیازهای مختلفی مورد استفاده قرار بگیرد; از جمله آن میتوان به استفاده از سیستم عامل های دیگر به عنوان میزبان, تست اپلیکیشن ها و نرم افزارها در محیطی امن و ایزوله, بک-آپ گرفتن از سیستم عامل فعلی, دسترسی به دیتاهایی که ویروسی شده اند یا استفاده از اپلیکیشن ها و نرم افزارهای قدیمی تر با نصب ورژن قدیمی سیستم عاملی دیگر و… اشاره کرد .از بزگترین مزایایی که ماشین مجازی دارند استقلال آنها از بقیه ماشین های مجازی و سیستم میزبان است. نرم افزاری به نام hypervisor یا virtual machine manager اجازه میدهد در آن واحد چند سیستم عامل روی یک سیستم اجرا شوند و تداخلی با هم نداشته باشند که این منجر به استفاده بهینه از فضای فیزیکی و زمان میشود. این استقلال به آنها قابلیت قابل حمل بودن را نیز اضافه میکند.در این بین مفهوم دیگری با عنوان container مطرح است که گاها با ماشین مجازی اشتباه گرفته میشود.همانند ماشین های مجازی, container ها نیز اپلیکیشن ها و نرم افزارهای مختلف را به صورت ایزوله و محافظت شده از بقیه ی منابع اجرا میکنند با این تفاوت که ماشین مجازی بخشی از سخت افزار را برای راه اندازی محیطی کاملا جداگانه در اختیار میگیرد ولی کانتینر فقط همان نرم افزار خاص و وابستگی هایش را از بقیه ی سیستم جدا میکند و همچنین کانتینرهای مختلف سیستم عامل میزبان را باهم به صورت اشتراکی استفاده میکنند درحالیکه ماشین های مجازی هر کدام مجاز بودند سیستم عاملی مجزا داشته باشند.مزیت کلیدی کانتینر ها نسبت به ماشین های مجازی این است که سربار خیلی کمتری به نسبت ماشین های مجازی دارند از این جهت که فقط حاوی فایل های باینری و کتابخانه ها و وابستگی های مخصوص به همان نرم افزاری که اجرایش میکنند هستند, کرنل یک سیستم عامل میزبان را به صورت اشتراکی استفاده میکنند که این مزیت, آنها را نسبت به ماشین های مجازی کوچکتر میکند و درنتیجه ی آن سریع تر بوت میشوند, استفاده ی بهینه ای از منابع دارند و همچنین قابلیت انتقال نرم افزار ها و اپلیکیشن ها را بیشتر میکنند.برعکس آن ماشین های مجازی بزرگتر هستند و نسبت به کانینرها کندتر بوت میشوند, آنها کاملا از یکدیگر جدا هستند و هرکدام کرنل سیستم عامل مخصوص خود را دارند. ماشین های مجازی برای اجرای چند اپلیکیشن با یکدیگر, ایجاد محیطی ایزوله بین اپلیکیشن های مختلف و اجرای برنامه های قدیمی که روی سیستم عامل های با ورژن قدیمی تر اجرا میشوند بهترین انتخاب هستند.container vs. virtual machineداکر مفهوم کانتینر را ارایه میدهد و همانطور که گفته شد استفاده از ماشین مجازی برای اجرای یک برنامه سربار بسیار زیادی دارد و اصلا مقرون به صرفه نیست, با این حال داکر در سیستم عامل های macOS و windows به صورت یک ماشین مجازی کوچک ارایه میشود, البته اگر دقیق تر به آن نگاه کنیم, ما یک ماشین مجازی کوچک ایجاد میکنیم که توسط آن تمام کانتینر ها را اجرا میکنیم و هرچه تعداد کانتینر ها زیاد میشوند سربار استفاده از ماشین مجازی نیز کمتر میشود.</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Fri, 20 Aug 2021 22:59:11 +0430</pubDate>
            </item>
                    <item>
                <title>دسته بندی دیتابیس ها</title>
                <link>https://virgool.io/@parnian_rad/%D8%AF%D8%B3%D8%AA%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%87%D8%A7-xhpudpdjml8b</link>
                <description>یک سیستم مدیریت پایگاه داده (database management system یا به اختصار DBMS) یک مجموعه از داده های به هم پیوسته و برنامه هایی برای دستیابی به این داده ها میباشد. هدف اصلی یک سیستم مدیریت پایگاه داده ایجاد روشی برای ذخیره سازی و دستیابی به اطلاعات دیتابیس به نحوی کارآمد و ساده می باشد. دسته بندی های متعددی برای این سیستم ارائه شده که در ادامه به بررسی یکی از این دسته بندی ها میپردازیم.گفته شد هدف سیستم های مدیریت پایگاه داده ایجاد روشی برای ذخیره سازی و دستیابی به اطلاعات دیتابیس به نحوی کارآمد است. در سیستم های توزیع شده مفهومی با عنوان CAP مطرح میشود که مختصر شده ی عبارات  partition tolerance, availability, consistency می باشد.عبارت consistency اشاره به مفهوم همگام بودن و یکپارچگی دیتابیس ها دارد به این معنی که همه ی دیتابیس ها در سیستم توزیع شده برای یک آیتم تکراری یک مقدار واحد دارند.در این سیستم ها Availability به این معنی است که برای هر عمل نوشتن یا خواندن از دیتابیس انتظار دریافت جواب در زمان معقول را داریم؛ به بیانی ساده تر سیستم همیشه آماده است.و نهایتا partition tolerance به این مفهوم اشاره دارد که علی رغم وجود مشکل در بعضی قسمت ها، سیستم همچنان به فعالیت خودش را ادامه دهد.آنچه واضح است هر سه جز نمیتوانند همزمان با هم برقرار باشند! برای درک بهتر این مطلب در نظر بگیرید که هیچ سیستم توزیع شده ای از رخ دادن خطا در امان نیست، لذا سعی بر این است که partition tolerance را تا حد ممکن برقرار سازیم، در حضور این جز، تنها یکی از دو مفهوم availability یا consistency می توانند برقرار باشند[چرا؟] فرض کنید تاکید بر روی برقراری consistency باشد، در این صورت وقتی خطایی در بخشی از سیستم رخ می دهد، در همان لحظه تضمینی برای یکسان و یکپارچه بودن اطلاعات وجود ندارد و به همین دلیل سیستم در پاسخ به عملیاتی که انتظار می رود انجام دهد، تولید خطا میکند و یا نمیتواند در زمان معقولی پاسخ دهد، لذا availability زیر سوال میرود. از طرف دیگر فرض کنید تاکید بر روی availability باشد، در این صورت سیستم در پاسخ به عملیاتی که میخواهد رویش انجام شود آخرین ورژن از داده ای را که دارد استفاده میکند بدون اینکه تضمینی برای consistency آن وجود داشته باشد! در حالتی که partition tolerance برقرار نباشد، هر دو شرط availability و consistency را میتوانیم با هم داشته باشیم.به همین ترتیب طراحان سیستم های مدیریت پایگاه داده، دسته بندی ها و طراحی های مختلفی برای پایگاه داده شکل داده اند که هر کدام از آنها، در بخش هایی از این سه مفهوم قوت دارند.به صورت کلی در این دسته بندی، دیتابیس ها به چهار دسته ی column-based، document-based، key-value و graph-based تقسیم میشوند که در ادامه هر کدام را به صورت دقیق تر بررسی میکنیم.دسته بندی های مختلف دیتابیس هادیتابیس های key-value: دیتابیس های غیر رابطه ای هستند که از تعدادی کلید و مقادیر برای آن کلید ها ساخته شده اند (شیوه ذخیره سازی شبیه به مفهوم دیکشنری است)، این دیتابیس ها در جایی که منطق کار ساده باشد و در حجم کم ذخیره سازی، سرعت زیاد مدنظر باشد استفاده میشوند. Redis نمونه ای از این دسته دیتابیس می باشد.key-value databasesاگر هداف پیچیده تری داریم، شاید بهتر باشد نوع دیگری از دیتابیس ها برای مثال document-based ها استفاده کنیم.دیتابیس های document-based: به این مدل دیتابیس اصطلاحا schema-less گفته میشود، بدین مفهوم که مقید به طرح خاص از پیش تعیین شده ای نیستند و به صورت داینامیک و برحسب نیاز میتوان ساختارشان را تغییر داد. از این دیتابیس ها برای ذخیره و کویری زدن به دیتای JSON استفاده میشود، این دسته از دیتابیس ها SQL را پشتیبانی میکنند و قدرت زیادی در indexing دارند که این مشخصات، راه های متنوعی جهت دستیابی، انتقال و تحلیل داده ها ارائه میدهد. از این دسته در کاربردهایی که schema تغییرات زیادی دارد استفاده میشود، برای مثال در کاربرد هایی چون مدیریت محتوا، هر محتوا ممکن است تعداد زیادی صفت داشته باشد که این صفات متمایز از صفات محتوای دیگر باشند، در نتیجه هر محتوا را میتوان به عنوان یک document مجزا دسته بندی کرد، به عنوان مثال های دیگر از کاربردهای این دسته دیتابیس ها میتوان به موتور های جستجو، ابزار های لاگ گیری و… اشاره کرد. mongoDB و elasticsearch نمونه هایی از این دسته می باشند.ذخیره سازی در دیتابیس های document-basedدیتابیس های column-based: در این مدل از دیتابیس ها به جای دسته بندی دیتابیس به صورت سطری، دید ستونی به داد ها داریم که این منجر به دستیابی راحت تر و سریعتر به داده هایی که مشخصه خاصی دارند میشود - نسبت به حالتی که مجبور به بررسی تعداد زیادی از سطرها باشیم. رویکرد سطری برای مواقعی که نیاز به دستیابی به کل اطلاعات و فیلدهای یک رکورد داریم مفید است درحالیکه برای دستیابی به تعدادی فیلد که دارای مشخصه خاص هستند رویکرد ستونی مفیدتر واقع میشود (به بیانی دیگر برای عملی چون * SELECT هزینه زیادی پرداخته میشود ولی برای عمل WHERE هزینه به مراتب کمتر میشود). از این دیتابیس ها در مواقعی که پردازش زیادی روی داده انجام میدهیم و استنتاج داده برایمان مهم تر است استفاده میکنیم، به این دلیل که هم دریافت، و هم ذخیره سازی داده(به دلیل عملیات indexing) کار مشکل و زمان بری می باشد.جدول زیر را در نظر بگیرید:رویکرد سطری برای ذخیره داده های این جدول به شکل زیر خواهد بود:row basedدر حالی که رویکرد ستونی به شکل زیر خواهد شد:column basedدیتابیس های graph-based: این دیتابیس ها به رابطه ی میان داده ها، به اندازه ی خود داده ها، اهمیت میدهد. در حالیکه بقیه ی دیتابیس ها برای ارتباط میان داده هایشان از عملیات پرهزینه ای چون JOIN استفاده میکنند، در این دسته بندی ارتباط میان داده ها نیز همگام با خود داده ها ذخیره میشود و برای کوئری های پیچیده و ذخیره داده هایی که ارتباطات گسترده میانشان وجود دارد انتخاب بسیار مناسبی هستند. در این نوع دیتابیس، موجودیت ها تشکیل رئوس گراف و روابط میان موجودیت ها تشکیل یال ها را میدهد که این یال ها می تواند جهت دار یا بدون جهت باشد. مثال هایی از استفاده از این دسته دیتابیس در شبکه های اجتماعی، نقشه های جغرافیایی و… می باشد. Neo4j نمونه ای از این دیتابیس است.graph-based databases</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Sun, 01 Aug 2021 03:14:02 +0430</pubDate>
            </item>
                    <item>
                <title>الگوریتم چیست؟</title>
                <link>https://virgool.io/@parnian_rad/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%DA%86%DB%8C%D8%B3%D8%AA-z6oa7ee1nbry</link>
                <description>احتمالا واژه ی الگوریتم در روزمره زیاد به گوشتان خورده باشد، الگوریتم به تعبیری بسیار ساده، به گام به گام بودن یک کار اشاره میکند، بسیاری از امور شخصی ما دارای الگوریتم مشخص و روتین از پیش تعیین شده هستند، در این مقاله قصد داریم مفهوم الگوریتم را به صورت دقیق تر در دنیای برنامه نویسی بررسی کنیمبه زبانی ساده، الگوریتم هر روش ساخت یافته ای است که مجموعه ای را به عنوان ورودی میگیرد و مجموعه ای را به عنوان خروجی برمیگرداند! به بیانی دیگر یک سلسله مراتب از عملیاتی که روی داده های ورودی انجام میشود و آنها را به داده های خروجی تبدیل میکند. در این میان همه ی الگوریتم ها &quot;صحیح&quot; نیستند؛ ولذا باید ابتدا به تعریفی برای &quot;الگوریتم های صحیح&quot; بپردازیم.الگوریتمی را صحیح گوییم که به ازای هر ورودی که به آن بدهیم، با ارائه خروجی مطلوب و درست کارش را به اتمام برساند و مساله ی داده شده را حل کند، و الگوریتمی را ناصحیح گوییم که به ازای بعضی مقادیر ورودی اصلا کارش به اتمام نرسد، یا اگر به اتمام میرسد خروجی غلطی را به عنوان جواب به ما ارائه دهد.البته نکته ی قابل توجه در اینجا این است که تمام الگوریتم های ناصحیح، در عمل ناکارآمد نیستند و گاهی میتوان با کنترل خطا، از آنها بهره ی زیادی برد.احتمالا با این تعاریف، هنوز به پاسخی برای این پرسش که &quot;الگوریتم چیست و چه نوع مسائلی با آن حل میشوند؟&quot;  نرسیده اید، لذا در ادامه چند مورد از الگوریتم هایی که در دنیای امروز کاربرد زیادی دارند را بررسی میکنیم تا به شهود بهتری برسیم.در دنیای امروز، اینترنت به مردم اجازه میدهد با خیل عظیمی از داده ها سروکار داشته باشند، آنها را در اینترنت به اشتراک بگذارند، آنها را دستکاری و به روز کنند و همچنین داده های مختلف را از منابع مختلف جمع آوری کنند؛ با استفاده و بهره وری از الگوریتم ها سایت های اینترنتی توان مدیریت این داده های کلان را دارند، برای مثال میتوانند روترهایی که با آن انتقال داده ها راحت تر باشد را پیدا کنند، داده های مورد نیاز را دقیق تر شناسایی کنند و در اختیار کاربران قرار دهند و...مثال دیگری که میتوان به آن اشاره کرد تبلیغاتی است که هر روزه آنها را میبینیم! سهامداران و صاحبان کمپین ها و کارخانه ها همیشه به دنبال این هستند که محصولشان را در جایی تبلیغ کنند که بیشترین سود برایشان حاصل شود، به عنوان مثال یک نامزد انتخاباتی به دنبال جاییست که با معرفی خودش و صرف هزینه ی گزاف برای تبلیغات، به بیشترین درصد رای برسد، یک شرکت عرضه خدمات اینترنتی به دنبال فهم این مساله است که کجا منابعش را مستقر کند که بهترین خدمت رسانی به مشتریانش را داشته باشد و صد ها نمونه ی دیگر که الگوریتم پاسخی برای همه ی اینها دارد.اکثر این مسائلی که با ارائه الگوریتم حل می شوند دو مشخصه ی جذاب دارند، یکی اینکه برای هر کدام از آنها می تواند تعداد زیادی الگوریتم وجود داشته باشد و در این میان پیدا کردن آنکه &quot;بهترین راه حل&quot; را ارائه میدهد کار دشواری است (و اصلا قبل از آن نیاز به تعریفی برای بهترین الگوریتم داریم)، دیگر اینکه خیلی از این مسائل کاربرد های عملیاتی دارند و در دنیای واقعی نیز از آنها استفاده میشود.در بررسی الگوریتم ها، یک معیار کارایی برای آنها تعریف میکنیم که &quot;سرعت&quot; است. به عبارتی دیگر، معیار کارایی الگوریتم مدت زمانی است که طول میکشد تا خروجی مورد نظر تولید شود. برای واضح تر شدن بحث، در نظر بگیرید که اگر کامپیوترهای ما بی نهایت سریع بودند و بی نهایت حافظه داشتیم، آن گاه هر الگوریتمی که ما را صرفا به جواب می رساند مورد قبول بود و در میان انبوه الگوریتم ها، آنکه استفاده و پیاده سازیش آسان تر بود را برمی گزیدیم. با این حال کامپیوتر های ما بی نهایت سریع نیستند، بی نهایت حافظه نیز در اختیار ما قرار ندارد و اتفاقا در هر دوی اینها محدودیت داریم و باید از آنها به دقت استفاده کنیم و در این میان الگوریتم هایی که در استفاده از منابعی که در اختیار ما است صرفه جویی می کنند، ارجح هستند. پس به بررسی مثالی از دو الگوریتم که کار یکسانی را با مرتبه زمانی متفاوت، و در دو سیستم متفاوت انجام میدهند میپردازیم.دو الگوریتم merge-sort و insertion-sort را در نظر بگیرید، این دو الگوریتم برای مرتب سازی استفاده میشوند و به ازای مجموعه داده هایی که به عنوان ورودی دریافت میکنند، مرتب شده ی این داده ها را به عنوان خروجی برمیگردانند با این تفاوت که اولی در اردر زمانی c1.nlogn نسبت به ورودی و دومی در اردر زمانی c2n^2 نسبت به ورودی کارش را انجام میدهد. فرض کنید به ازای n=10000000 الگوریتم insertion-sort را در کامپیوتری که در هر ثانیه ده بیلیون عملیات انجام میدهد، و الگوریتم merge-sort را در کامپیوتری که در هر ثانیه 10 میلیون عملیات انجام میدهد اجرا کنیم، واضح است که کامپیوتر اول 1000 بار سریعتر از کامپیوتر دوم است. همچنین فرض کنیم ثابت c2 در الگوریتم insertion-sort برابر با 2 باشد و ثابت c1 در الگوریتم merge-sort برابر با 50، با این حساب خواهیم داشت:insertion-sortmerge-sortمیبینیم حتی با وجود این شرایط الگوریتم merge sort در حدود 17 برابر سریعتر از الگوریتم insertion sort است! و این حتی در تعداد ورودی های بالاتر بسیار مشهود تر میشود. برای مثال اگر تعداد 100 میلیون داده ی ورودی برای سورت داشته باشیم، الگوریتم merge-sort در حدود 4 ساعت و الگوریتم insertion-sort در حدود 23 روز زمان برای مرتب سازی آنها زمان نیاز دارند!نکته ی مورد توجه دیگر این است که مرتبه زمانی اجرای الگوریتم ها نیز به سه مدل best case, average case, worst case تقسیم بندی میشود که البته ما همیشه worst case را گزارش میکنیم، به این دلیل که اولا با این کار یک کران بالا روی زمان اجرایی الگوریتم به ازای هر ورودی دلخواه داریم، دوما در بیشتر الگوریتم ها عمدتا حالت worst case اتفاق میافتد و نهایتا حالت average case نیز تقریبا به بدی حالت worst case است! و لذا معیار ما برای برتری یک الگوریتم بر دیگری همین worst case خواهد بود. برای تحلیل و به دست آوردن زمان اجرای الگوریتم ها روش های مختلفی وجود دارد، یکی از آنها substitution method، دیگری درخت بازگشت ، master theorem و… که در مقاله ی بعدی به بررسی آنها پرداخته خواهد شد.</description>
                <category>پرنیان راد</category>
                <author>پرنیان راد</author>
                <pubDate>Sat, 31 Jul 2021 02:10:43 +0430</pubDate>
            </item>
            </channel>
</rss>