Forwarded from آموزش پایتون، دوآپس و مهندسی نرم افزار | BobyCloud (Boby Cloud)
✅ در ویدیو جدید بابی در نقش یک آتش نشان فداکار به سراغ مبحث تست نویسی در مهندسی نرم افزار میره و راجع به Smoke Test (تست دود) صحبت میکنه. همچنین یک نمونه Smoke Test با استفاده از سلنیوم در پایتون روی وبسایت LeetCode پیاده سازی میکنیم.
🔥 تست دود نوعی تست نرم افزار هست که پس از انجام تغییرات در نرم افزار انجام میشود تا اطمینان حاصل شود که ویژگی های اصلی نرم افزار به درستی عمل میکنند.
🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/Mog3OaiSidE?si=Sgyo6udH4wQHWZNg
〰️〰️〰️〰️〰️〰️
@BobyDotCloud
🔥 تست دود نوعی تست نرم افزار هست که پس از انجام تغییرات در نرم افزار انجام میشود تا اطمینان حاصل شود که ویژگی های اصلی نرم افزار به درستی عمل میکنند.
🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/Mog3OaiSidE?si=Sgyo6udH4wQHWZNg
〰️〰️〰️〰️〰️〰️
@BobyDotCloud
❤2🔥1
سری مهندسی نرمافزار: پست 3
از لینکدین Saeed Shahrivari Joghan
لینک پست در کامنت
احتمالاً در صحبت با دوستان و همکاران یا در فضای مجازی به کتابهای پیشنهادی متعددی برای مطالعه (مثلاً کتاب کد تمیز) برخورد کرده باشید. با وجود اینکه مطالعه این کتابها مفیده اما از دید من کتابهای مهمتر و پایهایتری برای مطالعه قبل از این کتابها وجود داره که بهتره اول در اون زمینهها مفاهیم پایهای رو به طور صحیح یاد بگیریم.
از دید من یه مهندس نرمافزار باید در ۷ حوزه، مطالعات پایهای مناسبی داشته باشه:
- برنامه نویسی
- ساختار دادهها و الگوریتم
- معماری کامپیوتر
- پایگاه داده
- سیستم عامل
- شبکههای کامپیوتری
- مهندسی نرمافزار
دقت کنید که منظور من صرفاً توسعهدهندهها نیستند و این ۷ حوزه برای طیفهای مختلف مهندسین نرمافزار از توسعهدهنده تا دواپس و تحلیلگر مفیده. من در مقاله زیر که در ویرگول منتشر کردم به طور مفصل راجع به این ۷ حوزه صحبت کردم و برای هر کدوم یه کتاب مناسب معرفی کردم. اگه کتابهای معرفی شده رو مناسب دیدید لطفاً تا جای ممکن این پست رو به اشتراک بذارید تا به دست افراد بیشتری برسه.
https://vrgl.ir/jl1SF
از لینکدین Saeed Shahrivari Joghan
لینک پست در کامنت
احتمالاً در صحبت با دوستان و همکاران یا در فضای مجازی به کتابهای پیشنهادی متعددی برای مطالعه (مثلاً کتاب کد تمیز) برخورد کرده باشید. با وجود اینکه مطالعه این کتابها مفیده اما از دید من کتابهای مهمتر و پایهایتری برای مطالعه قبل از این کتابها وجود داره که بهتره اول در اون زمینهها مفاهیم پایهای رو به طور صحیح یاد بگیریم.
از دید من یه مهندس نرمافزار باید در ۷ حوزه، مطالعات پایهای مناسبی داشته باشه:
- برنامه نویسی
- ساختار دادهها و الگوریتم
- معماری کامپیوتر
- پایگاه داده
- سیستم عامل
- شبکههای کامپیوتری
- مهندسی نرمافزار
دقت کنید که منظور من صرفاً توسعهدهندهها نیستند و این ۷ حوزه برای طیفهای مختلف مهندسین نرمافزار از توسعهدهنده تا دواپس و تحلیلگر مفیده. من در مقاله زیر که در ویرگول منتشر کردم به طور مفصل راجع به این ۷ حوزه صحبت کردم و برای هر کدوم یه کتاب مناسب معرفی کردم. اگه کتابهای معرفی شده رو مناسب دیدید لطفاً تا جای ممکن این پست رو به اشتراک بذارید تا به دست افراد بیشتری برسه.
https://vrgl.ir/jl1SF
👍9
✅ پست سوالی از لینکدین Hesam Attari در مورد مایکروسرویس (یا میکروسرویس)
کامنت های پستش رو بخونید. نکات خوبی داره. (لینک)
از مایکروسرویس چه میخواهید؟ چه مشکلی در پروژه یافته اید و یا چه مشکلی را در پروژه میخواهید حل کنید که به سراغ مایکروسرویس کردن می روید؟
برخی فکر می کنند چون پروژه بزرگ میشود باید سراغ مایکروسرویس کردن پروژه رفت. اصلن میدانید مثلا هنگام پابلیش کردن چه مسائلی ممکن است به وجود بیاید؟
حالا فرض کنیم مشکل را پیدا کردید چاره ای هم ندارید و میخواهید سراغ مایکروسرویس کردن بروید. چرا از همان اول api gateway میگذارید؟ با تمام مزایایش میدانید چه پیچیدگی هایی به وجود می آید؟
قریب به اتفاق پروژه ها فرآیندهای مهندسی نرم افزار ندارند یا کامل رعایت نمیکنند. همین مهندسی را در پروژه ها رعایت کنید بسیاری از مشکلات شما حل می شود. کافیست که r&d کنید. همین را در دانشگاه میتوانید تمرین کنید و یا نکردید هم می توانید موضوعات را جستجو کنید.
#softwareengineering
کامنت های پستش رو بخونید. نکات خوبی داره. (لینک)
از مایکروسرویس چه میخواهید؟ چه مشکلی در پروژه یافته اید و یا چه مشکلی را در پروژه میخواهید حل کنید که به سراغ مایکروسرویس کردن می روید؟
برخی فکر می کنند چون پروژه بزرگ میشود باید سراغ مایکروسرویس کردن پروژه رفت. اصلن میدانید مثلا هنگام پابلیش کردن چه مسائلی ممکن است به وجود بیاید؟
حالا فرض کنیم مشکل را پیدا کردید چاره ای هم ندارید و میخواهید سراغ مایکروسرویس کردن بروید. چرا از همان اول api gateway میگذارید؟ با تمام مزایایش میدانید چه پیچیدگی هایی به وجود می آید؟
قریب به اتفاق پروژه ها فرآیندهای مهندسی نرم افزار ندارند یا کامل رعایت نمیکنند. همین مهندسی را در پروژه ها رعایت کنید بسیاری از مشکلات شما حل می شود. کافیست که r&d کنید. همین را در دانشگاه میتوانید تمرین کنید و یا نکردید هم می توانید موضوعات را جستجو کنید.
#softwareengineering
👍3
Forwarded from Microfrontend.ir
آموزش جامع داکر
** در این پلی لیست میخوام داکر رو از بیخ یاد بگیریم. یعنی قبل از داکر خودمون یه چیزی شبیه داکر اما خیلی ساده تر با پایتون بنویسم بعد بریم سراغ خود داکر که هم داکر رو یاد بگیریم و هم بدونیم پشت صحنه چه اتفاقاتی می افته!
در این ویدیو از آموزش جامع Docker به بررسی تاریخچه مجازی سازی و روش های مختلف آن پرداختیم. روش VM-Based برای مجازی سازی کامل یک ماشین و روش Container Based برای اجرای ایزوله فرایندها و پروسس ها مطرح کردیم. سپس مولفه های لازم برای ساخت کانتینر در سیستم عامل لینوکس را بررسی کردیم و در نهایت Docker و podman و rtk را به عنوان مهمترین Container runtime های حال حاضر معرفی کردیم و در نهایت مفهوم Container Orchestration و ضرورت آن را شرح دادیم.
Link: https://youtu.be/Z8olH4UzeA0
Playlsit: https://www.youtube.com/playlist?list=PLJ9zDGwhhsBzLTI3VNE8Vp4JpXNn_yRR7
〰️〰️〰️〰️〰️〰️
© @microfrontend_ir
** در این پلی لیست میخوام داکر رو از بیخ یاد بگیریم. یعنی قبل از داکر خودمون یه چیزی شبیه داکر اما خیلی ساده تر با پایتون بنویسم بعد بریم سراغ خود داکر که هم داکر رو یاد بگیریم و هم بدونیم پشت صحنه چه اتفاقاتی می افته!
در این ویدیو از آموزش جامع Docker به بررسی تاریخچه مجازی سازی و روش های مختلف آن پرداختیم. روش VM-Based برای مجازی سازی کامل یک ماشین و روش Container Based برای اجرای ایزوله فرایندها و پروسس ها مطرح کردیم. سپس مولفه های لازم برای ساخت کانتینر در سیستم عامل لینوکس را بررسی کردیم و در نهایت Docker و podman و rtk را به عنوان مهمترین Container runtime های حال حاضر معرفی کردیم و در نهایت مفهوم Container Orchestration و ضرورت آن را شرح دادیم.
Link: https://youtu.be/Z8olH4UzeA0
Playlsit: https://www.youtube.com/playlist?list=PLJ9zDGwhhsBzLTI3VNE8Vp4JpXNn_yRR7
〰️〰️〰️〰️〰️〰️
© @microfrontend_ir
❤9👍3
Media is too big
VIEW IN TELEGRAM
✅ ویدئوی معرفی تکنیک خم هیلبرت (Hilbert Curve) که Google Maps و Tinder برای مدلسازی موقعیت مکانی ازش استفاده می کنند.
مدرس: دکتر علیرضا آقامحمدی @golemcourse
کلاس درس تحلیل و طراحی سیستمها
توی این لینک (ویدئوی کاملش) میتونید توضیحات چند تکنیک مهم دیگه رو هم ببینید که شرکتهایی مثل گوگل، تیندر، لیفت، اسنپ و تسپی ازشون استفاده می کنند:
-تکنیک Geohashing که شرکتهایی نظیر Bing Maps و Lyft از آن استفاده میکنند.
-داده ساختار Quadtree که شرکت Yext آن را به کار میگیرد.
-خم هیلبرت (Hilbert Curve) که Google Maps و Tinder از آن بهره میبرند.
مدرس: دکتر علیرضا آقامحمدی @golemcourse
کلاس درس تحلیل و طراحی سیستمها
توی این لینک (ویدئوی کاملش) میتونید توضیحات چند تکنیک مهم دیگه رو هم ببینید که شرکتهایی مثل گوگل، تیندر، لیفت، اسنپ و تسپی ازشون استفاده می کنند:
-تکنیک Geohashing که شرکتهایی نظیر Bing Maps و Lyft از آن استفاده میکنند.
-داده ساختار Quadtree که شرکت Yext آن را به کار میگیرد.
-خم هیلبرت (Hilbert Curve) که Google Maps و Tinder از آن بهره میبرند.
🔥5
Forwarded from CodeCrafters (Mojtaba)
دستور GROUP BY در SQL
دستور GROUP BY در SQL برای گروهبندی رکوردها بر اساس مقادیر یک یا چند ستون استفاده میشود. با استفاده از این دستور میتوانید رکوردها را بر اساس مقادیر مشترک در ستونهای مورد نظر گروهبندی کرده و نتایج را بر اساس گروهها تجمیع کنید.
ساختار دستور GROUP BY به صورت زیر است:
به عنوان مثال، فرض کنید یک جدول به نام "employees" داریم که شامل ستونهای "name"، "department" و "salary" است. میخواهیم مجموع حقوق هر بخش را محاسبه کنیم. برای این کار از دستور GROUP BY استفاده میکنیم. دستور زیر نتیجه مورد نظر را به ما میدهد:
مثال دیگر، میتوانیم تعداد کارمندان هر بخش را محاسبه کنیم:
@Code_Crafters
دستور GROUP BY در SQL برای گروهبندی رکوردها بر اساس مقادیر یک یا چند ستون استفاده میشود. با استفاده از این دستور میتوانید رکوردها را بر اساس مقادیر مشترک در ستونهای مورد نظر گروهبندی کرده و نتایج را بر اساس گروهها تجمیع کنید.
ساختار دستور GROUP BY به صورت زیر است:
SELECT column1, column2, ..., aggregate_function(column)در این دستور، شما ابتدا ستونهایی که میخواهید نتایج را بر اساس آنها گروهبندی کنید، را در قسمت GROUP BY مشخص میکنید. سپس با استفاده از توابع تجمیعی مانند SUM، COUNT، AVG، MIN و MAX، میتوانید مقادیر ستونهای دیگر را برای هر گروه محاسبه کنید.
FROM table
GROUP BY column1, column2, ...
به عنوان مثال، فرض کنید یک جدول به نام "employees" داریم که شامل ستونهای "name"، "department" و "salary" است. میخواهیم مجموع حقوق هر بخش را محاسبه کنیم. برای این کار از دستور GROUP BY استفاده میکنیم. دستور زیر نتیجه مورد نظر را به ما میدهد:
SELECT department, SUM(salary)نتیجه این دستور شامل دو ستون "department" و "SUM(salary)" است. ستون "department" حاوی نام بخشها است و ستون "SUM(salary)" حاوی مجموع حقوق برای هر بخش است.
FROM employees
GROUP BY department
مثال دیگر، میتوانیم تعداد کارمندان هر بخش را محاسبه کنیم:
SELECT department, COUNT(employee_id)همچنین، میتوانیم میانگین حقوق کارمندان هر بخش را محاسبه کنیم:
FROM employees
GROUP BY department
SELECT department, AVG(salary)#SQL
FROM employees
GROUP BY department
@Code_Crafters
👍8
✅ تکلیف پایتون | Arithmetic Operations
از احمد احمدی
یک ایمیل از محسن (برنامهریز مالی) دریافت کردیم.
در این ایمیل از ما خواسته شده تا یکسری محاسبات مالی را با استفاده از پایتون و اُپراتورهای ریاضیاتیش انجام دهیم. طبق متن ایمیلِ اِرسالی از محسن، قرار هست که موارد زیر را با استفاده از پایتون کُدنویسی کنیم:
✔️سودناخالصِ حاصل از فروش یک جفت کفش سیاه
✔️نسبت سودحاشیه ای از فروش یک جفت کفش سیاه
✔️قیمت موردنیاز برای رسیدن به سود حاشیهای %60
✔️مقدار مالیات برای یک جفت کفش سیاه
✔️مقدار سرمایه نهایی که به آن میرسیم اگر سودناخالص حاصل از فروش 100 جفت کفش سیاه را سرمایه گذاری کنیم
لینک ویدئو
توی این ویدئو فقط سر سوال رو مطرح کرده
از احمد احمدی
یک ایمیل از محسن (برنامهریز مالی) دریافت کردیم.
در این ایمیل از ما خواسته شده تا یکسری محاسبات مالی را با استفاده از پایتون و اُپراتورهای ریاضیاتیش انجام دهیم. طبق متن ایمیلِ اِرسالی از محسن، قرار هست که موارد زیر را با استفاده از پایتون کُدنویسی کنیم:
✔️سودناخالصِ حاصل از فروش یک جفت کفش سیاه
✔️نسبت سودحاشیه ای از فروش یک جفت کفش سیاه
✔️قیمت موردنیاز برای رسیدن به سود حاشیهای %60
✔️مقدار مالیات برای یک جفت کفش سیاه
✔️مقدار سرمایه نهایی که به آن میرسیم اگر سودناخالص حاصل از فروش 100 جفت کفش سیاه را سرمایه گذاری کنیم
لینک ویدئو
توی این ویدئو فقط سر سوال رو مطرح کرده
👍1🔥1
Forwarded from مطالب رایگان و آزاد🎈 ( behrad)
* تست رگرسیون چیست؟
بر خلاف اسم قلمبهش خیلی چیز سادهایه،
ما یسری تست داریم به اسم یونیت-تستینگ،
Unit Testing
که میایم واحدهای درون برنامه رو جدا جدا تست میکنیم، بخونید ماژولهای مختلفش رو...
یه تست یکپارچگی داریم،
Integrity Testing
که ببینیم آیا این واحدها در کنار هم به درستی کار میکنن،
و یه تست کلی
System Testing
داریم که معلومه چیه...
یه تست پذیرش هم داریم، که قبلا ازش حرف زدم:
توی مهندسی نرمافزار ما یک نوع آزمون نرمافزار داریم به اسم آزمون پذیرش
Acceptance Testing
هدفش اینه که تست کنه این نرمافزار مورد پذیرش کاربر هست یا نه.
این آزمون پذیرش خودش دو نوع داره :
1-آلفا تستینگ
2-بتا تستینگ
و....
▪️نسخه آلفا و نسخه بتا چیست؟
و همهٔ اون خزعبلات...
=+=+=+=+=+=+=+=+=+=+=+=+=+
پس شد چهارتا تست:
Unit Testing
Integrity Testing
System Testing
Acceptance Testing
تست رگرسیون میگه که:
اگر تغییری توی نرمافزار اعمال کردی باید 3 تا تست اول لیست رو دوباره انجام بدی:)
همین....
یعنی از اونجایی که تغییرات جدید نرمافزار ممکنه روی قسمتهای قبلی که قبلا تست شدن و درست بودن اثر بذارن، بایـــــد 3 تست اول رو دوباره انجام بدی....
مثال کوچیکش توی پروژههای من و شما میشه که مثلا من یه جایی کد دیتابیسم رو تغییر میدم، یهو یه ماژولی که مربوط بوده به لاگین از کار میفته... چون APIیی رو کال میکرده که ایشون متدی رو صدا میزده که الان اسمش عوض شده:)
حالا اینجا توی یه سیستم کلاس جهانی میبینین یارو با کلاه کابوییش میاد میگه دکتر تو بخاطر حمله خونریزی قلبی پیلود رو عوض کردی، قبول، اما من یونیت/رگرسیون تست میکنم که مطمئن بشیم این تغییر به چیزی آسیب نمیزنه...
واسه همینه که پـــــچ کردن یه باگ گاها تا 90 روز طول میکشه....
یهو نمیتونن ساختار کل پروژه رو به هم بریزن...!
و واسه همینه که باگ ریپورت کردن عـــــــــرف و اصول داره...
که توضیح میدم...
میدونم طولانی شده ولی اهمیتی نمیدم🙃
=+=+=+=+=+=+=+=+=+=+=+=+=+
راستش من یخورده شیطنت کردم (🫣) این اسم "رگرسیون" رو از قصد آوردم که بتونیم بعدا بهانهای داشته باشیم که از "رگرسیون خطی" حرف بزنیم...
مفهومی ریاضیاتی که یکی از پایــــــههای اصلی یادگیری ماشین توی حوزه هوش مصنوعی هست...
خیلی چیز جذابیه... با یه لینیار رگرشن ساده، ماشین شما یاد میگیره چجوری تحلیل کنه و کلاس یه داده رو پیشبینی کنه...
میتونه از روی یه فاکتور از رفتار یه کاربر یه برازش بزنه روی نمودار و آینده رو پیشبینی کنه...
خیــــلی جذابه🫣💦✨...
واضحه که ازش در آینده حرف میزنیم(از اون قولها...)
بر خلاف اسم قلمبهش خیلی چیز سادهایه،
ما یسری تست داریم به اسم یونیت-تستینگ،
Unit Testing
که میایم واحدهای درون برنامه رو جدا جدا تست میکنیم، بخونید ماژولهای مختلفش رو...
یه تست یکپارچگی داریم،
Integrity Testing
که ببینیم آیا این واحدها در کنار هم به درستی کار میکنن،
و یه تست کلی
System Testing
داریم که معلومه چیه...
یه تست پذیرش هم داریم، که قبلا ازش حرف زدم:
توی مهندسی نرمافزار ما یک نوع آزمون نرمافزار داریم به اسم آزمون پذیرش
Acceptance Testing
هدفش اینه که تست کنه این نرمافزار مورد پذیرش کاربر هست یا نه.
این آزمون پذیرش خودش دو نوع داره :
1-آلفا تستینگ
2-بتا تستینگ
و....
▪️نسخه آلفا و نسخه بتا چیست؟
و همهٔ اون خزعبلات...
=+=+=+=+=+=+=+=+=+=+=+=+=+
پس شد چهارتا تست:
Unit Testing
Integrity Testing
System Testing
Acceptance Testing
تست رگرسیون میگه که:
اگر تغییری توی نرمافزار اعمال کردی باید 3 تا تست اول لیست رو دوباره انجام بدی:)
همین....
یعنی از اونجایی که تغییرات جدید نرمافزار ممکنه روی قسمتهای قبلی که قبلا تست شدن و درست بودن اثر بذارن، بایـــــد 3 تست اول رو دوباره انجام بدی....
مثال کوچیکش توی پروژههای من و شما میشه که مثلا من یه جایی کد دیتابیسم رو تغییر میدم، یهو یه ماژولی که مربوط بوده به لاگین از کار میفته... چون APIیی رو کال میکرده که ایشون متدی رو صدا میزده که الان اسمش عوض شده:)
حالا اینجا توی یه سیستم کلاس جهانی میبینین یارو با کلاه کابوییش میاد میگه دکتر تو بخاطر حمله خونریزی قلبی پیلود رو عوض کردی، قبول، اما من یونیت/رگرسیون تست میکنم که مطمئن بشیم این تغییر به چیزی آسیب نمیزنه...
واسه همینه که پـــــچ کردن یه باگ گاها تا 90 روز طول میکشه....
یهو نمیتونن ساختار کل پروژه رو به هم بریزن...!
و واسه همینه که باگ ریپورت کردن عـــــــــرف و اصول داره...
که توضیح میدم...
میدونم طولانی شده ولی اهمیتی نمیدم🙃
=+=+=+=+=+=+=+=+=+=+=+=+=+
راستش من یخورده شیطنت کردم (🫣) این اسم "رگرسیون" رو از قصد آوردم که بتونیم بعدا بهانهای داشته باشیم که از "رگرسیون خطی" حرف بزنیم...
مفهومی ریاضیاتی که یکی از پایــــــههای اصلی یادگیری ماشین توی حوزه هوش مصنوعی هست...
خیلی چیز جذابیه... با یه لینیار رگرشن ساده، ماشین شما یاد میگیره چجوری تحلیل کنه و کلاس یه داده رو پیشبینی کنه...
میتونه از روی یه فاکتور از رفتار یه کاربر یه برازش بزنه روی نمودار و آینده رو پیشبینی کنه...
خیــــلی جذابه🫣💦✨...
واضحه که ازش در آینده حرف میزنیم(از اون قولها...)
🔥5👍2
جنگولرن
✅ پیاده سازی Django Soft Delete از کانال @microfrontend_ir چندی پیش خبری منتشر شد که در توییتر حذف دادهها به درستی انجام نمیشود. واقعیت این است که در اغلب نرمافزارهای مدرن دادهها به صورت فیزیکی حذف نمیشوند و صرفا برچسپ حذف شده میگیرند. در این ویدیو…
✅ مشکل soft delete برای relation ها
اگه این ویدئو رو از کانال @microfrontend_ir دیده باشید. تقریبا همه حالت هارو برای Soft delete هندل کرده.
برای اینکه حذف واقعی اتفاق نیافته، متد delete مدل رو override می کنیم و میگیم جای حذف، رکورد رو آپدیت کن و...
ولی وقتی با اکشن پیشفرض delete ع ادمین، یک یا چند رکورد رو حذف کنیم، حذف واقعی اتفاق می افته.
✔️که Hêmn از default_manager_name استفاده کرد و این مورد هم هندل کرد.
✔️البته داکیومنت جنگو گفته میتونید متد delete_queryset رو override کنید یا اکشن کاستوم خودتون رو بنویسید. (راه های رسیدن به خدا زیاده)
❔اما اگه ما relation داشته باشیم باید چکار کنیم؟ فرض کنید جدول Person رو داریم و جدول Address کلید خارجی از نوع CASCADE داره. در این صورت با Soft delete رکورد person حذف میشه اما address های متصل بهش حذف نمیشن.
✔️اولین راهکاری که به ذهن من میرسه استفاده از Signals هست.
به نظر شما best practice ع این مورد چیه؟
آپدیت:
💬پاسخ Hêmn به سوالم:
در اصطلاح orm به اینها میگن مدیرت ابجکت های orphan و پیاده سازی های مختلف داره، من ترجیحم استفاده از دسکریپتور خود مدله، مدلهای جنگو برای روابطشون یک ریلیتد منیجر دارن که همه روابطشون رو مدیریت میکنه. یعنی شما با استفاده از این ویژگی میتونم همه مدل های مرتبط رو پیدا کنید و لاجیک مدنظرتونو اعمال کنید. اینم بگم بعضی وقتها بد هم نیست کل منطق سافت دیلیت در سطح دیتابیس اتفاق بیافته
اگه این ویدئو رو از کانال @microfrontend_ir دیده باشید. تقریبا همه حالت هارو برای Soft delete هندل کرده.
برای اینکه حذف واقعی اتفاق نیافته، متد delete مدل رو override می کنیم و میگیم جای حذف، رکورد رو آپدیت کن و...
ولی وقتی با اکشن پیشفرض delete ع ادمین، یک یا چند رکورد رو حذف کنیم، حذف واقعی اتفاق می افته.
✔️که Hêmn از default_manager_name استفاده کرد و این مورد هم هندل کرد.
✔️البته داکیومنت جنگو گفته میتونید متد delete_queryset رو override کنید یا اکشن کاستوم خودتون رو بنویسید. (راه های رسیدن به خدا زیاده)
❔اما اگه ما relation داشته باشیم باید چکار کنیم؟ فرض کنید جدول Person رو داریم و جدول Address کلید خارجی از نوع CASCADE داره. در این صورت با Soft delete رکورد person حذف میشه اما address های متصل بهش حذف نمیشن.
✔️اولین راهکاری که به ذهن من میرسه استفاده از Signals هست.
به نظر شما best practice ع این مورد چیه؟
آپدیت:
💬پاسخ Hêmn به سوالم:
در اصطلاح orm به اینها میگن مدیرت ابجکت های orphan و پیاده سازی های مختلف داره، من ترجیحم استفاده از دسکریپتور خود مدله، مدلهای جنگو برای روابطشون یک ریلیتد منیجر دارن که همه روابطشون رو مدیریت میکنه. یعنی شما با استفاده از این ویژگی میتونم همه مدل های مرتبط رو پیدا کنید و لاجیک مدنظرتونو اعمال کنید. اینم بگم بعضی وقتها بد هم نیست کل منطق سافت دیلیت در سطح دیتابیس اتفاق بیافته
❤2🔥2
✅این عکسی از کتاب Fluent Python ع که کلاس دیاگرام کالکشن پایتون رو نشون میده.
زیرش نوشته UML class diagram...
دوستانی که رشته شون نرم افزار هست با UML آشنا هستن.
ویکی پدیا فارسی میگه:
زبان مدلسازی یکپارچه (به انگلیسی: Unified Modeling Language) یا «یو امال»، یک زبان مدلسازی همه منظوره استاندارد در زمینه مهندسی نرمافزار است.
✔️چه استفاده هایی داره؟
برای مستند سازی روند تحلیل، حاصل تحلیل، روند طراحی و حاصل طراحی نرم افزار قابل استفاده است. البته فقط مخصوص نرم افزار نیست و رشته های دیگه هم استفاده میکنن. ویکی پدیای فارسی چسبوندش به نرم افزار 😂
✔️لازمه برنامه نویس جنگو یادش بگیره؟
برای پروژه هایی که مستندسازی تحلیل و... ندارن لازم نیست (احتمالا فریلنسرها نیازش نداشته باشن)
زیرش نوشته UML class diagram...
دوستانی که رشته شون نرم افزار هست با UML آشنا هستن.
ویکی پدیا فارسی میگه:
زبان مدلسازی یکپارچه (به انگلیسی: Unified Modeling Language) یا «یو امال»، یک زبان مدلسازی همه منظوره استاندارد در زمینه مهندسی نرمافزار است.
✔️چه استفاده هایی داره؟
برای مستند سازی روند تحلیل، حاصل تحلیل، روند طراحی و حاصل طراحی نرم افزار قابل استفاده است. البته فقط مخصوص نرم افزار نیست و رشته های دیگه هم استفاده میکنن. ویکی پدیای فارسی چسبوندش به نرم افزار 😂
✔️لازمه برنامه نویس جنگو یادش بگیره؟
برای پروژه هایی که مستندسازی تحلیل و... ندارن لازم نیست (احتمالا فریلنسرها نیازش نداشته باشن)
👍11
Forwarded from Python Hints
خواستم یکبار دیگه تأکید کنم روی
که هم به خودم یادآوری کرده باشم هم باقی دوستان،
اصولاً توی دنیای واقعی هم همین هست مثال میزنم که جا بیوفته (چون متاسفانه خیلی کم رعایت میشه)
کودکی رو به خاطر بیارید، یک کاری میخواستی بکنی که با شک بالا میدونستی پدر و مادر اجازه نمیدهند.
وقتی میرفتی و اجازه میگرفتی، درجا نه میشنیدی حالا باید تمام جزئیات و ... رو توضیح میدادی تا همهی نگرانیها برطرف بشه
بعد شاید حتی ۱ همراه یا ... هم باهات میفرستادند و در اینصورت شما اجازه داشتی کاری که میخوای رو انجام بدی، لذتش ۲۰٪ میشد.
مثال میزنم :
یک تفریح سالمی که ما (از درس فیزیک و شیمی) داشتیم این بود که ۲ تا آجر میذاشتیم نزدیک هم ی تشتک نوشابه (باید پلاستیک کفش رو میکندیم، قدیما داشت، جدیدا نداره) میذاشتیم روی آجرها و یک تیکه شمع رو میریختیم داخلش (نقش روغن) بعد یک شمع دیگه زیر این تشتک روشن میکردیم صبر میکردیم شمع داخل تشتک به نقطه جوش برسه (یا حتی ی کم آتیش بگیره) بعد ی قطره آب داخلش مینداختیم و شعله چندبرابر میشد.
درس ایمنی :اگر ماهیتابه روغن روی گاز آتیش گرفت آب توش نریزید، فقط درش رو بذارید و شعله زیرش رو خاموش کنید 😁
۹۰٪ بچهها اجازه انجام اینکار رو نداشتند، من اولین بار بدون اجازه رفتم اینکارو کردم جلو در خونه خودمون وقتی پدرم دید گفت نباید اینکارو میکردی و ...
منم عذرخواهی کردم و توضیح دادم که شعله کوچیک هست (صورتمم عقب گرفتم که ابرو و موژهام نسوزه) و نمیدونستم که باید براش اجازه بگیرم، بعد چندبار به خودش نشون دادم، درنهایت گفت پس مراقب باش اشکالی نداره (بزرگ شدی دیگه)
اما قبل از اینکه پدرم من رو ببینه، بیش از ۵۰ بار اون کار رو گرده بودم.
هم همین هست، وقتی نسبت بروز Exception خیلی کم هست چرا هر دفعه میخوای چک کنی که اجازه انجام اون محاسبه رو داری یا نه ؟!
این همه گفتم، که خواهش کنم این مورد رو توی کدهاتون بیشتر رعایت کنید.
پ.ن : یادم رفت پستهای قبلی که EAFP رو توضیح دادم reply کنم ولی این اولین مورد بود (سرچ کنید باقیش رو هم میتونید بخونید)
https://t.me/pyHints/59
EAFP
( easier to ask forgiveness than permission )که هم به خودم یادآوری کرده باشم هم باقی دوستان،
اصولاً توی دنیای واقعی هم همین هست مثال میزنم که جا بیوفته (چون متاسفانه خیلی کم رعایت میشه)
کودکی رو به خاطر بیارید، یک کاری میخواستی بکنی که با شک بالا میدونستی پدر و مادر اجازه نمیدهند.
وقتی میرفتی و اجازه میگرفتی، درجا نه میشنیدی حالا باید تمام جزئیات و ... رو توضیح میدادی تا همهی نگرانیها برطرف بشه
بعد شاید حتی ۱ همراه یا ... هم باهات میفرستادند و در اینصورت شما اجازه داشتی کاری که میخوای رو انجام بدی، لذتش ۲۰٪ میشد.
مثال میزنم :
یک تفریح سالمی که ما (از درس فیزیک و شیمی) داشتیم این بود که ۲ تا آجر میذاشتیم نزدیک هم ی تشتک نوشابه (باید پلاستیک کفش رو میکندیم، قدیما داشت، جدیدا نداره) میذاشتیم روی آجرها و یک تیکه شمع رو میریختیم داخلش (نقش روغن) بعد یک شمع دیگه زیر این تشتک روشن میکردیم صبر میکردیم شمع داخل تشتک به نقطه جوش برسه (یا حتی ی کم آتیش بگیره) بعد ی قطره آب داخلش مینداختیم و شعله چندبرابر میشد.
درس ایمنی :
۹۰٪ بچهها اجازه انجام اینکار رو نداشتند، من اولین بار بدون اجازه رفتم اینکارو کردم جلو در خونه خودمون وقتی پدرم دید گفت نباید اینکارو میکردی و ...
منم عذرخواهی کردم و توضیح دادم که شعله کوچیک هست (صورتمم عقب گرفتم که ابرو و موژهام نسوزه) و نمیدونستم که باید براش اجازه بگیرم، بعد چندبار به خودش نشون دادم، درنهایت گفت پس مراقب باش اشکالی نداره (بزرگ شدی دیگه)
اما قبل از اینکه پدرم من رو ببینه، بیش از ۵۰ بار اون کار رو گرده بودم.
EAFP
هم همین هست، وقتی نسبت بروز Exception خیلی کم هست چرا هر دفعه میخوای چک کنی که اجازه انجام اون محاسبه رو داری یا نه ؟!
این همه گفتم، که خواهش کنم این مورد رو توی کدهاتون بیشتر رعایت کنید.
پ.ن : یادم رفت پستهای قبلی که EAFP رو توضیح دادم reply کنم ولی این اولین مورد بود (سرچ کنید باقیش رو هم میتونید بخونید)
https://t.me/pyHints/59
Telegram
Python Hints
توی این مثال (قطعا غیر واقعی)
هر ۲ تا روش رو بررسی کردیم و البته قانون
exception
هم رعایت شده.
تفاوت سرعت رو خودتون میبینید دلیلش هم اینه که اسم تابع رو وقتی کاربر میبینه توی ۹۹٪ موارد قطعا متوجه هست که ۲ تا عدد باید بده و ...
توی
LBYL
حتی اگر همه چیز…
هر ۲ تا روش رو بررسی کردیم و البته قانون
exception
هم رعایت شده.
تفاوت سرعت رو خودتون میبینید دلیلش هم اینه که اسم تابع رو وقتی کاربر میبینه توی ۹۹٪ موارد قطعا متوجه هست که ۲ تا عدد باید بده و ...
توی
LBYL
حتی اگر همه چیز…
👍7❤1
✅ کلمه orphan معنی اش تقریبا میشه یتیم
چه ربطی به جنگو داره آقای جنگولرن 😁
توی ListView (یکی از جنریک ویوهای جنگو) با این attribute مشخص میکنیم که جنگو هنگام صفحه بندی یا pagination با رکوردهای یتیم چطوری برخورد کنه.
✔️فرض کنید هر صفحه قراره شامل 10 رکورد بشه ولی ما 53 رکورد داریم.
خب تکلیف اون 3 تای آخر چی میشه؟
میتونیم بگیم صفحه آخر میتونه 3 تا یتیم رو به سرپرستی قبول کنه 😁
لذا صفحه آخر 13 رکوردی میشه
لینک زیر ازش استفاده کرده. البته نکات دیگه ای هم برای یادگیری داره
لینک
چه ربطی به جنگو داره آقای جنگولرن 😁
توی ListView (یکی از جنریک ویوهای جنگو) با این attribute مشخص میکنیم که جنگو هنگام صفحه بندی یا pagination با رکوردهای یتیم چطوری برخورد کنه.
✔️فرض کنید هر صفحه قراره شامل 10 رکورد بشه ولی ما 53 رکورد داریم.
خب تکلیف اون 3 تای آخر چی میشه؟
میتونیم بگیم صفحه آخر میتونه 3 تا یتیم رو به سرپرستی قبول کنه 😁
لذا صفحه آخر 13 رکوردی میشه
لینک زیر ازش استفاده کرده. البته نکات دیگه ای هم برای یادگیری داره
لینک
👏10😁6👍4
Forwarded from بنیاد پایتون کاران فارسی (SorousH)
Generators
درود. میخواستم درباره ی آبجکت معروف و شناخته شده ی generator حرف بزنیم ولی با نگاه کمی متفاوت تر و به این برسیم که دقیقا چطور کار میکنه و چطور پیداش شد. نیاز هست که کمی حرف های پیش نیاز بزنیم صبور باشید.
قبل از هر چیزی درباره ی خود فانکشن حرف بزنیم ولی نه تو پایتون بلکه تو C:
وقتی یه فانکشنی کال میشه، توی call stack یک frame جدید میاد که برای اون فانکشن هست. این frame شامل تمام متغیر های لوکال و پارامتر های اون فانکشن هست. وقتی فانکشن تموم میشه چه اتفاقی میفته؟
اون frame از stack پاپ میشه(یا دقیق ترش stack pointer کم میشه)
و نکته اینجاس که هرچی که توی اون frame هست دیگه قابل دسترس نیست و اگه استفادشون کنیم undefined behavior هست. چرا؟ چون توی "مموری استک" این frame قرار داده شده بود و اون فضا الان آزاد شده و قابل استفاده هست برای بقیه(توی پرانتز، تو C که مدیریت حافظه نداره، باید آبجکت هایی که توی heap میسازیم رو خودمون مدیریت کنیم نه استک):
int *returnArray() {
int arr[3] = {11, 22, 33};
printf("%p\n", arr);
printf("%d\n", arr[1]);
return &arr;
}
int main(void) {
int *arr;
arr = returnArray();
printf("%p\n", arr);
printf("%d\n", arr[1]); // ???
}
با اینکه آدرسش رو return کردیم ولی باز نمیتونیم به آیتم های لیست دسترسی داشته باشیم.
حالا اینارو گفتم که موضوع مهمی رو بگم اونم اینکه تو پایتون هم همین call stack و اینا هست ولی اون frame object توی heap ساخته میشه. این به این معناس که اگه بخوایم میتونیم ذخیرش داشته باشیمش و همیشه بمونه! مثلا مانع از نابود شدن خودش و آبجکت های درونش بشیم. تو مثال زیر global f رو اگه از کامنت در بیارید obj از بین نمیره چون frame رو ذخیره کردیم:
from gc import collect
from sys import _getframe
class A:
def __del__(self):
print("del called")
def fn():
# global f
f = _getframe(0)
obj = A()
fn()
collect()
input()
خب حالا که اینو گفتیم بریم سراغ خود آبجکت فانکشن تو پایتون. وقتی فانکشن کال میشه یه frame object ساخته میشه. این frame object داخلش آبجکت های زیادی هست(مستقیم یا غیر مستقیم) از جمله رفرنسی داره به متغیر های داخل اون namespace و رفرنسی داره به code object که یک unit عه executable هست. داخل این code object ما bytecode ها رو داریم که همون instruction ها هستن.
درواقع instruction ها هستن که اجرا میشن و این state ذخیره میشه. تو کد زیر lasti یعنی last instruction. (توی cpu هم اتفاق مشابهی میفته. اینجا pvm میخواد بدونه چیو اجرا کرده و حالا نوبت چیه):
from sys import _getframe
def fn():
print(_getframe(0).f_lasti)
a = 10
print(_getframe(0).f_lasti)
fn()
خب حالا بخش جالب ماجرا اینجاس. ما به عنوان طراحان فرضی زبان پایتون، میدونیم که frame ما میتونه خارج از موقع کال شدن هم زنده بمونه + از طرفی به state هم که دسترسی داریم...( اینکه الان متغیر های local چیا هستن، اینکه الان تا instruction چندم اجرا شده و غیره)
فقط یه مشکلی هست، فانکشن های ما وقتی کال میشن از اولین instruction تا آخرینش رو اجرا میکنن و تموم میشن و همه ی آبجکت های داخل اون frame از بین میرن(اگه رفرنس دیگه ای نداشته باشن جای دیگه).
الان همه چیز محیا هست برای اینکه یه ساختار یا keyword جدیدی بیاریم تو زبان که هرجایی از execution فانکشن خواستیم بتونیم pause کنیم و اون رو با هر state ای که داره به حال خودش رها کنیم. بیایم yield رو معرفی کنیم! هروقت yield اومد، کافیه اجرا رو متوقف کنیم و مثل فانکشن ها(که بعد از تموم شدنشون، frame شون از stack frame جدا میشد) این generator ها رو هم frame شون رو جدا کنیم.
بعدا اگه خواسیم generator رو ادامه بدیم و روش next بزنیم(مستقیم خودمون یا غیر مستقیم توسط پایتون) تنها کاری که باید بکنیم اینه که frame ش رو برداریم بچسبونیم به stack frame ممون و از اون state ای که بودیم ادامه بدیم.
def gen():
a = 1
yield
b = 1
yield
g = gen()
next(g)
print(g.gi_frame.f_lasti, g.gi_frame.f_locals)
next(g)
print(g.gi_frame.f_lasti, g.gi_frame.f_locals)
این call stack با linkedlist پیاده سازی شده و frame ها نود های اون هستن. با f_back به frame قبلی اشاره میکنن به راحتی وصل میشن و جدا میشن.
جنریتور ها با وجود سرعت خوبی که دارن، برای سرعت بیشتر ساخته نشدن بلکه برای استفاده ی بهینه تر از مموری ساخته شدن. داشتن همچین آبجکتی(به اضافه ی ساختار هایی مثل yield from) میتونه زمینه ی خیلی چیز ها رو فراهم کنه. از جمله فریموورک هایی مثل asyncio :)
درود. میخواستم درباره ی آبجکت معروف و شناخته شده ی generator حرف بزنیم ولی با نگاه کمی متفاوت تر و به این برسیم که دقیقا چطور کار میکنه و چطور پیداش شد. نیاز هست که کمی حرف های پیش نیاز بزنیم صبور باشید.
قبل از هر چیزی درباره ی خود فانکشن حرف بزنیم ولی نه تو پایتون بلکه تو C:
وقتی یه فانکشنی کال میشه، توی call stack یک frame جدید میاد که برای اون فانکشن هست. این frame شامل تمام متغیر های لوکال و پارامتر های اون فانکشن هست. وقتی فانکشن تموم میشه چه اتفاقی میفته؟
اون frame از stack پاپ میشه(یا دقیق ترش stack pointer کم میشه)
و نکته اینجاس که هرچی که توی اون frame هست دیگه قابل دسترس نیست و اگه استفادشون کنیم undefined behavior هست. چرا؟ چون توی "مموری استک" این frame قرار داده شده بود و اون فضا الان آزاد شده و قابل استفاده هست برای بقیه(توی پرانتز، تو C که مدیریت حافظه نداره، باید آبجکت هایی که توی heap میسازیم رو خودمون مدیریت کنیم نه استک):
int *returnArray() {
int arr[3] = {11, 22, 33};
printf("%p\n", arr);
printf("%d\n", arr[1]);
return &arr;
}
int main(void) {
int *arr;
arr = returnArray();
printf("%p\n", arr);
printf("%d\n", arr[1]); // ???
}
با اینکه آدرسش رو return کردیم ولی باز نمیتونیم به آیتم های لیست دسترسی داشته باشیم.
حالا اینارو گفتم که موضوع مهمی رو بگم اونم اینکه تو پایتون هم همین call stack و اینا هست ولی اون frame object توی heap ساخته میشه. این به این معناس که اگه بخوایم میتونیم ذخیرش داشته باشیمش و همیشه بمونه! مثلا مانع از نابود شدن خودش و آبجکت های درونش بشیم. تو مثال زیر global f رو اگه از کامنت در بیارید obj از بین نمیره چون frame رو ذخیره کردیم:
from gc import collect
from sys import _getframe
class A:
def __del__(self):
print("del called")
def fn():
# global f
f = _getframe(0)
obj = A()
fn()
collect()
input()
خب حالا که اینو گفتیم بریم سراغ خود آبجکت فانکشن تو پایتون. وقتی فانکشن کال میشه یه frame object ساخته میشه. این frame object داخلش آبجکت های زیادی هست(مستقیم یا غیر مستقیم) از جمله رفرنسی داره به متغیر های داخل اون namespace و رفرنسی داره به code object که یک unit عه executable هست. داخل این code object ما bytecode ها رو داریم که همون instruction ها هستن.
درواقع instruction ها هستن که اجرا میشن و این state ذخیره میشه. تو کد زیر lasti یعنی last instruction. (توی cpu هم اتفاق مشابهی میفته. اینجا pvm میخواد بدونه چیو اجرا کرده و حالا نوبت چیه):
from sys import _getframe
def fn():
print(_getframe(0).f_lasti)
a = 10
print(_getframe(0).f_lasti)
fn()
خب حالا بخش جالب ماجرا اینجاس. ما به عنوان طراحان فرضی زبان پایتون، میدونیم که frame ما میتونه خارج از موقع کال شدن هم زنده بمونه + از طرفی به state هم که دسترسی داریم...( اینکه الان متغیر های local چیا هستن، اینکه الان تا instruction چندم اجرا شده و غیره)
فقط یه مشکلی هست، فانکشن های ما وقتی کال میشن از اولین instruction تا آخرینش رو اجرا میکنن و تموم میشن و همه ی آبجکت های داخل اون frame از بین میرن(اگه رفرنس دیگه ای نداشته باشن جای دیگه).
الان همه چیز محیا هست برای اینکه یه ساختار یا keyword جدیدی بیاریم تو زبان که هرجایی از execution فانکشن خواستیم بتونیم pause کنیم و اون رو با هر state ای که داره به حال خودش رها کنیم. بیایم yield رو معرفی کنیم! هروقت yield اومد، کافیه اجرا رو متوقف کنیم و مثل فانکشن ها(که بعد از تموم شدنشون، frame شون از stack frame جدا میشد) این generator ها رو هم frame شون رو جدا کنیم.
بعدا اگه خواسیم generator رو ادامه بدیم و روش next بزنیم(مستقیم خودمون یا غیر مستقیم توسط پایتون) تنها کاری که باید بکنیم اینه که frame ش رو برداریم بچسبونیم به stack frame ممون و از اون state ای که بودیم ادامه بدیم.
def gen():
a = 1
yield
b = 1
yield
g = gen()
next(g)
print(g.gi_frame.f_lasti, g.gi_frame.f_locals)
next(g)
print(g.gi_frame.f_lasti, g.gi_frame.f_locals)
این call stack با linkedlist پیاده سازی شده و frame ها نود های اون هستن. با f_back به frame قبلی اشاره میکنن به راحتی وصل میشن و جدا میشن.
جنریتور ها با وجود سرعت خوبی که دارن، برای سرعت بیشتر ساخته نشدن بلکه برای استفاده ی بهینه تر از مموری ساخته شدن. داشتن همچین آبجکتی(به اضافه ی ساختار هایی مثل yield from) میتونه زمینه ی خیلی چیز ها رو فراهم کنه. از جمله فریموورک هایی مثل asyncio :)
👍5👏1
ویدئویی کوتاه برای سطح جونیور که توصیه میکنم ببینید
✔️ در ویدیو جدید یوتوب راجع به ۳ تا تکنیک ریفکتورینگ در پایتون با متدهای built-in و مثال هایی در زمینه های زیر صحبت میکنیم:
✅ ریفکتور یک کد نمونه سازمان مسافرتی و پروازهای فعال
✅ ریفکتور یک کد نمونه فروشگاهی و محاسبه مجموع قیمت
✅ ریفکتور یک کد نمونه بانک و شرایط وام دهی
و همچنین منبعی رو برای مطالعه بیشتر معرفی میکنیم.
🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/YVIO3V5JzuI?si=VvD4pm3rZ_hsS4qq
〰️〰️〰️〰️〰️〰️
@BobyDotCloud
✔️ در ویدیو جدید یوتوب راجع به ۳ تا تکنیک ریفکتورینگ در پایتون با متدهای built-in و مثال هایی در زمینه های زیر صحبت میکنیم:
✅ ریفکتور یک کد نمونه سازمان مسافرتی و پروازهای فعال
✅ ریفکتور یک کد نمونه فروشگاهی و محاسبه مجموع قیمت
✅ ریفکتور یک کد نمونه بانک و شرایط وام دهی
و همچنین منبعی رو برای مطالعه بیشتر معرفی میکنیم.
🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/YVIO3V5JzuI?si=VvD4pm3rZ_hsS4qq
〰️〰️〰️〰️〰️〰️
@BobyDotCloud
👍9
Forwarded from Renani Mohsen / محسن رنانی
.
✍ ترور یعنی پایان
هر فرد یا گروهی که به نقطه ترور و «خشونتِ کور» برسد دارد به پایان خویش اعتراف میکند. فرقی نمیکند که برحق باشی یا باطل، مظلوم باشی یا ظالم و چه کسی را میکشی مقصر یا بیگناه؛ همین که تصمیم به خشونت کور گرفتی یعنی ذهن تو و روان تو به بنبست رسیده است: بنبست در اندیشیدن و راهی عقلانی یافتن، بنبست در اخلاقی زیستن و انسان ماندن، و بنبست در تابآوری روانشناختی و از هم نگسیختن. درواقع جهان و زندگی و جامعه به بنبست نرسیده است تو به بنبست رسیدهای و آن هم دو بنبست: بنبستی در خویش و بنبستی با بیرون خویش.
کسی که با خویش در آشتی است و هنوز در درونش جوانه امید و عطر معنا برای زندگی هست، در بدترین فشارهای بیرون نیز از خویشتنِ خویش انرژی میگیرد و زیستِ درونی عقلانی و شادمانهای دارد. و کسی که با بیرون خویش در آشتی است، در سختترین فرسودگیها و تلاطمات درونی نیز این فرصت را دارد که از بیرون (جامعه و هستی) انرژی بگیرد و تنها نماند و به نقطه استیصال نرسد. تنها کسانی که هم در درون خویش و هم با بیرون خویش به بنبست رسیدهاند، دست به خشونت کور میبرند؛ فرقی نمیکند فرد باشد یا گروه یا فرقه یا حزب یا حتی یک حکومت. حتی وقتی یک ایدئولوژی فرمان به خشونت کور میدهد، درواقع دارد به غیرانسانی بودن خود و به بنبست رسیدن خود و به پایان یافتن خود اعتراف میکند.
پس آنکه در خشونتِ کور میکُشد، خواه خود را خواه دیگری را، او در دو بنبست گیرافتاده است و با این کار پیام میدهد که به نقطه پایان خویش رسیده است، گرچه هنوز ظاهراً زنده باشد و در دستش بمب یا اسلحه باشد و ظاهراً هنوز قدرت کشتن داشته باشد.
خشونت کور البته پیام دیگری هم دارد: چیزهایی سرجای خودش نیست و احتمالا خیلی وقت است که سرجایش نبوده است و باید گشت و یافت و اصلاح کرد آنچه را که سرجای خودش نیست و باعث شده است که برخی به بنبست کشیده شوند و تصمیم بگیرند با خیال پایان دیگران، پایان خویش را رقم بزنند.
و اما این غصههایی که این روزها از درون و بیرون، غزه یا کرمان یا هرجایی که بیگناهی کشته میشود، بر دلمان میبارد، و این مصیبتهایی که پیدرپی برسرمان آوار میشود، اگر نکشدمان، قویترمان میکند.
به مردم کرمان، به مردم ایران و به همه انسانهای صلحجوی جهان تسلیت میگویم که کشته شدن ظالمانه حتی یک انسان بیگناه خبر بدی است برای همه آنانی که امید دارند در جهانی انسانیتر زیست کنند.
محسن رنانی / ۱۴ دیماه ۱۴۰۲
@Renani_Mohsen
.
✍ ترور یعنی پایان
هر فرد یا گروهی که به نقطه ترور و «خشونتِ کور» برسد دارد به پایان خویش اعتراف میکند. فرقی نمیکند که برحق باشی یا باطل، مظلوم باشی یا ظالم و چه کسی را میکشی مقصر یا بیگناه؛ همین که تصمیم به خشونت کور گرفتی یعنی ذهن تو و روان تو به بنبست رسیده است: بنبست در اندیشیدن و راهی عقلانی یافتن، بنبست در اخلاقی زیستن و انسان ماندن، و بنبست در تابآوری روانشناختی و از هم نگسیختن. درواقع جهان و زندگی و جامعه به بنبست نرسیده است تو به بنبست رسیدهای و آن هم دو بنبست: بنبستی در خویش و بنبستی با بیرون خویش.
کسی که با خویش در آشتی است و هنوز در درونش جوانه امید و عطر معنا برای زندگی هست، در بدترین فشارهای بیرون نیز از خویشتنِ خویش انرژی میگیرد و زیستِ درونی عقلانی و شادمانهای دارد. و کسی که با بیرون خویش در آشتی است، در سختترین فرسودگیها و تلاطمات درونی نیز این فرصت را دارد که از بیرون (جامعه و هستی) انرژی بگیرد و تنها نماند و به نقطه استیصال نرسد. تنها کسانی که هم در درون خویش و هم با بیرون خویش به بنبست رسیدهاند، دست به خشونت کور میبرند؛ فرقی نمیکند فرد باشد یا گروه یا فرقه یا حزب یا حتی یک حکومت. حتی وقتی یک ایدئولوژی فرمان به خشونت کور میدهد، درواقع دارد به غیرانسانی بودن خود و به بنبست رسیدن خود و به پایان یافتن خود اعتراف میکند.
پس آنکه در خشونتِ کور میکُشد، خواه خود را خواه دیگری را، او در دو بنبست گیرافتاده است و با این کار پیام میدهد که به نقطه پایان خویش رسیده است، گرچه هنوز ظاهراً زنده باشد و در دستش بمب یا اسلحه باشد و ظاهراً هنوز قدرت کشتن داشته باشد.
خشونت کور البته پیام دیگری هم دارد: چیزهایی سرجای خودش نیست و احتمالا خیلی وقت است که سرجایش نبوده است و باید گشت و یافت و اصلاح کرد آنچه را که سرجای خودش نیست و باعث شده است که برخی به بنبست کشیده شوند و تصمیم بگیرند با خیال پایان دیگران، پایان خویش را رقم بزنند.
و اما این غصههایی که این روزها از درون و بیرون، غزه یا کرمان یا هرجایی که بیگناهی کشته میشود، بر دلمان میبارد، و این مصیبتهایی که پیدرپی برسرمان آوار میشود، اگر نکشدمان، قویترمان میکند.
به مردم کرمان، به مردم ایران و به همه انسانهای صلحجوی جهان تسلیت میگویم که کشته شدن ظالمانه حتی یک انسان بیگناه خبر بدی است برای همه آنانی که امید دارند در جهانی انسانیتر زیست کنند.
محسن رنانی / ۱۴ دیماه ۱۴۰۲
@Renani_Mohsen
.
❤25👎8👏4👍2🤮2🥱2🔥1😁1
Forwarded from Microfrontend.ir
بهینه سازی مدلهای Django با PostgreSQL Tablespace
یک الگوی رایج برای بهینهسازی عملکرد در سیستمهای پایگاه داده، استفاده ازTablespace برای سازماندهی طرح دیسک است. در این ویدیو بهینه سازی مدلهای Django با PostgreSQL Tablespace را بررسی کردیم که از طریق آن میتوان محل ذخیره سازی داده ها را بین فضاهای مختلف ذخیره سازی که میتوانند کندتر یا سریعتر باشند.
Video Link: https://youtu.be/1gBizdUgzBw
Django Tips Playlist:
https://www.youtube.com/playlist?list=PLJ9zDGwhhsBwdrfdaoOqbYev3_ocuBOfv
〰️〰️〰️〰️〰️〰️
© | @microfrontend_ir
یک الگوی رایج برای بهینهسازی عملکرد در سیستمهای پایگاه داده، استفاده ازTablespace برای سازماندهی طرح دیسک است. در این ویدیو بهینه سازی مدلهای Django با PostgreSQL Tablespace را بررسی کردیم که از طریق آن میتوان محل ذخیره سازی داده ها را بین فضاهای مختلف ذخیره سازی که میتوانند کندتر یا سریعتر باشند.
Video Link: https://youtu.be/1gBizdUgzBw
Django Tips Playlist:
https://www.youtube.com/playlist?list=PLJ9zDGwhhsBwdrfdaoOqbYev3_ocuBOfv
〰️〰️〰️〰️〰️〰️
© | @microfrontend_ir
👍6🔥1
Forwarded from یادگیری ماشین با چاشنی صنعت (Abolfazl 🤘)
دیزاین notification system قسمت اول
سلام دوستای عزیز همراه شما هستیم با یک بخش دیگه از خوبای مصاحبه سیستم دیزاین که البته از اسمش معلومه چی هست و چقد این روزا رو بورسه.
فرض کنید شما میخواین یه سیستم نوتیف طراحی کنید که روزانه به میلیون ها کاربر یه نوتیف ارسال شه حالا اون نوتیف میتونه ایمیل، پیامک یا هر شکل دیگه ای داشته باشه. مسلما اصلا کار آسونی نیست که میلیون ها و حتی میلیارد ها کاربر رو ساپورت کنیم.
پس اولین مسئله ای که ما باهاش سر و کار داریم scalability هستش. یعنی همون مقیاس پذیری. ما به عنوان یک معمار سیستم یا مهندس نرم افزار ارشد باید بتونیم این چاله چوله ها رو جوری پر کنیم که فحش کمتری رو از کاربران دریافت کنیم و بتونیم بالاخره scale قابل توجهی از کاربران رو ساپورت کنیم.
فرضیات ما از این سیستم:
۱ - ما انواع نوتیف ها ( ایمیل، موبایل و پیامک) رو ساپورت میکنیم
۲ - سیستم ما به شکل real time پیاده میشه و کاربرا کمترین زمان انتظار تا دریافت نوتیف رو دارن ( جوگیر نشید تو سیستمای معمولی این روش رو پیاده کنید الکی پیچیده کنیدا ! این واسه سیستمای بزرگه)
۳ - روی دیوایس های اندروید، IOS و دسکتاپ ساپورت میشه
۴ - نوتیف توسط برنامه های مختلف سمت کاربر با هماهنگی سمت سرور دریافت میشه
۵ - روزانه ۱۰ میلیون push notif، یک میلیون پیامک و ۵ میلیون ایمیل ارسال میشه
سلام دوستای عزیز همراه شما هستیم با یک بخش دیگه از خوبای مصاحبه سیستم دیزاین که البته از اسمش معلومه چی هست و چقد این روزا رو بورسه.
فرض کنید شما میخواین یه سیستم نوتیف طراحی کنید که روزانه به میلیون ها کاربر یه نوتیف ارسال شه حالا اون نوتیف میتونه ایمیل، پیامک یا هر شکل دیگه ای داشته باشه. مسلما اصلا کار آسونی نیست که میلیون ها و حتی میلیارد ها کاربر رو ساپورت کنیم.
پس اولین مسئله ای که ما باهاش سر و کار داریم scalability هستش. یعنی همون مقیاس پذیری. ما به عنوان یک معمار سیستم یا مهندس نرم افزار ارشد باید بتونیم این چاله چوله ها رو جوری پر کنیم که فحش کمتری رو از کاربران دریافت کنیم و بتونیم بالاخره scale قابل توجهی از کاربران رو ساپورت کنیم.
فرضیات ما از این سیستم:
۱ - ما انواع نوتیف ها ( ایمیل، موبایل و پیامک) رو ساپورت میکنیم
۲ - سیستم ما به شکل real time پیاده میشه و کاربرا کمترین زمان انتظار تا دریافت نوتیف رو دارن ( جوگیر نشید تو سیستمای معمولی این روش رو پیاده کنید الکی پیچیده کنیدا ! این واسه سیستمای بزرگه)
۳ - روی دیوایس های اندروید، IOS و دسکتاپ ساپورت میشه
۴ - نوتیف توسط برنامه های مختلف سمت کاربر با هماهنگی سمت سرور دریافت میشه
۵ - روزانه ۱۰ میلیون push notif، یک میلیون پیامک و ۵ میلیون ایمیل ارسال میشه
👍4