<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی</title>
        <link>https://virgool.io/feed/@Novo</link>
        <description>یک فرد آزاد از خودش . github.com/bigsbug</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:42:58</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/31434/avatar/1C4LLE.png?height=120&amp;width=120</url>
            <title>علی</title>
            <link>https://virgool.io/@Novo</link>
        </image>

                    <item>
                <title>تقابل مفاهیم SOLID روی کدمون ؟؟</title>
                <link>https://virgool.io/codenevis/solid-vs-us-vr5rbycsqhbz</link>
                <description>مروری بر مفاهیم OOP و تفاوت هایکه پیروی کردن از اونها روی یک کد ایجاد میکنه.چهار مفهوم میخوایم برسی بکنیم- Abstraction (Abstract)- Concretion (Concrete)- Instantiation (Instance)- Injection  (Dependency Injection)که هر چهار مورد رابطه مستقیمی برهم دارن که اگه این موارد رعایت بکنیم یک کد خیلی خوب و با کیفیتی خواهیم داشت طبق نموداری که براتون کشیدمبرای اینکه بتونیم این مفاهیم بصورت منسجم توضیح بدیم بیاید یک بازی ساده فرض کنیم تو این بازی ساده ما دوتا موجودیت داریم- Player (بازیکن):این موجودیت نشون دهنده بازیکنان بازی هستش که می‌تونن یا ربات یا انسان باشن.این موجودیت ویژگی‌هایی مثل اسم (name) و نوع (type) داره.پلیر می‌تونه وظایفی مثل حرکت کردن، ضربه و... انجام بده براساس نوعی که انتخاب شده براش.- Playground (زمین بازی):این موجودیت نشون دهنده محیط بازی هستش که دوتا Player میتونن داخلش بازی بکنن.زمین بازی مسئول مدیریت بازی و انجام اعمال مربوط بهش هستش، مثل شروع بازی، اتمام بازی و...خب این پایه ترین حالت ممکن هستش درواقع تمام دردسر ها از اینجایی شروع میشن که شما چطور این دوتا قراره به هم وصل و پیاده سازی بکنید و اینجا جای هستش که مفاهیمی که بالا تر اشاره کردم در مقابل هم  یا کنار هم قرار میگیرن.ولی قبل اینکه چطور براساس این مفاهیم کد خودمون بنویسیم بیاید ببینیم چطور این مفاهیم در مقابل و یا کنار هم قرار میگیرن.Concretion VS Abstraction:این دو مفهوم خیلی باهم رابطه مستقیمی دارن و زیاده روی کردن تو هرکدومش میتونه معایب خودش داشته باشه ولی یک نقل قول معروف داریم که میگه : Depend on abstractions, not on concretionsفارسیش میشه: &quot;بر انتزاعات وابستگی داشته باشید، نه به تجسم‌ها.&quot;در واقع چیزیکه این کوت میخواد بهمون برسونه این هستش طوری کد نزنیم که با یک تغییر کوچیک یا بزرگ کل سیستم از کار بیوفته و کدمون مثل سنگ سفت و غیرانعطاف پذیر باشه, و نیاز باشه خیلی جاها اپدیت بکنیم. زیاد نمیخوام درمورد این موضوع بپردازم چون قبلا درموردش چندتا مقاله نوشتم و با جزییات درموردش بحث شده که بالاتر میتونید پیدا بکنیدشون قبل از ادامه دادن.[لینک مقاله]Instantiation VS  Injection:منظور از instance و inject چیه ؟ در واقع توی بازی که داشتیم ما یک Playground داشتیم که نیاز به دوتا Player داشت خب کاریکه این Playground میکنه این هستش که میاد دوتا instance از Player داخل خودش ایجاد میکنه و ازشون استفاده میکنه و موقع ساخت Playground از ما میخواد در کنار اطلاعاتی که برای ساخت خودش نیازه اطلاعات دوتا  player هم بهش پاس بدیم تا  بتونه ازشون Instance بسازه و استفاده بکنه.  تو اکثر موارد اینکار بشدت غیرحرفه ای هستش و باعث میشه کد و سیستمی که اینطوری طراحی شده بشدت توسعه پذیری  و تست نویسی براش مشکل و  تو مواردی هم غیر ممکن باشه.فرض کنید Player  های ما از  فردا یک ورودی جدید به  اسم color که رنگ پلیر ما مشخص میکنه میگیره, خب  اینجا  نیازه تمام کد بروزرسانی بکنیم و حتی  خود Playground هم اپدیت بشه, در صورتیکه اگه  از Injection استفاده میشد هیچکدوم از این مشکلات ایجاد نمیشد و خب چطور  ؟ خیلی ساده ما بجای اینکه داخل Playground بیایم instance از پلیر های خودمون ایجاد بکنیم  میایم  instance هایکه بیرون از Playground ساختم به عنوان ورودی بهش پاس میدیم,و دیگه Playground هیچ مسئولیتی برای ایجاد Player  نداره.و اگه فردا نیاز بود برای Playground تست نویسی هم بشه ما میتونیم بهش Player های فیک بدیم و  درگیر ایجاد Instance از Player نشیم, و  حتی باگ پذیریی کد هم بشدت پایین میاد و Playground فقط یک کار میکنه. میتونیم درمورش خیلی  بیشتر صحبت کنیم ولی برای تاپیک الا همینثقدر کافیه.در واقع تو  پاراگراف بالا به خیلی از  موارد  SOLID  اشاره شدش و خوندنش بی  نصیب نیست.حالا  که یک تعریف مختصر از مفاهیمی که مهمن داریم بیاید روی  نمودار  ببینیم کدمون چطور میشه و انالیزش بکنیم. بیاید اول از سمی ترین حالت ممکن شروع  کنیمConcretion ➕ Instantiation:Instantiation: خب همینطور که میبینید ما موقع ساخت Playground اطلاعات دوتا Player هم میگیریم تا بتونیم توی ابجکت ساخته شده دوتا instance از پلیر هامون با اون اطلاعات بسازیم و توی Playground مون  استفاده کنیم ازشپ ن: تصور کنید از فردا نیازه سه تا Player داشته باشیم :)Concretion: خب از اونطورف هم Player میبینید که توی بدنه اش اومده و شرط گذاشته که نوعش چیه و براساس اون الگوریتم های متفاوت  اجرا بکنه مثلا برای نوع انسان باید منتظر ورودی از سمت کاربر  باشه  ولی برای نوع ربات نیازی  به اینکار نیست و سریع میتونیم حرکت بعدی محاسبه کنیمپ ن: تصور کنید که Playground هم براساس نوع پلیر یکسری  شرط های دارهConcretion➕Injection:خب توی این روش میبنید که ما بجای  اینکه داخل خود Playground بیایم instance های پلیرهامونو بسازیم اومدیم و بیرون از اون ساختم, و مسئولیت ساخت پلیر ها دیگه Playground برعهده نداره, و ما فقط پلیر های ساخته شده بهش پاس میدیم موقع ساخت و اگه تعداد پلیر ها بیشتر بشه فقط نیازه که instance های بیشتری بسازیم و بهش پاس بدیم, در همین حین ویژگی های جالبی مثل اشتراک گذاشتن Player ها بین اجزای مختلف کد داریم مثلا به چند Playground متفاوت میتونیم پلیر های یکسانی بفرستیم, یا مثلا موقع تست نوشتن برای Playground های خودمون یا اگه موجودیتی به اسم Team داشتیم که نیاز به دریافت پلیر ها برای ساخت تیم داشت ازشون استفاده بکنیم.دیدید که مشکل Instantiation چطور با تکنیک Injection حل شد و ویژگی های  خوبی به کدمون اضافه کرد ولی ما هنوز  مشکل  Concretion داریمConcretion➕ Abstraction:خب اگه به  تصویر نگاه کنید دیگه ما توی Player شرطی به شکل اگه نوع ربات بود اینکار بکن یا نوع انسان بود اینکار بکن نداریم, بلکه با abstract کردن Player و ارث بری از Player ما دو نوع مختلف پلیر که هرکدوم الگوریتم ها و حتی پراپرتی های متفاوتی, مثل میزان سلامتی سرعت و قدرت میتونن داشته باشن ساختیم, و موقع ساخت ما نوع پلیر به عنوان ورودی دریافت نمیکنیم بلکه از ابجکتی که اون نوع میسازه instance ایجاد میکنیم این یکی از مهمترین و پایه ترین ويژگی های هستش که توی OOP داریم و قبلا چندین مقاله اموزشی درموردش نوشتم که بالاتر  میتونید پیدا بکنید.[لینک مقاله]ولی همینطور که میبنید Playground اوقات سختی داره میگذرونه چون الا باید نه تنها اطلاعات ساخت Player ها موقع ساختش دریافت بکنه بلکه باید با توجه به نوع پلیر که براش ارسال کردیم از کلاس درست برای ساخت instance استفاده بکنه, که خودش باعث ایجاد باگ و افزایش هزینه نگهداری ازش میشه و اگه فردا پلیر نوع GOD اضافه بکنیم به سیستم باید Playground هم اپدیت بکنیم و همه چیز پیچیده تر میشهInjection ➕ Abstraction:خب حالا چی میشه ما همزمان هم از تکنیک injection و abstraction استفاده کنیم ؟؟ این میشه که ما هم خدا داریم و هم خرما :)خب توی تصویر میبینیم که مشکل ما بشدت ساده شده و دیگه خبری از اون همه شرط و ورودی موقع ساخت نیست, و حتی Playground میتونه با هر نوع Player بدون اپدیت و دستکاری کردنش کار بکنه, و تنها شرطش هم این هستش که پلیری که بهش میدید از Player ارث بری یا نوعش Player باشه.و اگه فردا پلیر God به سیستم اضافه کردید اصلا نیازی به اپدیت کردن Playground ندارید در کنار تمام فوایدی که قبلا درموردش صحبت کردیمو این ترکیب وقتی استفاده میکنیم به این کوت میرسیمProgram to interfaces NOT implementationsنتیجه گیری:اگه همه این مواردی که صحبت کردیم درموردش روی نمودار بزاریم با این تصویر روبه رو میشیمکانال تلگرامی من : لینکایدی کانال: EXPLAIN_TO_YOURSELF</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Fri, 26 Apr 2024 12:41:56 +0330</pubDate>
            </item>
                    <item>
                <title>چطور به یک یادگیرنده سریع و منعطف تبدیل بشیم | مقاله ای از هاروارد</title>
                <link>https://virgool.io/@Novo/%DA%86%D8%B7%D9%88%D8%B1-%D8%A8%D9%87-%DB%8C%DA%A9-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%D9%86%D8%AF%D9%87-%D8%B3%D8%B1%DB%8C%D8%B9-%D9%88-%D9%85%D9%86%D8%B9%D8%B7%D9%81-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%A8%D8%B4%DB%8C%D9%85-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2%D9%87%D8%A7%D8%B1%D9%88%D8%A7%D8%B1%D8%AF-wxd4txf0opnr</link>
                <description>چطور به یک یادگیرنده سریع و منعطف تبدیل بشیم؟خلاصه:یادگیری سریع و منعطف - مهارتی برای یادگیری از تجربیاتتان بطوریکه شما میتوانید با آن در موقعیت های جدید به موفقیت برسید - مهارتی که بسیار خواستنی است برای ایجاد نیرو کاری سریع, منعطف و توانمند. برای مثال, یک مدیر با مهارت یادگیری سریع و منعطف میتواند با موفقیت استعداد های خودش را در بخش های مختلف سازمان ارایه دهد. و افرادی با توانایی بالا در مهارت یادگیری سریع و منعطف تبدیل به اشخاص مورد اعتماد و اصلی برای پروژه ها و پست های پراهمیت و تاثیرگذار تبدیل میشوند. در این مقاله, نویسنده برسی میکند منظور از بودن یک یادگیرنده سریع و منعطف چیست و چندین استراتژی برای افزایش توانای شما در این مهارت معرفی میکند.یادگیری سریع و منعطف مهارتی است برای یادگیری و بهرمندی از تجارب شما بطوریکه به شما در کسب موفقیت در موقعیت های جدید کمک میکند، این به معنای دانستن نحوه انجام کار هایی است که تاکنون آن را انجام نداده اید. مهارتی که به طور روز افزون به اهمیت آن افزوده می شود، زیرا حرفه های ناشناخته و پیچیده به تدریج برای هر فرد به یک واقعیت تبدیل می‌شوند.یادگیرندگان چابک با اعتماد بنفس کامل به تغییرات در نقش ها و در موقعیت های دارای عدم اطمینان, حرفه خودشان نزدیک میشوند, زیرا با دانستن آنکه بینش و استعداد آنها قرار است به آنها برای رسیدن به موفقیت در موقعیت ها جدید کمک کند. تحقیقات نشان داده است که یادگیری سریع و منعطف یک نشانه مهم از اشخاصی با پتانسیل موفقیت در نقش ها شغلی فعلی و آینده آنان است. در نتیجه, فراگیران چابک آهنربا هایی برای جذب فرصت های بیشتر, و موقعیت های یادگیری و احتمالات بیشتر هستند.برای سازمانها, یادگیری چابک مهارتی بسیار خواستنی برای ایجاد نیرو کاری سریع, منعطف و توانمند است.  برای مثال, یک مدیر با مهارت یادگیری سریع و منعطف میتواند با موفقیت استعداد های خودش را در بخش های مختلف سازمان ارایه دهد. و افرادی با توانایی بالا دریادگیری چابک تبدیل به اشخاص مورد اعتماد و اصلی برای پروژه ها و پست های پراهمیت و تاثیرگذار تبدیل میشوند. در این مقاله, ما معنی بودن یک یادگیرنده چابک بودن را برسی خواهیم کرد  و چندین استراتژی برای افزایش توانای شما در این مهارت معرفی میکنم.زیربنای مجموعه مهارت یادگیری چابکدر اینجا سه بلوک سازنده مهارت یادگیری چابک داریم:حرکت به سمت نوآورییک یادگیرنده چابک با موفقیت میتواند به سمت دو نوع از نوآوری حرکت کند: کار بر روی چیزهای پیچیده بدون وجود هیچ راهنمای و موقعیت هایکه هیچ تجربه ای ندارد. در زمانیکه بعضی از افراد درحال دست پنجه نرم کردن با سطوح بالای از ابهاماتی هستنند که نوآوری ایجاد میکند, یادگیرنده های چابک از موقعیت بهرمیبرند و به موفقیت میرسند در شرایطی که بقیه افراد ممکن است  متوقف شوندرک دیگرانیادگیرندگان چابک در درک و همدلی و حتی پیش بینی دیدگاه های مختلف ماهر هستند. با گذاشتن خود بجای دیگران, انها میتوانند سرنخ هارا بهم وصل کنند و تضاد و مشکلات احتمالی را پیدا کنند, و با فاصله گرفتن تصویر بزگتر را ببینند. بجای انکه منتظر بمانند تا دیگان به آنها دیدگاه های مختلف را بگویند یا اینکه چیزی کار نمیکند, یادگیرندگان چابک بدنبال نظرات مختلف میگردند و در رویکرد خود با ذهنی باز به این نظرات نگاه میکنند.خودآگاهییادگیرندگان چابک درای خود آگاهی بالای هستند. انها تاثرات که دارند را درک میکنند و بدنبال بینش و راهی برای بهبود بخشیدن به آن هستند. آنها درمورد میزان حمایتی که نیاز دارند دقیق هستند و به اندازه کافی اعتماد بنفس برای درخواست کمک از دیگران برای انجام بهترین کار خود دارند. انها یادگیری را به عنوان یک عمل ثابت درنظر دارند و بطور فعال درمورد دنیا اطراف خودشان کنجکاو هستند, انها از دانش, تجربیات  و منابع دیگران استفاده میکنند.مهارت یادگیری چابک خودرا ارزیابی کنیداز خودتان سوالات زیر را  بپرسید برای درک بهتری از وضعیت فعلی مهارت یادگیری چابک خود:حرکت به سمت نوآوری۱. هر چند وقت برروی چیزی برای اولین بار کار میکنم ؟۲. چه مدت زمانی را در منقطه غیر امن خود ( انجام چیزای هایکه بنظرم &quot;ترسناک&quot; هستند) در سه ماه گذشته گذرانده ام ؟۳. چگونه به عوض شدن اولیت ها و برنامه ها بدون اطلاع قبلی پاسخ نشان میدهم؟درک دیگران۱. چه مقدار زمانی برای مکالمه ای برای یادگیری درباره دیگران و چیزا هایکه درک محدودی از ان دارم میگذرانم ؟۲. چه مقدار در بحث های پر چالش, زمانیکه دیدگاه های مختلفی داریم مطمعن هستم ؟۳. چه مقدار تنوع شناختی (به عبارت دیگر، افرادی که دارای تجارب، دیدگاه‌ها و روش‌های متنوعی هستند) در جامعه حرفه ای من وجود دارد؟خودآگاهی۱. چه احساسی درمورد درخواست کمک برای رسیدن به یک موفقیت دارم ؟۲. نقات قوت من در کدام قسمت از کارهايی که انجام می‌دهم، بیشترین تأثیر را دارند؟۳. هرچند وقت یکبار درخواست بازخورد درمورد چیزیکه به خوبی انجام داده ام دارم, و نحوه بهتر شدن تاثر گذاریم در آن را میپرسم ؟چگونه چابکی یادگیری خود را افزایش دهیماین استراتژی ها را امتحان کنید برای ساخت زیربنانی برای چابکی یادگیری خود:حرکت به سمت نوآورینوآوری هرگز آسان نیست, همانطور که ذهن های ما ترجیح میدهد همان کار امنی را بکند که قبلا انجام میداده است.همچنین این میتواند سخت باشد تا از توانایی های خود با موفقیت در موقعیت های استفاده کنیم که به آنها حس آشنایی نداریم. ما بر روی آنچه که می‌دانیم به عنوان منبع ارزش خود حساب می‌کنیم، به جای اینکه ببینیم چگونه می‌توانیم دانش خود را به بهترین شکل در سازمان هایمان یا به عبارتی در بخش های مختلفی به کار گیریم. بهبود یافتن در کار با انتقال دانش خود در شرایط جدید، به عنوان یک شتاب‌دهنده برای چابکی یادگیری عمل می‌کند. این بدان معناست که می‌توانید تأثیر مثبتی بر روی افراد و مکان‌های بیشتری بگذارید.با ‍&quot;جانشینی&quot; بجای همکارتان یا مدیرتان در جلساتی که شما در موضوع آن متخصص نیستید شروع کنید. این یک راه مطمعن برای بدست آوردن یک ذهنیت اولیه است, درجاییکه شما هیچ دانشی ندارید.سپس, سعی کیند کارهای جسورانه خود را شناسایی کنید که به دلیل فشار زمان یا افراد حس ناشخوایندی میدهد به شما. برای مثال, شاید شما سعی دارید کاری را در یک ماه انجام بدهید درصورتیکه بصورت معمول دو برابر آن زمان میگیرد. تحربیات و کارهای  این چنینی زیستگاه طبیعی برای توسعه مهارت یادگیری چابک است,زیرا می‌توانند به عنوان یک نیروی محرکه برای یادگیری چابک عمل کننددرک دیگراناین آسان است تا تبدیل به یک کوته بین شویم بدلیل کارهای روزمره شغلمان, با تمرکز خیلی زیاد بر روی دنیا و کار خودمان, ما فراموش میکنیم چه چیزی اهمیت دارد برای بقیه اعضا تیم مان یا بخش های مختلف سازمانمان. این به معنی است ما اطلاعات ارزشمندی را از دست میدهیم که باعث افزایش بینشی میشود که یادگیری چابک ما را افزایش میدهد.با تناسب بر روی میزان گوش دادن به شنیدن خودمان شروع کنیم. زمانیکه شما صحبت میکنید, شما خیلی کم یادمیگیرید - شما درحال گفتن به بقیه افراد هستید که چه چیزی های میدانید. با افزایش میزان گوش دادنمان و کم کردن میزان مقدار صحبت کردنمان, ما یک موقعیت خوب و آسان برای یادگیریمان ایجاد میکنیم. قبل از جلسه, مقدار نسبیت مورد نظر گوش دادنتان با صجبت کردنتان را یاداشت کنید (برای مثال۴۰٪ - ۶۰٪) سپس سعی کنید ببینید چقدر به آن عمل کرده اید بعد از جلسه. گوش دادن یکی از توانایی های است که ما دوست داریم مقدار توانایی خود را بیشتر از آن چیزیکه است ارزیابی کنیم, پس غافلگیر نشونید اگر در جایی نیستید که انتظارش را داشته اید. حتی تمایل به گوش دادن بیشتر شما را به مسیر درست هدایت میکند.سپس, سعی کنید یک موقعیت برای همدلی ایجاد کنید, یک موقعیت برای همدلی به معنای قرار دادن خودتان بجای شخص موردنظر و از دید اون نگریستن به دنیایشان است.این فراتر از فقط وقت گذراندن با شخصی از تیم متفاوتی است و این بیشتر شبیه وقت گذراندن بصورت معنی داری است بطوریکه باعث شود تا درک شما از فرصت‌ها و موانع آن‌ها را سریعتر افزایش پیدا کند. شما ممکن است به مدت یک ماه در جلسات هفتگیشان شرکت کنید یا بصورت کمرنگ چند روز در پروژه هایشان باشید. کار شما این است در طول این تجربه موقعیت همدلی گوش فرادهید, تجربه کنید و یادبگیرید. این ممکن است کاری که نیاز به سخت کوشی و سرمایه گذاری زیاد باشد ولی آما بشدت سودآوری است که باعث افزایش توانای شما در یادگیری چابک میشود.خودآگاهیچیزی که معمولا باعث جلوگیری از توسعه خودآگاهی میشود ضعف در انگیزه برای توسعه این مهارت نیست, بلکه این ضعف در تشخیص واضح این است که ما چه کاری را نیاز داریم تا به شکل متفاوتی انجام دهیم برای بیشتر خود آگاه بودن. ایجاد عاداتی برای تمرین کارهای ساده ای که باعث بیشتر خودآگاه شدن میشود می تواند تفاوت قابل توجهی در افزایش مهارت در یادگیری چابک ایجاد کند.با این شروع  کنید که چگونه دوست دارید ظاهر شوید در موقعیت هایکه نیاز به مهارت یادگیری چابک دارد. آن چند حرفی که دوست دارید بقیه افراد در همان جلسات و ان لحظات  درمورد شما بقیه بگویند چیست ؟ شاید کلماتی مانند با اعتماد بنفس, خونسرد, باهوش و استراتژیک باشد. این به شما یک نقطه شروع برای هدفتان(مثال: چطور دوست دارید بقیه شما را ببینند) میدهد. سپس درخواست بازخورد بکنید - به عنوان مثال &quot;چگونه اثر من را توصیف می‌کنید؟&quot; - تا ببینید آیا هدف شما و اثر شما با هم تداخل دارند یا خیر. شناسایی هر گونه اختلاف بین هدف و اثر شما به شما کمک می‌کند تا در مورد اقداماتی که برای بهبود نیاز دارید، واضح باشند برایتان.سپس، سعی کنید به سرعت یاد بگیرید. شرایط مختلف و دشوار زمان مناسبی برای توسعه چابکی یادگیری هستند. در این زمان‌های پر چالش, با این سه سوال  یک نقشه برای ذهنیت یادگیری سریع ایجاد کنید:۱. چه نقاط قوتی امروز بیشتر برایم مفید بوده است ؟۲. کی و چه دانشی به من کمک کرده است تا موفق شوم؟۳. چطور میتوانم تاثیر خودم را در اینچنین موقعیت های بهتر بکنم ؟این نقشه ذهنی به شما اطلاعات مفیدی درمورد توسعه خودتان میدهد و میتواند همچنتین به عنوان یک راهنما برای مکالماتی با مدیر یا مربیتان درمورد اینکه چطور میتوانید مهارت یادگیر چابک خود را حتی بهتر بکنید باشد.یادگیری چابک یک مهارت اساسی برای اشخاص ویک توانایی مهم برای سازمان ها است, اما این مهارت تصادفی یادگرفته نمیشود. برای افزایش مهارت چابکی یادگیری خود, شما نیاز است آگاه باشید از موقعیت فعلی خود و چه اقداماتی به شما کمک میکند.ما این را می توانیم روشی برای ایجاد یک &quot;نقشه برای یادگیری سریع و منعطف&quot; بنامیم، جایی که شما مدنظر قرار داده‌اید که به صورت هوشمندانه در جهت افزایش چابکی خود و نتیجه از آن، تأثیرگذاری خود را در تیم و سازمان خود افزایش دهید.</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sun, 24 Dec 2023 13:08:30 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش رمزنگاری RSA  و پیاده سازی در Python</title>
                <link>https://virgool.io/@Novo/rsa-encryption-ao1poasym4cf</link>
                <description>برای این آموزش هیچ پیش نیازی وجود نداره و از هیچ لایبری خاصی استفاده نمیشه و همه چی از ۰ تا ۱۰۰ گفته و پیاده سازی میشه و مهمترین نکته کسایی هم که از ریاضی بدشون میاد هم میتونن کامل بخونن و درک بکنن چون نیازی به ریاضیات پیشرفته و درک عمیقی نداره و ریاضیات نسبتا متوسط هم جوابه .RSAاصلا RSA چیه‌ ؟بصورت معمولی بگیم RSA یک روزش رمزنگاری نا متقارن (asymmetric) هستش که خیلی استفاده ازش رایج هستش و دوتا کلید داره یک کلید خصوصی برای رمزگشایی (decryption) و یک کلید عمومی برای رمزنگاری (encryption) این تعریف برای همه الگوریتم های رمزنگاری نا متقارن یکی هستش و در سال 1978 این الگوریتم RSA درست شدش, خب اینا زیاد مهم نیستش بیایم یخورده شفافتر بکنیم منظورمون از کلید های خصوصی و عمومی.خب بیاید فرض کنیم شما بخاطر کرونا نمیتونید برید به محل کارتون و نوع کاری هم که دارید خیلی حساسه و اطلاعات حساسی از مشتری هاتون دیافت میکنید و یا ارسال میکنید و هیچکس بجز خودتون و مشتری نباید ازشون اگاه بشه ولی مشکل اینجاست که بخاطر حساسیت زیاد نه میتونید این اطلاعات از طریق اینترنت رد و بدل کنید و نه از طریق پست چون حتی ممکنه خود پستچی نامه بخونه و یا حتی گمش بکنه یا بدزدنش و اگه کسی نامه باز بکنه اطلاعات مهمی میبینه که نباید میدید و خطرات زیادی واسه مشتری ایجاد میشه یا حتی واسه خودتون . خب چون حساسیت موضوع درک کردید تصمیم گرفتید یکسری جعبه برای رد و بدل کردن اطلاعات بسازید و این جعبه ها یکسری خصوصیات جالب دارن اول اینکه کلید باز کردنشون فقط و فقط دست خودتون هستش و خصوصیت دیگش هم این هستش بعد از اینکه مشتری اطلاعات خودشو تو جعبه گذاشت جعبه قفل میشه و دیگه حتی خود مشتری هم به اطلاعات داخل جعبه دسترسی نداره , پس حتی اگه این جعبه ها موقع حمل و نقل گم بشن و یا کسی سعی کنه بزور اطلاعات داخل جعبه برداره کارش ناموفق میمونه چون نه رمز جعبه بلد و نه این جعبه های جالب قابل تخریب هستن خب این RSA هم شبیه همین هستش یکسری کلید رمزنگاری بصورت عمومی ( همون جعبه ها ) به همه میده که تا بشه باهاش اطلاعات خودشونو موقع ارسال به شما امن نگه دارن  و بعد اتمام کار بدون داشتن کلید خصوصی (کلید جعبه) حتی خودتونم نمیتونید به اطلاعات رمزنگاری شده دسترسی داشته باشید خب این کلیت ماجرا بودش حالا بریم ببینیم چطور اصلا پیاده سازی میشه.چطوری کاری میکنه RSA ؟در واقع RSA بر پایه اعداد اول کار میکنه حالا عداد اول چی هستن محض یادآوری Prime numbersعدادی هستن که بجز 1  و به خودشون به هیچ عدد دیگه موقع تقسیم کردن عدد صحیح نمیدن مثلا 7 فرض کنید به هیچ عددی بجز خودش و 1 موقع تقسیم عدد صحیحی نمیده مثلا  3.5 = 2 / 7 و یا به زبان دیگه اصلا نمیشه با ضرب کردن دو عدد صحیح دیگه به اون رسید مثلا برای رسیدن به 7 باید عدد 2 * 3.5 بشه تا نتیجه 7 بدست بیاد یا به طریق دیگه هیچ فاکتوری (عاملی) بجز خودش و 1 ندارهخب ما برای شروع نیاز داریم دوتا عدد اول انتخاب بکنیم و به این دوتا اعدد اول میگیم  a  و b a = 7 b = 5 نکته مهم : بین اعداد انتخابی عدد 2  نباشه و همینطور هر دو عدد یکسان نباشن اگه هرکدوم از این دو شرط نقص بشن الگوریتم خراب میشهنکته خیلی مهمتر : سعی کنید اگر نیاز نیستش اعداد اول کوچیک انتخاب نکنید دلیلشو اخر مقاله میگمو هیمنطور نیاز داریم تا حاصل ضرب این دوتا اعدد اول یکجا ذخیره کنیم  خب اینجا تو متغیر  c ذخیره میکنیمشc = a * bو به یک متغیر phi برای ذخیره تعداد اعدادی که تو بازه 1 تا عدد c هستن و نسبت به c متباین یا کوپرایم (coprime) باشن نیاز داریم. اصلا کوپرایم چیه ؟Prime numbers 13 and 4زمانی میگیم یک عدد کوپرایم عدد دیگه هستش که بزرگترین مضرب مشترک(ب م م ) اون دو عدد 1 باشه و یا هیچ فاکتور (عاملی) بزرگتری بجز 1 بین اون دو عدد مشترک نباشه مثلا.آیا عدد 13 کوپرایم عدد 4  هستش ؟  اره ولی چرا؟ چون فاکتور های عدد 13 اعداد 1 , 13  هستن و فاکتور های عدد 4 عداد 1, 4, 2  هستن و بزرگترین عدد مشترک بین فاکتور ها عدد ‍1  هستشآیا عدد 11 کوپرایم عدد 10  هستش ؟ بله چون فاکتور های عدد 11  اعداد 1, 11 هستن و فاکتورهای ‍10  اعداد 1, 2, 5, 10 و بزرگترین عدد مشترکشون عدد 1 هستش آیا عدد 13 کوپرایم عدد 26 هستش ؟ نه چون فاکتور های عدد 13 اعداد 1, 13  هستن و فاکتور های عدد 26  اعداد 1, 2, 13, 26 و بزرگترین فاکتور مشترک عدد 13  هستش درصورتیکه باید عدد 1 برای کوپرایم شدن میشدشحالا بیایم a , b, c, phi محاسبه کنیم با فرض اینکه ما دو عدد اول خودمونرو اعداد 2 و 7 انتخاب کردیمa = 5  b =7 c = a * b = 35خب بریم ببینیم تعداد کوپرایم بین رنج 1 تا c یعنی 1 تا 35 چندتا هستن نسبت به عدد c برای سادگی بجای گفتن ایا فلان عدد کوپرایم فلان عدد هستش از علامت Φ (فی) استفاده میکنیم. اینم یک سایت خوب برای اینکه بفهمیم ایا یک عدد کوپرایم عدد دیگه هستش یا نه  code exampleکوپرایم های درست :    1 Φ 35 : &quot;T&quot; |   2 Φ 35 : &quot;T&quot; |    3 Φ 35 : &quot;T&quot; |   4 Φ 35 : &quot;T&quot; |   6 Φ 35 : &quot;T&quot; |    8 Φ 35 : &quot;T&quot; |  9  Φ 35 : &quot;T&quot; 11 Φ 35 : &quot;T&quot; | 12 Φ 35 : &quot;T&quot; | 13 Φ 35 : &quot;T&quot; | 16 Φ 35 : &quot;T&quot; | 17 Φ 35 : &quot;T&quot; | 18 Φ 35 : &quot;T&quot; | 19 Φ 35 : &quot;T&quot; | 22 Φ 35 : &quot;T&quot; | 23 Φ 35 : &quot;T&quot; | 24 Φ 35 : &quot;T&quot; | 26 Φ 35 : &quot;T&quot; | 27 Φ 35 : &quot;T&quot; | 29 Φ 35 : &quot;T&quot; | 31 Φ 35 : &quot;T&quot; | 32 Φ 35 : &quot;T&quot; | 33 Φ 35 : &quot;T&quot; | 34 Φ 35 : &quot;T&quot;کوپرایم های نادرست :5 Φ 35 : &quot;F&quot; | 7 Φ 35 : &quot;F&quot; | 10 Φ 35 : &quot;F&quot; | 14 Φ 35 : &quot;F&quot; | 15 Φ 35 : &quot;F&quot; | 20 Φ 35 : &quot;F&quot; | 21 Φ 35 : &quot;F&quot; | 25 Φ 35 : &quot;F&quot; | 28 Φ 35 : &quot;F&quot; | 30 Φ 35 : &quot;F&quot; | 24و برای اینکه اینا دستی هم برسی بکنید میتونید از سایت بالا استفاده کنید. خب تعداد کل کوپرایم های ها ما شدش 24 پسphi = 24یک راه ساده برای بدست اوردن phi استفاده از فرمول زیر هستش phi = (a-1) * (b-1)phi = (5-1) * (7-1) = 24ساخت کلید های عمومی و خصوصیKeysخب الا تمام چیزایکه برای ساخت کلید های خصوصی و عمومی نیازه داریم یعنی c, phi. برای ساخت کلید عمومی رمزنگاری (Encryption) ما باید کوپرایمی برای phi پیدا بکنیم که از 2 بزرگتر و از عدد  phi  کوچیکتر باشه که همزمان کوپرایم عدد c هم باشه2 &lt;  E &lt; phi2 &lt; E &lt; 24 code example  خب کوپرایمی که بین این بازه هستش اعدد 11, 13, 17, 19, 23 هستن و اگه رنج بزرگتری داشتیم میتونستیم چندین کوپرایم دیگه هم داشته باشیم برای اسونی کوچیکترین عدد پیدا شده انتخاب میکنیم یعنی 11 و ازش برای ساخت کلید خصوصی استفاده میکنیممثال : فاکتور های عدد 11  اعداد 1, 11  و فاکتور های عدد 24  اعداد 1, 2, 3, 4, 6, 8, 12, 24 چون بزرگترین مضرب مشترک عدد 1 هستش کوپرایم هستن برای عدد 35 یا همون c هم کوپرایم هم محسوب میشن چون بزرگترین مضرب مشترک یا همون ب م م اونها عدد 1 هستشخب تا اینجا ما داریمa = 5b = 7c = 35phi = 24e = 11خب الا وقتشه کلید خصوصی رمزگشایی(Decryption) بسازیم یا پیدا بکنیم فرمولی که باهاش کلید خصوصی بدست میاریم به شکل زیر هستش (D * E) % phi = 1(D * 11) % 24 = 1به زبون ساده ما باید یک عددی (D) پیدا بکنیم که حاصل ضربش با 11 (E) , اگه تقسیم بر 24 (phi) بکنیم مقدار باقی ماندش مساوی با 1 باشهچندتا نکته : رنجی که ما دنبال عدد درست برای D هستیم به این صورت محاسبه میشه از phi+1 تا phi+n که این n میتونه هر چقدر میخواد بزرگ باشه من اینجا 1000 انتخاب کردمانجام این عملیات ها با دست و یا روی برگه خیلی تاقت فرسا هستش واسه همین این محاسبات با کامیپوتر انجام میدیمcode exampleما میتوینم به تعداد خیلی زیادی کلید داشته باشیم و در اخر از بین گزینه ها یکی انتخاب میکنیم و ادامه میدیم مثلا برای جواب بالا ما کلید های خصوصی (D) ... 35, 59, 83, 107 , داریم که برای آسونی اینجا کوچیکترین انتخاب میکنیمخب عدد صحیح برای D ما اعدد  ... 35, 59, 83, 107 هستن میتونیم بصورت دلخواه یکی انتخاب کنیم پس الا ما این چیزا داریمa = 5b = 7c = 35phi = 24e = 11d = 59خب کلید ها از دو بخش تشکیل میشن برای کلید عمومی (e , c) و برای کلید خصوصی (d , c) و در این صورت کلید های ما اینا هستنکلید عمومی رمزنگاری (E) : (11, 35)کلید خصوصی رمزگشایی (D) : (59, 35)خب تبریک تا اینجا نود درصد راه رفتیم فقط مونده بفهمیم چطور باید ازشون استفاده کنیم :))اینکار هم خیلی ساده دوتا مرحله داره مرحل اول تبدیل دیتا به معادل کد ascii اونا هستش اگه نیاز بودش و مرحله بعد بیایم تک تک اونارو با یک فرمول رمزنگاری یا رمز گشایی کنیم مراحل رمز نگاری :اول میایم یکسری عدد معمولی رمزنگاری میکنیم مثلا24 , 32 , 11الا تک تک این عدد هارو به توان  E  که مقدارش 11 هستش میرسونیم و بعد میزان باقی ماندش بر عدد c بدست میاریمcode example(number) ** e % c(11 ** 11 ) % 35 : 16(24 ** 11 ) % 35 : 19(32  ** 11 ) % 35 : 23خب حالا بیاید همینو رمزگشایی کنیممراحل رمزگشایی :خب دیتای که میخوایم رمزگشایی کنیم همون دیتای هستش که مرحله قبل با کلید عمومی رمزنگاریش کردیم یعنی encrypted_data :  16, 23, 19خب برای رمز گشایی از فرمول زیر استفاده میکنیم(encrypted_data) ** d % ccode example(16 ** 59 ) % 35 : 11(19 ** 59 ) % 35 : 24(23 ** 59 ) % 35: 32خب دیدیم که یک الگوریتم رمزنگاری نامتقارن چیکار میکنه و تنها کاری که میکنه این هستش که میتونه یک عددی به عدد دیگه تبدیل بکنه و باز همونو برگردونه به حالت اولیش باتوجه یک یک فرمول و چند عدد :)خب یادتونه گفتم اگه نیازی نیستش عداد اول کوچیک انتخاب نکنید ؟ الا میبینیم چرا اینکارو باید بکنیم خب بیاید عدد های 35 و 36 و 100 رمزنگاری کنیم و باز رمزگشایی کنیمencrypt : 35   ** 11 % 35 = 0 36   ** 11 % 35 = 1 100 ** 11 % 35 = 25decrypt : 0 ** 59 % 35 = 0 1 ** 59 % 35 = 1 25 ** 59 % 35 = 30خب دقت کردید؟ الگوریتم کار نمیکنه اصلا جالا دلیلش چیه ؟ بخاطر اینکه حداکثر عددی که میتونیم رمزنگاری بکنیم و برعکس مسقیما وابسته به مقدار c که الا مقدار 35 داره و از 35 بع بعد الگوریتم کار نمیکنه :))کلیت ماجرا همینه و هر نوع الگوریتم دیگه و لایبری واسه RSA میشناسید بیس اونا همینه فقط یخورده بهشون پر بال دادن مثلا کلید های ساخته شده به یک نوع متن و یا هش تبدیل میکنن که شکل متفاوتی داشته باشه و یا از الگوریتم های بهینه تری برای پیدا کردن اعداد استفاده میکنن مثل استفاده از الگوریتم اقلیدس برای پیدا کردن بزرگترین مضرب مشترک یا ب م م </description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sat, 15 Jan 2022 18:47:14 +0330</pubDate>
            </item>
                    <item>
                <title>يک دیاگرام باحال واسه انتخاب درست و بجا Http Code ها :)</title>
                <link>https://virgool.io/@Novo/%D9%8A%DA%A9-%D8%AF%DB%8C%D8%A7%DA%AF%D8%B1%D8%A7%D9%85-%D8%A8%D8%A7%D8%AD%D8%A7%D9%84-%D9%88%D8%A7%D8%B3%D9%87-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D8%AF%D8%B1%D8%B3%D8%AA-%D9%88-%D8%A8%D8%AC%D8%A7-http-code-%D9%87%D8%A7-clnybcyxcvlj</link>
                <description>چند وقت پیش داشتم تو فرم ها میگشتم ببینم تو شرایطی که هستم بهترین Status Code چیه که به یک دیاگرام باحال برخورد کردم که خیلی قشنگ بصورت گرافیکی وضعیت هارو شرح داده بودش :).و استفاده ازش هم راحته خیلی  بنظرم ی نسخه ازش داشته باشید خیلی بهتون کمک میکنه .واسه همین حیفم اومد براتون نزارمش . استفاده بجا از status code ها هم سطح کارتونو بالا میبره و هم بقیه دولوپر هایکه از چیزیکه ساختید استفاده میکنن خیلی راحتر میشن واسه نسخه های دیگش و یا باکیفیت بهتر هم میتونید به گیتش سربزنید :)https://github.com/for-GET/http-decision-diagramو نسخه تحت وبش هم میتونید اینجا ببینید http://for-get.github.io/http-decision-diagram/httpdd.fsm.html</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sun, 19 Sep 2021 21:29:02 +0430</pubDate>
            </item>
                    <item>
                <title>درست کردن لینک دانلود یکبار مصرف  + همراه محدودیت IP + و زمان داخل جنگو</title>
                <link>https://virgool.io/Whitenoise/%D8%AF%D8%B1%D8%B3%D8%AA-%DA%A9%D8%B1%D8%AF%D9%86-%D9%84%DB%8C%D9%86%DA%A9-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DB%8C%DA%A9%D8%A8%D8%A7%D8%B1-%D9%85%D8%B5%D8%B1%D9%81-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA-ip-%D9%88-%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D8%A7%D8%AE%D9%84-%D8%AC%D9%86%DA%AF%D9%88-xdszcsjtsvip</link>
                <description>خیلی مواقع نیازه که کلاینت بتونه به یکسری فایل که روی سرور هستن دسترسی پیدا بکنه بدون ادرس دهی مستقیم و یا تو یک بازمه زمانی خاصی دردسترسشون باشه این فایله . ولی ویط یکسری مشکلات هستش, لینک فایل کاربر ممکنه پخش بکنه بقیه کاربرا بدون خریدن اون فایل بهش دسترسی پیدا بکنن اگه اون فایل خریدنی  هستش و هزار یک دلیل دیگه که خدا میدونه ولی چیزی که باعث شد من نیازش پیدا بکنم این بود که تو یک پروژه iot نیاز بود دستگاها بتونن خودشونو اپدیت بکنن برای همین یک لینک نیاز بود که اخرین ورژن سورس دستگاه اونجا باشهو اینا از اونجا خودشنو اپدیت کنن ولی یک مشکل امنیتی کوچولو این وسط بودش !. اگه شخص سومی این لینک سورس دستگاهی که برای اپدیت بود بدست میاورد میتونست اخرین ورژن سورس دستگاها دانلود بکنه .برای همین اومدم یک مکانیزم درست کردم که لینک غیر مستقیم به دستگاه سورس بدم و این لینک مخصوص همون دستگاهی باشه که اونو درخواست کرده بود و تو همون یک دقیقه معتبر باشه و اگه شخص سومی سعی میکرد لینک باز بکنه پیغام اینکه همچین صفحه وجود نداره برو هنوز واست زود مواجه بشه.خب از این حرفا بگذریم بیایم اینو تو یک پروژه پیاده سازی کنیمنوشتن مکانیزم :خب تو اولین قدم میایم پروژه جدید شروع میکنیم و توش یک آپ جدید میسازیمخب ساختار پروژه میتونید ببینید الا وقته آپ جدید تو ستینگ اضافه کنیم بعد اینکار نیازه که یک مدل برای بخش لینک های یکبار مصرف خودمون بسازیم به فایل models.py داخل آپ auth_system میریم و یک مدل شبیه عکس پایین میسازیمخب بیایم مدل بالا ی تحلیل ریز بزنیم اول ی مدل به اسم Temp_link  درست کردیم توش چهارتا فلید داریم فیلد link :این فلید از نوع UUIDFIELD  هستش که توانای ذخیره uuid  هارو داره و از این فلید برای ساخت لینک های تصادفی و غیر قابل حدس برای فایلم هامون استفاده میکنیم همینطور که میبیند این فیلد چندتا خصوصیت داره اولیش غیرقابل ادیت بودن لینکش هستش که editable=False این وظیفه بعهده داره.بعدیش کلید اصلی بودن هستش که بصورت پرامیری کی تعریف شده و یونیک بودن که این کارا دوتا ارگومان primary_key=True unique=True بعهده دارن . اخرین و مهمترینش جنریت شدن بصورت خودکار هستش برای همین از default استفاده کردیم و مقدارشو مساوی با uuid4 که از ماژول uuid ایمپورت شده قرار دادم و هر وقت uuid4 صدا زده بشه یک uuid ورژن 4 بهمون میده فیلد expire :این فیلد وظیفه تعیین زمان منقضی شدن لینک هارو بعهده داره برای همین از نوع DateTimeField  استفاده کردم و مقدار پیش فرضشو مساوی قرار دادم با متد make_expire_time این متد میاد زمان حال میگیره و یک دقیقه بهش اضافه میکنه و تو فیلد قرار میده برامون بصورت پیش فرض اگه میخواهید زمان کمتر یا بیشتر کنید فقط مقدار timedelta تغییر بدید ورودی هاش میتونن minutes ,seconds ,hours ,days باشن هرکدوم نیاز دارید بزارید توش و مقدار بدید :)فیلد ip :این فیلد وظیفه نگهداری ip  کلاینتی که درخواست دانلود اون فایل داده داره و هر وقت کلاینت از این لینک بخواد استفاده بکنه ما میایم و ip کسی که الا میخواد دانلود بکنه با ip کسی که این لینک براش ساختیم چک میکنیم و نوع این فیلد GenericIPAddressField هستش که ip  ورژن 4  و 6  میتونه سیو کنهفیلد file :ما از این فیلد به عنوان رفرنس استفاده میکنیم حالا منظورم چیه ؟ فیلد FileField میتونه چند نوع ورودی بگیره یکیش ادرس فایل هستش اون یکیم یک instance از یک FileField دیگه هستش. حالا ما میایم یک فیلد FileField از داخل یک مدل دیگمون که قراره اون فایل دانلود بکنه یوزر بهش پاس میدیم  خب فیلد هامون تمام شد رسیدیم به یک متد مدل که از اسمش میتونید حدس بزنید چیکار میکنه درواقع متد check_expired میاد زمان حال به زمانیکه تو فیلد expire ذخیره شده برسی میکنه اگه زمان گذشته باشه False  برمیگردونه و اگرم نه  True و متد بعدی یعنی check_ip هم مثل قبلی میاد ip سیو شده با ip دریافتی برسی میکنه اگه یکی بودن True ریترن میکنهخب حالا چطور استفاده کنیم ازش ؟خب بیاید فرض کنیم شما یک آپ فروشگاه دارید که توش  pdf میفروشید و ی مدل به این شکل دارید که pdf  هارو توش ذخیره میکنیدstore/models.pyحالا دیگه زیاد وارد جزییاتش نشید :))حالا کاربر اومده ی پرداختی داشته و شما میخواهید اجازه بدید که دانلود بکنه pdf خب برای درست کردن لینک دانلودش این مراحل طی کنیدshellخب تو خط یک و دو اومدیم دوتا مدل خودمونو ایمپورت کردیم یک مدل مدل لینک های یکبار مصرفمون هستش و مدل دوم مدلی هستش که فایل دانلودی مون توش قرار دارهتو خط سه اومدیم یکی از این رکورد های داخل مدل PDF انتخاب کردیم حالا شما اینو وابسته به خرید کاربر ها هرطوری صلاح میدونید انتخاب میکنید .تو خط چهار و پنج اومدم نشون دادم مقادیر داخل اون رکورد انتخاب شده همینطور که میبینید یک فیلد به اسم name  و file   که از نوع FileField هستش داره و فایل دانلودمون توش قرار دارهتو خط شیش اومدیم یک نمونه از مدل Temp_link درست کردیم که برامون کار درست کردن لینک های یکبار مصرفو داره و ورودی اولش ip کاربری که اون لحظه خرید انجام داده یا میخوایم اجازه استفاده از لینک بدیم بهش میدیم این ip  میتونید از داخل request ویو بدست بیارید , ورودی file  هم همینطور که بالاتر گفتم میایم فیلد فایل اون مدلی که میخوایم طرف فایل داخلشو دانلود بکنه میدیم اینجا اون فایل داخل مدل pdf ما هستش تو خط هفت لینک یکبار مصرف سیو کردیم . تو خط هشت لینک اونو گرفتیم و تو خط نو هم زمانی منقضی شدن میبنیم و تو خط ده هم متدی که وظیفه برسی اینکه هنوز لینک زمانش معتبره یا نه داریم که اینجا  False  برگشت داده یعنی هنوز معتبره و تو خط ده یکبار اومدیم برسی کردیم ip کاربری که میخواد دانلود بکنه برسی کردیم دیدم که با اون چیزیکه انتظار ما بودش متفاوته برای همین False  برگشت داده و تو خط یاده کاربر با ip درست درخواست دانلود داره و میبینید  True  برگشت دادهاین کلیت موضوع بودش حالا بیایم view دانلود و urls  بنویسیمtutorial/urls.pyفایل urls که چیز خاصی نداره بجز ورودی گرفتن که نوع ورودی uuid  مشخص شده و اسم ورودی هم link گذاشتیم . میرسیم به ویومونauth_system/views.pyخب اینجا ی فانکشن ویو به اسم Download_File داریم که یک ورودی به اسم link میگیره  .تو خط اولش اومدیم برسی کردیم ببینیم اصلا همچین لینکی قبلا درست شده یا نه اگه بود که میاد اطلاعاتش تو متغیر temp  میزاره اگرم نبود واسه کاربر صفحه ارور  404  نشون میده .تو خط بعدترش اومدیم ip کلاینتی که درخواست دانلود فایل داده میگیرم با استفاده از تابع get_client_ip که اون از داخل هدر واسمون استخراجش میکنه . بعدش یک شرط داریم این شرط میگه ببین تاریخ انقضاش گذشته  و یا ip برای لینک یکبار مصرف درست شده با ip کلاینتی که الا میخواد دانلود بکنه یکی نبود بیا صفحه 404  نشونش بدهتو دو خط بعدی اومدیم فایل و اسم فایل داخل دوتا متغیر ریختیم. و تو خط بعدی ترش اومدیم فایل تو خروجی صفحه قرار دادیم و خط بعدترش با استفاده از هدر Content-Disposition به اون صفحه اعلام کردیم که یک فایل اینجا پیوست شده به فلان اسم و در اخر اون HttpResponse  که ساختیم ریترن کردیم.نکته : حالا اگه میخواهید کاربر فقط یکبار بتونه از لینک استفاده بکنه خطی که کامنت کردم از کامنتی در بیارید :))حالا کامل سیستم لینک یکبار مصرفمون درست شدش فقط کافیه این شکلی ازش استفاده کنیمhttps://domain.com/download/807b7a2c-a7a0-4a70-85af-fde84063e5caتا فایلی که مشخص کردیم بشه دانلود کرداینکه چطور روترینگ بکنید و فایل مدیا هارو تو تنظیمات درست بکنید خودتون بهتر میدونید و اگه خوب متوجه نشدید میتونید کامنت بزارید و اگه نیاز بود تو یک ویدیو بصورت واقعی تو پروژه پیاده سازی کنیم این مبحث </description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sun, 05 Sep 2021 22:25:04 +0430</pubDate>
            </item>
                    <item>
                <title>ـ interface ها و abstract کلاس ها قطعات گمشده در پایتون قسمت ۲</title>
                <link>https://virgool.io/@Novo/%D9%80-interface-%D9%87%D8%A7-%D9%88-abstract-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7-%D9%82%D8%B7%D8%B9%D8%A7%D8%AA-%DA%AF%D9%85%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%DB%B2-ngdtlnrot9as</link>
                <description>تو قسمت قبلی اومدیم interface ها و abstract کلاس ها برسی کردیم و یکسری توضحیات درمورد دلیل استفاده شون اوردیم همراه با یک مثال و تو این قسمت تمرکز اصلی روی پیاده سازی به زبان پایتون هستش و جاهایکه این دوتا مفهوم میتونن مورد استفاده قرار بگیرنو میبینم همراه با چندتا مثال خوباگه interface ها و abstract کلاس ها تو پایتون نیستن چطور میشه ازشون استفاده کرد ؟اگه قسمت ۱ خونده باشید مطمعنن میدونید که ما مفهوم مستقلی به اسم interface ها و یا abstract کلاس ها نداریم تو پایتون . خب راحل چیه؟چندتا راحل وجود داره اولین و ساده ترین استفاده از ماژول abc هستش یا به اختصار (abstract base class)  و تو PEP 3119 معرفی شدش و برای ساخت abstract کلاس ها مورد استفاده قرار میگیره , دومین راحل استفاده از ماژول zope هستش که برای ساخت interface ها مورد استفاده قرار میگیره و اخرین راحل و سخترینشون پیاده سازی abstract و interface ها با استفاده از خود پایتون هستش همینطور که تو قسمت ۱ گفتم پایتون خیلی از محدودیت های زبان های دیگه نداره برای همین این مفاهیم بصورت مستقل موجود نیستن توش برای همین میشه این مفاهیم با استفاده از کلاس های خود پایتون پیاده سازی کرد  که برای اینکار نیاز به درک درستی از شی گرایی تو پایتون و همینطور metaclass ها هستش.من تو این مقاله تمرکز روی استفاده از abc گذاشتم که کار باهاش راحته و نیازی به نصبش نیستچرا باید از abstract کلاس ها و یا interface ها استفاده کرد ؟ی مثال قراره داشته باشیم ولی قبلش یکسری نکات باید بگم تو پایتون تفاوت abstract کلاس ها با interface ها خیلی کم رنگ هستش و بزرگترین تفاوتشون میتونه این باشه که تو abstract کلاس ها ما میتونیم متد های معمولی داشته باشیم ولی تو interface ها نه !interface vs abstract تو تصویر بالا میبنید که کلاس myabstract نه تنها متد های abstract داره بلکه متد های معمولی هم میتونه تو خودش داشته باشه. ولی توی اینترفیس به این شکل نیست و اگه یک متد معمولی توش تعریف بشه با خطا مواجه میشیم. اگه تیکه کد بالا متوجه نمیشید نگران باشید پایینتر بطور کامل درموردش صحبت کردم فقط الا این نکته تو ذهنتون داشته باشید . پس میشه اینطور نتیجه گیری کرد که از abstract کلاس هاهم میشه مثل interface ها استفاده کرد و تو پایتون تنها تفاوتشون همین یک نکته هستشحالا چرا ما باید ازشون استفاده کنیم؟ ما زمانی مجبور میشیم ازشون استفاده کنیم که درحال طراحی و پیاده سازی واحد ها بزرگ و یا کوچیک هستیم و بعضی از این واحد ها ممکنه با واحد دیگه ارتباط برقرار بکنن برای همین ما یک رابط سراسری و عمومی (interface (api)) میسازیم برای هرکدوم از این واحد ها! و از مشکلاتی مثل ناهماهنگی بین این واحد ها جلوگیری میکنیم. شاید الا بخوبی متوجه منظورم نشید ولی به مثال پایین دقت کنید مثال :تمام لپتاپ ها و کامپیوتر های دسکتاپ زیر مجموعه کامپیوتر هستن فقط نوع مختلفی از کامپیوترو نشون میدن و در اصل یکی هستن و حالا هرکدوم از اینا میتونن مشخصات متفاوت و همینطور فیچر های مختص به خودشونو داشته باشن ! ولی این اصلیت اونهارو تحت تاثیر قرار نمیده. اون کامپیوتری که میگفتم همین abstract کلاسی هستش که پایین تو کد میبنید abstract classبرای اینکه یک abstract کلاس داشته باشیم نیازه که از ABC  ارث پذیری کنیم مثل کلاسی که تو تصویر میبینید از زمانیکه ارث بری کردید از ABC این یک کلاس abstract محسوب میشه. یک کامیپوتر داری بخش های ثابتی هستش مثل بخش صدا , تصویر که اینجا مانیتور استفاده کردیم و بخش کیبورد و موس و همینطور بخش پروسسور که وظیفه انجام عملیات های مختلف تو کامپیوتر داره. حالا تو این مثال خیلی چیزای دیگه ام ممکنه کامپیوتر داشته باشه که اینجا نگفتیم و همین بخش های هم که گفتید شاید نیاز به بازنگری داشته باشن ولی چون میخوام ساده نگه دارم به همینا بسنده میکنیمخب حالا تو بدنه abstract کلاسمون ما میتونیم از متد های abstract استفاده کنیم تو قسمت اول درموردشون گفتم یک متد abstract متدی هستش که فقط تعریف شده و دارای بدنه ای نیست و تو پایتون بعد تعریف همچین متدی نیازه که از دیکوریتور abstractclassmethod که از ماژول abc اورده شده استفاده کنیم مثل تصویر بالا, تا اون متد تعریف شده واقعا یک متد با خصوصیات abstract واقعی باشه.حالا متد های تعریف شده باید تو همه زیرکلاس ها پیاده سازی بشن وگرنه با ارورو موجه میشد مزیت اینکار سراسری بودن یکسری از متد ها تو بین تمام زیرکلاس های ما هستش و حتی اگه تیم یا شخص دیگه ام درحال توسعه کد های شما باشه و یا حتی خودتون درچار اشتباهی نمیشد که متدی فراموش کنید پیاده سازی کنیدتصویر بالا دقت کنید اینجا ما یک کلاس desktop داریم که به کامیپوتر ها دسکتاپ اشاره داره و یک فرزند از abstract کلاس کامپیوتر ما هستش.این کلاس desktop بدون تعریف تمام abstract متد هایکه تو کلاس abstract خودمون مشخص کردیم اومدیم و ازش سعی کردیم یک نمونه بسازیم , همینطور که حدس زدید و تو تصویر میبنید اروری با موضوع اینکه یک دونه یا تعدادی از abstract متد های مورد نیازی که تو کلاس والد تعریف شدن  پیاده سازی نشده مواجه میشیم و اسم اون متد هم اورده شدهخب فرض میکنیم اونم پیاده سازی کردیم بعدش چی ؟  خب بیاید فرض کنید ما یک سیستم عاملی داریم طراحی میکنیم که این سیستم عامل وابسته به کامپیوتر ما هستش و یکسری از فانکشن های اونو برای کار کردن صحیح نیاز داره کد پایین ببینید.این کلاس OS ورودیش یک کامپیوتر دریافت میکنه و واسش مهم نیست چه نوعی هستش دسکتاپ هست یا یا نوع همراه در هر صورت اون میدونه که اون کامپیوتر یکسری فانشکن های با اسم های ثابتیی داخلش هستن و با تغییر نوع کامیپوتر اونا تغییر نمیکنن  پس بدون دردسر ازشون استفاده میکنه. همینطور که میبیند os ما قابلیت پخش موزیک هم داره و میدونه هم برای اینکه پخش بکنه باید به کدوم قسمت کامپیوتر چه چیزای بفرسته تا اونکار انجام بشه. خب الا مهم نیست شما دارید اینو توسعه میدید یا شخصی دیگه یا تیم تون , هیچ مشکلی پیش نمیاد برای برنامه تون چون یکسری مفاهیم بصورت سراسری اعمال میشن و بعدا هیچ وقت پیش نمیاد یک OS  نیاز به استفاده از بخش Audio  کامیپوتر داشته باشه و اون بخش Audio پیاده سازی نشده باشه, اینطوری هر نوع OS طراحی بکنید بدرستی کار میکنن مثال پایین ببینید.اینجا فرض کنید تیم شما یا شخص دیگه ای بدون استفاده از abstract کلاس هامون یا interface مون یک کامیپوتر طراحی کرده و سعی کرده OS ما روش نصب کنه بیشتر بخش OS ما روی این کامپیوتره کار میکنه ولی اون تیم یا شخص فراموش کرده بخش Audio طراحی و پیاده سازی بکنه و زمانیکه os ما سعی در پخش صدای داشته باشه کرش میکنه و کلا قطع میشه و یک ناهماهنگی درست میشه ولی همین موضوع بیایم با استفاده از abstract کلاس هامون یا interface هامون اگه طراحی کرده بود ببینیمخب میبینید اینجا OS ما بخوبی روی این لپ تاپ کار میکنه. ولی باز یک مشکلی هستش این os ما ممکنه با برنامه های که بعدا براش طراحی میشه سازگاری نداشته باشه برای اینکه بخوبی با نرم افزار هایکه به os وابسته هستن هماهنگ باشه نیازه یک interface هم براش بزنیم و از قوانین اون پیروی کنیم.این یک مثال کوچیک و ساده از یکی از کاربرد های ایم مبحث هستش و شما بیشتر میتونید از مبحث تو بحث های از قبیل دیزاین پترن ها ببینید.اگه سوال و نظری داشتید میتونید کامنت کنید.</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sat, 28 Aug 2021 18:47:17 +0430</pubDate>
            </item>
                    <item>
                <title>ـ interface ها و abstract کلاس ها قطعات گمشده در پایتون قسمت ۱</title>
                <link>https://virgool.io/@Novo/%D9%80-interface-%D9%87%D8%A7-%D9%88-abstract-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7-%D9%82%D8%B7%D8%B9%D8%A7%D8%AA-%DA%AF%D9%85%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%DB%B1-lia19ol3sxr3</link>
                <description>ـ interface ها داخل پایتون کجان اصلا چرا همچین چیزی تو پایتون نیستش ؟ جاگزینی براش وجود داره؟ اصلا میشه شبیه سازیش کرداحتمالا تا الا حدسای زدید. ولی قبل از اینکه شروع کنم بیاید ببینیم چرا interface ها درست شدن تو زبان های خانواده C ولی تو زبان های مثل پایتون وجود ندارن و اصلا ی سوال مهمتر تفاوت شون با abstract کلاس ها چین ؟ سوال میدونید اصلا abstract کلاس ها چی هستن ؟ خب اگه نمیدونید صبر کنید اوناروم هم توضیح میدم. چیشد interface ها درست شدن ؟ کل موضوع برمیگرده به Object Oriented یا به اختصار شی گرایی  خب برای جواب دادن این باید بریم ساختار زبان های مثل جاوا و بقیه فک فامیل های C ی نگاهی بندازیم D:تو این زبانا یک مشکل بزرگ وجود داره و اونم single-inheritance  یا بقولی تک ارثی بودن هستش یعنی چی ؟فرض کنید ما یک کلاس داریم و میخوایم همزمان از دوتا کلاس یا بیشتر ارث بری بکنیم خب اینکار تو این زبانا غیرممکن هستش ولی خب پایتون اینجا هیچ کم کسری نذاشته .ی مثال از زبان جاوا ببینیم تا خوب متوجه بشید.نکته : برای شرح مفاهیم اولیه از زبان جاوا استفاده میشه چون بصورت ملموس تری میتونین حس کنید مفاهیم مورد نظرو برعکس پایتونinheritance in javaی توضیح کوچیک درمورد کد بالا :اول دوتا کلاس داریم که قرار ازشون ارث بری بشه به اسم ها parent_1  و parent_2 و سومین کلاس هم به اسم child_1  اومد از کلاس parent_1 ارث بری کرده که پیتونید کلمه کلیدی extends که معنی اینو میده از این کلاس ارث بری کن ببینید خب تا اینجا همه چیز اوکیه ولی child_2  اومد ارث بری کرده از دوتا کلاس parent ما خب همینطور که خودتون میدونید کار بدی هستش اینقدر طمعه داشته باشید به همون سهم خودتون قانع باشید D: اگه اینکارو که کلاس child_2 کرده تو زبان جاوا و بقیه فک فامیل های C  بکنید با یکسری ارور های ناموسی مواجه میشید.ولی خب همینطور که مستحضرید پایتون اینارو به کتف چپش گرفته همینطور که تو کد پایین هم مشاهده میکنید. inheritance in pythonخب تا الا حتما متوجه شدید نمیشه تو این زبانهای که گفتم بیشتر از یک کلاس ارث بری کرد برعکس زبان های مثل پایتون که چند ارثی ساپورت میکنن خب راحل چیه؟راحل interface ها بودن به کلاس های فرزند اجازه میدادن همزمان از دو یا چندتا والد ارث بری کنن.تیکه کد پایین ببینیدتو چند خط اول سه تا interface  تعریف کردیم به اسم های parent_1 , parent_2 ,  parent_3 و بعد از اون دوتا کلاس تعریف شدن به اسم های child_1 , child_2 و برای اینکه یک کلاس بتونه از interface ها ارث بری بکنه از کلمه کلیدی implements بعد اسم کلاس استفاده میشه . همینطور که میبنید هیچ محدودیتی برای ارث بری کردن نیست از interface ها برعکس کلاس های معمولیدقیقا interface ها چه کاربردی دارن؟اینکه چه کاربردی دارن مهمتریشو بالاتر گفتم ولی این همه ماجرا نیست.کاربرد دیگه این interface ها بخوایم خودمونی بگیم یک لیست از چیزای هستش که والد (parent) از فرزندش (child)  انتظار داره که حتما داشته باشه وگرنه خیلی ناراحت میشه و فرزندشو از ارث محروم میکنه D:حالا ی مثال از دنیای واقعی درمورد شی گرایی و ارث بری هاشون براتون میزنمما یک شی والد داریم به اسم خونه این خونه ما برای اینکه بشه خونه درنظرش گرفته یکسری چیز میز نیاز داره تا بشه بهش گفت خونه مثلا چی ؟ اینم من باید بگم ؟ :| جدای از شوخی میشه گفت اتاق نیازه داره, اشپزخونه, نشیمن و سرویس بهداشتی بصورت عمومی اینا اجزای معمول یک خونه هستن پس وقتی میگیم خونه یک مجموعه از این اجزا به اضافه چیزای غیر معمول منظورمون هستش که یک خونه میتونن تشکیل بدنحالا یک شی فرزند داریم که از والد خونه از نوع interface ارث بری کرده به اسم خونه ممد. این خونه ممد حتما چیزای که والد خونه لیست کرده حتما باید داشته باشه ولی یک نکته مهم ! والد خونه هیچ نظر و ایده ای نداره که این اجزا چه شکلی باشن میتونه نشیمن دویست متری باشه یا ده متری فقط بخش مهمش این هستش که حتما باید داشته باشه اونو و اگه نداشته باشه دیگه نمیشه اونو خونه گفت برای همین هیچ ارثی که بهش نمیرسه هیچ چندتا ارور هم میگیره .اگه از یک interface ارث بری کردید و متد های اونو تو کلاس فرزند استفاده نکردید با ارور مواجه میشیدکد بالا اگه اجرا کنید به مشکل میخورید چرا؟ چون تو interface  لیست توابعی که باید پیاده سازی بشن گفتیم ولی تو کلاس فرزند اونارو استفاده نکردیم خب از روی همین نکته بالا متونیم متوجه بشیم چرا اینقدر بدرد بخورن ! بازم بخوبی نفهمیدید کجا این مورد بدرد میخوره؟ خب فرض کنیم رفتید خونه ممد ازش میپرسید ممد سرویس بهداشتی کجاست ممد در کمال ناباوری میگه خونه من سرویس بهداشتی نداره :| خب اونجاست که آب روغن قاطی میکنید D: میبنید بعضی مواقع ما از فرزند ها یکسری انتظاراتی داریم که بطور معمول باید داشته باشنش که به مشکلی  برنخورید مثل زمانی که داشتید از خونه ممد استفاده میکردید ! اگه موقع ساخت خونه ممد از یک والد interface به اسم خونه پیروی میکرد مهندسه خونه ممد حتما سرویس بهداشتی میساخت چون تو interface خونه ذکر شده بود که حتما باید اونو داشته باشه اگه یک فرزند از اونه.بطور خلاصه میشه گفت دلیل دوم درست کردن یک نقشه از چیزای هستش که ما نیاز داریم .میرسیم به محدودیت های interface ها و تشابه اونها با abstract کلاس ها .در واقع خیلی interface ها با abstract کلاس ها تشابه دارن و چیزی که این دوتا از هم جدا میکنه همین محدودیت ها هستناولین محدودیت و مهمترینش  متد هایکه تو interface ها نوشته میشن همیشه خالی هستن !! و باید از طریق فرزند بازنویسی بشن برعکس abstract  کلاس هادومین چیز این هستش که تو کلاس های abstract هم متد های abstract هستن و هم متد های معمولی برعکس interface ها همینطور که تو کد بالا میبینید کلاس abstract ما محدودیتی برای نوع توابع درونش نداره و از هر دو نوع ساپورت میکنه هم از توابع abstract و هم توابع معمولیسومین چیز این هستش که هیچ شی مستقیمی از interface ها و abstract ها نمیشه ساخت و حتما فقط به عنوان والد استفاده بشنتو کد بالا میبنید که یک نمونه بصورت مستقیم از یک interface خواسته ساخته بشه ولی اینکار غیرممکن هستش و ارور میگیرید برای کلاس های abstract هم به این شکل هستش ولی برای کلاس های عادی نه!چهارمین چیز اینکه abstract کلاس ها بازم کلاس هستن ! پس نمیشه بیشتر از یک دونش برای ارث بری استفاده کرد و بازم به مشکل single-inheritance میخوریمپنجم اینکه تمام توابع interface ها از نوع abstract هستن برای همین تو خالی هستن و از طریق کلاس فرزند پر میشنو اخرین تفاوت interface ها متد سازنده ای یا constructor تو جاوا و یا متد __init__ تو پایتون ندارن برعکس abstract کلاس ها که میتونن داشته باشن!خب بریم interface هارو تو پایتون ببینیم !قبل شروع چندتا نکته بگم اول اینکه اومدیم interface ها و یکسری اطلاعات درموردشون گفتیم ولی باید اینو بدونید که خیلی از محدودیت های که بالاتر گفتم به این شکل تو پایتون نیستن! یعنی چی ؟! یعنی اون مفهموم interface  هایکه تو زبان جاوا و بقیه خانواده C میبینیم تو پایتون به اون شکل نیست , مثلا همینطور که بالاتر گفتم پایتون یک زبانی هستش که قابلیت پشتیبانی از چند وراثتی داره برای همین ما چیزی به اسم interface ها نداریم که بیاد مشکل اینکه نمیتونیم همزمان از چند کلاس وراثت بگیریم حل بکنه یا جاگزین abstract کلاس ها بشه. برای همین ما از abstract کلاس ها استفاده میکنیم تو پایتون ولی یک مشکلی این وسط هستش ! ما abstract کلاس هارو هم تو پایتون نداریم D: ولی یکسری راحل های برای پیاده سازی اونها تو پایتون وجود داره تو قسمت بعدی دربارش میگم و نشونتو میدم چطور میتونید ازشون استفاده کنیدبرای همین تو قسمت اول از زبان جاوا برای نشون دادن این مفاهیم استفاده کردم و گفتم این مفاهیم تو پایتون بصورت ملموس قابل درک نیستن.ولی یکسری راحل های برای پیاده سازی اونها تو پایتون وجود داره تو قسمت بعدی دربارش میگم و نشونتو میدم چطور میتونید ازشون استفاده کنی</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Fri, 27 Aug 2021 01:43:52 +0430</pubDate>
            </item>
                    <item>
                <title>گرفتن خروجی exe از پایتون در لینوکس بدون ماشین مجازی</title>
                <link>https://virgool.io/@Novo/%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-exe-%D8%A7%D8%B2-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%A8%D8%AF%D9%88%D9%86-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-y9io4nc5dyoo</link>
                <description>مطمعنن مواقعی براتون پیش اومده که نیاز به گرفتن خروجی exe برای خودتون یا کارفرما یا استفاده های دیگه شده باشید .اگه از اون دسته ادم های باشید که سیستم عامل اصلیشون لینوکس هستش و دلشون نمیخواد برای گرفتن یک خروجی ماشین مجازی ران بکنن یا حتی دوال بوت بکنن این مقاله میتونه نیازتونو برطرف بکنه. پیش نیازها :در این مرحله نیازه wine نصب کنیم که من روش نصب روی دبین بیس هارو گذاشتم اگه از توزیع های زیر استفاده میکنیدCentOS FedoraRedhat به لینکی که دادم مراجعه کنید برای آموزش نصبhttps://www.tecmint.com/install-wine-in-rhel-centos-and-fedora/خب برای نصب روی دبین بیس ها دستور زیرو میزنیم sudo apt install wine  بعد از نصب موفقیت امیز wine نیازه که یک نسخه ویندوزی از پایتون دانلود بکنیم که به سایت پایتون مراجعه میکنیم و نسخه مورد نیازمونو دانلود میکنیم من اینجا نسخه 3.8.7 دانلود میکنم نسخه های دردسترس برای دانلودنسخه ویندوز اینستالری که خود پایتون پیشنهاد داده دانلود میکنیم نصب و راه اندازی پایتون :برای نصب پایتون روی wine  یک ترمینال در محل دانلود فایل نصبی باز میکنیم و دستور زیرو میزنیم sudo wine ./python-3.8.7-amd64.exe نکته :‌ بجای اسم فایلی که گذاشتم اسم فایل اینستالری که دانلود کردید بزارید خروجی دستورنکته : تیک اضافه کردن پایتون تو PATH بزنید گزینه Install Now یا Customize Installation وابسته به نیازتون بزنید ممکنه با خطای مشابه 002e:err:mscoree:LoadLibraryShim error reading registry key for installrootمواجه بشید بهش توجه نکنید. بعد از دریافت نصب موفقیت آمیز پایتون دستور زیرو برای اطمینان بزنید اگه تیک اضافه کردن پایتون به Path زدید.sudo wine pythonخروجی دستوراگه همچین خروجی دریافت کردید میتونید مرحله بعدی شروع کنیدگرفتن خروجی exe و نصب لایبری ها :برای گرفتن خروجی و همینطور راحتی کار از لایبری auto-py-to-exe استفاده میکنیم  که بر پایه pyinstaller هستش. برای نصب دستور زیر بزنیدsudo wine pip install auto-py-to-exeبعد از نصب شدن اگه برنامه شما از لایبری خاصی استفاده میکنه اونهارو هم نصب کیند مثلا برنامه من از لایبری های pyqt5 bs4 requests استفاده میکنه پس دستور زیر میزنمsudo wine pip install pyqt5 bs4 requests بعد اتمام اینکار نیازه که از خود برنامه خروجی بگیریم برای اینکار دستور زیر میزنیمsudo wine auto-py-to-exeخروجی دستورنکته : یکسری وارنینگ بهتون میده بهشون توجه نکنید نکته : اخر متن بهتون یک لینک داده اونو باز کنید مثل تصویر بالا خب تو این قسمت نیازه که مسیر فایل main خودمونو بهش بدیم از طریق قسمت File Location و زدن دکمه Browse برامون یک فایل بروزر باز میکنه که من اول از وارد دایرکتوری روت خودم که به اسم / میتونید ببینید و بعد وارد دایرکتوری home و دایرکتوری یوزر خودم شدم برای دسترسی به فایل اسکریپت بعد انجام اینکار میتونید تو قسمت Advance یک اسم برای خروجی exe خودتون انتخاب کنید و تو قسمت Settings محل خروجی exe خودتونو مشخص کنیدو بعد از انجام کانفیگ مورد نیازتون دکمه CONVERT .PY TO .EXE بزنید و خروجی exe خودتونو تحویل بگیرید.برای تست خروجی هم میتونید به محل خروجی برید و دستور زیر بزنید sudo wine ./app.exeخب کارمون تموم شد و سعی کردم تا جای ممکن متن با توضیحات کافی بدون ابهام بگم اگه سوالی داشتید میتونید کامنت کنید.مطالب قبلی :اشتراک گذاری لوکال هاست در بستر اینترنتآموزش استخراج API از اپلیکیشن ها</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Thu, 04 Feb 2021 17:58:57 +0330</pubDate>
            </item>
                    <item>
                <title>اشتراک گذاری لوکال هاست  در بستر اینترنت</title>
                <link>https://virgool.io/CodeLovers/%D8%A7%D8%B4%D8%AA%D8%B1%D8%A7%DA%A9-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D9%84%D9%88%DA%A9%D8%A7%D9%84-%D9%87%D8%A7%D8%B3%D8%AA-%D8%AF%D8%B1-%D8%A8%D8%B3%D8%AA%D8%B1-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-krjy7bpka7be</link>
                <description>خیلی مواقع پیش میاد که نیاز داریم از راه دور به لوکال هاست سیستم خودمون یا یک شخص دیگه وصل بشیم, دلایلشم میتونه متفاوت باشه مثلا موقع طراحی سایت میخوایم نظر شخص یا کارفرمای بدونیم یا دسترسی به وب اپ هایکه روی لوکال هاستمون درحال اجرا هستن و  ... خب در کنار تمام این حرفا چطور میتونیم اینکارو بکنیم  ؟ یکسری نرم افزار برای اینکار هستن که چندتا اینجا براتون لیست کردم1 : ngrok2 : localhoust3 : PageKiteنرم افزار ngrok :این نرم افزار فوق العاده کاربر پسند هستش کار باهاش آسونه و همچنین تو اکثر سیستم عامل ها میتونید ازش استفاده بکنید که در کنار قابلیت های زیادی که ارایه میده گزینه خوبی هستش ngrokبرای شروع به کار باید یک نسخه از نرم افزار روی سیستم خودتون داشته باشید که لینکش بالاتر گذاشتم برای سهولت کار. بعد ورود به سایت و ساختن یک اکانت رایگان نسخه مطابق با سیستم عاملتون انتخاب و دانلود کنید.تو قدم بعدی نیازه که کد احراز هویت خودتون بگیرید تو صفحه دانلود یک راهنمای خوب گذاشتن که میتونید کد مخصوص به خودتونو ببینید و یا تو تبAuthentication و بخش Your Authtokenبعد تموم کردن این مراحل و استراکت کردن نرم افزار توی محلی که نرم افزار هستن یک ترمینال باز کنید و دستور زیر بزنید ./ngrok authtoken xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxنکته : بجای اون x ها کد احراز هویت که دریافت کردید بزارید بعد تنها کاریکه نیاز بکنید زدن دستور زیر هستش./ngrok http 8000نکته : بجای پورت 8000 که گذاشتم هر پورت نرم افزاریکه نیاز دارید بهش دسترسی داشته باشید بزارید خرجی دستور خب میتونید دوتا لینکی فوروادی که بهتون داده ببیند و همینطور تمام درخواست ها مانیتور میشه براتون نرم افزار localhoust :یک نرم افزار اوپن سورس  و راحت ! البته تا وقتیکه به ارور هاش برنخورید اینم مثل نرم افزار قبل توسط افراد زیادی استفاده میشه و مراحل نصب و استفاده اش خیلی راحتن برای شروع کار نیازه با استفاده از پکیج منیجر npm نصبش کنید با دستور زیرnpm install -g localtunnelنکته : اگر روی سیستم تون این پکیج منیجر ندارید میتونید به راحتی نصبش کنید. یا از تو صفحه گیت هاب نرم افزار localtunnel دانلود کنید تو قدم بعدی برای اشتراک گذاری لوکال هاستمون دستور زیر میزنیمlt --port 8000نکته : ممکنه با یکسری ارور مواجه بشید که پینشهاد میکنم فایروال خودتونو غیرفعال کنید خروجی دستور بالا همینطورکه تو عکس بالا میبنید بهتون یک لینک میده که بعد باز کردنش به یک سایت منتقل میشید که یک دکمه وجود داره بعد زدن دکمه میونید به لوکال هاستتون دسترسی داشته باشید برخلاف نرم افزارngrokکه بصورت مستقیم میتونید دسترسی داشته باشید.نرم افزار PageKite :این نرم افزار هم مثل نرم افزار قبلی اوپن سورس هستش و میتونید روی سیستم عامل های مختلف اجراش بکنید .میتونید با رفتن به لینک زیر دانلودش کنید https://pagekite.net/downloadsو بعد اینکار با رفتن به صفحه زیر طبق راهنمای خود سایت برنامه راه اندازی کنید https://pagekite.net/support/quickstart/سوال یا ابهامی وجود داشت میتونید کامنت کنید.</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Fri, 29 Jan 2021 20:38:07 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش استخراج  API از اپلیکیشن ها</title>
                <link>https://virgool.io/CodeLovers/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D8%AE%D8%B1%D8%A7%D8%AC-api-%D8%A7%D8%B2-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7-vjwammt8qcx1</link>
                <description>چند وقت پیش نیاز بود یک سایت اسکراپ (scrape) بکنم اگه تجربه شو داشته باشید میدونید که کار پر زحمتی هستش! و نمیشه روش حساب باز کرد خب این برای یک پروژه یک نقص بزرگ محسوب میشه هر  لحظه ممکنه که قالب سایت دچار تغییرات بشه و برنامه ما عملا کار کار بیوفته .همون موقع بود که متوجه شدم که سایت مورد نظرم یک اپلیکیشن هم برای یوزر های اندروید ارائه داده نکته : این آموزش مختص به اندروید یا سیستم عامل خاصی نیست ولی اینجا از اندورید استفاده میشه و با پیدا کردن نرم افزار مشابه میشه روی همه سیستم عامل ها اینکارو کردقدم اول : نصب پیش نیاز هابرای سیستم عامل اندروید من نرم افزار HttpCanary پینشهاد میکنم , این نرم افزار با ایجاد یک VPN و تونل کردن تمام داده ها برنامه مورد نظر و اسنیف کردن اطلاعات اونها کار میکنه .بعد از دانلود و نصب نرم افزار واردش میشیم و بهش دسترسی ها و اجازه نصب یک گواهی امنیتی میدیم .حتما بعد پایان کار از تو تنظیمات دستگاهتون گواهی های امنیتی نصب شده توسط برنامه پاک بکنیدآیکون HttpCanaryو بعد از اون نیاز به نصب نرم افزاری که قصد دارید API  ازش استخراج بکنید هستش اینجا من  از خود نرم افزار ویرگول استفاده میکنم ?از تو بخش اضافه کردن تارگت ها نرم افزار ویرگول انتخاب میکنیم  و روی ایکونی که پایین صفحه سمت راست هستش کلیک میکنم تا برنامه فعال بشه ایکونش شبیه ایکونه تلگرامه ?.  و بعد از اون وارد برنامه ای که تو بخش قبل انتخاب کردیم میشیم.قدم دوم : برسی کردن ریکویست ها الا برمیگردیم تو نرم افزار اسنیفر خودمون که اینجا HttpCanary هستش  صحنه ای شبیه این میبیند اطلاعات اسنیف شدهاینجا  میتونیم اطلاعات رد و بدیل شده برنامه با  API ببینیم , پایین ترین ریکویست اینجا مربوط به احراز هویت هستش و دومی مربوط به دریافت اخرین مطالب پست شده داخل ویرگول هستش تو عکس پایین میتونید ببینید .سه تا تب مختلف وجود داره که از روی اسمش میتونید کارکدشونو بفهمید الا به لینک  API که برای دریافت اطلاعات پست شده داخل ویرگول هستش الا دسترسی داریم https://virgool.io/api/v1.1/feeds?type=latest&amp;page=1الا لینک تو مرورگرتون بزنید به همچین صحنه زیبای مواجه میشید ? , البته تو خود برنامه ام میتونید اینو ببینید ولی برای درک بهتر از مرورگرم استفاده کردم .میتونید با رفتن به بخش های مختلف نرم افزار تارگتتون و برسی ریکویست هایکه ارسال شده بفهمید برای هرکاری از چه لینکی استفاده شده چند نمونه شو اینجا میزارم ببینید بازدید از پروفایلhttps://virgool.io/api/v1.1/feeds?type=profile&amp;username=Novo&amp;page=1بازدید از پست https://virgool.io/api/v1.1/post/e3oydlcfkr5eاون قسمت اخرش در واقع هش اون پست هستش تو عکس بالا میبنید که هر پست یک hash مرتبط با خودشو داره که برای گرفتن اطلاعات اون پست استفاده میشهیک مثال اینجا دیدیم برای بقیه نرم افزار هاهم همین مراحل مورد نیاز هستش.ولی بعضی از نرم افزار ها بصورت رمزنگاری شده اطلاعات رد و بدل میکنن که کارو سخت میکنه اگه مشکل و نظری داشتید خوشحال میشیم کامنت کنید</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Wed, 13 Jan 2021 17:43:13 +0330</pubDate>
            </item>
            </channel>
</rss>