<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی یوسفیان</title>
        <link>https://virgool.io/feed/@aliyousefian</link>
        <description>همیشه برنامه‌نویس ولی یه برنامه‌نویس متن باز عاشق پایتون جنگو و تحلیل داده</description>
        <language>fa</language>
        <pubDate>2026-04-14 22:33:46</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/360875/avatar/tAv6Cq.png?height=120&amp;width=120</url>
            <title>علی یوسفیان</title>
            <link>https://virgool.io/@aliyousefian</link>
        </image>

                    <item>
                <title>هشدار فوری گوگل: آسیب‌پذیری بحرانی کروم راه نفوذ هکرها را باز می‌کند! (فوری آپدیت کنید!)</title>
                <link>https://virgool.io/@aliyousefian/%D9%87%D8%B4%D8%AF%D8%A7%D8%B1-%D9%81%D9%88%D8%B1%DB%8C-%DA%AF%D9%88%DA%AF%D9%84-%D8%A2%D8%B3%DB%8C%D8%A8-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-%D8%A8%D8%AD%D8%B1%D8%A7%D9%86%DB%8C-%DA%A9%D8%B1%D9%88%D9%85-%D8%B1%D8%A7%D9%87-%D9%86%D9%81%D9%88%D8%B0-%D9%87%DA%A9%D8%B1%D9%87%D8%A7-%D8%B1%D8%A7-%D8%A8%D8%A7%D8%B2-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-%D9%81%D9%88%D8%B1%DB%8C-%D8%A2%D9%BE%D8%AF%DB%8C%D8%AA-%DA%A9%D9%86%DB%8C%D8%AF-ramotar8uobp</link>
                <description>در یک خبر فوری امنیتی، گوگل به‌تازگی یک بروزرسانی اضطراری را برای مرورگر کروم منتشر کرده تا به یک آسیب‌پذیری حیاتی از نوع &quot;Use-After-Free&quot; (CVE-2025-9478) در کتابخانه گرافیکی ANGLE رسیدگی کند. این نقص امنیتی می‌تواند به مهاجمان اجازه اجرای کد دلخواه بر روی سیستم‌های آلوده را بدهد و تهدیدی جدی برای امنیت کاربران کروم محسوب می‌شود.آسیب‌پذیری بحرانی کروم: جزئیات و تاثیراتاین آسیب‌پذیری که توسط تیم تحقیقاتی مبتنی بر هوش مصنوعی Google’s Big Sleep در تاریخ ۱۱ آگوست ۲۰۲۵ کشف شد، بالاترین امتیاز شدت CVSS یعنی ۹.۸ (بحرانی) را دریافت کرده است. این نقص به طور خاص در کتابخانه ANGLE (Almost Native Graphics Layer Engine) کروم وجود دارد که مسئول ترجمه فراخوانی‌های API OpenGL ES به APIهای گرافیکی سخت‌افزاری مانند Direct3D و Vulkan است.آسیب‌پذیری‌های &quot;Use-After-Free&quot; زمانی رخ می‌دهند که یک برنامه پس از آزاد کردن حافظه، همچنان از اشاره‌گر آن حافظه استفاده کند. این وضعیت، فرصت‌هایی را برای دستکاری حافظه و حملات تخریب حافظه ایجاد می‌کند. در مورد این آسیب‌پذیری خاص، نقص در روال‌های مدیریت حافظه ANGLE می‌تواند از طریق محتوای وب مخرب که توالی‌های نامناسب آزاد کردن حافظه را تحریک می‌کند، مورد سوءاستفاده قرار گیرد.نسخه‌های آسیب‌پذیر: این آسیب‌پذیری بر نسخه‌های کروم قبل از 139.0.7258.154 و 139.0.7258.155 در پلتفرم‌های ویندوز، مک و لینوکس تاثیر می‌گذارد.پیامدهای بهره‌برداری موفق: در صورت بهره‌برداری موفق، مهاجمان قادر خواهند بود تا کد دلخواه را با امتیازات فرآیند رندر کروم اجرا کنند. این امر به طور بالقوه می‌تواند منجر به خروج از سندباکس (sandbox escape) و در نهایت، سازش کامل سیستم شود. نگرانی ویژه از آنجایی ناشی می‌شود که ANGLE به طور گسترده‌ای در برنامه‌های وبی که از رندرینگ WebGL، عملیات HTML5 Canvas و پردازش گرافیکی شتاب‌دهنده GPU استفاده می‌کنند، کاربرد دارد.روش‌های حمله: مهاجمان می‌توانند از روش‌های مختلفی برای بهره‌برداری از این نقص استفاده کنند، از جمله:حملات دانلود از راه دور (drive-by download)تبلیغات مخربوب‌سایت‌های آلوده یا به خطر افتادهمحتوای وب مخرب که نیاز به فعال بودن شتاب‌دهنده GPU دارداقدامات کاهشی و توصیه‌های امنیتی فوریبا توجه به ماهیت حیاتی این آسیب‌پذیری و پتانسیل آن برای بهره‌برداری روز صفر (zero-day exploitation)، اقدامات فوری برای محافظت از سیستم‌ها ضروری است.۱. به‌روزرسانی فوری کروم: مهمترین گام، استقرار فوری نسخه 139.0.7258.154 یا بالاتر کروم است. این بروزرسانی که از ۲۶ آگوست ۲۰۲۵ به طور خودکار در حال انتشار جهانی است، شامل پچ‌های جامع برای توابع مدیریت حافظه ANGLE و مکانیسم‌های حفاظت از پشته (heap) برای جلوگیری از شرایط مشابه Use-After-Free است.۲. اقدامات امنیتی برای سازمان‌ها: تیم‌های امنیتی در سازمان‌ها باید اقدامات زیر را در اولویت قرار دهند:استقرار راه‌حل‌های تشخیص و پاسخ Endpoint (EDR).تقسیم‌بندی شبکه (network segmentation).فهرست سفید کردن برنامه‌ها (application allowlisting) برای شناسایی تلاش‌های احتمالی بهره‌برداری.استفاده از هدرهای Content Security Policy (CSP) و فناوری‌های جداسازی مرورگر برای محدود کردن سطح حمله برای بهره‌برداری‌های مبتنی بر وب.۳. نظارت مستمر: متخصصان امنیت باید برای شناسایی تلاش‌های فعال بهره‌برداری علیه نصب‌های پچ‌نشده کروم، الگوهای غیرعادی ترافیک شبکه، ایجاد فرآیندهای غیرمنتظره و رفتارهای تخصیص حافظه غیرمعمول را زیر نظر داشته باشند.با توجه به شدت این آسیب‌پذیری، توصیه می‌شود که همه کاربران کروم بلافاصله مرورگر خود را به‌روزرسانی کنند تا از خود در برابر این تهدید جدی محافظت نمایند.</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Fri, 29 Aug 2025 16:14:08 +0330</pubDate>
            </item>
                    <item>
                <title>آسیب‌پذیری بحرانی پیکربندی Nginx در پروژه‌های Django</title>
                <link>https://virgool.io/@aliyousefian/%D8%A2%D8%B3%DB%8C%D8%A8-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-%D8%A8%D8%AD%D8%B1%D8%A7%D9%86%DB%8C-%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C-nginx-%D8%AF%D8%B1-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-django-duruwaxzas3v</link>
                <description>اخیراً متوجه یک آسیب‌پذیری جدی و به سادگی قابل سوءاستفاده در پروژه‌های Django با پیکربندی نادرست Nginx شدم. (نمی‌خواهم بگویم چطور متوجه شدم 😅)مشکل از یک پیکربندی رایج و به ظاهر بی‌ضرر Nginx برای سرو کردن فایل‌های استاتیک یا مدیا در برنامه‌های Django ناشی می‌شود. در این پیکربندی، استفاده از دستور alias می‌تواند باعث افشای محتوای دایرکتوری والد شود. به این معنا که اگر مسیرهایی مانند /media../ یا /static../ استفاده شوند و دایرکتوری‌های مدیا یا استاتیک در همان دایرکتوری کد منبع شما قرار داشته باشند، ممکن است کل کد منبع برنامه شما در معرض دسترس قرار گیرد.راه‌حل‌های پیشنهادی:اضافه کردن اسلش در انتها: مطمئن شوید که در مسیرهای /media/ یا /static/، یک اسلش در انتها اضافه شده باشد.استفاده از گزینه “root” به جای “alias”: در صورت امکان، به گزینه‌ی امن‌تر root در پیکربندی Nginx تغییر دهید.برای بررسی سریع اینکه سایت شما آسیب‌پذیر هست یا نه، می‌توانید آدرس زیر را امتحان کنید(در صورت نیاز، .gitignore را با نام فایلی که می‌دانید در دایرکتوری والد وجود دارد جایگزین کنید.)بعد از بیش از 15 سال استفاده از این روش‌های پیاده‌سازی در پروژه‌های Django، واقعاً تعجب‌آور است که هنوز این مشکل به این اندازه مطرح نشده است. از همه همکاران و علاقه‌مندان می‌خواهم که پیکربندی‌های Nginx خود را دوباره بررسی کنند و در صورت امکان این مطلب را به اشتراک بگذارند تا از بروز چنین مشکلاتی جلوگیری شود.</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Fri, 25 Jul 2025 22:39:26 +0330</pubDate>
            </item>
                    <item>
                <title>بهترین روش‌های نام‌گذاری برنچ و پیام‌های Commit در گیت</title>
                <link>https://virgool.io/@aliyousefian/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B1%D9%88%D8%B4-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D9%85-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%A8%D8%B1%D9%86%DA%86-%D9%88-%D9%BE%DB%8C%D8%A7%D9%85-%D9%87%D8%A7%DB%8C-commit-%D8%AF%D8%B1-%DA%AF%DB%8C%D8%AA-wngk0fiif2gk</link>
                <description>سلام دوستان، در این مطلب قصد دارم به چند روش بهتر برای استفاده از گیت به صورت موثرتر بپردازم. گیت؟ بله، همان گیتی که قبلاً با آن آشنا هستید.آیا شما یکی از آن دسته افراد هستید که برنچ  ایجاد می‌کنند و سپس فراموش می‌کنند چرا وجود دارند؟ آیا همیشه باید به دنبال تغییرات فایل بگردید تا یک Commit را درک کنید؟ در ادامه چند نکته به شما خواهم گفت.چرا باید استانداردها را دنبال کنم؟1. وضوح و درک2. همکاری و تیم‌کاری3. راحتی در ناوبری و نگهداری4. مستندسازی و انتقال دانش5. کیفیت پروژه6. لیست تغییرات خودکار7. بهینه‌سازی CI/CDپیش از مطالعههر زیربخش زیر عنوان‌های &quot;اصول نام‌گذاری برنچ&quot; و &quot;اصول پیام Commit&quot; به ترتیب به عنوان قواعد پایه، میانی و پیشرفته مرتب شده‌اند.شما می‌توانید به هر سطح قوانین بر اساس مورد استفاده و ارتباط مناسب دنبال کنید؛ با این حال پیشنهاد می‌شود که تا سطح قوانین میانی پیش بروید.اصول نام‌گذاری شاخه1. نام‌های توصیفی: یک شاخه با نام مناسب، مفهومی فوری از هدف آن را ارائه می‌دهد. به جای نام‌های عمومی، انتخاب کنید.feature/loginbugfix/navbar-overflow2. استفاده از خط تیره: از خط تیره برای جدا کردن کلمات (یا kebab case) در نام شاخه استفاده کنید، این باعث خوانایی می‌شود.bugfix/fix-login-issue3. کاراکترهای الفبایی کوچک عددی:فقط از کاراکترهای الفبایی کوچک (a-z، 0-9) و خط تیره استفاده کنید. از علائم نگارشی، فاصله، آندرلاین، یا هر کاراکتر ویژه دیگری هنگام ممکن اجتناب کنید.4. اجتناب از خطوط خطازی غیرضروری:از خطوط  غیرضروری مثل خطوط پشت سر هم یا پایانی اجتناب کنید.feat/new--login5. کوتاه و موثر: نام‌های شاخه را ساده نگه دارید. هر چند توصیفی باشند، باید کافی مختصر باشند تا هدف را به یک نگاه درک کنید.پیشوند یا نوعپیشوند دادن به شاخه‌ها کمک می‌کند تا بر اساس هدف آن‌ها سازماندهی شوند. این نه تنها وضوح را افزایش می‌دهد بلکه به اتوماسیون جریان‌های کاری کمک می‌کند.برخی از پیشوندهای رایج نوع شاخه و کاربردهای آنها عبارتند از:- feature/:برای توسعه ویژگی‌های جدید.- bugfix/: برای رفع اشکالات در کد. اغلب به همراه یک مسئله ایجاد می‌شود.- hotfix/:برای رفع اشکالات حیاتی در محصول.- release/: برای آماده‌سازی یک نسخه جدید، معمولاً برای انجام وظایفی مانند لمس‌های آخر و بازبینی‌ها.- docs/:برای نوشتن، اصلاح یا اصلاح مستندات.شامل شماره تیکتاگر پروژه شما از یک سیستم پیگیری issue مانند Jira استفاده می‌کند یا اگر بر اساس issue GitHub یا یک ابزار مشابه دیگر بازبینی می‌شود، اضافه کردن توکن مسئله به نام شاخه امکان پیگیری آن را آسان می‌کند. مثال: feature/PROJ-123-footer-linksمتن کامیت ها&lt;type&gt;([optional scope]): &lt;description&gt;  # subject

  [optional body]

  [optional footer(s)]پیام موضوع به صورت دستوری:کامیت‌ها رو با لحن دستوری بسازید. برای نشون دادن کار کامیت با یه فعل شروع کنید.مثال: به جای &quot;fix: Fixed bug #67&quot; از &quot;fix: Fix bug #67&quot; استفاده کنید.کوتاه و خلاصه:سعی کنید موضوع رو زیر 50 کاراکتر جا بدید تا تو ابزارهای مختلف گیت، مثل git log --oneline، خوانا باشه. نقطه انتهایی و کلمات/симبل های اضافه رو حذف کنید.با حرف بزرگ شروع کنید:خیلی ساده، موضوع رو با حرف بزرگ شروع کنیدنوع و بدنه پیام:یک پیشوند &quot;نوع&quot; در موضوع میتونه نوع تغییرات داخل کامیت رو نشون بده. بعضی از انواع رایج عبارتند از:feat:: برای خلاصه سازی یه قابلیت جدید در کد.fix:: برای نشون دادن رفع یه باگ.مثال‌های دیگه عبارتند از build:, chore:, ci:, style:, refactor:.میتونید با اضافه کردن یه &quot;اسکوپ&quot; داخل پرانتز به نوع کامیت، اطلاعات زمینه‌ای بیشتری بدید. مثلا: feat(parser): Add the ability to parse arrays.میتونید با گذاشتن یه خط خالی بعد از موضوع، یه &quot;بدنه&quot; به پیام اضافه کنید تا توضیحات بیشتری بدید.بدنه رو به چند خط تقسیم کنید که هر کدوم از 72 کاراکتر رو رد نکنه.پاورقی و بدنه توسعه یافته پیامیک پاورقی برای انتقال اطلاعات اضافی مربوط به کامیت، مانند بازبینی‌کننده، تأیید کننده و غیره، استفاده می‌شود. مثال:Signed-off-by: Alice &lt;alice@example.com&gt;تغییر اساسی (Breaking Change): تغییر اساسی به تغییرات نسبتاً مهمی در کد اشاره می‌کند که می‌تواند با اضافه کردن علامت &quot;!&quot; بعد از نوع/محدوده یا اضافه کردن آن با بدن یا به عنوان پاورقی نشان داده شود.توضیح بیشترپاورقی جایگزین مناسبی برای اطلاعاتی است که مستقیماً به خود تغییر مرتبط نیستند، مانند تأییدکننده یا کمیته‌ای که آن را بررسی کرده است.Breaking Change زمانی مهم است که کد جدید به روشی ناسازگار با نسخه قبلی کار کند. با افزودن علامت &quot;!&quot;، توسعه‌دهندگان دیگر را از پتانسیل شکستن کد موجود آگاه می‌کند.هر اطلاعات اضافی‌ای که می‌خواهید برای درک بهتر کامیت ضروری نباشد را می‌توان در این بخش‌ها گنجاند.نکات مهمپاورقی و بدنه توسعه‌یافته برای جزئیات بیشتر هستند و همیشه ضروری نیستند.از استفاده بیش از حد پاورقی برای اطلاعات غیر ضروری که می‌توان آن‌ها را از طریق ابزارهای دیگر ردیابی کرد، خودداری کنید.هنگام استفاده از تغییر اساسی، تغییرات ناسازگار و تأثیرات احتمالی آن‌ها را به طور واضح توضیح دهید.chore!: drop support for Nod
  BREAKING CHANGE: use JavaScript features not available in Node 6منبعhttps://www.conventionalcommits.org/en/v1.0.0/#examples</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Sat, 10 Feb 2024 11:09:16 +0330</pubDate>
            </item>
                    <item>
                <title>افزایش سرعت django در سرور با استفاده از gunicorn</title>
                <link>https://virgool.io/@aliyousefian/%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-django-%D8%AF%D8%B1-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-gunicorn-njjazhmyaafo</link>
                <description>اگر با استفاده از فریم ورک جنگو پروژه خود رو نوشتید ولی سرعت تعداد ریکوستی که سرور شما پاسخگو هست کمه و با استفاده از کانفیگ های که در سایت‌ها هست نمی تونید تعدادRPS را افزایش دهید پیشنهاد میکنم درون فایل سرویس gunicorn خود این تغییرات را بدهید سرعت تعداد درخواست تون به شدت افزایش پیدا میکنه:۱-تعداد worker خودتون رو به این صورت انتخاب کنید که 2*تعداد cpu  به علاوه یک باشه :(2* cpu )+1و در قسمت تنظیمات gunicorn حتما این دستور را قرار دهید --timeout 30این باعث میشه برای هر درخواست ۳۰ ثانیه جواب نیومد آنرا رها کنهمرحله بعد حالت thread را فعال کنید --worker-class gthread--threads 4در نهایت تعداد درخواست در هر worker را محدود کنید به ۱۰۰۰--max-requests 1000موفق باشید </description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Tue, 04 Apr 2023 12:27:35 +0330</pubDate>
            </item>
                    <item>
                <title>کاربرد args , kwargs در پایتون</title>
                <link>https://virgool.io/@aliyousefian/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-args-kwargs-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-rys98nyomvjn</link>
                <description>گاهی اوقات، وقتی به تعریف یک تابع در پایتون نگاه می‌کنید، ممکن است ببینید که دو آرگومان عجیب و غریب دارد: *args و **kwargs. اگر تا به حال فکر کرده اید که این متغیرهای عجیب و غریب چیست، یا چرا IDE شما آنها را در main() تعریف می کند، پس این مقاله برای شما مناسب است. شما یاد خواهید گرفت که چگونه از args و kwargs در پایتون برای افزایش انعطاف پذیری به توابع خود استفاده کنید.در پایان مقاله، خواهید دانست:معنی *args و **kwargs در واقع چیستنحوه استفاده از *args و **kwargs در تعاریف تابعنحوه استفاده از یک ستاره (*) برای باز کردن بسته بندی تکرارپذیرهانحوه استفاده از دو ستاره (**) برای باز کردن دیکشنری هااین مقاله فرض می کند که شما قبلاً می دانید که چگونه توابع پایتون را تعریف کنید و با لیست ها و فرهنگ لغت کار کنید.ارسال چندین آرگومان به یک تابع*args و **kwargs به شما امکان می دهند چندین آرگومان یا آرگومان کلمه کلیدی را به یک تابع ارسال کنید. مثال زیر را در نظر بگیرید. این یک تابع ساده است که دو آرگومان می گیرد و مجموع آنها را برمی گرداندdef my_sum(a, b):
    return a + bاین تابع به خوبی کار می کند، اما تنها به دو آرگومان محدود می شود. اگر بخواهید تعداد متغیری از آرگومان ها را جمع آوری کنید، که تعداد مشخصی از آرگومان های ارسال شده فقط در زمان اجرا تعیین می شود، چه؟ آیا ایجاد تابعی که بتواند تمام اعداد صحیح ارسال شده به آن را جمع کند، مهم نیست که چند عدد باشد، عالی نیست؟استفاده از متغیر args پایتون در تعاریف توابعچند راه وجود دارد که می توانید تعداد متفاوتی از آرگومان ها را به یک تابع منتقل کنید. راه اول اغلب برای افرادی که تجربه کار با مجموعه ها را دارند شهودی ترین راه است. شما به سادگی یک لیست یا مجموعه ای از همه آرگومان ها را به تابع خود ارسال می کنید. بنابراین برای my_sum()، می توانید لیستی از تمام اعداد صحیحی که باید اضافه کنید ارسال کنید:# sum_integers_list.py
def my_sum(my_integers):
    result = 0
    for x in my_integers:
        result += x
    return result

list_of_integers = [1, 2, 3]
print(my_sum(list_of_integers))
این پیاده‌سازی کار می‌کند، اما هر زمان که این تابع را فراخوانی می‌کنید، باید فهرستی از آرگومان‌ها را نیز برای ارسال به آن ایجاد کنید. این می تواند ناخوشایند باشد، به خصوص اگر از قبل همه مقادیری را که باید در لیست قرار گیرند، ندانید.اینجاست که *args می تواند واقعاً مفید باشد، زیرا به شما امکان می دهد تعداد متفاوتی از آرگومان های موقعیتی را ارسال کنید. مثال زیر را در نظر بگیرید:# sum_integers_args.py
def my_sum(*args):
    result = 0
    # Iterating over the Python args tuple
    for x in args:
        result += x
    return result

print(my_sum(1, 2, 3))
برای توضیحات بیشتر و به ویدیو یوتیوب این آموزش مراجعه کنید و آموزش‌های بیشتر در مورد پایتون را اونجا پیدا کنیدhttps://youtu.be/hyvFbZXVAwY</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Wed, 31 Aug 2022 14:30:53 +0430</pubDate>
            </item>
                    <item>
                <title>مرتب سازی لیست‌ در پایتون</title>
                <link>https://virgool.io/@aliyousefian/%D9%85%D8%B1%D8%AA%D8%A8-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%84%DB%8C%D8%B3%D8%AA-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-jkyppurep5gh</link>
                <description>همه برنامه نویسان باید کد بنویسند تا آیتم ها یا داده ها را مرتب کنند. مرتب‌سازی می‌تواند برای تجربه کاربر در برنامه شما بسیار مهم باشد، خواه سفارش آخرین فعالیت کاربر بر اساس مهر زمانی باشد یا قرار دادن لیستی از گیرندگان ایمیل به ترتیب حروف الفبا بر اساس نام خانوادگی. قابلیت مرتب‌سازی پایتون ویژگی‌های قوی برای انجام مرتب‌سازی اولیه یا سفارشی‌سازی سفارش در سطح دانه‌بندی ارائه می‌دهد.در پایان این آموزش، شما می دانید که چگونه:پیاده سازی مرتب سازی و ترتیب اولیه پایتون در ساختارهای دادهتفاوت بین sorted() و .sort()یک ترتیب مرتب سازی پیچیده در کد خود را بر اساس الزامات منحصر به فرد سفارشی کنیدبرای این آموزش، به درک اولیه لیست ها و تاپل ها و همچنین مجموعه ها نیاز دارید. این ساختارهای داده در این آموزش مورد استفاده قرار خواهند گرفت و برخی عملیات اساسی بر روی آنها انجام خواهد شد. همچنین، این آموزش از پایتون 3 استفاده می کند، بنابراین اگر از پایتون 2 استفاده می کنید، خروجی نمونه در این آموزش ممکن است کمی متفاوت باشد.مرتببا استفاده از sorted() می توانید از پایتون برای مرتب سازی لیست استفاده کنید. در این مثال، لیستی از اعداد صحیح تعریف شده است، و سپس sorted() با متغیر اعداد به عنوان آرگومان فراخوانی می شود:numbers = [6, 9, 3, 1]
sorted(numbers)
numbersبرای یادگیری بیشتر و کامل تر ویدیو کامل این آموزش را در صفحه یوتیوبم دنبال کنید https://youtu.be/3OHrGMhdpdw </description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Wed, 31 Aug 2022 14:20:14 +0430</pubDate>
            </item>
                    <item>
                <title>4 تم برتر برای ZSH در لینوکس</title>
                <link>https://virgool.io/@aliyousefian/4-%D8%AA%D9%85-%D8%A8%D8%B1%D8%AA%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-zsh-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-cxfb803idt30</link>
                <description>خیلی از ماها از bash script خود سیستم عامل های لینوکسی استفاده میکنیم ولی ZSH به نظرمن خیلی بهتر و کاربردی تر برای کاربران هست. من تم های زیادی رو تست کردم ولی با فاصله Powerlevel10k خیلی بهتره از بقیه تم ها و هم سریع و خیلی آپشن داره روی فولدرها و کار با git اطلاعات خیلی خوبی را نشان میدهد.بزارید از این شروع کنم که چطور zsh را نصب کنیم من روی ابونتو 18.04 نصب کردم :apt install zshchsh -s /usr/bin/zsh rootwget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
source ~/.zshrc
خب نصب شد حالا استفاده از تم ها و ست کردن این تم ها فقط باید فایل vim ~/.zshrcرا باید ویرایش کنی لیست تم ها را میتونید توی مسیرcd ~/.oh-my-zsh/themes/
ls -aببینید اگر هم تمی خواستید نصب کنید توی همین پوشه بریزید. برای تغییر نام فایل .zshrc  را ویرایش کنید و ZSH_THEME=&#x27;risto&#x27;  را تغییر دهید تم ترمینال شما تغییر می کند.Powerlevel10kSpaceship ZSHAgnosterbastard</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Mon, 18 Oct 2021 21:42:22 +0330</pubDate>
            </item>
                    <item>
                <title>8 وب سایت ضروری برای فرانت کار ها</title>
                <link>https://virgool.io/@aliyousefian/8-%D9%88%D8%A8-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%B6%D8%B1%D9%88%D8%B1%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%81%D8%B1%D8%A7%D9%86%D8%AA-%DA%A9%D8%A7%D8%B1-%D9%87%D8%A7-kscsw3tqqfrj</link>
                <description>خب در این مقاله میخواهم 8 وب سایت برای فرانت کارها که نیاز دارند معرفی کنم. CSS-Tricksاین وب سایت  همه چیز CSS ، از جمله مقالات ، فیلم ها ، و راهنمای مورد علاقه من ، راهنماها است. هر زمان که UI را طراحی می کنم و نحوه عملکرد flexbox یا grid را فراموش می کنم ، به طور مرتب به راهنماهای موضوعاتی که تصاویری فوق العاده و توضیحات ساده ارائه می دهند ، برمی گردم.cssreference.ioاین نام می گوید که چیست ، اما ccsreference.io اسناد قدیمی و خسته کننده شما نیست. آنها مستقیماً با نشان دادن بسیاری از ویژگیهای CSS در یک قالب مرتب و تمیز که برای چشم ها آسان است به اصل مطلب می رسند.هر ویژگی CSS در کنار آنها مثالهای بی شماری آورده شده است تا به شما کمک کند اطلاعاتی را که برای آن آمده اید به طور مثر دریافت کنید.چه چیز دیگری از اسناد مرجع نیاز دارید؟Coolorsوب سایت شخصی خود را با یک رنگ بندی منحصر به فرد و جذاب جذاب کنید. این وب سایت از زمانی که شروع به استفاده از آن کرده ام رشد کرده است ، اما ویژگی اصلی که من استفاده می کنم ایجاد پالت شخصی شما است (به بالا مراجعه کنید).با رنگهای تصادفی آزمایش کنید تا ترکیبی را که بیشتر دوست دارید پیدا کنید و سپس از رنگهای شش ضلعی ارائه شده برای پیاده سازی آنها در پروژه های خود استفاده کنید. این نه تنها هنگام کار با برنامه های جلویی مفید است ، بلکه هر زمان که می خواهید هر چیزی را طراحی و طراحی کنید.Unsplashهمه آنجا بوده ام شما به مرحله ای رسیدید که تمام داربست ها را برای برنامه خود انجام داده اید و باید افزودن محتوا را شروع کنید. افزودن &quot;Lorem ipsum ...&quot; برای نوشتار آسان است ، اما برای تصاویر ، باید مراحل جستجوی گوگل را برای اطمینان از اندازه مناسب ، رایگان ، اقامتگاه طی کنید.Unsplash با ارائه تصاویری با کیفیت بالا و &quot;قابل استفاده آزاد&quot; که به راحتی می توانید به هر پروژه یا وبلاگی (مانند این one) اضافه کنید به شما کمک می کند. هنگام بارگیری تصاویر نیز می توانید اندازه (کوچک ، متوسط ، بزرگ) را متناسب با نیاز خود انتخاب کنید.Alligator.ioیک یافته جدید برای من بود. این مانند یک وبلاگ فنی پیشرفته با مشارکت کنندگان زیادی است. موضوعات شامل React ، Angular ، Vue ، CSS ، JavaScript و غیره است. در جریان روندهای فعلی فناوری به همراه راهنماها و آموزش هایی باشید تا مهارت های پیشرفته خود را ارتقا دهید. قطعاً ارزش یک نشانک را دارد.Awesomeچی؟ یک رپو Github؟ بسیار خوب ، آرام باشید و بقیه README را مطالعه کنید تا منابع بی ارزشی را که این رپو ارائه می دهد ، ببینید.این آخرین لیست همه منابع در فهرست است. اساساً ، این یک لیست بی پایان از منابع است که توسط جامعه تنظیم شده است. و این فقط یک repo نیست.در اینجا می توانید مخازن دیگر را پیدا کنید که در آن افراد دارای لیست موضوعی &quot;فوق العاده&quot; خاص خود هستند ، از Nodejs و Python گرفته تا موارد مربوط به سوالات مصاحبه و طراحی.من نباید این را بگویم ، اما به جای جستجو در وبلاگ هایی مانند این (که من از آنها بسیار قدردانی می کنم) ، &quot;عالی&quot; را بررسی کنید زیرا سالهاست که توسط بسیاری از افراد مهربان و با دانش طراحی شده است.Brand Palettesیک پایگاه داده از مارک ها و رنگ آنها است. تقریباً همین است. با این وجود ، این یک منبع جالب است که در جیب پشت خود داشته باشید.</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Sat, 02 Oct 2021 20:05:59 +0330</pubDate>
            </item>
                    <item>
                <title>customize User Model in django</title>
                <link>https://virgool.io/@aliyousefian/customize-user-model-in-django-dbqatogxz6ml</link>
                <description>شاید برای شما نیز پیش آمده باشد که بخواهد مدل user را در جنگو تغییر دهید. به صورت پیش فرض username در مدل user یکتا است حال فرض کنید میخواهید فیلد ایمیل نیز یکتا باشد این تغییر کل مدل user  را تغییر نمیدهد و فقط برای فیلد ها تغییر جزی همراه دارد برای این نوع تغییرات از کلاس  AbstractUser استفاده میکنیم و اگر بخواهیم تمام فیلدهای مدل User را تغییر دهیم از کلاس AbstractBaseUser استفاده می شود برای مثال میخاهیم فیلد ایمیل را یکتا کنیم برای این کار من در پروژه یک app  با نام core ایجاد میکنم :INSTALLED_APPS = [    &#x27;django.contrib.admin&#x27;,    &#x27;django.contrib.auth&#x27;,    &#x27;django.contrib.contenttypes&#x27;,    &#x27;django.contrib.sessions&#x27;,    &#x27;django.contrib.messages&#x27;,    &#x27;django.contrib.staticfiles&#x27;,    &#x27;core&#x27;,]ویرایش users/models.py:from django.contrib.auth.models import AbstractUserfrom django.contrib.auth.models import AbstractUserfrom django.db import modelsfrom django.utils.translation import ugettext_lazy as _from .managers import CustomUserManagerclass CustomUser(AbstractUser):    username = None    email = models.EmailField(_(&#x27;email address&#x27;), unique=True)    USERNAME_FIELD = &#x27;email&#x27;    REQUIRED_FIELDS = []    def __str__(self):        return self.emailهمانطور که مشاهده میکنید فیلد ایمیل اجباری شده است و فیلد username را حذف کردیم.در قسمت تنظیمات مسیر مدل user  را از حالت پیش فرض تغییر میدهیم AUTH_USER_MODEL = &#x27;core.CustomUser&#x27;و سپس عملیات مایگریت برای دیتابیس را انجام میدهیمpython manage.py makemigrations</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Wed, 29 Sep 2021 11:31:27 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه پروفایل گیت خود رو جذاب کنیم(README.md)</title>
                <link>https://virgool.io/@aliyousefian/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B1%D9%88%D9%81%D8%A7%DB%8C%D9%84-%DA%AF%DB%8C%D8%AA-%D8%AE%D9%88%D8%AF-%D8%B1%D9%88-%D8%AC%D8%B0%D8%A7%D8%A8-%DA%A9%D9%86%DB%8C%D9%85readmemd-uoomf3q4sb4u</link>
                <description>شاید شما هم دیده باشید که بعضی از اکانت‌های گیت‌هاب پروفایل جالبی دارند مانند اکانت گیت‌هاب من برای اینکار کافی است تا در مرحله اول ریپویی با نام کابری گیت‌هاب خود ایجاد کنید و تیک create readme.md را بزنید تا فایل readme در ریپوی شما ایجاد گردد سپس میتونید ببنید که به صورت پیش فرض برای شما درون این فایل قرار دارد. حالا می توانید با چک کردن گیت‌هاب های افراد دیگه و الگو گرفتن پروفایل خود را ارتقا بدیدچند تا از پروفایل‌های گیت را براتون میزارم برای الگو گرفتنgithub.com/ashbakernzgithub.com/jlengstorfgithub.com/abhisheknaiiduhttps://github.com/danBamikiya</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Fri, 20 Aug 2021 01:09:07 +0430</pubDate>
            </item>
                    <item>
                <title>Netwrokx (part 1)</title>
                <link>https://virgool.io/@aliyousefian/netwrokx-part-1-shnscmri4fli</link>
                <description>در این بخش با کتابخانه Networkx سعی میکنم کار با گراف و معیار های گرافی را به صورت عملی آموزش دهم خب کدهای که نمایش میدهم و اجرا میکنم روی گیت‌هاب من  قرار داره میتوند دانلود و استفاده کنید.داکیومنت کامل این کتابخانه بر روی سایتش قرار داره پس اگه حوصله متن من رو نداشتید میتونید برید و اونجا بخونید :))برای نصب اول پایتون رو روی سیستم خودوتون نصب کنید بعدش پیشنهاد میکنم jupyter notebook را نصب کنید. بعدش با استفاده از پیپ pip  با دستور زیر نصب کنید pip install networkxبرای اینکه مطمین شی که نصب شده در محیط ترمینال بنویسpytest networkxخب اگر  قسمت دوم بدون خطا اجرا شد شما به خوبی نصب کردید و میتواند استفاده کنید ولی حواستون باشه من چند کتابخونه دیگه هم اضافه کردم مانند pandas , matplot  شما هم نصب کنید  در ادامه لازم داریم.مرحله اول ایجاد یک گراف خالی است یا  instance  خالی برای ساختار گرافی مون :G = nx.Graph()گراف خالی G ساخته می‌شود هانطور که توضیح دادم گراف از گره یا نود و یال‌های متصل شده به وسیله این نود‌ها ساخته می‌شود پس برای این که گراف خالی G  را معرفی  کنیم و قابل پردازش کنیم نیاز است تا گرهای گراف و یال‌های این گراف را تعریف کنیم.گره یا نودنمودار G را می توان به روش های مختلف رشد داد. NetworkX شامل بسیاری از توابع و امکانات مولد گراف برای خواندن و نوشتن نمودارها در فرمت های مختلف است. برای شروع ، ما دستکاری های ساده را بررسی می کنیم. می توانید یک گره را در یک زمان اضافه کنید. مانند مثال زیر که گره ۱ را به گراف G اضافه می‌کند.G.add_node(1)اگر میخواهید چندین گره همزمان اضافه کنید از کد زیر استفاده کنید. به صورت آرایه ای از گره‌هاG.add_nodes_from([2, 3])دستور G.nodes لیستی از گره‌های گراف G را نمایش می‌دهد.G.nodes
output:NodeView((1, 2, 3, 4))يال‌ها (edge)G.add_edge(1,2)یالی بدون وزن بین دو گره ۱و ۲ برقرار میکند.برای اینکه اطلاعاتی اولیه از گراف G ببینید کافی با دستور :print(nx.info(G))
output:
Name: 
Type: Graph
Number of nodes: 4
Number of edges: 1
Average degree:   0.5000اگر خواستید نمایشی اولیه از گرافی که ساختید داشته باشید کافی است دستور nx.draw(G,with_labels=True)را بزنید.خب سعی می‌کنم این سری از آموزش  را تکمیل کنم</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Thu, 19 Aug 2021 13:12:47 +0430</pubDate>
            </item>
                    <item>
                <title>شبکه‌های پیچیده و پویا Complex Network</title>
                <link>https://virgool.io/@aliyousefian/%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D9%BE%DB%8C%DA%86%DB%8C%D8%AF%D9%87-%D9%88-%D9%BE%D9%88%DB%8C%D8%A7-complex-network-ehc7juln15s7</link>
                <description>اول یه توضیح علمی میگم براش بعد از آن در مورد برنامه نویسی و عمکرد آن براتون میگم:شبکه پیچیده(به انگلیسی: Complex networks)شبکه است با ویژگی‌های توپولوژی بارز، ویژگی‌هایی که در شبکه‌های ساده از قبیل شبکهٔ کاری یا گراف تصادفی رخ نمی‌دهد ولی اغلب در گراف‌های مدل از سیستم‌های واقعی رخ می‌دهد. مطالعهٔ شبکه‌های پیچیده زمینهٔ جوان و فعالی از پژوهش‌های علمی (از سال ۲۰۰۰ میلادی) است که به طور گسترده از مطالعات تجربی شبکه‌های دنیای واقعی از قبیل شبکه‌های رایانه‌ای، شبکه‌های تکنولوژی، شبکه‌های مغزی و شبکه‌های اجتماعی الهام گرفته است. به طور ساده یک شبکه یا گراف یک مجموعه ای از نودها و لینک‌ها هستد. لینک‌ها می‌توانند وزن دار یا غیر وزن دار باشند. مغز یک شبکه عظیمی از نرون‌هاست که توسط سیناپس ها به هم متصل شده‌اند. کنترل فعالیت ژنتیک در یک سلول که یک شبکه پیچیده ای از ژن هاست، توسط پروتئین‌های تنظیم کننده انجام می‌گیرد. ارتباطات اجتماعی شبکه هایی هستند که در آن مردم یا سازمان‌هایی از مردم، نودها هستند و ارتباطات گوناگونی بین آنها وجود دارد. اینترنت و وب دو شبکه برجسته در جوامع امروزی هستند. در قلمرو امنیت ملی، تلاش‌های بسیاری برای شناسایی و تحلیل شبکه های تروریستی انجام گرفته است. همه این مباحث برای مدت زمانی مطالعه شده، اما فقط مطالعه شبکه ها یک بحث اصلی تحقیق در سیستم های پیچیده است و از جمله دلایل برای این موضوع، کامپیوترهای سریعی هستند که مطالعه شبکه های واقعی را از روی مشاهده و تجربه ممکن می‌سازد. مثال‌هایی از سیستم‌های پیچیده در طبیعت و جامعه وجود دارد؛ مانند: مغز، دستگاه ایمنی بدن، سلول‌های بیولوژیکی، شبکه های متابولیکی، کلونی مورچه، اینترنت و وب، داد و ستد اقتصادی و شبکه های اجتماعی انسانی. هیچ تعریف رسمی از سیستم های پیچیده وجود ندارد. به طور غیر رسمی، یک سیستم پیچیده که یک شبکه بزرگی از مولفه های نسبتاً ساده است، بدون هیچ کنترلی، رفتارهای پیچیده‌ای را نشان می‌دهد. البته واژه‏ ها در این تعریف یا دقت زیادی تعریف نشده‌اند. مولفه‌های نسبتاً ساده به این معنا است که نقش وظیفه‌ای آنها در رفتار جمعی سیستم، ساده است. برای مثال، یک نرون (یاخته عصبی) یا یک مورچه موجودیت های پیچیده ای هستند، هر چند که نقش وظیفه ای آنها در مغز یا کلونی نسبتاً ساده است سیستم های پیچیده نگاهی نو به پدیده های است که به علت ارتباط بین اجزای آن و همچنین ارتباط با دیگر پدیده ها، از پیچیدگی بالایی برخوردارند و رفتار جمعی متفاوتی بروز می دهند. بدین معنی که با مطالعه تک تک اجزای یک سیستم پیچیده نمی توان به رفتار جمعی آن دست یافت. به عبارت دیگر، سیستم پیچیده معرف پارادایم پیچیدگی است که عناصر سازنده آن تشکیل شبکه ای را می دهند که اجزاء شبکه دارای برهم کنش هستند و از اندیشه کل نگر بهره می گیرند. پارادایم کلاسیک که بخشی نگر است، بر این فرض استوار است که اگر اجزاء سیستمی را دقیقاً شناسایی کنیم و از عمل کرد آن اطلاع یابیم، قادر خواهیم بود به خواص کلی پدیده و سیستم دست یابیم. مطالعات کیهان شناسی، ساختارهای بی نظم در مواد، زیست شناسی، جامعه شناسی و اقتصاد محدودیت کاربرد این مسئله در مقالات و کتب متعدد را به نمایش گذاشته اند. حوزه‌های اصلی دانش سیستم‌های پیچیده به قرار زیر است: 1. دینامیک‌ها (پویایی‌ها): مطالعه ساختار و رفتار و ویژگی های سیستم های پیچیده که در طول زمان به طور مداوم تغییر می‌کند 2. اطلاعات: مطالعه ارائه‌ها، نمادها و ارتباطات 3. رایانش: مطالعه نحوه پردازش اطلاعات و اقدام بر مبنای آن توسط سیستم‌ها 4. تکامل: مطالعه چگونگی تطبیق سیستم‌ها با محیطی که دائما در حال تغییر است تمامی این موارد حوزه‌های مستقلی از پژوهش هستند، اما در مطالعات پیچیده‌گی کنار هم قرار می‌گیرند. یه نظر دانش سیستم های پیچیده حداقل دو هدف دارد (یا به عبارتی محققین مختلف اهداف متفاوتی دارند): 1. توسعه ابزارهای ریاضوی و محاسباتی که منجر به بینشی بین رشته‌ای می‌شود. برای مثال با مطالعه رفتار کلنی مورچه‌ها به عنوان یک مثال پردازش اطلاعات، می‌توان پرسید که این پردازش چه تفاوت‌ها و شباهت‌هایی با آنچه در شهرها صورت می‌گیرد دارد. یا جریان اطلاعات در شبکه مغزی، تا چه حدی شبیه یک شبکه اقتصادی است؟ چنین یافته‌های بین رشته‌ای امروزه از بزرگترین دستاوردهای دانش سیستم های پیچیده بوده است. که بسیاری را در این مجموعه مطالب بررسی خواهیم کرد. 2. برخی دانشمندان پیچیدگی هدفی والاتر دارند و آن توسعه یک تئوری عمومی پیچیدگی است که تمامی حوزه‌های جدا از هم این دانش را یکی کند. چنین هدفی در جامعه محققان بسیار بحث برانگیز است و خیلی‌ها اعتقاد دارند که واقع‌بینانه نیست. با این وجود عده به دنبالش هستند. در این مطالب ا چندی دانشمندان دانش سیستم های پیچیده درباره چنین رویکردی می‌شنویم.برای تحلیل شبکه‌های پیچیده مانند شبکه‌های اجتماعی یا هر شبکه‌ای که نودهای آن به هم متصل می‌شوند و یال داریم میتوانیم از ابزار‌های مانند Networkx در پایتون  یا graphx در اسپارک استفاده کنیم. در این مقاله بیشتر از این مبحث را توضیح نمی‌دهم ولی در مقالات بعدی ابزار networkx را قدم به قدم توضیح خواهم داد. </description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Thu, 19 Aug 2021 11:22:57 +0430</pubDate>
            </item>
                    <item>
                <title>vscode در github</title>
                <link>https://virgool.io/@aliyousefian/vscode-%D8%AF%D8%B1-github-b1kpbwluija0</link>
                <description>شاید برای شما هم اتفاق افتاده باشد که بخواهید فایلی را برروی رپوی گیت‌هاب خود ویرایش کنید قابلیت جدید گیتهاب به شما این اجازه را میدهد تا پروژه خود را به صورت آنلاین در وب و آنلاین با ابزار vscode باز و ویرایش کنید یا حتی کل اکستنشن های vscode را نصب کنید.برای این کار وارد صفحه رپوی خود شوید و .(دات را بر روی کیبورد)  بزنید خواهید دید که vscode برای شما باز میشود.</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Thu, 19 Aug 2021 03:31:35 +0430</pubDate>
            </item>
                    <item>
                <title>آسیب‌پذیری  دستور Sudo در لینوکس</title>
                <link>https://virgool.io/@aliyousefian/%D8%A2%D8%B3%DB%8C%D8%A8-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-sudo-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-o5d0iuxrgrfo</link>
                <description>CVE-2021-3156: Heap-Based Buffer Overflow in Sudo (Baron Samedit)به تازگی برای سیستم‌های لینوکسی sudo مشکل امنیتی پیدا شده براساس گزارش سایت،  این نفوذ براساس heap overflow برروی دستور sudo قابل اجرا است تا ادمین سیستم را از شما بگیرند. من زیاد در مورد نوع و روش هکش توضیح نمیدم ولی میتونید با دیدن این لینک تا حدودی به روش دستیابی و اسکریپت اکسپلویت آن برسید لطفا در سریع ترین زمان ممکن پکیج sudo خود را آپدیت کنید.ورژن‌های آسیب‌پذیر Ubuntu 20.04 (Sudo 1.8.31) Debian 10 (Sudo 1.8.27)  Fedora 33 (Sudo 1.9.2)روش پچ کردن :sudo --version
wget https://www.sudo.ws/dist/sudo-1.9.5p2.tar.gz
tar xzvf sudo-1.9.5p2.tar.gz 
cd sudo-1.9.5p2 
./configure
 make &amp;&amp; sudo make install
 bash -c &amp;quotsudo --version&amp;quots</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Fri, 29 Jan 2021 11:33:54 +0330</pubDate>
            </item>
                    <item>
                <title>تنظیمات امنیتی برای deploy کردن Django</title>
                <link>https://virgool.io/@aliyousefian/%D8%AA%D9%86%D8%B8%DB%8C%D9%85%D8%A7%D8%AA-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-deply-%DA%A9%D8%B1%D8%AF%D9%86-django-hhs8kepljrzf</link>
                <description>در این مقاله قصد دارم چک لیست امنیتی اولیه که برای deploy کردن یک پروژه جنگو نیاز است را معرفی کنم در مرحله اول با اجرای دستور زیر  خود جنگو پروژه شما را بررسی میکند . اگر نکته یا پیشنهادی برای شما داشت به شما معرفی میکند از جمله صفحاتی که به حملات  XSS یا  Anti forgery-token آسیب‌پذیر هستند رامعرفی میکند python manage.py check --deployدر بخش تنظیمات خود جنگو یعنی فایل setting.py  نکات زیر را اعمال کنید در مرحله اول نیاز است تا کلید رمزنگار جنگو و پروژه خود را به environment  سرور لینوکسی خود منتقل کنید در این مرحله کلید را که در تنظیمات شما با نام SECRET_KEY است با با دستور زیر به سرور خود منتقل کنید export SECRET_KEY=&lt;SECRET_KEY&gt; و جایگزین این کلید کد زیر را قرار دهید import os
SECRET_KEY = os.environ[&#039;SECRET_KEY&#039;]خب تا این مرحله ۲ قسمت را گفتیم سخت که نبود مرحله بعدی ما این است که Debug را False کنیم تا خطاهای اصلی سیستم را به کاربر با اطلاعات بسیاری که در خود را را نبیند. DEBUG = Trueدر تنظیمات پایگاه داده‌ایی رمز پایگاه خود را به صورت text نگه ندارید و می‌توانید مانند SECRET_KEY درهمان environment  نگهداری کنید.DATABASES = {
&#039;default&#039;: {
&#039;ENGINE&#039;: &#039;django.db.backends.postgresql&#039;,
&#039;NAME&#039;: &#039;educa&#039;,
&#039;USER&#039;: &#039;educa&#039;,
&#039;PASSWORD&#039;: &#039;*****&#039;,
}
}در تنظیمات خود این قسمت را قرار دهید تا تمامی خطا های رخ داده برای مدیر سیستم در حال Debug =False ارسال گردد ADMINS = (
(&#039;Antonio M&#039;, &#039;email@mydomain.com&#039;),
)سرور خود را بر روی HTTPS تنظیم کنید و فلگ‌های زیر را اعمال کنید:CSRF_COOKIE_SECURE=True
SESSION_COOKIE_SECURE=Trueلاگ گیری را فعال کنید LOGGING = {     &#039;version&#039;: 1,     &#039;disable_existing_loggers&#039;: False,     &#039;formatters&#039;: {         &#039;verbose&#039;: {             &#039;format&#039;: &#039;%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s&#039;         },         &#039;simple&#039;: {             &#039;format&#039;: &#039;%(levelname)s %(message)s&#039;         },     }, &#039;filters&#039;: {     &#039;special&#039;: {         &#039;()&#039;: &#039;project.logging.SpecialFilter&#039;,         &#039;foo&#039;: &#039;bar&#039;,     },     &#039;require_debug_true&#039;: {         &#039;()&#039;: &#039;django.utils.log.RequireDebugTrue&#039;,     }, }, &#039;handlers&#039;: {     &#039;file_error&#039;: {         &#039;level&#039;: &#039;ERROR&#039;,         &#039;class&#039;: &#039;logging.FileHandler&#039;,         &#039;filename&#039;:      },این قسمت کوچکی از تنظیمات امنیتی بود سعی میکنم در آینده این مقاله را تکمیل کنم.https://www.packtpub.com/product/django-3-by-example-third-edition/9781838981952https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/#logging</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Thu, 21 Jan 2021 18:35:39 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه پروژه جنگو خود را در 8 centos  اجرا  (deploy) کنیم</title>
                <link>https://virgool.io/CodeLovers/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AC%D9%86%DA%AF%D9%88-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%AF%D8%B1-8-centos-%D8%A7%D8%AC%D8%B1%D8%A7-deploy-%DA%A9%D9%86%DB%8C%D9%85-qavrp6set409</link>
                <description>خب در این پست میخواهم کد جنگو را بر روی سرور CentOS را برای شما شرح دهم. برای شروع باید  که پایگاه داده و برنامه خود را راه اندازی سپس سرور برنامه Gunicorn را نصب و پیکربندی می کنیم. این به عنوان رابط برنامه ما عمل می کند و درخواست های مشتری را در تماس های HTTP به پایتون ترجمه می کند که برنامه ما می تواند پردازش کند. سپس Nginx را در مقابل Gunicorn راه اندازی خواهیم کرد تا از مکانیزم های عملکرد اتصال بالا با عملکرد بالا و ویژگی های امنیتی آسان برای اجرای آن بهره مند شویم.خب بیایید شروع کنیم:مرحله اول نصب EPEL repositorysudo yum install epel-releaseدر مرحله بعد نیاز است پایگاه داده را نصب کنید، برای اینکار من PostgreSQL را نصب میکنمdnf module list postgresqlدستور بالا ورژن‌های postgres را به شما نشان میدهد ورژن مورد نظر خود را با دستور زیر انتخاب و نصب کنیدsudo dnf module enable postgresql:12 sudo dnf module enable postgresql:&lt;version of postgres&gt;برای نصب کامل من خودم از ورژن 10 را نصب می‌کنم sudo dnf install postgresql-serverبعد نصب نیازه تا پیش نیازها postgres  به آن نیاز دارد دستور زیر را وارد کنیدsudo postgresql-setup --initdbsudo systemctl start postgresqlsudo systemctl enable postgresqlحواستون باشه دیتابیس postgres  نیاز داره تا روش ورود به این دیتابیس از جنگو باید باشه حالت md5  است برای این کار  فایل تنظیمات اصلی را ویرایش کنیدsudo nano /var/lib/pgsql/data/pg_hba.confاز ident  به md5 تغییر بدید. خیلی مهمه‌ها!!!!!!# TYPE  DATABASE        USER            ADDRESS                 METHOD# &quot;local&quot; is for Unix domain socket connections onlylocal   all             all                                     peer# IPv4 local connections:#host    all             all             127.0.0.1/32            identhost    all             all             127.0.0.1/32            md5# IPv6 local connections:#host    all             all             ::1/128                 identhost    all             all             ::1/128                 md5بعد از ذخیره سازی با دستورات زیر فایل تنظیمات دیتابیس را ریستارت کنید sudo systemctl restart postgresql sudo systemctl enable postgresqlبا ترمینال دستور زیر را وارد کنید و پایگاه داده . schema  و user  را بسازید  sudo su - postgres psqlCREATE DATABASE &lt;yourdatabasename&gt;CREATE USER myprojectuser WITH PASSWORD &#x27;password&#x27;;GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;\qخب دیتابیس ساخته شد میریم واسه جنگو sudo pip install virtualenv
virtualenv myprojectenvsource myprojectenv/bin/activateخب حالا  نصب کنید requiements.txtpip install -r requiement.txtاز فایل setting ویرایش کنید مشخاصات پایگاه داده را DATABASES = {    &#x27;default&#x27;: {        &#x27;ENGINE&#x27;: &#x27;django.db.backends.postgresql_psycopg2&#x27;,        &#x27;NAME&#x27;: &#x27;myproject&#x27;,        &#x27;USER&#x27;: &#x27;myprojectuser&#x27;,        &#x27;PASSWORD&#x27;: &#x27;password&#x27;,        &#x27;HOST&#x27;: &#x27;localhost&#x27;,        &#x27;PORT&#x27;: &#x27;&#x27;,    }جدولها دیتابیس را migrate کنید python manage.py makemigrationspython manage.py migrate
python manage.py createsuperuser
خب پروژه را اجرا کنید اگه مشکلی نبود ادامه توضیحات من رو بخونید :)))python manage.py runserver 0.0.0.0:8000برای اجرا در nginx نیاز دارید تا gunicorn را نصب و اجرا کنید pip install gunicorn cd ~/myprojectgunicorn --bind 0.0.0.0:8000 myproject.wsgi:applicationسرویس زیر را در بسازید sudo nano /etc/systemd/system/gunicorn.serviceدر این فایل تنظیمات زیر را اعمال کنید حواستون باشه مسیر پروژه تون را جایگزین کنید [Unit]Description=gunicorn daemonAfter=network.target[Service]User=userGroup=nginxWorkingDirectory=/home/user/myprojectExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
[Install]WantedBy=multi-user.targetسرویس gunicorn را اجرا کنیدsudo systemctl start gunicornsudo systemctl enable gunicornاین بخش تمام شد حالا nginx را نصب کنdnf install nginxsudo nano /etc/nginx/nginx.confتنظیمات زیر را اعمال کنید server {    listen 80;    server_name server_domain_or_IP;    location = /favicon.ico { access_log off; log_not_found off; }    location /static/ {        root /home/user/myproject;    }    location / {        proxy_set_header Host $http_host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_pass http://unix:/home/user/myproject/myproject.sock;    }}پس ریستارت کن امیدوارم اجرا بشه و sudo nginx -tsudo systemctl start nginxsudo systemctl enable nginx</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Sat, 16 Jan 2021 00:16:54 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه uuid را مدل ایجاد کنیم</title>
                <link>https://virgool.io/coderlife/%DA%86%DA%AF%D9%88%D9%86%D9%87-uuid-%D8%B1%D8%A7-%D9%85%D8%AF%D9%84-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DA%A9%D9%86%DB%8C%D9%85-wuv9tg7iokv0</link>
                <description>در مدل جنگو برای آنکه به جای id که مقداری primary استفاده کنیم می‌توانیم از uuid استفاده کنیم که کلیدی تصادفی است که براساس زمان سیستم و MAC و سخت افزار سیستم شما ساخته می‌شود این کد باعث می‌شود که در آدرس سایت اعداد ID  که پشت سرهم هستند ظاهر نشوند و نشود با اضافه کردن مقداری به URL شما باعث ایجاد دسترسی به داد‌های حساس شما باشد.برای این کار کافیه در مدل فیلد آن‌را اضافه کنیدimport uuid 
from django.db import models
class MyUUIDModel(models.Model):     id = models.UUIDField(          primary_key = True,          default = uuid.uuid4,          editable = False)     # other fields خب خیلی راحت بود ولی اگر بخواهید از مدل قدیمی استفاده کنید به این مسله بر می‌خورید که چطور این فیلد را اضافه کنید اگر به صورت دستی اضافه کنید مشکلی اساس در MIGRATE خواهید داشت UUID فیلد‌های NULL که دیتابیس شما را دچار مشکل می‌کند. راه حل چیه ؟این خط را به MIGRATION خود اضافه کنیدdef create_uuid(apps, schema_editor):     Device = apps.get_model(&#039;device_app&#039;, &#039;Device&#039;)     for device in Device.objects.all():         device.uuid = uuid.uuid4()        
 device.save()
# -*- coding: utf-8 -*
from __future__ import unicode_literals

from django.db import migrations, models
import uuid


def create_uuid(apps, schema_editor):
    Device = apps.get_model(&#039;device_app&#039;, &#039;Device&#039;)
    for device in Device.objects.all():
        device.uuid = uuid.uuid4()
        device.save()


class Migration(migrations.Migration):

    dependencies = [
        (&#039;device_app&#039;, &#039;XXXX&#039;),
    ]

    operations = [
        migrations.AddField(
            model_name=&#039;device&#039;,
            name=&#039;uuid&#039;,
            field=models.UUIDField(blank=True, null=True),
        ),
        migrations.RunPython(create_uuid),
        migrations.AlterField(
            model_name=&#039;device&#039;,
            name=&#039;uuid&#039;,
            field=models.UUIDField(unique=True)
        )
    ]</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Thu, 26 Nov 2020 21:08:46 +0330</pubDate>
            </item>
                    <item>
                <title>جنگو swagger برای rest api</title>
                <link>https://virgool.io/@aliyousefian/%D8%AC%D9%86%DA%AF%D9%88-swagger-%D8%A8%D8%B1%D8%A7%DB%8C-rest-api-c7x8kuucoxoz</link>
                <description>شاید برای شما نیز اتفاق افتاده باشد که از پکیچ rest Django  برای ارتباط با API در فریم‌ورک جنگو داشته باشید. django-rest-framework به صورت پیش‌فرض تمپلیتی برای آن‌که بتواند راحت‌تر با API کار کنید می‌دهد.ولی خیلی کامل نیست و کاربر پسند برای برنامه نویسان نیست یکی از بهترین پکیچ که میتواند به شما کمک کند Django swagger است که به شما ui به صورت زیر می‌دهد.برای نصب آن pip install django-rest-swaggerپس از نصب پکیچ در قسمت setting.py پروژه INSTALLED_APPS = (
        ...
        &#039;rest_framework_swagger&#039;,
    )در نهایت مسیر زیر را در url.py اصلی اضافه کنید from django.conf.urls import url
from rest_framework_swagger.views import get_swagger_view

schema_view = get_swagger_view(title=&#039;Pastebin API&#039;)

urlpatterns = [
    url(r&#039;^$&#039;, schema_view)
]ولی مشکلی وجود داره django swagger دیگر پشتیبانی نمی‌شود و منغضی شده در همین جهت پکیج جدیدی معرفی شد که واقعا خیلی بهتر عملکرده نسبت به django swagger این پکیج با نام drf-yasgمزایا اصلی ایم پکیچ از سریالازرهای تو در تو به صورت کامل پشتیبانی می‌کند.سازگار با ابزار codegenقالب های سفارشی سازی در تمام نقاط فرآیند تولید مشخصات  مشخصات JSON و YAMLجدیدترین نسخه swagger-ui و redoc برای مشاهده مستندات تولید شدهطرح ایجاد شده Swagger می تواند به طور خودکار توسط swagger-spec-validator تأیید شودطریقه نصب ساده‌ای دارهpip install -U drf-yasgدر فایل setting.pyINSTALLED_APPS = [
   ...
   &#039;django.contrib.staticfiles&#039;,  # برای فایل‌های css باید باشه
   &#039;drf_yasg&#039;,
   ...
] در url.py  را اضافه کنید:from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

...

schema_view = get_schema_view(
   openapi.Info(
      title=&amp;quotSnippets API&amp;quot,
      default_version=&#039;v1&#039;,
      description=&amp;quotTest description&amp;quot,
      terms_of_service=&amp;quothttps://www.google.com/policies/terms/&amp;quot,
      contact=openapi.Contact(email=&amp;quotcontact@snippets.local&amp;quot),
      license=openapi.License(name=&amp;quotBSD License&amp;quot),
   ),
   public=True,
   permission_classes=[permissions.AllowAny],
)

urlpatterns = [
   url(r&#039;^swagger(?P&lt;format&gt;\.json|\.yaml)$&#039;, schema_view.without_ui(cache_timeout=0), name=&#039;schema-json&#039;),
   url(r&#039;^swagger/$&#039;, schema_view.with_ui(&#039;swagger&#039;, cache_timeout=0), name=&#039;schema-swagger-ui&#039;),
   url(r&#039;^redoc/$&#039;, schema_view.with_ui(&#039;redoc&#039;, cache_timeout=0), name=&#039;schema-redoc&#039;),
   ...
]پیشنهاد میکنم ادامه داکیومنت  drf-yasg را بخوانید من سعی میکنم قسمت‌های اصلی بعدی را در پست بعتی به اشتراک بگذارم.باتشکر از شما من را دنبال کنید :Ali Yousefian Linkedin </description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Tue, 17 Nov 2020 23:39:45 +0330</pubDate>
            </item>
                    <item>
                <title>تغییرات در کوکی‌های مرورگرها samesite  از کروم ورژن 80</title>
                <link>https://virgool.io/@aliyousefian/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D8%A7%D8%AA-%D8%AF%D8%B1-%DA%A9%D9%88%DA%A9%DB%8C%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D9%88%D8%B1%DA%AF%D8%B1%D9%87%D8%A7-samesite-%D8%A7%D8%B2-%DA%A9%D8%B1%D9%88%D9%85-%D9%88%D8%B1%DA%98%D9%86-80-pccx50pkkcgb</link>
                <description>تغییرات در کوکی‌های مرورگرها samesite  از کروم ورژن 80شاید برای شما نیز اتفاق افتاده باشد که سایت شما در ورژن‌های جدید کروم 85 و فایرفاکس خطای مثل شکل بالا نمایش داده شود و کوکی شما به صفحات وب شما اضافه نشود.این مشکل برای من در فریم ورک جنگو اتفاق افتاد من سایتی با ورژن 2.2.5 نوشته بودم که back-end آن جنگو و قسمت فرانت آن Reactjs بود سایت به خوبی مار می‌کرد تا اینکه در ورژن‌های جدید مرورگرها پچار مشکل شد. SameSite Cookie باعث میگردد تا اگر دامنه فرانت از بک اند شما جدا است، اجازه ایجاد کوکی های امن (secure) را ندهد و تگ Httponly  دارند اجازه ایجاد نداشته باشند.تا یک سال پیش ۲ نوع پارامتر برای samesite  وجود داشت یک lax , strict استفاده از lax  باعث می‌شود بعضی از کوکی‌ها به صورت cross site  ارسال شوند، درصورتی که این درخواست‌ها به صورت GET or HEAD و نه POST  تا کوکی ذخیره شود.در حالت strict اجازه ارسال و ذخیره کوکی در حالت cross site  امکان پذیر نیست.پس اگر نیاز بود که در حالت POST این کوکی‌ها ست شوند باید چه کرد؟سایت من همین مشکل را داشت این مشکل در جنگو ۳ حل شده و با تغییر در تنظیمات و تغییر samesite  به None این مشکل رفع می‌گردد.CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SAMESITE = &#039;None&#039;SESSION_COOKIE_SAMESITE = &#039;None&#039;در جنگو ۳ حل شد ولی شاید شما هم مثل من پروژه با جنگو ۲ دارید حال باید چه کرد ؟در نگاه اول در گیت کتابخانه وجود دارد  https://github.com/jotes/django-cookies-samesite pip install django-cookies-samesiteMIDDLEWARE_CLASSES = (
    &#039;django_cookies_samesite.middleware.CookiesSameSite&#039;,
    ...
)SESSION_COOKIE_SAMESITE = &#039;None&#039;
# or
DCS_SESSION_COOKIE_SAMESITE = &#039;None&#039;ولی این روش کار نکرد برای من خب با جستجوی زیاد به کتابخانه‌ایی رسیدم با نام  https://pypi.org/project/django-samesite-none/ این کتابخانه  تغییر MIDDLEWARE باعث می‌گردد  تا جنگو ۲ از خاصیت  None = samesite   بهره ببرد،خب فقط کتابخانه را نصب کنید.pip install django-samesite-noneدر مرحله بعد MIDDLEWARE را اضافه کنید هورااا مشکل حل شد:).MIDDLEWARE = [
    &amp;quotdjango_samesite_none.middleware.SameSiteNoneMiddleware&amp;quot,
    ...
]</description>
                <category>علی یوسفیان</category>
                <author>علی یوسفیان</author>
                <pubDate>Tue, 17 Nov 2020 00:36:50 +0330</pubDate>
            </item>
            </channel>
</rss>