<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آرش حاتمی</title>
        <link>https://virgool.io/feed/@hatamiarash7</link>
        <description>SRE @ Arvancloud</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:35:41</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/10910/avatar/OVkn0B.jpg?height=120&amp;width=120</url>
            <title>آرش حاتمی</title>
            <link>https://virgool.io/@hatamiarash7</link>
        </image>

                    <item>
                <title>تغییرات نرم افزاری لازم قبل از آغاز سال ۱۴۰۲</title>
                <link>https://tech.arvancloud.ir/dst-iran-1402-hsrsartuozxi</link>
                <description>در بهار ۱۴۰۱ قانونی در کشور تصویب شد که دیگر ساعت رسمی کشور تغییر نکند. این قانون از سال ۱۴۰۲ اجرایی خواهد شد که باید قبل از آن اطمینان حاصل کنیم زیرساخت‌ها٬ پروژه‌ها و اپلیکیشن‌های ما تحت تاثیر قرار نگیرند.ساعت تابستانه چیست؟لغت DST که کوتاه شده ی Daylight Saving Time می‌باشد همان ساعت تابستانه است که در ۶ ماه ابتدایی سال فعال شده و در ۶ ماه پایانی غیرفعال خواهد شد. این تغییر با نیت‌های مختلفی انجام می‌شود. بعضی از کشورهای جهان برای استفاده بهتر از نورطبیعی عصرها ٬ بعضی‌ها جهت کاهش حوادث جاده ای و اکثر کشور‌ها نیز به دلیل کاهش میزان انرژی جهت روشنایی مصنوعی در شب ساعت رسمی خود را تغییر می‌دهند.در حال حاضر کمتر از ۴۰ درصد کشورهای جهان از DST استفاده می‌کنند که ایران نیز یکی از آن‌ها بود.مدیریت منطقه زمانیتغییرات تاریخ و زمان و همچنین منطقه زمانی توسط پکیج های مختلف انجام خواهند شد. قوانین ساعتی کشورهای مختلف در این پکیج ها تنظیم شده است تا به صورت خودکار برای کاربران DST اعمال شود. در صورتی که این پکیج‌ها آپدیت باشند مشکلی برای اپلیکیشن‌های شما به وجود نخواهد آمد.توجه کنید که این تغییر ساعت فقط برای منطقه زمانی ( Time Zone ) ایران وجود دارد. در صورتی که از منطقه زمانی UTC استفاده می‌کنید نیاز نیست کار خاصی انجام دهید.در ادامه روش‌هایی را جهت به روزرسانی پکیج‌های مورد نظر بررسی خواهیم کرد.لینوکستوزیع‌های لینوکس از پکیج tzdata جهت مدیریت تاریخ٬ ساعت و منطقه زمانی استفاده می‌کنند. از آپدیت بودن این پکیج اطمینان حاصل کنید.sudo apt-get install tzdataتغییرات مربوط به ساعت ایران در تاریخ ۱۶ آگوست ۲۰۲۲ در پکیج tzdata منتشر شد‌ ( تاریخچه ). پکیج نصب شده باید از این نسخه جدیدتر باشد. جهت مشاهده نسخه نصب شده از دستور زیر استفاده نمایید:dpkg -s tzdata | grep -i versionداکربا توجه به اینکه در ایمیج‌های داکر ممکن است Base image های متفاوتی استفاده کنید٬ احتمال اینکه پکیج tzdata در آن آپدیت نباشد وجود دارد. با به‌روزرسانی کردن مجدد این پکیج در فایل Dockerfile می‌توانید مشکل را برطرف کنید.RUN apt-get update &amp;&amp; apt-get install tzdata -yکتابخانه‌هاتغییرات ذکر شده در مراحل قبل مربوط به سیستم عامل بود. اما ممکن است شما در کدهای خود به طور مستقیم زمان را محاسبه کرده باشد. در این صورت مطمئن شوید که از جدیدترین نسخه کتابخانه‌های مربوط به زبان برنامه نویسی خود استفاده کنید. در ادامه چند نمونه از این کتابخانه ها آورده شده است.Python: pytz 2022.7.1Erlang: qdate_localtime 1.2.1</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Wed, 15 Mar 2023 15:47:23 +0330</pubDate>
            </item>
                    <item>
                <title>استقرار آبی-سبز با DNS</title>
                <link>https://virgool.io/@hatamiarash7/blue-green-deployment-using-dns-prpbdxqurprh</link>
                <description>استقرار آبی سبز چیه؟ابتدا باید بدونیم Blue - Green به چه معناست. استقرار سبز-آبی فرایند تهیه  بیش از یک محیط Production است که به شما این قابلیت رو میده تا نسخه های  متفاوت از برنامه ی خودتون رو منتشر کنید و در کسری از ثانیه بین اونها  جابجا بشید. احتمالا الان مدل انتشار Canary به ذهنتون خطور می‌کنه ولی  باید بگم که این فرق داره ( این پست رو بخونید ).با داشتن هر دو محیط در کنار هم٬ می‌توانید به سرعت و بدون Downtime به  نسخه جدید بروید یا در صورت مشکل به نسخه قدیمی برگردید. در این روش بر  خلاف مدل های سنتی که به صورت In-Place به روزرسانی انجام می‌شد٬ دیگر نیاز  نیس تا محیط Production متوقف یا از دسترس خارج بشه٬ سیستم آپدیت بشه و  دوباره همه چیز به مدار برگرده.موضوع این پست چیز دیگه است. اگه نیاز به اطلاعات بیشتر دارید به این نوشته از محمد بابازاده مراجعه کنید.حال بریم که روش خودمون رو بررسی کنیم.۱- انتشار نسخه اولیهمسلما قبل از هر چیز نیاز به یک اولیه برای پیاده سازی چنین روشی داریم.  در ابتدا یک رکورد DNS تعریف می‌کنیم که به یک یا چند سرور اشاره کند. این  رکورد به ما اجاره میده که بدون دونستن آدرس های IP مقصد٬ به طور مداوم  دسترسی ثابتی به سرویس فراهم کنیم.برای این مورد، باید از یک رکورد A استفاده کنیم، نوعی رکورد DNS است که  Hostname را به آدرس های IP نگاشت می‌کنه. انواع مختلفی از رکوردهای DNS  با اهداف مختلف وجود داره و رکوردهای A ابتدایی ترین اونها هستند. ما برای  هر استقرار به یک رکورد A نیاز داریم.بهترین راه برای انجام این کار استفاده از یک شماره نسخه در رکورد A و  استقرار یک زیرساخت جدید برای هر نسخه جهت دستیابی به چرخش ساده تر محیط ها  است. در نتیجه ما همیشه دو محیط انتشار ثابت با برچسب های آبی یا سبز  داریم.۲- ایجاد CNAMEرکورد بعدی DNS که باید ایجاد کنیم یک CNAME است. رکورد CNAME نام  مستعار از یک Hostname به Hostname دیگه است، به این معنی که میشه ازش برای  تغییر مسیرها یا ارائه چندین نام برای یک سرویس استفاده کرد. ما باید یک  CNAME ارائه کنیم که مشتریان ما برای دسترسی به خدماتمون ازش استفاده کنند  تا در نهایت بشه راحت و سریع مسیریابی را کنترل کرد.این رکورد نباید نسخه گذاری بشه چون در هر محیط فقط یک مورد وجود داره و  ما ازش برای پیدا کردن مقصدی که ترافیک باید مسیریابی بشه استفاده  می‌کنیم. در اینجا چند نمونه از رکورد های CNAME و A آورده شده:CNAME Record -&gt; A Record
logging.company.com -&gt; logging-01.company.com
logging.company.com -&gt; 01.logging.company.com
logging.company.com -&gt; logging-blue.company.com
logging.company.com -&gt; blue.logging.company.com۳- انتشار نسخه جدیدپس از اینکه سیستم اصلی ( اولیه ) اجرا شد و مشتریان از CNAME برای  دسترسی به خدمات ما استفاده کردند، حالا باید نسخه جدیدی از نرم‌افزار را  اجرا کنیم. میشه اون رو درست در کنار نسخه فعلی مستقر کرد که پس از استقرار  باید بتونیم از طریق رکورد A جدید بهش دسترسی داشته باشیم.در مرحله بعد، ما باید تمامی تست‌های خودمون رو اجرا کنیم تا مطمئن  باشیم که محیط جدید مطابق انتظار کار می‌کنه و می‌تونیم به مرحله سوییچ  کردن بریم. این مورد خیلی مهمه که مطمئن بشیم این آزمایش‌ها بر سایر  استقرارها ( نسخه ی منتشر شده قبلی ) تأثیر نمی‌گذاره، چون ممکنه منابعی  مثل پایگاه‌های داده به صورت اشتراکی استفاده بشه.۴- سوییچ کردنبرای اینکه برنامه خودمون رو به نسخه جدید سوییچ کنیم٬ کافی است تا  رکورد CNAME آپدیت بشه و به رکورد A جدید اشاره کنه. این مورد باید سریع  اتفاق بیوفته ولی با توجه به مقدار TTL رکورد DNS ممکنه تغییر کمی طول بکشه  چون با توجه به این مقدار٬ رکورد ما در جاهای مختلف Cache خواهد شد. به  نظر من برای TTL میشه از ۶۰ ثانیه استفاده کرد.در این بین اگه خطایی رخ داد یا از محیط ( نسخه ) جدید راضی نبودیم،  می‌تونیم با هدایت مجدد CNAME به رکورد A قدیمی اون رو برگردونیم. به دلیل  سادگی فرآیند، این کار باید سریع و آسان انجام بشه.۵- پاکسازیپس از سوییچ کردن، ممکنه لازم باشه محیط قبلی رو با حذف اون یا حذف هر  نرم افزاری که در حال اجرا مانده، پاکسازی کنیم. این کار رو میشه بلافاصله  پس از آپدیت کردن٬ یا بعد از چند ساعت/روز انجام بدید. در هر صورت کاملا  بستگی به نیازمندی های شما داره.نتیجه گیریروش استقرار آبی-سبز برای به حداقل رساندن ریسک ها و Downtime در انتشار  نرم افزار یکی از بهترین راه ها است و DNS راه اصلی برای انجام این کار  است. توجه کنید که تغییرات زیادی در این فرآیند وجود داره، اما ساده نگه  داشتن امور بسیار مهم است.</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Thu, 09 Mar 2023 22:41:54 +0330</pubDate>
            </item>
                    <item>
                <title>ایجاد gitignore سراسری</title>
                <link>https://virgool.io/@hatamiarash7/global-gitignore-pem4tcrw3szo</link>
                <description>خیلی وقت ها افراد فایل های gitignore را ویرایش کرده و اون رو شخصی سازی میکنند. اگه هرکس بخواد به سلیقه خودش عمل کنه فایل های غیرکاربردی خواهیم داشت.مشکل کجاست؟فرض کنید در یک تیم فنی ۲ نفر مشغول به کار هستند. یکی از اون ها سیستم عامل مک داره و یکی دیگه ویندوز. یکیشون از نرم افزارهای JetBrains استفاده میکنه و دیگری از VSCode. حالا اگر بخوایم نیازمندی های این دو نفر رو در نظر بگیریم باید به چنین فایلی برسیم:مدیریت و بررسی چنین فایل طولانی در تیم های بزرگ و پروژه های سنگین بسیار دشوار و پر دردسره چون یه سازمان/تیم نمیتونه نیازمندی های تمام افراد خودش رو در این فایل پوشش بده بلکه هر فرد مسئول مدیریت این موارد برای خودشه. فایل مورد نظر ما باید چنین باشه:راه حلما در هر پروژه یک فایل محلی gitignore. داریم که تغییرات اون روی پروژه اعمال میشه. حالا اگر یک فایل سراسری داشته باشیم که نیازمندی های خودمون رو داخلش قرار بدیم کار تیمی خیلی بهتر و تمیز تر انجام میشه. برای مثال خودم به شخصه عادت دارم فایل های مربوط به توسعه محلی یک پروژه در پوشه ای به نام dev ذخیره بشه پس دیگه نیازی نیست داخل هر پروژه از تیم این پوشه Ignore بشه.برای این سناریو ما میتونیم یک فایل gitignore. سراسری برای کل سیستم داشته باشیم. ابتدا یه فایل برای این کار بسازید. این فایل میتونه هرجا از سیستم عامل شما باشه ولی برای اینکه بعدا هم راحت تر به سراغش برید و مسیرش رو گم نکنید پیشنهاد میکنم در مسیر Home سیستم عامل باشه.پس از اینکه فایل ایجاد شد اطلاعات مورد نیاز خودتون رو بنویسید. برای مثال:در نهایت باید این فایل رو به Git معرفی کنید. برای این کار از دستور زیر استفاده کنید:و تمام! از حالا به بعد دیگه نیاز نیست Commit های اضافی و فایل های gitignore. شلوغ و غیر کاربردی داشته باشیم.</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Mon, 05 Sep 2022 21:22:14 +0430</pubDate>
            </item>
                    <item>
                <title>عبور از Captcha و حل خودکار آن</title>
                <link>https://virgool.io/hatamiarash7/bypass-captcha-i13lphit8oef</link>
                <description>Captcha ها معمولا برای مسدود کردن افراد خراب کاری به کار می رود که قصد  کلاهبرداری یا دستکاری داده ها را دارند با در کمپین های تبلیغاتی مختلف  میلیون ها حمله انجام می دهند. دلایل زیادی وجود داره که بخواهید یک سایت  رو از طریق برنامه ای که نوشتید کنترل کنید و مسلما Captcha نمیتونه جلوی  شما رو بگیره.اکنون بیش از چند سال است که با Captcha ها سر و کار دارید. آن همه خط و  کلمه و عدد که راه شما را سد می کنند. به هنگام ورود ، ثبت نام یا ارسال  نظر در هر جایی!انصافا اینو کی حل می کنه ؟Captcha مخفف عبارت Completely Automated Public Turing tests to tell  Computers and Humans Apart یا معدل فارسی ( تست های تورینگ عمومی کاملا  خودکار جهت تشخیص رایانه ها و انسان ها ) است و به گونه ای طراحی شده اند  تا مانند دروازه ای خاص ، انسان ها را از خود عبور دهند و جلوی ربات ها را  بگیرند. البته خطوط و بی معنا و کلمات ناخوانای سنتی این روزها کمتر رایج  هستند و جای خودشون رو به reCaptcha گوگل دادند. این کپچا به هنگامی که  ضریب انسانیت شما را بالا در نظر بگیرد به صورت خودکار تیک سبزی نشان داده و  اجازه عبور می دهد.اگر امتیازی بالاتر از آستانه در نظر گرفته شده کسب نکنید ، کپچا شما رو به  یک چالش تصویری جذاب دعوت میکنه و پازلی در اختیار شما میذاره که واقعا حل  اون آزاردهنده تر از رمزگشایی کپچاهای سنتی !!!کپچا برای انسان آزاردهنده است ، ولی اگر حداقل کارشون رو انجام بدن و  ما رو با پازل های مختلف درگیر نکنن میشه اون ها رو تحمل کرد ( ایده ای که  منجر به انتشار نسخه سوم reCaptcha یا Invisible Captcha شد ). اما راه  ساده تر از اثبات انسان بودن ، حل خودکار کپچاها است.اینجا است که به سراغ 2Captcha می رویم.2Captcha چطور کار می کنه ؟این  ابزار گونه های مختلفی از کپچا را حل می کند که این روند قالبا در دو  مرحله انجام می شود. ابتدا داده های لازم برای حل کپچا را ارسال کرده و یک  Request ID تحویل می گیرد. در صورتی که کپچا به صورت عکس باشد این داده ها  شامل رشته Base64 آن عکس است.در مرحله بعد درخواست خودتون رو ثبت می کنید و منتظر جواب کپچا می‎مونید !تا اینجای کار همه چیز ساده است. اما وقتی به سراغ Google reCaptcha می‎رید  داستان کمی فرق داره. شما همچنان درگیر همون 2 مرحله قبل هستید فقط داده  های متفاوتی رو ارسال می کنید. در این مورد باید Site Key مربوط به  reCaptcha رو ارسال کنید. این مقدار به صورت پیشفرض در بدنه HTML سایت قرار  می گیره.پاسخی که از کپچا دریافت میشه یه Token که باید در کنار باقی فیلدهای فرم با شناسه g-recaptcha-response ارسال بشه. برای مثال به تصویر زیر نگاه کنید. ( نسخه دمو reCaptcha v2 که خود گوگل منتشر کرده ). فیلد توکن با استایل display: none در فرم قرار میگیره تا در نهایت Submit بشه. این که فیلد متنی در اختیار  شما است یعنی به راحتی میتونید مقدار اون رو ویرایش کنید تا آزمایش های  خودتون رو انجام بدید. این گزینه کمک بزرگی به کاهش زمان Bypass میکنه.برای کپچاهای مبتنی بر تصویر ، نتیجه تقریبا در لحظه حاصل میشه ولی برای  reCaptcha نسخه 2 چیزی حدود 15 تا 30 ثانیه طول میکشه ( به Timeout کپچا  نمیرسه خیالتون راحت ? )خودکار سازی روند Bypassقبل از اینکه خودتون رو درگیر کپچا کنید ، باید ابزارهای خودتون رو  انتخاب کنید. مسلما نمیشه درخواست ها رو دستی به سرور ارسال کرده و نتایج  رو دریافت و در فرم قرار بدید. در ضمن کل روند Bypass کردن برای تست و  آزمایش و رد کردن کپچاها در شبیه ساز هاست ( کارهای دیگه ای هم میشه کرد  ولی بیاید خوش بینانه فکر کنیم و کلاه سفید باشیم ). ?در اولین مرحله به یک مرورگر نیاز داریم چون که با وب سایت و برنامه تحت  وب سر و کار داریم. به شخصه روزمره از Firefox استفاده می کنم و تست ها و  اتوماسیون ها رو با Google Chrome انجام میدم. فایرفاکس هم جواب میده و  برای اتوماسیون ، کروم بهتر عمل میکنه.در مرحله بعد کتابخانه ای برای اتوماسیون خودمون نیاز داریم. پیشنهاد من Puppeteer.  با استفاده از این کتابخانه شما حتی نیاز به نصب گوگل کروم هم ندارید چون  به صورت پیشفرض به همراه خودش نسخه ای از Chromium رو نصب می کنه. البته در  صورت نیاز می تونید از نسخه ی کروم که خودتون جدا نصب کردید هم استفاده  کنید ، مشکلی نیست.با دستور زیر Puppeteer رو نصب کنید :npm i puppeteer
 # or
 yarn add puppeteerبا اجرای این دستور آخرین نسخه puppeteer به همراه مرورگر مربوطه نصب میشه.  ( حجمی در حدود 200 مگابایت ). در صورتی که نیاز به دانلود و نصب مجزای  مرورگر ندارید از متغییر PUPPETEER_SKIP_CHROMIUM_DOWNLOAD استفاده کنید. یا خیلی ساده می تونید از puppeteer-core استفاده کنید. این نسخه مرورگری رو به همراه خودش نصب نمیکنه و فقط فایل های اصلی کتابخانه رو در اختیار شما قرار میده.npm i puppeteer-core
# or
yarn add puppeteer-coreبرای مقایسه بهتر نسخه معمولی و Core به این آدرس مراجعه کنید.تست و شروع به کاربعد از اینکه مطمئن شدید همه چیز نصب شده و آماده به کاره وقتشه تا یه  تست کوچیک انجام بدیم. برای مثال یک وب سایت رو باز کنیم. بریم سراغ وب  سایت Dice :const puppeteer = require(&amp;quotpuppeteer-core&amp;quot);

(async () =&gt; {
  let launchOptions = {
    headless: false,
    executablePath:
      &amp;quotC:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe&amp;quot,
    defaultViewport: null,
  };

  const browser = await puppeteer.launch(launchOptions);
  const page = await browser.newPage();

  await page.goto(&amp;quothttps://www.dice.com/register&amp;quot);
})();در اینجا ما سه گزینه را تنظیم می کنیم :ویژگی headless رو غیرفعال می کنیم تا مرورگر باز بشه و خودمون همه چیز رو مشاهده کنیمبا استفاده از گزینه executablePath می تونیم آدرس فایل اجرایی مرورگر رو به برنامه بدیم. برای مثال اینجا از نسخه ویندوز استفاده شده.با استفاده از defaultViewport اندازه های پیشفرض صفحه رو  کامل غیرفعال می کنیم تا مشکلی با وب سایت های مختلف نداشته باشیم. برای  مثال اگه مرورگر رو Maximize باز کنید ، وب سایت به طور کامل کل صفحه رو پر  نمیکنه.تا اینجای کار که ساده بود! حالا بریم سراغ مراحل بعدی کار تا کم کم  اتوماسیون خودمون رو راه بندازیم. ابتدا باید فیلد های خودمون رو در صفحه  شناسایی کنیم. تمام مرورگر ها ابزار Inspect/devtools دارن. این ابزار با  کلید F12 باز میشه و سپس باید المان های مختلف رو پیدا کنیم. ترکیب Ctrl+Shift+C در ویندوز و Shift+C+⌘ در مک. اینجا در وب سایت Dice ما 5 فیلد داریم که باید پر بشه.First Name = #fnameLast Name = #lnameEmail = #emailNew Password = #passwordRetype Password = #passwordConfirmationحالا باید داده های خودمون رو در فیلدهای بالا وارد کنیم. این کار هم به سادگی انجام میشه و تابعی به اسم type برای اون در اختیار داریم :await page.type(&amp;quot#fname&amp;quot, &amp;quotFirstName&amp;quot);
await page.type(&amp;quot#lname&amp;quot, &amp;quotLastName&amp;quot);
await page.type(&amp;quot#email&amp;quot, &amp;quotmail@domain.com&amp;quot);
await page.type(&amp;quot#password&amp;quot, &amp;quotStrongP@ssw0rd#&amp;quot);
await page.type(&amp;quot#passwordConfirmation&amp;quot, &amp;quotStrongP@ssw0rd#&amp;quot);شبیه سازی کلیک روی دکمه Register هم به سادگی مراحل قبل بوده و با تابع click انجام میشه :await page.click(&amp;quot#people button[type=submit]&amp;quot);حالا با اجرای کد ، ثبت نام به صورت خودکار انجام میشه ولی خب مسلما کار نمیکنه چون Captcha رو رد نکردیم !راه اندازی 2Captchaابتدا در وب سایتشون ثبت نام کرده و کلید API خودتون رو دریافت کنید.روند کار API به این صورته که داده های کپچا رو به 2Captcha ارسال می  کنید و نتایج رو دریافت می کنید. ولی اینجا با reCaptcha طرف هستیم و در  نتیجه باید تغییراتی را هم داشته باشیمبه reCaptcha SiteKey نیاز داریم که اول پست توضیح دادم. این مقدار در  کدهای جاوا اسکریپت قرار داره که با جستجو در devtools می تونید اون رو  پیدا کنید.باید method روی userrecaptcha قرار داده بشهآدرس صفحه نیز باید ارسال بشهconst formData = {
  method: &amp;quotuserrecaptcha&amp;quot,
  key: apiKey,
  googlekey: &amp;quot6LcleDIUAAAAANqkex-vX88sMHw8FXuJQ3A4JKK9&amp;quot,
  pageurl: &amp;quothttps://www.dice.com/register&amp;quot,
  json: 1,
};

const response = await request.post(&amp;quothttp://2captcha.com/in.php&amp;quot, {
  form: formData,
});

const requestId = JSON.parse(response).request;بعد از اینکه درخواست خودتون رو ارسال کردید و Request ID دریافت شد ، باید از اون برای دریافت نتیجه استفاده کنید و به چنین آدرسی درخواست بفرستید :http://2captcha.com/res.php?key=${apiKey}&amp;action=get&amp;id=${reqId}در صورتی که کپچای شما حاضر نباشد جواب CAPTCHA_NOT_READY  دریافت خواهید کرد که یعنی باید چند ثانیه دیگه مجدد تست کنید. وقتی که  کپچا حاضر باشه پاسخ شما داده میشه که برای کپچا های عادی ، جواب اون و  برای reCaptcha مقدار مورد نظر جهت قرار دادن در فرم برای Submit خواهد  بود.برای reCaptcha v2 این فرایند 15 الی 30 ثانیه ( شایدم بیشتر ) طول بکشه. در ادامه نمونه کد مربوطه رو مشاهده می کنید :async function pollForRequestResults(
  key,
  id,
  retries = 30,
  interval = 1500,
  delay = 15000
) {
  await timeout(delay);
  return poll({
    taskFn: requestCaptchaResults(key, id),
    interval,
    retries,
  });
}
function requestCaptchaResults(apiKey, requestId) {
  const url = `http://2captcha.com/res.php?key=${apiKey}&amp;action=get&amp;id=${requestId}&amp;json=1`;
  return async function () {
    return new Promise(async function (resolve, reject) {
      const rawResponse = await request.get(url);
      const resp = JSON.parse(rawResponse);
      if (resp.status === 0) return reject(resp.request);
      resolve(resp.request);
    });
  };
}
const timeout = (millis) =&gt;
  new Promise((resolve) =&gt; setTimeout&#40;resolve, millis&#41;);در اینجا طی یک بازه زمانی تعیین شده بررسی می کنیم که آیا کپچای ما حل  شده یا نه. تا در سریع ترین زمان ممکن و قبل از رسیدن به Timeout فرم  خودمون رو ثبت کنیم.بعد از این که پاسخ دریافت شد ، باید اون رو در فیلد g-recaptcha-response که بالاتر توضیح دادم قرار بدید. این کار هم که با تابع type انجام میشه ولی به همین سادگی هم نیست چون این فیلد در حال عادی مخفی بوده و این تابع جواب نمیده. حالا دو تا راه داریم :فیلد رو Visible کنید و سپس از تابع type استفاده کنید ❌با استفاده از جاوا اسکریپت مقدار رو در فیلد قرار بدیم ✔مورد دوم ساده تره ! و خب مسلما تابع آماده ای هم براش هست. اینجا می تونیم از تابع evaluate استفاده کنیم :const response = await pollForRequestResults(apiKey, requestId);

const js = `document.getElementById(&amp;quotg-recaptcha-response&amp;quot)=&amp;quot${response}&amp;quot`;

await page.evaluate(js);وقتی توکن به فرم اضافه شد ، همه چیز آماده است تا ثبت نام خودمون رو انجام بدیم. به همین سادگی ! فقط یکم تمیزکاری نیاز دارید.نکته : جهت سرگرمی بیشتر و اینکه همه چیز رو مرحله به مرحله مشاهده کنید می تونید از متغییر slowMo استفاده کنید ?پروژه و کد کامل این پست رو در گیت هاب می تونید مشاهده کنید : https://github.com/hatamiarash7/MyWebSite_Projects/tree/master/2captcha </description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Tue, 21 Dec 2021 18:00:10 +0330</pubDate>
            </item>
                    <item>
                <title>سرویس های ابری : شریک یا فروشنده ؟</title>
                <link>https://virgool.io/hatamiarash7/partner-cloud-providers-zuv1mbfdxbn3</link>
                <description>فکر نکنم لازم باشه در مورد مزیت های پردازش ها و سرویس های ابری صحبتی  بکنم. همه می‌دونیم مهاجرت به فضای ابری چقدر باعث پیشرفت پروژه ها و روند  توسعه شون میشه. این مورد طی سال های اخیر در کشور خودمون هم اتفاق افتاده و  شرکت های پیشرو در زمینه IT کم کم زیرساخت ها و روش های سنتی خودشون رو  کنار گذاشتن و دارن از خدمات ابری استفاده می کنن. در کنار این شرکت ها ،  مجموعه هایی هم به وجود اومدن که چنین سرویس هایی رو ارائه میدن. عرضه و  تقاضا ! حالا اینکه تو کشور ما اول عرضه بوده یا تقاضا جای بحث هست.این  مبحث به سرمایه گذاری های کلان هم نیاز داره که با نگاه و بررسی جنبه های  مختلف ، باید از هدر رفتن منابع مالی و زمانی جلوگیری بشه.پولمون رو از سر راه نیاوردیم که :)اینجا ما 3 تا مجموعه مختلف رو داریم :خدمات دهنده سرویس ابریشرکت/تیم/مجموعه استفاده کننده از سرویس ابریمشتری هادر حال حاضر جدال سنگینی بین دو مورد اول وجود داره که در نهایت هم باعث  نا رضایتی گروه سوم میشه و این اتفاق در نهایت منجر به ضرر های مالی  سنگینی میشه. یه مجموعه کلی هزینه کرده برای مهاجرت به سرویس ابری و حالا  پشیمون شده از انتخابش. مجموعه دیگه سرویس ابری ارائه داده و در خدمات  رسانیش مشکل داشته حالا مشتری هاش رو از دست داده و اون هم ضرر زیادی کرده  ... یه عالمه مشتری هم ناراضی هستن و صبح تا شب توییت میکنن که این چه  وضعشه ؟بیاید شرایط موجود و راه حل ها رو در 4 قسمت مختلف بررسی کنیم :1- کاهش کار های برنامه ریزی نشدهوجود Task ها و آپدیت های برنامه ریزی نشده بدون شک قاتل مجموعه شما است  که توضیح کامل اون نیازمند یه پست جدا است. یکی از مهم ترین کار ها در  استراتژی کسب و کار شما کم کردن چنین رخداد هایی است که پشت پرده مشکلات  زیادی رو به وجود میاره. اما در بحث ابری ... فرض کنید شما یه پروژه دیپلوی  شده دارید و 1 میلیون مشتری و همه چیز طبق روال داره پیش میره. حالا یه  دفعه تصمیم می‌گیرید ویژگی جدیدی رو ارائه بدید. سریع دست به کار شده و بچه  های فنی شرکت برنامه نویسیش رو آغاز میکنن ، بعدش پروژه میرسه دست تیم  DevOps و اونا هم میرن سراغ Cloud Provider و سریع چند تا سرویس میارن بالا  و یا علی مدد ! در عرض دو ماه به صورت فشرده چند تا گروه مختلف درگیر میشن که  یه قابلیت جدید اضافه بشه.اگر این روند بخواد اصولی انجام بشه ، قبلش یه جلسه کوتاه بین توسعه  دهنده ها و Cloud Provider باید برگزار بشه تا نیازمندی های جدید بررسی بشن  شاید اصلا مجموعه ای که داره سرویس میده در توانش نباشه زیرساخت مد نظر  شما رو فراهم کنه ! شاید زیرساختی که ارائه میدن برای سرویس شما مناسب  نباشه ! شاید نیاز باشه آپدیت هایی صورت بگیره !اگه بخوایم واقع بینانه به این قضیه نگاه کنیم ، فعلا بین دو گروه اول تعامل زیادی وجود نداره. سرویس دهنده تبلیغات خودش رو میکنه و سرویس گیرنده هم توقعات خودش رو داره. ?2 - برطرف کردن سریع مشکلاتتو دنیای ابری هیچوقت قرار نیست همه چیز طبق انتظار ما پیش بره. خیلی  وقت ها یه اشتباه کوچیک باعث میشه تا یکی از سرورها از زنجیره خارج بشه و  پشت سرش مشکلات زیادی به وجود بیاد. در چنین شرایطی مجموعه سرویس دهنده  باید بتونه سریعا دست به کار بشه و مشکل رو برطرف کنه. در غیر این صورت  روند نارضایتی تا End User ها پیش میره و ضررهای مالی زیادی ممکنه به وجود  بیاد که الان قابل اندازه گیری نیست.طی چند سال اخیر وقتی مشکلی به وجود اومده ، شرکت ها و بچه های فنیشون رو  دیدم که نشستن یه جا میزنن تو سر خودشون و پشت سر هم توییت میکنن که فلان  سرویس دهنده کارش خوب نیست ، چرا سرور ها نمیاد بالا ، چرا فلان دیتاسنتر  داغون شده ، چرا ، چرا ، چرا ...بیاید قبول کنیم که در چنین شرایطی وظیفه تیم توسعه دهنده هم شامل صبر  کردن و عدم ایجاد مزاحمت میشه. خیالتون راحت باشه ، سرویس دهنده حواسش هست و  داره کار شما رو انجام میده. حالا ارسال تیکت های زیاد و توییت و منشن کرد  اون ها چیزی رو درست نمیکنه.این جا است که هر دو گروه باید خودشون رو جای طرف مقابل قرار بدن تا خواسته های همدیگه رو بهتر درک کنن.3 - پشتیبانی 24x7 اصولی ☎الان خب باب شده که اکثر سرویس دهنده ها برای خودشون پلن های پشتیبانی  مختلف ارائه میدن و بر اساس سطح های مختلف ، شرایط مختلف هم پدید آوردن و  هزینه های مختلفی هم می‌گیرن ! اما آیا واقعا همون چیزی که تو سایت هاتون  نوشتید در عمل هم انجام میشه ؟ خودم رو بخوام مثال بزنم ، نزدیک 7 ساله که  از یه مجموعه نه چندان مشهور چندین سرور خریدم و دارم باهاشون کار می کنم.  به قدری سیستم پشتیبانی پیچیده ای دارن که وقتی تیکت ثبت می کنم ، اون سوال  و مشکل من بین 4-5 نفر مختلف میچرخه تا دست آخر یه نفر جوابم رو بده.  درسته که مشکل رو حل می کنن ولی نفرات زیادی درگیر میشن. ( اخیرا دیگه آدرس  ایمیل بچه های فنی شون رو گیر آوردم و مستقیم به خودشون میگم چی شده ? )پشتیبانی فنی تو حوزه سرویس های ابری ، کمی از باقی حوزه ها حساس تره ... باید نگرش جدیدی رخ بده در موردش.4 - دسترسی به بستر ابرینکته ای که شاید خیلی ها بهش فکر نکرده باشن ، میزان دسترسی مشتری به  سرویس های ارائه شده است. قبل از این که یه متخصص عملیات ابری استخدام کنید  و پروژه رو تحویلش بدید باید از سرویس دهنده مطمئن باشید.بعضی از سرویس دهنده ها دوست دارن خودشون کل پلتفرم رو به دست بگیرن !  نمیدونم اصلا چه اصراری هست آقا جان ! در نهایت هم مهندسان عزیز فقط با یه  نسخه محدود و قفل شده طرف میشن که برای هر امکانات اضافه یا عملیات های  مختلف باید تیکت ثبت بشه که فلان کار رو برامون بکنید یا فلان ویژگی رو  فعال کنید و غیره.خب سرویس دهنده عزیز ، شما که داری سرویس میدی بیا و به روش اصولی این کار  رو انجام بده تا پیامد های ریز و درشت هم به وجود نیاد. سرویس های محدود  شده برای خیلی از مجموعه ها کفایت می کنه و شاید اصلا متوجه نشن که چه  چیزهایی در اختیارشون نیست ولی وای به حال روزی که یه مجموعه پیشرفته تر  بفهمه چی به سرش اومده ?پس بیاید دسترسی کامل به پلتفرم رو ارائه بدید تا روابط تجاری خوب و خوشی وجود داشته باشه.سخن پایانی ، شریک باشید نه ارائه دهنده ?تو حوزه ابری اگر به عنوان شریک همدیگه رو نگاه کنیم ، اکثر مشکلات خیلی  راحت حل میشه ، پروژه ها به خوبی مستقر میشن ، مشتری های نهایی هم راضی  هستن. اینجا شاید نقش Cloud Provider ها حساس تر هم باشه. اگه اون ها  خودشون رو توی پروژه های مختلف ما شریک بدونن ، دلسوزانه تر رفتار می کنن و  به هنگام وقوع مشکل ، مشتری هم با شریک خودش طرف میشه. پس صبورانه تر  برخورد می کنه.</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Sat, 15 May 2021 19:17:18 +0430</pubDate>
            </item>
                    <item>
                <title>Clubhouse و مشکلات جدیدش</title>
                <link>https://virgool.io/hatamiarash7/clubhouse-api-security-oa0i8izawdms</link>
                <description>کلاب هاوس در April سال ۲۰۲۰ راه‌اندازی شد درست در زمانی که شیوع کرونا روز به روز افزایش می‌یافت و افراد بیشتری دورکار یا در قرنطینه قرار می‌گرفتند. این شبکه یک ماه بعد در ماه May توانست ۱۰ میلیون دلار سرمایه اولیه و با خرید ۲ میلیون دلاری سهام موجود از شرکت خطرپذیر اندریسن هورویتس محبوبیت قابل توجهی پیدا کند و براساس اطلاعاتی که در بخش ویکی‌پدیای این شبکه اجتماعی دیده می‌شود ، از دسامبر سال ۲۰۲۰ ، این برنامه ۶۰۰ هزار کاربر ثبت شده داشت که فقط با دعوتنامه برای کاربران سیستم عامل iOS در دسترس بود. البته همچنان هم اپلیکیشن این شبکه اجتماعی در اختیار کاربران سیستم عامل iOS قرار دارد و به گفته صاحبان این شبکه اجتماعی بزودی نسخه اندروید آن هم روانه بازار می‌شود. ( خبرآنلاین )تا حالا خیلی از شماها که آیفون / آیپد دارید با این شبکه اجتماعی کار کردید. البته خب نسخه های غیررسمی اندروید این شبکه اجتماعی هم موجوده و شاید نیم نگاهی بهش انداخته باشید. ولی بیاید راجع به مسائل دیگه ای صحبت کنیم. در بحث کاربردی بودن این شبکه اجتماعی جدید هیچ شکی نیست ولی مانند خیلی نمونه های قدیم و جدید دیگه ای ، مشکلات زیادی هم پشت سرش درست میشه.چند وقت بعد از اینکه نسخه های نهایی برنامه منتشر شد ، مسابقه ای هم بین توسعه دهنده های کل دنیا شروع شد ! مسابقه برای ساخت نسخه های غیر رسمی برای پلتفرم های دیگه ! در اولین مرحله هم نسخه iOSبرنامه و درخواست های شبکه اش آنالیز شد و نتیجه اش شد به دست آمدن لیست API های این شبکه اجتماعی و جزئیات کامل اون. اینجا بود که نسخه های جدید Clubhouse شکل گرفت. یکی از این نسخه ها که اوایل محبوبیت زیادی هم پیدا کرد Open Clubhouse بود ؛ یک برنامه تحت وب که تقریبا تمامی قابلیت های نسخه رسمی رو داشت ولی Clubhouse پنج روز بعد حساب کاربری توسعه دهنده رو مسدود کرد ! این پروژه الان متوقف شده ولی ریپازیتوری اون هنوز موجوده : https://github.com/ai-eks/OpenClubhouse از سمت دیگه مشکلاتی برای اتاق های باز ( Public ) این شبکه اتفاق افتاد. در بازه کوتاهی پس از انتشار برنامه ، اتاق ها و گفتگوهای حساس سیاسی شکل گرفت که اکثرا در Taiwan و Xinjiang بود. از اونجایی که فضای مجازی چین به شدت سانسور میشه ( مثلا ما خودمون خیلی آزادیم ? ) خیلی از کاربر ها از شنود صحبت هاشون توسط پلیس و عواقبش ترسیدن. گرچه هنوز گزارش پیگیری به طور رسمی منتشر نشده ولی مقامات چین این برنامه رو از تاریخ 8 فوریه ممنوع کردن و کلی بحث های مختلف در خبرگزاری های چین منتشر شد و امنیت این برنامه زیر سوال رفت.تجربیات شخصیمن هم مانند خیلی های دیگه ، ابتدا کاربر عادی بودم تا اینکه نسخه های غیر رسمی Clubhouse رو دیدم و لیست API اون هم به دست آوردم. به هم ریختگی ها و مشکلات زیادی اینجا وجود داره ؛ بعضی ها خنده دار و بعضی ها مشکل ساز. بیاید از استراق سمع شروع کنیم.بریم سراغ کمی صحبت های فنی ! اینجا سرویسی به اسم Agora وجود داره ، یک پلتفرم ارتباط Real-time که Clubhouse هم از ویژگی Live Audio Streaming اون استفاده میکنه. https://github.com/AgoraIO-Community روش کار به این صورته که وقتی کاربر به یه اتاق می پیونده درواقع درخواست های متعددی به زیرساخت های Agora ارسال میشه تا این ارتباط برقرار بشه. گرچه به هنگام ثبت نام Token های مختلفی جهت اعتبارسنجی ساخته میشه و در هر درخواست از اونها استفاده میشه ولی مشکل جای دیگه است !استراق سمع وقتی اتفاق میوفته که این ارتباط مداوم بین Agora و Clubhouse قطع میشه. وقتی Session مربوطه به اتمام برسه Clubhouse شما رو از اتاق بیرون میندازه ولی همچنان کانال صوتی Agora فعاله ! کمی فکر کنید ! با این روش افراد مختلف میتونن همچنان به مکالمات گوش بدن در صورتی که مشخصات اون ها در اعضای کانال ( اتاق ) وجود نداره و این یعنی استراق سمع ! یا اصطلاح انگلیسی Ghost listening که خب خودم به شخصه تستش کردم و از این قضیه مطمئن شدم.حالا بماند که وقتی با استفاده از این API ها و ارتباط مستقیم با Agora میشه تمام مکالمات رو ضبط کرد ، اگه کمی بهش فکر کنید همین مورد خودش جنبه های امنیتی مختلفی داره.Agoraاین مشارکت با Agora باعث بروز نگرانی های دیگه ای هم شده. این شرکت که عمدتا در چین و آمریکا فعالیت میکنه در اعلامیه IPO خودش اعلام کرده که داده هاش ممکنه تحت قانون امنیت سایبری چین باشه و به اپراتور های شبکه کمک کنه تا به تحقیقات پلیس بپیوندند. البته این احتمال منوط به اینه که Clubhouse داده هاش رو در چین ذخیره کنه. گرچه همچنان این برنامه در چین ممنوع هست ولی پروژه های غیر رسمی زیادی ازش ساخته شده که با یه جستجو ساده می تونید بهش دسترسی پیدا کنید.اگر شماهم برنامه نویس هستید و میخواید تو این مسابقه شرکت کنید سری به این ریپازیتوری که آماده کردم بزنید و شروع به کار کنید. https://github.com/hatamiarash7/Clubhouse-API لینک مستقیم Collection : https://documenter.getpostman.com/view/2651915/TzCQa6Wx توجه تقریبا هیچ Rate limit سنگینی وجود نداره پس خیالتون راحت باشه ?در صورت ارسال زیاد کد تایید برای چند دقیقه شماره تون بلاک میشهپیشنهاد میکنم اگر تا حالا حساب کاربری Clubhouse ندارید از این API استفاده نکنید چون بلافاصله شماره موبایلتون بلاک میشه ?خیلی از بخش های API در حال حاضر Optional حساب میشه و حتی چندتا از Endpoint ها رو به این لیست اضافه نکردم چون آزمایشی بودن و خود Clubhouse ازشون استفاده نمیکنه. فقط گزینه اش رو گذاشته برای آینده !!!!! ?سعی کنید برای تست از یه شماره دیگه استفاده کنید. حساب کاربری جدید بسازید چون ممکنه بلاک بشید. وضعیت بلاک بودن با درخواست Check در Authentication مشخص میشه.توسعه دهنده های خوبی باشید و سواستفاده نکنید ?</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Mon, 05 Apr 2021 13:26:43 +0430</pubDate>
            </item>
                    <item>
                <title>مانیتورینگ 200 هزار درخواست DNS در ثانیه</title>
                <link>https://virgool.io/hatamiarash7/dns-monitoring-y68bhiy3yjgb</link>
                <description>یکی از بهترین راه ها برای شناسایی و جلوگیری از مشکلات احتمالی در حملات  مربوط به DNS ٬ مانیتور کردن این داده هاست. تو این پست مشکلات ٬ راهکار  های موجود و راه حل نهایی رو شرح میدم.چرا باید درخواست های DNS را مانیتور کرد ؟رویه های عادی امنیتی مانند استقرار فایروال ٬ سنسور های IDS ٫ ابزار  های NSM و غیره همیشه وجود داشته اند. امنیت اطلاعات حالا بیشتر از قبل  شبکه محور شده و در کنار اون ٫ هکر ها نیز با این روند سازگار شده و حملات  خرابکارانه ی گسترده ای تو این حوزه اتفاق می افته.امروزه بسیار مشاهده میشه که بدافزار ها یا هکر ها از DGAs یا حملات DNS  به صورت ارسال سریع داده و راه های مختلف برای مسدود/شناسایی آدرس های آی  پی مختلف استفاده میکنن. کاملا واضح و روشنه که نظارت بر فعالیت های DNS در  داخل شبکه و تلاش برای یافتن ناهنجاری های مرتبط با اون ٫ در این زمینه  کمک های زیادی به افزایش امنیت می کنه.بررسی گزینه های موجودشاید همین الان چنین سوالی تو ذهنتون شکل بگیره : &quot; چرا تمام داده ها رو  به Elasticsearch یا Splunk منتقل نکنیم و روی داده هامون Query اجرا کنیم  ؟ &quot;خب همین اول کار لازمه که گزینه های تجاری مثل Splunk رو به کلی فراموش  کنیم. تو این مبحث ما در مورد حدودا ۱ ترابایت داده در روز صحبت می کنیم که  حجم قابل توجهی از رکورد هاست. Splunk یک گواهینامه گران قیمت ۱۸۰۰ دلار  به ازای هر گیگابایت داره. البته با افزایش حجم این مبلغ کم میشه. فرض کنیم  که یک تخفیف ۹۰ درصدی برای ارسال ۳ ترابایت داده در روز هم داشته باشیم.$1800/GB * 1024GB  * ( 100 - 90 ) / 100 = $184,320با این حجم از داده تقریبا سالی ۱۸۵ هزار دلار برای خودمون هزینه درست کردیم !!! خب مسلما استفاده از چنین مواردی منطقی نیست.گزینه بعدی میشه ES. بهترین راه برای ذخیره و بازیابی داده ها با فرمت  JSON که قالب مشخصی هم ندارن. اینجا سناریوی های مختلفی برای بحث ذخیره  سازی وجود داره. مثلا :استفاده از PacketBeat برای ارسال دیتا به ESاستفاده از PacketBeat برای ارسال دیتا به Logstash و ESاستفاده از PassiveDNS برای ذخیره سازی داده های خام DNS به صورت فایل و ارسال داده ها با استفاده از Filebeat یا Logstashاین راهکار ها و موارد مشابه دیگه ٬ یه مشکل اساسی دارن. این حجم عظیم  داده برای ES به احتمال زیاد باعث ایجاد مشکلات اساسی توی اجرا و نمایش  داده ها شد. این مورد روی سخت افزار این چنینی تست شده :OS: Red Hat Enterprise Linux 7.7 MaipoKernel: Linux 3.10Disk: 44TB HDDCPU: Intel Xeon Gold 5122 @ 16x 3.7GHzRAM: 192GBچنین نتیجه ای فقط دو دلیل میتونه داشته باشه ٬ یا ES برای ذخیره داده  های زیاد ( تقریبا ۱۵۰ هزار در دقیقه ) ساخته نشده ٬ یا اینکه تنظیمات و  کانفیگ های خاصی باید برای این مورد انجام بشه. در نهایت ES هم گزینه رد  شده ای حساب شد.حالا راهکار مناسب چیه ؟استفاده از ClickHouseشاید خیلی از شماها اسم ClickHouse به گوشتون خورده باشه. از این DBMS ستون-محور برای ذخیره و آنالیز حجم  زیادی از داده ها در لحظه استفاده میشه. با توجه به ساختاری که داره سرعت  خیلی بالایی در نوشتن و در عوض سرعت کمی برای خواندن اطلاعات داره که خب با  توجه به موضوع کاری ما خیلی مناسبه. ما در لحظه حجم عظیمی از داده های DNS  رو ذخیره میکنیم ولی با همون سرعت نیاز با بازیابی و آنالیزشون نداریم. تو  پروژه ی ما در بدترین شرایط نسبت نوشتن به خواندن ۱ میلیون به ۱ میشه.  یعنی به ازای هر ۱ میلیون داده که ذخیره میکنیم یک دستور Select اجرا می  کنیم تا داده های قبلی رو آنالیز کنیم یا توی داشبورد خودمون نشون بدیم.شاید براتون جالب باشه که بدونید همین الان Cloudflare هم از چنین روشی  برای آنالیز داده های DNS خودش استفاده میکنه. برای اطلاعات بیشتر این پست از وبلاگشون رو بخونید. توضیح دادن که با استفاده از ClickHouse حجم عظیم ۱ میلیون داده بر ثانیه رو آنالیز میکنن.مشکلات جمع آوری / ارسال داده هادر حال حاضر ابزار های زیادی برای بررسی داده های شبکه و Interface ها وجود داره. مشهور ترین نمونه ی اون PassiveDNS که وقتی کاربرد داره که بخواید حجم های کمتر از سناریوی ما رو پردازش  کنید. در ضمن برای چنین پروژه ای نمیشه منابع سخت افزاری زیادی رو اشغال  کرد. برای مثال فقط مجازیم که از یک هسته پردازنده استفاده کنیم و در صورت  تکمیل ظرفیت ٬ احتمالا بخشی از ترافیک رو از دست میدیم.گزینه جالب دیگه ای گه وجود داره gopassivedns که در واقع همان پروژه قبلی است ولی از زبان GO برای توسعه اون استفاده شده. ولی خب این پروژه هم مشکلات خودش رو داره از جمله :هنوز ۱۰۰ درصد کامل نیستبه صورت مستقیم به دیتابیس متصل نمیشه و داده ها رو فقط ذخیره میکنه. این یعنی نیاز به ظرفیت زیادی از هارد دیسکاز بسته های Dot1Q پشتیبانی نمیکنهپس این مورد هم کنسل !!در این بین کتابخانه dnszeppelin هم موجوده که یه مشکل اساسی رو حل کرده ! اونم اتصال مستقیمش به  ClickHouse که برای سناریو ما خیلی عالیه. ولی همچنان مشکل عدم پشتیبانی از  Dot1Q رو داره.راه حل نهاییپروژه خیلی خوبی برای رفع تمام این ایرادات توسط علی مسجل نوشته شده و درواقع ترکیب موارد بالا است که ویژگی های زیر رو داره :اتصال مستقیم به ClickHouseاجرا به صورت یک فایل باینری سادهپشتیبانی از Dot1Qبسیار سبک و سریعاین پروژه که DNSMonster نام داره دقیقا همون کاری رو انجام میده که مد نظر ماست. روند پروژه به این صورت میشهاجرای dnsmonster در شبکه داخلی و بررسی بسته هااجرای یک کانتینر از ClickHouse برای ذخیره سازی و بازیابی داده هایک cronjob برای حذف داده های قدیمیاستفاده از Grafana برای نمایش داده هابا توجه به اینکه داده های خام در اختیار دارید میتونید خودتون هم  داشبورد مدنظرتون رو با استفاده از فریمورک های مختلف از اول پیاده سازی  کنید ولی خب Grafana هم از بهترین نمونه های موجوده چرا که وقتی صحبت از  مانیتورینگ به میون میاد ٬ احتمالا داده های دیگه رو هم مانیتور میکنید و  همین الان Grafana روی سیستمتون نصب هست و نیازی به اضافه کردن داشبورد  جدیدی ندارید.داشبورد نهاییروش نصباین پروژه به صورت متن باز تحت گواهینامه ی MIT منتشر شده که از این لینک میتونید اون رو Clone کنید.اسکریپت Bash ساده ای هم برای نصب و اجرا وجود داره که میتونید ازش استفاده کنید :git clone https://gitlab.com/mosajjal/dnsmonster.git &amp;&amp; cd dnsmonster
chmod +x autobuild.sh
./autobuild.shاین اسکریپت تمام نیازمندی ها رو به صورت کانتینر های داکر اجرا میکنه و  دیتابیس رو هم تنظیم میکنه. علاوه بر این داشبورد Grafana هم برای ما  میسازه و نیاز نیست هیچ کار دیگه ای انجام بدید.برای ارسال درخواست های آزمایشی DNS جهت مشاهده داده ها از این اسکریپت استفاده کنید :https://github.com/hatamiarash7/MyWebSite_Projects/tree/master/dns-generatorهیچ چیز کامل نیستبا اینکه این پروژه یکی از بهترین نمونه هایی که تا حالا دیدم ولی بازم کامل نیست و مشکل بزرگی داره.مشکل اینجاست که dnsmonster مانند wireshark عمل میکنه و باید یه Interface خاص Sniff بشه. پس مسلما نیاز داریم تا  کانتینر ما به شبکه Host دسترسی داشته باشه که خب با استفاده از NET_ADMIN این گزینه حل میشه ولی علاوه بر اون باید برای عملیات Sniffing یک  Interface شبکه هم به پروژه معرفی بشه. اینجاست که تو سیستم عامل ویندوز به  مشکل بر میخوریم !!!تو سیستم عامل های لینوکس یا مک اینترفیس های رایج همیشگی مثل eth0 وجود  داره و ازش برای این منظور استفاده می کنیم. ولی توی ویندوز بحث فرق  میکنه. اینترفیس های ما هیچ اسم مشخصی ندارن که با استفاده از اون شناسایی  بشن. مدل جایگزین GUID اون هاست ولی خب متاسفانه استفاده از GUID برای این  پروژه جواب نمیده. برای این منظور Issue ثبت کردم و در حال حل مشکل هستیم.</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Fri, 17 Jul 2020 17:19:43 +0430</pubDate>
            </item>
                    <item>
                <title>بومی سازی سیستم مانیتورینگ - بخش اول</title>
                <link>https://virgool.io/hatamiarash7/%D8%A8%D9%88%D9%85%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%85%D8%A7%D9%86%DB%8C%D8%AA%D9%88%D8%B1%DB%8C%D9%86%DA%AF-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-ysmrtbvl4xwq</link>
                <description>تقریبا اوایل سال 98 بود که با تکمیل تجهیزات و نصب اونا توی رک های اتاق سرور نیاز به یه سیستم مانیتورینگ مناسب برای دما و رطوب داشتیم. با شرکت های مختلف تماس گرفتیم و نمونه های زیادی هم معرفی شد بهمون ؛ چه نسخه های تولید داخل چه نمونه های وارداتی.متاسفانه اصلا گزینه های مناسبی نبودن. نمونه های داخلی که کیفیت و امکانات لازم رو نداشتن و نمونه های خارجی هم قیمت های به شدت گرونی داشتن و هرطور حساب کتاب کردم ارزش خرید نداشتن.الله و اکبر از ظاهر ... امان از باطن !!!این شد که تصمیم گرفتم همین سیستم رو خودم بسازم ! اولش زیاد امید نداشتم و بعد از طراحی مدل های مختلف تو ذهنم ، میذاشتمشون کنار تا اینکه یه مدل خیلی خوب رو متصور شدم. اکثر تجهیزاتی که برای رک ها طراحی میشه در حداقل ترین حالت ممکن از نظر ارتفاع 1 یونیت رو اشغال میکنه و برای عرض هم باید استاندارد 19 اینچی رعایت بشه. این سوال برام مطرح شد که اصلا لازمه برای چنین چیز ساده ای این همه فضا اشغال کنیم ؟؟؟؟ دیگه بگذریم از نیاز به ساخت بدنه ای برای قرار گیری تو این استاندارد ها که نهایتا اگر هم بتونم طراحیش کنم و بدم برام بسازنش دست کمی از نمونه های تولید داخل نداره توی بی کیفیت بودن !!در ضمن بزرگترین مشکلی که این نمونه های آماده دارن اینه که اکثرشون فقط مدیریت تنها یک رک رو در اختیارتون میذارن. حالا ما باید چیکار میکردیم که 14 تا رک داریم ؟ 14 تا آی پی مختلف ؟ 14 تا پنل مدیریت مختلف ؟ کی میخواد به این همه رسیدگی کنه ؟راه حل ساده بود ! این همه تجربه و پروژه در مورد IoT باید برای خودم هم یه جا به درد بخوره و تصمیم گرفتم با ترکیب RaspberryPI و ماژول های ESP همین سیستم رو بسازم.::: رزبری پای در نقش یک Gateway یا بهتر بگم یک Collector::: ماژول های NodeMCU ESP8266 برای کلاینت های پایش اطلاعات::: سنسور DHT22 جهت دریافت دما و رطوبت محیطهر ماژول ESP یک سنسور بهش وصل میشه و با توجه به سایز کوچیکش هرجای مناسبی از رک که بخوایم نصب میشه ( محل نصبش تقریبا مهمه مثلا نباید جلوی خروجی فن های یک سرور یا سوییچ باشه که خیلی دما رو زیاد نشون بده یا مثلا روی سقف یا کف رک نصب بشه که دمای غیر واقعی نشون بده. من خودم انتهای طبقه ثابتی که وسط هر رک قرار داشت نصبشون کردم ). هر کدوم از این ماژول ها به صورت WebServer کانفیگ میشن و با تعریف یک route مثل data/ اطلاعات دما و رطوبت رو در قالب JSON بر می گردونن.curl http://10.1.1.45/data{&amp;quottemperature&amp;quot:&amp;quot24.00&amp;quot,&amp;quothumidity&amp;quot:&amp;quot21.70&amp;quot}تا اینجا ما 14 تا کلاینت داریم که هرکدوم به صورت مستقل پس از اتصال به شبکه بی سیم و دریافت IP میتونن خیلی سریع دما و رطوبت لحظه ای رو نشون بدن.نسخه اولیه کلاینت ها ... چسب کاری شده :))مرحله بعد روش استفاده از این هاست. اینجا رزبری پای وارد عمل میشه و با قرار گرفتن تو شبکه ، توسط یه اسکریپت پایتون تمام این دیتا ها رو جمع آوری میکنه. شاید به نظر ساده بیاد ولی پیچیدگی های خیلی خاصی توی این مرحله وجود داشت. اولا که باید این جمع آوری به صورت منظم انجام بشه پس نیاز به یه Cron Job داریم تا این کارو برای ما انجام بده. باید بتونیم این Job رو تغییر بدیم. مثلا الان داره هر 5 دقیقه اطلاعات دریافت میشه فردا میخوایم هر 10 دقیقه این کارو بکنه. منطقی نیست که هر سری با SSH متصل بشیم به رزبری پای و تغییرات رو اعمال کنیم بلکه میخوایم تمام اینا به صورت جامع در پنل کاربری قرار داشته باشه. پس نیاز داریم تا یه Backend مدیریتی خیلی ساده هم روی رزبری داشته باشیم که در صورت دریافت تغییرات لازم ، cron رو ویراش کنه ( دیگه از دردسر های دسترسی و ذخیره لاگ ها و ... نمیگم براتون ). اینجا بود که سراغ Lumen رفتم و یه سرویس خیلی جمع و جور برای این کار نوشتم.تا اینجا نصف کار انجام شده بود. کلاینت ها فعال بودن و رزبری پای به طور منظم دیتا جمع آوری میکرد و توی دیتابیس خودش ذخیره میکرد ( میتونستم یه دیتابیس خارجی هم تعریف کنم روی یکی از سرور ها ولی خب منطقی نبود برای چنین چیز ساده ای منابع جدا اختصاص داده بشه )عجب عکس خوشگلی شد :)) حالا که کلی دیتا جمع آوری شده نیاز داریم که از اینا استفاده کنیم. قسمت مهم کار ! یک داشبورد مدیریتی ! اینجا بود که به سراغ Laravel رفتم و سعی کردم با کلی سلیقه به خرج دادن به پنل کامل و خوشگل برای شروع کار طراحی کنم. از اول هم طوری طراحی کردم این سیستم رو که بشه همه جا ازش استفاده کرد نه فقط توی یه اتاق سرور ( مثلا همین الان تو خونه خودمون هم چنین سیستمی داره کار میکنه ). این شد از پنل ( توضیحات هر بخش زیر عکس نوشته شده ) :تعریف مکان اصلی ( مثلا خانه ، کارگاه و ... )تعریف یک اتاق جدید ( در سناریوی ما هر رک معادل یک اتاق در نظر گرفته میشه )لیستی از نمودار های مربوط به هر اتاق ( در اینجا هر رک ) که دما و رطوبت رو با توجه به بازه انتخابی نمایش میدهتنظیمات هر مکانگزینه اول همان مقدار متغییر اعلام شده برای Cron job بوده که برای رزبری پای ارسال میشود و Lumen با دریافت این مقدار Cron را تنظیم خواهد کرد.گزینه دوم مربوط به صفحه نمودار ها بوده و مشخص میکند که چند دقیقه اخیر در نمودار ها نمایش داده شود.خیلی خب :) دیگه همه چیز آماده است و به بهترین نحو داره کار میکنه ... خیلی نکات فنی و مشکلات ریز و درشت این وسط اتفاق افتاد که دیگه ازشون فاکتور گرفتم. حالا اگه بخوایم از نظر قیمت مقایسه کنیم با راه حل اول یعنی خرید نمونه های آماده ( قیمت ها مال الانه !!! ) قبلا ارزونتر خریدم :)رزبری پای بسته به مدل از 0.7 تا 1.2 میلیون تومان ( نسخه 3 هم میشه استفاده کرد که ارزونتر باشه )ماژول های ESP هر کدام 50 هزار تومانسنسور DHT22 هر کدام 50 هزار تومان ( عجییییب گرون شده ! )با یه محاسبه ساده همین الان اگر بخوایم چنین سیستمی رو پیاده کنیم کلا 2.2 میلیون تومان هزینه داره !!! 14 تا ماژول و سنسور و یه رزبری پای 4 با 2 گیگ رمصرفه جویی در هزینه ، طراحی کامل از صفر تا صد طبق نیاز ها ، اشغال نکردن فضای بیهودهدر بخش دوم پست ، از ادامه ی ماجرا پس از گذشت یک سال کار این سیستم می نویسم براتون</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Fri, 24 Apr 2020 19:48:37 +0430</pubDate>
            </item>
                    <item>
                <title>زیر تیغ اینترنت</title>
                <link>https://virgool.io/hatamiarash7/%D8%B2%DB%8C%D8%B1-%D8%AA%DB%8C%D8%BA-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-avqkbvfs9wed</link>
                <description>روزهای جالبی پیش روی ما قرار داره. جمله ای تکراری مدام توی ذهن ما میچرخه ... &quot; از بیرون تحریم ، از داخل فیلتر &quot;. این موضوع برای خیلی از ماها دیگه عادی شده و چند ساله داریم باهاش دست و پنجه نرم می کنیم. ولی برای برنامه نویس ها داستان فرق داره و بلای دیگه ای هم دچارشون شده و اونم سرعت پایین اینترنتوقتی که احتمالش هست با مشت بکوبید به مانیتوریکی از ابزارهایی که خیلی از ما برنامه نویس ها ازش استفاده می کنیم Docker و Kubernetes که خب داستان ها داریم باهاشونبرای استفاده از این سرویس ها نیاز به دانلود Image های مختلفی هست که باید دانلود بشه و اینجا دقیقا مشکل شروع میشه. تقریبا هیچ Registry نیست که ایران رو تحریم نکرده باشه !!!! برای دور زدن تحریم هم که یا باید از VPN های مختلف استفاده کرد یا از سرویس هایی مانند شکن و بگذر استفاده کنیم که خب این روش ها هم محدودیت هایی برای پهنای باند دارند ( حتی سرویس تجاری شکن هم اونطور که خودشون میگن تفاوت چندانی نداشت )نتیجه اش اینه که یه Image ساده و سبک مثل Nginx خیلی طول میکشه دانلود بشهتو روز های اخیر با مشکلی که کشور باهاش دست و پنجه نرم میکنه ( کرونا جان ) و قرنطینه خانگی مردم اوضاع اینترنت بدتر هم شده و در حالت عادی هم سرعت اینترنت خیلی اومده پایین دیگه چه برسه بخوایم در این شرایط یه Image داکر هم دانلود کنیمتمام اینا کنار هم ختم شد به یه راه حل ساده ...اکثر ماها یه سرور مجازی / فیزیکی داریم که خارج ایران هاست شده ( اگر ندارید بخرید که به کار میاد ). خب مسلما شرایط اینترنت و سرعت دانلود و غیره و غیره روی اون سرور ها خیلی تفاوت داره با شرایطی که ما داریم. اگر بتونیم Image های خودمون رو روی اون سرور Pull کنیم و سپس دانلودش کنیم چی ؟ خب مسلما سرعت کار خیلی بالا میرهنتیجه این صحبت ها شد یه اسکریپت پایتون که این کار رو برای ما انجام میده و می تونید از این ریپازیتوری اون رو ببینیدبا یه دستور ساده Image رو دانلود می کنیمpython pull.py hello-worldاین اسکریپت Image رو در قالب یه فایل tar به شما تحویل میده که میتونید اون رو دانلود کرده و با دستور docker load روی سیستم خودتون نصبش کنیداگر شما هم نظری برای بهتر شدن اسکریپت دارید یا روش های دیگه ای هم به ذهنتون میاد با بقیه به اشتراک بذارید :)</description>
                <category>آرش حاتمی</category>
                <author>آرش حاتمی</author>
                <pubDate>Mon, 09 Mar 2020 22:22:18 +0330</pubDate>
            </item>
            </channel>
</rss>