Forwarded from Python BackendHub (Mani)
سورس کدی که خوب تست نداره هر PR ای که زده میشه بهش، مثل رولت روسی (Russian roulette) میمونه 😁
@PyBackendHub
@PyBackendHub
Sadra Codes
سورس کدی که خوب تست نداره هر PR ای که زده میشه بهش، مثل رولت روسی (Russian roulette) میمونه 😁 @PyBackendHub
یه مدت سعی کردم هر ریپازیتوری که میسازم، تاجایی که ممکنه علاوه بر تست خوب، کاورج رو بالای ۹۵ نگه دارم. (اون ۵ درصدم چیزایی که بخاطر دیزاین بد نتونستم تست کنم و باید سریع ریفکتور شه)
اوایل ایگنور میکردم اون فایلها یا خطها رو تا Badge کاورج ۱۰۰ درصد خودنمایی کنه توی ریدمی ریپازیتوری، ولی خب چراا مرد؟ 😂
نمیدونید تستهایی که صد در صد کدبیس رو تست میکنن چقدر خوبن! فرض کن ۱۰۰۰ تا فیچر توی پروژهات داری. یهو یه PR میاد. راحت با یه کامند میتونی مطمئن شی که این PR هیچ چیزی رو Break نمیکنه و (حداقل) از این بابت ایمنه. این دقیقا یه لول بعد از لاجیک برنامه هست. یعنی شما به توافق رسیدی که فلان PR باید زده شه، فلان بخش باید تغییر کنه. حالا این اتفاق افتاده و تستها کارشون رو انجام میدن.
من اولش که TDD رو مطالعه میکردم اینجوری بودم که: هنن؟ چرا باید واسه هیچی (پروژهای که خالیه) تست بنویسی؟ اصلا چی بنویسی؟ چیو میخوای تست کنی وقتی چیزی وجود نداره اصلا؟ ولی بعد که رفتم جلوتر، دیدم فرهنگ جالبی داره و خیلی UX رو میبره بالا. منظورم UXی هست که یه توسعهدهنده دیگه از ابزار شما به دست میاره. (فرضا ابزارتون یه کتابخونه هست)
راجع به TDD در Integration Testing و مشکلاتش، اینکه چرا زیاد جالب نیست هم بعدا یه پست میذارم. :)) 🙌
اوایل ایگنور میکردم اون فایلها یا خطها رو تا Badge کاورج ۱۰۰ درصد خودنمایی کنه توی ریدمی ریپازیتوری، ولی خب چراا مرد؟ 😂
نمیدونید تستهایی که صد در صد کدبیس رو تست میکنن چقدر خوبن! فرض کن ۱۰۰۰ تا فیچر توی پروژهات داری. یهو یه PR میاد. راحت با یه کامند میتونی مطمئن شی که این PR هیچ چیزی رو Break نمیکنه و (حداقل) از این بابت ایمنه. این دقیقا یه لول بعد از لاجیک برنامه هست. یعنی شما به توافق رسیدی که فلان PR باید زده شه، فلان بخش باید تغییر کنه. حالا این اتفاق افتاده و تستها کارشون رو انجام میدن.
من اولش که TDD رو مطالعه میکردم اینجوری بودم که: هنن؟ چرا باید واسه هیچی (پروژهای که خالیه) تست بنویسی؟ اصلا چی بنویسی؟ چیو میخوای تست کنی وقتی چیزی وجود نداره اصلا؟ ولی بعد که رفتم جلوتر، دیدم فرهنگ جالبی داره و خیلی UX رو میبره بالا. منظورم UXی هست که یه توسعهدهنده دیگه از ابزار شما به دست میاره. (فرضا ابزارتون یه کتابخونه هست)
راجع به TDD در Integration Testing و مشکلاتش، اینکه چرا زیاد جالب نیست هم بعدا یه پست میذارم. :)) 🙌
Forwarded from Python BackendHub (Mani)
یک نکته به حرفای صدرا اضافه کنم
قانون goodhart میگه که اگه یک measure (معیار) تبدیل به تارگت بشه، دیگه معیار خوبی نیست.
برای همین من اصلا چیزایی مثل تست کاوریج و استوری پوینتو اینا رو قبول ندارم. چون اینا measure نیستن هیچوقت همیشه تارگت میشن.
همین اتفاقی که واسه صدرا افتاد، شما به جای اینکه دنبال این باشین که تست بنویسید که یوزکیس و ادجکیس هارو کاور کنید، تست مینویسید که صد در صد شه 😅. برای همین قبلا گفتم تست کاوریج یک دروغه. خوبه که داشته باشیم، بدونیم عه فلان فایلمون اصلا کاور نشده، ولی target نیست! همین موضوع راجب استوری پوینت، استوری پوینت تارگت نیست!
تارگت باید این باشه: تست هایی که business requirement رو تست میکنن، که گارانتی میدن نرم افزار اون requirement رو satisfy میکنه طبق اون شرایط
استوری پونینتم همینه ها هیچ فرقی نداره. اونایی که از هر اسپرینت میام جمع میزنن استوری پوینتو و هدفشون میشه استوری پوینت دقیقا تو همین دستن.
@PyBackendHub
قانون goodhart میگه که اگه یک measure (معیار) تبدیل به تارگت بشه، دیگه معیار خوبی نیست.
برای همین من اصلا چیزایی مثل تست کاوریج و استوری پوینتو اینا رو قبول ندارم. چون اینا measure نیستن هیچوقت همیشه تارگت میشن.
همین اتفاقی که واسه صدرا افتاد، شما به جای اینکه دنبال این باشین که تست بنویسید که یوزکیس و ادجکیس هارو کاور کنید، تست مینویسید که صد در صد شه 😅. برای همین قبلا گفتم تست کاوریج یک دروغه. خوبه که داشته باشیم، بدونیم عه فلان فایلمون اصلا کاور نشده، ولی target نیست! همین موضوع راجب استوری پوینت، استوری پوینت تارگت نیست!
تارگت باید این باشه: تست هایی که business requirement رو تست میکنن، که گارانتی میدن نرم افزار اون requirement رو satisfy میکنه طبق اون شرایط
استوری پونینتم همینه ها هیچ فرقی نداره. اونایی که از هر اسپرینت میام جمع میزنن استوری پوینتو و هدفشون میشه استوری پوینت دقیقا تو همین دستن.
@PyBackendHub
Forwarded from shahriaarrr
🚨دعوت برای اسپانسرینگ پادکست کیبوردکست🚨
دوستان سلام👋
هیچوقت دوست نداشتم که این پیام رو ارسال کنم اما از سر ناچاری اینجا رو آخرین پایگاهی دیدم که صدای خودمو برسونم و دست هامو برای یاری گرفتن از شما دراز کنم و این فراخوان رو قرار بدم💔💔
برای ضبط ۳ اپیزود پایانی کیبوردکست یعنی اپیزودهای «سهراب بهدانی»، «احسان قربانی» و اپیزود ویژه فصل اول نیازمند مکانی برای ضبط هستیم که این سه اپیزود رو نه بصورت مجازی در دیسکورد، بلکه بصورت حضوری در مشهد در دو نسخه صوتی و ویدیویی رو ضبط بکنیم.
از اونجایی که نه محل مناسبی برای ضبط نداریم و هزینه اجاره استودیو هم بالاست، لذابصورت رسمی این فراخوان رو منتشر کردم تا از افراد و شرکتها دعوت کنم در صورت امکان اسپانسر هر کدام از اپیزودها یا هر سه اپیزود پایانی کیبوردکست بشن❤️
جهت ارتباط با من درباره موضوع «اسپانسرشیپ» میتونید ایمیل بزنید:
[email protected]
همچنین درصورتی که تمایل به کمک از طریق دونیت دارید هم میتونید از طریق این لینک مبلغ دلخواه خودتون رو دونیت کنید:
https://daramet.com/shahriaarrr
تمامی دونیت ها برای پادکست کیبوردکست خرج خواهد شد و بصورت یک گزارش در کانال تلگرامی اختصاصی دونیت ها مخارج ارائه خواهد شد:
https://www.tg-me.com/shahriaarrrDonations
سپاس فراوان❤️
@shahriaarrr12
دوستان سلام👋
هیچوقت دوست نداشتم که این پیام رو ارسال کنم اما از سر ناچاری اینجا رو آخرین پایگاهی دیدم که صدای خودمو برسونم و دست هامو برای یاری گرفتن از شما دراز کنم و این فراخوان رو قرار بدم💔💔
برای ضبط ۳ اپیزود پایانی کیبوردکست یعنی اپیزودهای «سهراب بهدانی»، «احسان قربانی» و اپیزود ویژه فصل اول نیازمند مکانی برای ضبط هستیم که این سه اپیزود رو نه بصورت مجازی در دیسکورد، بلکه بصورت حضوری در مشهد در دو نسخه صوتی و ویدیویی رو ضبط بکنیم.
از اونجایی که نه محل مناسبی برای ضبط نداریم و هزینه اجاره استودیو هم بالاست، لذابصورت رسمی این فراخوان رو منتشر کردم تا از افراد و شرکتها دعوت کنم در صورت امکان اسپانسر هر کدام از اپیزودها یا هر سه اپیزود پایانی کیبوردکست بشن❤️
جهت ارتباط با من درباره موضوع «اسپانسرشیپ» میتونید ایمیل بزنید:
[email protected]
همچنین درصورتی که تمایل به کمک از طریق دونیت دارید هم میتونید از طریق این لینک مبلغ دلخواه خودتون رو دونیت کنید:
https://daramet.com/shahriaarrr
تمامی دونیت ها برای پادکست کیبوردکست خرج خواهد شد و بصورت یک گزارش در کانال تلگرامی اختصاصی دونیت ها مخارج ارائه خواهد شد:
https://www.tg-me.com/shahriaarrrDonations
سپاس فراوان❤️
@shahriaarrr12
Forwarded from Python BackendHub (Mani)
آیوکلاک (AioClock) یک فریم ورک برای scheduling و یا تسک منیجمنت هست و هر چیزی که هر فریم ورکی نیاز داره رو داخلش داره, مثل دپندسی اینجکشن و startup/stop ایونت, ساپورت از ماژولار کد نوشتن و ...
امشب وقت گذاشتم و داکیونتشو خیلی بهتر کردم که کاملا متوجه شید فریم ورک چطوری کار میکنه. تو عکس واضح نیست کامل تصیه میکنم سری به داکیومنت بزنید.
داکیومنت
گیتهاب
@PyBackendHub
امشب وقت گذاشتم و داکیونتشو خیلی بهتر کردم که کاملا متوجه شید فریم ورک چطوری کار میکنه. تو عکس واضح نیست کامل تصیه میکنم سری به داکیومنت بزنید.
داکیومنت
گیتهاب
@PyBackendHub
🚩 پایتون ۳.۱۳؛ فیچرهای جدید و دپریکیشنها!
🔥 گیل (GIL) آپشنال: امکان بیلد گرفتن از CPython و غیرفعال کردن GIL. (در حالت عادی شما از GIL استفاده میکنید)
🔥 کامپایلر JIT: قراره در این پچ جدید، از یک کامپایلر just in time رونمایی شه که در یک سری از سناریوهای خاص، سرعت اجرای کدتون رو افزایش میده. این رو موقع بیلد گرفتن دستی از CPython میشه تنظیم کرد و بصورت پیشفرض غيرفعال هست.
🔥 تایپ هینت
🔥 ساپورت از سیستمعامل iOS: یک رلیز قابل نصب روی iOS قراره در این پچ قرار داده بشه. هنوز خبری از رلیز اندروید نیست ولی گویا دارن روش کار میکنن. (چیزی که بعنوان پایتون روی دیوایسهای اندرویدتون نصب دارید، رلیز لینوکس پایتون هست.)
🔥 بهبود Interaction: ارورها و تریسبکها دقیقتر و هوشمندتر شدن. همچنین ارورها بصورت رنگی نمایش داده میشن.
🔥 بهبود REPL: کامندهای
و کلی فیچر و امکانات جدید که توی ۵ دقیقه در مقاله زیر توضیح دادم به همراه مثالهای ساده و قابل فهم:
🔗 https://blog.imsadra.me/python-313-new-features-deprecations
For more 👉 @lnxpylnxpy
🔥 گیل (GIL) آپشنال: امکان بیلد گرفتن از CPython و غیرفعال کردن GIL. (در حالت عادی شما از GIL استفاده میکنید)
🔥 کامپایلر JIT: قراره در این پچ جدید، از یک کامپایلر just in time رونمایی شه که در یک سری از سناریوهای خاص، سرعت اجرای کدتون رو افزایش میده. این رو موقع بیلد گرفتن دستی از CPython میشه تنظیم کرد و بصورت پیشفرض غيرفعال هست.
🔥 تایپ هینت
IsType
و ReadOnly
: دوتا تایپ جدید به typing
اضافه شده. در مقاله مثال زدم.🔥 ساپورت از سیستمعامل iOS: یک رلیز قابل نصب روی iOS قراره در این پچ قرار داده بشه. هنوز خبری از رلیز اندروید نیست ولی گویا دارن روش کار میکنن. (چیزی که بعنوان پایتون روی دیوایسهای اندرویدتون نصب دارید، رلیز لینوکس پایتون هست.)
🔥 بهبود Interaction: ارورها و تریسبکها دقیقتر و هوشمندتر شدن. همچنین ارورها بصورت رنگی نمایش داده میشن.
🔥 بهبود REPL: کامندهای
exit
، help
و quit
تغییر کردن.و کلی فیچر و امکانات جدید که توی ۵ دقیقه در مقاله زیر توضیح دادم به همراه مثالهای ساده و قابل فهم:
🔗 https://blog.imsadra.me/python-313-new-features-deprecations
For more 👉 @lnxpylnxpy
Forwarded from Python BackendHub (Mani)
بحث خوبی شد تو گروه, یکی پرسید که JIT چیه و چی کار میکنه دقیقا. سعی میکنم خیلی ساده توضیح بدم که قابل درک باشه برای همه.
وقتی یه اسکریپت پایتونی رو ران میکنی، یه سری فایل با پسوند .pyc تو پوشهی pycache ساخته میشه. اینا بایت کد هستن. بایت کد چیه؟ یه low level representation از کدی که نوشتی. بایت کد platform independent هست یعنی مهم نیست رو چی داری رانش میکنی. اما این بایت کد برای CPU قابل فهم نیست. CPU فقط ماشین کد رو میفهمه، یعنی همون باینری صفر و یک. پس وقتی بایت کد تولید میشه، PVM (Python Virtual Machine) میاد و بایت کد رو به ماشین کد تفسیر میکنه تا CPU بتونه اجراش کنه.
حالا JIT چیه؟ تبدیل بایت کد به ماشین کد زمان و منابع مصرف میکنه. JIT توی رانتایم این تبدیل رو انجام میده و ماشین کد رو توی حافظه نگه میداره تا دفعات بعدی که همون کد اجرا میشه، دوباره نیاز به تبدیل نباشه. اینکار رو فقط برای بخشهایی از کد که زیاد اجرا میشن (بهشون میگن hot loop) انجام میده. چرا؟ چون خوده ذخیره کردن این دیتا پرهزینست و مموری اشغال میکنه پس کل کد رو نمیاد اینکارو کنه. یعنی JIT Engine نگاه میکنه ببینه این بخش از کد اونقدری داره اجرا میشه که ارزش داشته باشه ماشین کدش رو نگه داره یا نه.
چرا کد پایتون مستقیم کد ماشین نمیشه؟ دلیلش اینه که PVM و Python runtime environment داره تو پایتون کارای دیگهای هم میکنه تو ران تایم مثل مدیریت حافظه، لود کردن ماژولها و پکیجها و... این باعث میشه که پایتون انعطافپذیر و راحت باشه، ولی خب به قیمت افت عملکرد در مقایسه با زبان های کامپایلری مثل C.
@PyBackendHub
وقتی یه اسکریپت پایتونی رو ران میکنی، یه سری فایل با پسوند .pyc تو پوشهی pycache ساخته میشه. اینا بایت کد هستن. بایت کد چیه؟ یه low level representation از کدی که نوشتی. بایت کد platform independent هست یعنی مهم نیست رو چی داری رانش میکنی. اما این بایت کد برای CPU قابل فهم نیست. CPU فقط ماشین کد رو میفهمه، یعنی همون باینری صفر و یک. پس وقتی بایت کد تولید میشه، PVM (Python Virtual Machine) میاد و بایت کد رو به ماشین کد تفسیر میکنه تا CPU بتونه اجراش کنه.
حالا JIT چیه؟ تبدیل بایت کد به ماشین کد زمان و منابع مصرف میکنه. JIT توی رانتایم این تبدیل رو انجام میده و ماشین کد رو توی حافظه نگه میداره تا دفعات بعدی که همون کد اجرا میشه، دوباره نیاز به تبدیل نباشه. اینکار رو فقط برای بخشهایی از کد که زیاد اجرا میشن (بهشون میگن hot loop) انجام میده. چرا؟ چون خوده ذخیره کردن این دیتا پرهزینست و مموری اشغال میکنه پس کل کد رو نمیاد اینکارو کنه. یعنی JIT Engine نگاه میکنه ببینه این بخش از کد اونقدری داره اجرا میشه که ارزش داشته باشه ماشین کدش رو نگه داره یا نه.
چرا کد پایتون مستقیم کد ماشین نمیشه؟ دلیلش اینه که PVM و Python runtime environment داره تو پایتون کارای دیگهای هم میکنه تو ران تایم مثل مدیریت حافظه، لود کردن ماژولها و پکیجها و... این باعث میشه که پایتون انعطافپذیر و راحت باشه، ولی خب به قیمت افت عملکرد در مقایسه با زبان های کامپایلری مثل C.
@PyBackendHub
Forwarded from Python BackendHub (Mani)
مهدی تو کامنتا اشاره کرد که میتونید NewType بزنید. اسم دیگه New Type تو تایپ سیستم بهش Brand Type هم میگن. شما دارین یک تایپ رو برند میکنید. برند کردن یک تایپ یعنی چی؟
به مثال زیر دقت کنید
ایمیل تو ران تایم, تایپش str معمولیه. هیچ فرقی نکرده. ولی برای تایپ چکر ایمیل EmailType هست. اینطوری شما اگه یک تابع داشتی send_email که یک ایمیل میگرفت نیاز نیست هربار ولیدیت کنی که ایا واقعا این استرینگی که داده شده به کد شما درواقع ایمیل هست یا نه. به جاش EmailType استفاده میکنی.
اینجام دقیقا همینه. شما نیازی نیست که تو ران تایم تو توابعت وقتی یک همچین کیسی داری که دو جا دو چیز به هم لینک شدن بیای هربار چک کنی که این ورودی از اون تابع اومده یا نه. به جاش تو فانکشن get_books خروجی رو Brand میکنی. مثلا SortedBookList. و ورودی این تابع رو فقط میذاری SortedBookList.
البته که هنوز شما میتونی خطا کنی. شما همچنان میتونی تو ران تایم قبل پاس دادن ورودی به اون فانکشن لیستی که سورت نشده یا استرینگی که واقعا ایمیل نیست رو cast کنی به اون تایپ. ولی پیدا کردن همچین خطایی تو code review خیلی راحته و احتمالش خیلی ناچیزه که خطا غیرعمدی انجام شه.
یک مقاله خیلی خوب راجب typing تو پایتون
یک مقاله با typescript که داره Branded type و یوزکیس هاشو خیلی قشنگ توضیح میده
@PyBackendHub
به مثال زیر دقت کنید
from typing import NewType
EmailType = NewType("EmailType", str)
email = EmailType("[email protected]")
print(type(email))
ایمیل تو ران تایم, تایپش str معمولیه. هیچ فرقی نکرده. ولی برای تایپ چکر ایمیل EmailType هست. اینطوری شما اگه یک تابع داشتی send_email که یک ایمیل میگرفت نیاز نیست هربار ولیدیت کنی که ایا واقعا این استرینگی که داده شده به کد شما درواقع ایمیل هست یا نه. به جاش EmailType استفاده میکنی.
اینجام دقیقا همینه. شما نیازی نیست که تو ران تایم تو توابعت وقتی یک همچین کیسی داری که دو جا دو چیز به هم لینک شدن بیای هربار چک کنی که این ورودی از اون تابع اومده یا نه. به جاش تو فانکشن get_books خروجی رو Brand میکنی. مثلا SortedBookList. و ورودی این تابع رو فقط میذاری SortedBookList.
البته که هنوز شما میتونی خطا کنی. شما همچنان میتونی تو ران تایم قبل پاس دادن ورودی به اون فانکشن لیستی که سورت نشده یا استرینگی که واقعا ایمیل نیست رو cast کنی به اون تایپ. ولی پیدا کردن همچین خطایی تو code review خیلی راحته و احتمالش خیلی ناچیزه که خطا غیرعمدی انجام شه.
یک مقاله خیلی خوب راجب typing تو پایتون
یک مقاله با typescript که داره Branded type و یوزکیس هاشو خیلی قشنگ توضیح میده
@PyBackendHub
Medium
Exploring the Power of Python’s typing Library
Python, traditionally known for its dynamic typing, embraced a new era of code clarity and bug prevention with the introduction of the…
Forwarded from Yasha
همونطور که میدونید چند روز پیش رباتهای ناشناس تلگرام هک شدن و همه متوجه ناامن بودنش شدیم. من و چند تا دیگه از بچههای کامیونیتی روی ربات پیام ناشناسی کار کردیم که میکنیم که اوپنسورسه، پیامها رو با استفاده از الگوریتمهای رمزنگاری End2End رمزشده جابجا میکنه و سرور قابلیت خوندن پیامها رو نداره. تمام فرایند رمزنگاری رو سمت کلاینت انجام میده و سرور هیچ دخالتی توی مکانیزمش حتی نداره. این ربات الان توی مرحله تسته، ازتون میخوام که ربات رو تست کنید و نظرتون رو اعلام کنید.
🔗 @E2EChatbot
🔗 Source Code
برای حمایت از پروژه میتونید توی گیتهاب به ریپازیتوری استار بدید ⭐️ روی کدش مشارکت کنید، باگها رو گزارش کنید یا اینکه این پست رو به دیگران و افراد فنی صاحب نظر بفرستید تا دیده بشه و ما رو کمکمون کنن. 🤍
@Yasha
🔗 @E2EChatbot
🔗 Source Code
برای حمایت از پروژه میتونید توی گیتهاب به ریپازیتوری استار بدید ⭐️ روی کدش مشارکت کنید، باگها رو گزارش کنید یا اینکه این پست رو به دیگران و افراد فنی صاحب نظر بفرستید تا دیده بشه و ما رو کمکمون کنن. 🤍
@Yasha
Forwarded from Python BackendHub (Mani)
این چیه دیگه؟!
ببینید وقتی داریم از e2e encryption صحبت میکنیم همچین فلویی داریم
من فرستنده یک private key و public key دارم. شما هم همینطور.
من برای اینکه پیامی به شما بفرستم که کسی جز شما نخونه باید با پابلیک کی شما پیام رو encrypt کنم. بعدش با private key خودم میام اون پیام رو digital signature میزنم. اینکار باعث میشه که شما بدونی من این پیام رو فرستادم برات.
شما که پیام رو میخونی نیاز به پابلیک کی من داری. که بتونی چک کنی ایا این پیامو واقعا من فرستادم برات؟
دوستان ربات ناشناس و e2e encryption کاملا در تضاد هستن
چرا؟ فکر کن من بهت پیام دادم سلام روت کراش زدم. شما شک کردی که مانی همچین پیامی داده. به من میگی مانی میتونی یک سلام کنی تو لینک ناشناسم؟ همین که من یک سلام بنویسم public key پیام جدیدم با قبلیه رو مقایسه میکنی و متوجه میشی که من همونیم که گفتم روت کراش زدم.
نکته دوم نحوه ذخیره خوده تلگرامه. من به صدرا لینکو دادم گفتم یک پیام بفرست. صدرا که پیامو فرستاد من هم با سیستم بازش کردم هم با گوشی. تو جفت حالت تونستم پیام رو ببینم. پس درواقع secret key من رو گوشی یا سیستمم ذخیره نشده. رو دیتابیسه تلگرامه! کارمند تلگرام اراده کنه میتونه بیاد پیام های منو بخونه. e2e encryption یعنی فقط و فقط مقصد و مبدا سکرت کی داشته باشن و کسی این وسط نتونه بخونه.
متاسفانه e2e encryption صرفا یک buzz word هست. تو تلگرام فقط secret chat انکریپت میشه. نه چت معمولی. واتس اپ هم به شما قابلیت بک آپ دیتا و ریکاور کردنش رو یک گوشی دیگه میده. که دوباره طبق لاجیک بالا همچین چیزی فقط به شرطی ممکنه که واتس اپ سکرت کی شما رو نگه داشته باشه.
امنیت یک فرهنگه اجتماعی هست. شما هرچی برنامت رو ایمن تر کنی UX بدتری خواهی داشت. پس این درست نیست که بگم من الان یک برنامه خیلی امن و خفن میسازم و همه قراره حال کنند. ترید آفه.
اما اینکه مشکلات بزرگی رخ نده (که هر ۱ ماه یک بار تو ایران اتفاق میفته) جلوگیریش با روش های تکنیکال و بیشتر قفل زدن نیست. تو اروپا آمریکا هیچ چیزی e2e انکریپت نمیشه. به جاش data regulatory خوب دارن. قوانین سنگین دارن. یک شرکت ۵ نفری باید فکر GDPR (قوانین مربوط به دیتا تو اروپا) باشه. شما میتونی ایمیل بدی یا تو خوده اپ درخواست بزنی دیتات کامل پاک شه.
و در نهایت دیتایی که شما میفرستی تو اینترنت مشخص نیست واقعا چه بلایی سرش میاد.
یک مثال:
من یک فیلم ۱ گیگی براتون میفرستم. شما میفرستی تو save message ات. من فیلمو یک ساعت بعد پاک میکنم (دو طرفه). اون فیلم شما هنوز تو save message هست. عملیات forward به شدت سریعه. پس سوال اینجاست که آیا با دیلیت چت دو طرفه واقعا دیتا داره پاک میشه از سرور تلگرام؟ بعید بدونم.
دو ساعت راجب این چیزا تو لایو امروز امیربهادر صحبت کردیم. بحثای جالبی شد. اگه وقت و علاقه داشتین توصیه میکنم ببینید.
@PyBackendHub
ببینید وقتی داریم از e2e encryption صحبت میکنیم همچین فلویی داریم
من فرستنده یک private key و public key دارم. شما هم همینطور.
من برای اینکه پیامی به شما بفرستم که کسی جز شما نخونه باید با پابلیک کی شما پیام رو encrypt کنم. بعدش با private key خودم میام اون پیام رو digital signature میزنم. اینکار باعث میشه که شما بدونی من این پیام رو فرستادم برات.
شما که پیام رو میخونی نیاز به پابلیک کی من داری. که بتونی چک کنی ایا این پیامو واقعا من فرستادم برات؟
دوستان ربات ناشناس و e2e encryption کاملا در تضاد هستن
چرا؟ فکر کن من بهت پیام دادم سلام روت کراش زدم. شما شک کردی که مانی همچین پیامی داده. به من میگی مانی میتونی یک سلام کنی تو لینک ناشناسم؟ همین که من یک سلام بنویسم public key پیام جدیدم با قبلیه رو مقایسه میکنی و متوجه میشی که من همونیم که گفتم روت کراش زدم.
نکته دوم نحوه ذخیره خوده تلگرامه. من به صدرا لینکو دادم گفتم یک پیام بفرست. صدرا که پیامو فرستاد من هم با سیستم بازش کردم هم با گوشی. تو جفت حالت تونستم پیام رو ببینم. پس درواقع secret key من رو گوشی یا سیستمم ذخیره نشده. رو دیتابیسه تلگرامه! کارمند تلگرام اراده کنه میتونه بیاد پیام های منو بخونه. e2e encryption یعنی فقط و فقط مقصد و مبدا سکرت کی داشته باشن و کسی این وسط نتونه بخونه.
متاسفانه e2e encryption صرفا یک buzz word هست. تو تلگرام فقط secret chat انکریپت میشه. نه چت معمولی. واتس اپ هم به شما قابلیت بک آپ دیتا و ریکاور کردنش رو یک گوشی دیگه میده. که دوباره طبق لاجیک بالا همچین چیزی فقط به شرطی ممکنه که واتس اپ سکرت کی شما رو نگه داشته باشه.
امنیت یک فرهنگه اجتماعی هست. شما هرچی برنامت رو ایمن تر کنی UX بدتری خواهی داشت. پس این درست نیست که بگم من الان یک برنامه خیلی امن و خفن میسازم و همه قراره حال کنند. ترید آفه.
اما اینکه مشکلات بزرگی رخ نده (که هر ۱ ماه یک بار تو ایران اتفاق میفته) جلوگیریش با روش های تکنیکال و بیشتر قفل زدن نیست. تو اروپا آمریکا هیچ چیزی e2e انکریپت نمیشه. به جاش data regulatory خوب دارن. قوانین سنگین دارن. یک شرکت ۵ نفری باید فکر GDPR (قوانین مربوط به دیتا تو اروپا) باشه. شما میتونی ایمیل بدی یا تو خوده اپ درخواست بزنی دیتات کامل پاک شه.
و در نهایت دیتایی که شما میفرستی تو اینترنت مشخص نیست واقعا چه بلایی سرش میاد.
یک مثال:
من یک فیلم ۱ گیگی براتون میفرستم. شما میفرستی تو save message ات. من فیلمو یک ساعت بعد پاک میکنم (دو طرفه). اون فیلم شما هنوز تو save message هست. عملیات forward به شدت سریعه. پس سوال اینجاست که آیا با دیلیت چت دو طرفه واقعا دیتا داره پاک میشه از سرور تلگرام؟ بعید بدونم.
دو ساعت راجب این چیزا تو لایو امروز امیربهادر صحبت کردیم. بحثای جالبی شد. اگه وقت و علاقه داشتین توصیه میکنم ببینید.
@PyBackendHub
Forwarded from Python BackendHub (Mani)
برای اینکه بهتر متوجه شید این عکس از repsonse همون api ای هست که تیم یاسر زده.
الان با وجود sender_public_key میشه گفت واقعا ناشناسه؟
@PyBackendHub
الان با وجود sender_public_key میشه گفت واقعا ناشناسه؟
@PyBackendHub
Forwarded from Python BackendHub (Mani)
یکی از دوستانی امروز یادم انداخت به یه لایبری قدیمی که نوشته بودم. این لایبری یه HTTP client هست که میتونه سایتهایی که زیر پوشش Cloudflare هستن و سیستم رباتیابشون فعاله رو کراول کنه. تاحالا در موردش صحبت نکرده بودم، ولی گفتم اینجا یه توضیحی بدم.
لینک گیتهابش اینجاست با httpx کاملاً سازگاره، یعنی اگه از httpx استفاده میکردید، با تغییر import میتونید به راحتی ازش استفاده کنید.
مشکل چی بود؟ سایتهایی که از Cloudflare به عنوان reverse proxy استفاده میکنن، معمولاً از یه مکانیزم تشخیص ربات استفاده میکنن که به TLS Fingerprint متکیه. حالا TLS Fingerprint چیه؟ وقتی شما به یه سایت وصل میشید، اولین چیزی که رد و بدل میشه، یه پیام به اسم Client Hello هست. این پیام اطلاعات اولیهای رو درباره کلاینت شما به سرور میده، مثل نسخه TLS که پشتیبانی میکنید و یه لیست به اسم cipher suite.
توضیح Cipher suite: در واقع مجموعهای از الگوریتمهای رمزنگاری هست که کلاینت و سرور میتونن برای برقراری یه ارتباط امن استفاده کنن. هر مرورگر یا کلاینت یه لیست مشخص از cipher suite داره که ترتیبش هم خاص همون کلاینت هست. مثلاً مرورگر کروم یه لیست مشخص داره، مرورگر فایرفاکس یه لیست دیگه، و مثلاً requests پایتون هم یه لیست کاملاً متفاوت.
کلادفلیر چطور متوجه میشه شما مرورگر نیستید؟ اون میاد این TLS Fingerprint، یعنی ترکیب نسخه TLS و ترتیب cipher suiteها، رو با user-agent شما مقایسه میکنه. اگه این دو تا با هم نخونن، مثلاً user-agent شما میگه مرورگر کروم هستید ولی cipher suiteها میگن یه اسکریپت پایتونید، Cloudflare متوجه میشه که شما مرورگر نیستید و درخواست رو بلاک میکنه.
کله سناریویی که گفتم اینجا داره اتفاق میفته تو لایبری من که کلا ۱۰ خط کده.
@PyBackendHub
لینک گیتهابش اینجاست با httpx کاملاً سازگاره، یعنی اگه از httpx استفاده میکردید، با تغییر import میتونید به راحتی ازش استفاده کنید.
مشکل چی بود؟ سایتهایی که از Cloudflare به عنوان reverse proxy استفاده میکنن، معمولاً از یه مکانیزم تشخیص ربات استفاده میکنن که به TLS Fingerprint متکیه. حالا TLS Fingerprint چیه؟ وقتی شما به یه سایت وصل میشید، اولین چیزی که رد و بدل میشه، یه پیام به اسم Client Hello هست. این پیام اطلاعات اولیهای رو درباره کلاینت شما به سرور میده، مثل نسخه TLS که پشتیبانی میکنید و یه لیست به اسم cipher suite.
توضیح Cipher suite: در واقع مجموعهای از الگوریتمهای رمزنگاری هست که کلاینت و سرور میتونن برای برقراری یه ارتباط امن استفاده کنن. هر مرورگر یا کلاینت یه لیست مشخص از cipher suite داره که ترتیبش هم خاص همون کلاینت هست. مثلاً مرورگر کروم یه لیست مشخص داره، مرورگر فایرفاکس یه لیست دیگه، و مثلاً requests پایتون هم یه لیست کاملاً متفاوت.
کلادفلیر چطور متوجه میشه شما مرورگر نیستید؟ اون میاد این TLS Fingerprint، یعنی ترکیب نسخه TLS و ترتیب cipher suiteها، رو با user-agent شما مقایسه میکنه. اگه این دو تا با هم نخونن، مثلاً user-agent شما میگه مرورگر کروم هستید ولی cipher suiteها میگن یه اسکریپت پایتونید، Cloudflare متوجه میشه که شما مرورگر نیستید و درخواست رو بلاک میکنه.
کله سناریویی که گفتم اینجا داره اتفاق میفته تو لایبری من که کلا ۱۰ خط کده.
@PyBackendHub
GitHub
GitHub - ManiMozaffar/cfcrawler: Cloudflare scraper and cralwer written in Async, In-place library for HTTPX. Crawl website that…
Cloudflare scraper and cralwer written in Async, In-place library for HTTPX. Crawl website that has cloudflare enabled, easier than ever! - ManiMozaffar/cfcrawler
روی Hey یه آپدیت ریز دادم. حالا میتونید آدرس سرویس LLM دلخواه خودتون رو ست کنید واسه پروژه. اینجوری آپدیت کنید:
و اینجوری از کانفیگ جدید استفاده کنید:
اگه نگران پاک شدن کانفیک قبلی هستید (چون config create کانفیگتونو بازنویسی میکنه)، فقط این رو اضافه کنید به کانفیگ فعلیتون:
بصورت پیشفرض تنظیم شده به سرویس MindsDB که میتونید از این به بعد تغییرش بدید. و اینکه ورژن قبلی هنوز به خوبی کار میکنه. اگه احیانا میخواید سرویس رو تغییر بدید اپدیت کنید.
pip install -U hey-mindsdb
و اینجوری از کانفیگ جدید استفاده کنید:
hey config create
hey config edit
اگه نگران پاک شدن کانفیک قبلی هستید (چون config create کانفیگتونو بازنویسی میکنه)، فقط این رو اضافه کنید به کانفیگ فعلیتون:
...
"service": "https://llm.mdb.ai",
...
بصورت پیشفرض تنظیم شده به سرویس MindsDB که میتونید از این به بعد تغییرش بدید. و اینکه ورژن قبلی هنوز به خوبی کار میکنه. اگه احیانا میخواید سرویس رو تغییر بدید اپدیت کنید.
Sadra Codes
روی Hey یه آپدیت ریز دادم. حالا میتونید آدرس سرویس LLM دلخواه خودتون رو ست کنید واسه پروژه. اینجوری آپدیت کنید: pip install -U hey-mindsdb و اینجوری از کانفیگ جدید استفاده کنید: hey config create hey config edit اگه نگران پاک شدن کانفیک قبلی هستید…
لانچش کردم روی پروداکتهانت. آره خلاصه نیازمند Upvoteهای گرمتان هستیم. 🤍🙌
🐈 : https://www.producthunt.com/new/products/hey-30620d3c-3330-4c6a-86cd-8cf9930a2490
🐈 : https://www.producthunt.com/new/products/hey-30620d3c-3330-4c6a-86cd-8cf9930a2490