Rust for Python developers – Telegram
Rust for Python developers
2.15K subscribers
23 photos
1 video
2 files
83 links
Rust programming language for python developers

یک توسعه دهنده پایتون هستم که سعی میکنم rust یاد بگیرم.
تو این مسیر منابع و نظرات شخصی خودم رو با آیندگان هم به اشتراک میذارم

اگر به هوش مصنوعی و پایتون علاقه دارید به کانال :
@pytens
@pyhints
سر بزنید.
Download Telegram
من خیلی از این اطلاعات رو در مورد مموری توی Rust مجبور شدم دونه دونه بخونم مثلا اینکه
stack: 2MB-8MB

و ... شاید به کار خیلی‌ها نیاد ولی برای System developer جزو واجبات هست که حداقل یکبار این موارد رو برای زبان برنامه‌نویسی که کد میزنه ببینه و بررسی کنه.

خیلی اتفاقی توی یوتیوب این ویدئو رو شروع کردم و دیدم داره این اطلاعات رو همرو یکجا توضیح میده؛ الان روی دقیقه ۸ هستم و دارم ازین ویدئو لذت می‌برم امیدوارم بدرد شما هم بخوره

Youtube Link

بعدش میرم سراغ ۱۵ صفحه Rust خوندن امروز
با وجود کم خوابی ۲۴ ساعت گذشته؛ دارم از یادگیری Rust لذت میبرم و همین نمیذاره بخوابم.
👍104👏4
Forwarded from Python Hints
توی این هفته freecodecamp دوتا دوره عالی گذاشته؛ این دو مورد ربطی به پایتون نداره اما بدرد خیلیا میخوره بخصوص :
@pytens, @pyrust

اینکه دارم پست رو اینجا میذارم چون متوجه شدم خیلی از بچه ها این کانال فوق العاده رو نمی شناسند و باهاش آشنا نیستند؛ بهونه کردم برای معرفی کانال.

دوره ها کدوم موارد هستند ؟


1- Cuda Programming Course (in C)

2- Linux Device Driver Development (in C)


حقیقتش اینکه این هفته جلسه نداریم؛ برای این هست که از شروع لایوها اولین جمعه ای هست که تسک ندارم و چون ۲ هفته گذشته بسیار بسیار درگیر بودم؛ ترجیح دادم این جمعه رو استراحت کنم و برای این استراحت این ۲ ویدئو رو انتخاب کردم برای دیدن.

امیدوارم شما هم لذت ببرید؛ کانسپت مهم هست.
8👍6
دیروز برای اولین بار یکی از پروژه‌ها رو به انتخاب خودم روی Rust کد زدم.

یک کد کوچیکی داشتیم که زحمتش زو یکی از بچه‌ها کشیده بود، باید خیلی سریع قیمت یک سری سرور رو پیدا می‌کرد و اگر ارزونتر بود درخواست اجاره سرور رو می‌داد، بعد خودشون به کاربر اجاره می‌دهند.

ولی رقیب‌های بسیار زیادی داره این موضوع که هیچی به ما نمیرسه و همین باعث شد من وارد پروژه بشم.

خود دولوپر می‌گفت سرعت پاسخ سرور فروشنده کم هست؛ برای همین کد رو بردیم روی ۳ تا سرور مختلف و با curl درخواست دادیم.
زمان پاسخ بسیار سریعتر از نسخه پایتون بود وقتی دیتا برامون میومد.

شک کردم سربارهای فریمورک‌های پایتون باشه، بجای اینکه فریمورک عوض کنم چون همه چیز API بود و سختی نداشت.

کل زبان برنامه‌نویسی رو عوض کردم و اومدم روی Rust، بعد از اتمام برای اولین بار تونستیم ۷ تا سرور رو بگیریم، یک سرچ دیگه زدم و یک سری optimization flag پیدا کردم که هم حجم فایل نصف شد هم مصرف memory، سرعتمون هم بالاتر رفت.

خلاصه که الان همه سرورها رو می‌بینیم و اگر خوشمون نیاد رد می‌کنیم تا باقی بخرند، برای خودم خیلی جذاب بود گفتم با شما هم به اشتراک بذارم.

یادم باشه optimization flag هارو باهاتون به اشتراک بذارم.
👍237🔥1
وقتی شروع میکنی از Rust بیشتر و بیشتر استفاده کردن بعضی وقتا بین اینکه از کدوم crates استفاده کنی میمونی مخصوصا اینکه برای هر کلمه کلیدی شاید چند صفحه crate بیاد.

حقیقتا برای من که درحال یادگیری هستم وقتگیر هست بررسی کردن دونه دونه نتایج و اوایل یادگیری چیزی که برام مهم هست maintenance, popularity اون پکیج هست.

https://blessed.rs/crates

اصطلاحا به پکیج هایی با ویژگی بالا که گفتم (محبوبیت و نگهداری) میگن blessed crates و این سایت هم برای همین این اسم رو داره و شده منبع اصلی من برای یافت پکیج های اصلی برای تسکهای مختلف.

خلاصه که شما هم می‌تونید ازین استفاده کنید و با خیال راحت crate های مورد نیاز رو یاد بگیرید.
👍1631👏1
Forwarded from Python Hints
بیشترین سوالی که از من میشه، برای پیشرفت چه پروژه‌ای بزنم ؟
یا از کجا بفهمم سطحم برای توسعه پروژه چطوری هست و ...

شاید همین الان هم خود شما درگیر این موضوع باشید، برای بچه‌های frontend, mobile ساده هست، مثلا وارد یوتیوب می‌شن و می‌زنند

Clone X in React
Clone Facebook in React, ....


ولی توی Python و حالا تمرکز خودم Rust موضوع سخت‌تر هست و ۹۹٪ مواقع مجبور میشیم Source Code بخونیم که به اندازه کد زدن لذت بخش نیست واقعاً

https://codecrafters.io/

این موضوع رو لذت بخش کرده (سایت پولی هست) بعضی از چلنج‌ها رایگان هست و بر اساس سطح شما چلنج سخت یا آسون میشه.

مثلاً توی پیاده‌سازی گیت، اگر beginner باشید ویژگی‌ها ساده‌تر هست وقتی Senior شدید می‌تونید دوباره همون رو تمرین کنید.


اگر هم نتونستید خرید کنید:
۱- ازش ایده بگیرید
۲- توی یوتیوب اسم چالش رو سرچ کنید، ویدئو گذاشتن از مراحله چالش‌ها و حل اون‌ها از نظر سایت هیچ ایرادی که نداره هیچ، تشویق هم می‌شه.


بازم میگم leetcode برای یادگرفتن و تمرین زبان برنامه‌نویسی نیست؛ چون دیدم بعضی اساتید به اشتباه leetcode رو پیشنهاد می‌دهند برای تمرین زبان برنامه‌نویسی.
11👍3
امروز آخرین مصاحبه درخواست همکاریم توی سری اول شرکت‌هایی که براشون رزومه فرستاده بودم به عنوان Rust developer/software engineer بود.

گفتم شاید بد نباشه که تجربیات این ۲-۳ هفته رو در اختیار دوستان بذارم، توجه کنید که هیچکدوم از موقعیت‌ها ایران نبود.

اولین موضوع مشترک توی همه مصاحبه‌ها این بود که بسیار مصاحبه‌هام مفهومی بود، بخش اول مصاحبه‌ها واقعاً تئوری و نحوه عملکرد بخش‌های مختلف توی Rust بود

دقیقاً این دوتا مورد ازم سوال شد (دوتا شرکت مختلف) :

https://news.1rj.ru/str/pyrust/77
https://news.1rj.ru/str/pyrust/82

بعد با توجه به پوزیشن شغلی وارد مفاهیم، سیستم‌ یا بکند یا ... می‌شدیم که خب اینها خیلی وابسته به زبان‌برنامه‌نویسی نبود.

ولی خیلی جالب بود، هیچکدوم سوال الگوریتم و ساختمان داده نپرسیدند (منظورم توی بخش کد زدن هست.)

تمام موارد چون بعنوان junior rust درخواست پر کرده بودم؛ کسی رو می‌خواستند که بتونه کد بزنه، من توی بخشی که اون‌ها نیازی نداشتند عملکرد خوبی داشتم
System design, Software Architecture, ...

اما توی کد زدن، با اینکه کار رو در میاوردم ولی دستم کند بود وقتی از crate ها قرار بود استفاده کنم.

چیزی که من متوجه شدم این بود که حداقل برای پوزیشن جونیور و شاید حتی میدلول باید لیست crate های مهم رو بلد باشی، چون دقیقاً توی مرحله توسعه کد مصاحبه ازت همچین چیزی می‌خوان.

برای مثال امروز از من توسعه یک ابزار خواستند که ۷-۸ تا آرگومان توی حالات مختلف می‌گرفت و یک سری لاگ رو بررسی می‌کرد چه بصورت file و چه بصورت stdin.

تمام منطقی که بهم داده بودند رو پیاده‌سازی کردم تقریباً هم سریع بودم ولی وقتی رسیدم به استفاده از clap بسیار سرعتم کند شد چون تا امروز از این crate استفاده نکرده بودم و برای args از خود std استفاده می‌کردم.

چندروز قبل متوجه این قضیه شدم و بعد از اون دیگه قرار مصاحبه‌ای رو قبول نکردم و به سمت

Blessed crate
ها رفتم تا نقطه ضعف‌هام رو تقویت کنم.


دلیل مصاحبه رفتنم هم همین بود، نقاط ضعف خودم رو پیدا کنم.

راستی clap رو هم کامل خوندم و به اندازه کافی یادگرفتم.
👍2911👏43🔥2👌2🕊2🥰1
می‌خوام یک منبع معرفی کنم ولی قبلش باید بگم چرا به این نتیجه رسیدم؛
توی دوران نوجوانی بعد از چندسال Linux Server Administrator بودن و وقتی تسک‌ها برام تکراری و همگی اسکریپت شده بود رفتم سراغ مباحث امنیتی به مدت هک و امنیت رو خوندم و بعد به Reverse Engineering رو آوردم.

نوشتن کرک یا حذف قفل یا حتی فارسی سازی قطعات و ... یک بخش قضیه بود؛ کار با Assembly یک بحث دیگه (تنها درس دانشگاه که ۲۰ گرفتم هم همین بود بدون استاد و میانترم ببین چه عشقی به کد زدن و خوندن Assembly داشتم)

همیشه همه جا میگم اگر یادگرفتن assembly نبود قطعا زمانی که امنیت کار میکردم بدترین و وقت تلف کن‌ترین بخش حرفه‌ای عمرم بود ولی به لطف اسمبلی یادگرفتن عمرم تلف نشد؛ به همه بچه‌ها هم از یک سطحی به بعد وقتی بهم میگفتن چطوری فلان چیز رو یاد میگری یا بدون خوندن می‌‌دونی چه عملکردی باید داشته باشه و ... میگم همش رو مدیون یادگیری اسمبلی هستم شما هم بخون و یاد بگیر.

توی اسمبلی کار کردن با مموری - شیفت دادن بیت برای اعمال ریاضی و ... همرو باید یاد بگیری چیزهایی که توی خیلی از زبان‌های دیگه نیست (هرچند بعضی‌هاش رو توی دوره یوتیوب پایتون بررسی کردیم)

امروز داشتم کتاب Rust in Action رو یک مروری میکردم که دیدم تمام این مقاهیم رو صحبت کرده بسیار ساده‌تر و البته کاربردی چون همشون رو استفاده می‌کنه تا توی Rust یک پروژه‌ای رو بزنه (مثلا cpu emulator یا OS نویسی و ...)

خلاصه خواستم بگم اگر شما هم توی این بحث‌ها با من بودید و پیش از این گفتم همرو مدیون اسمبلی هستم؛ شما دیگه نیازی نیست سراغ اسمبلی برید می‌تونید Rust رو بخونید و بعد برید سراغ Rust in Action مسیر ساده‌تر؛ کاربردی‌تر و قطعا جذابتری هست.
32👍142
یک آپدیت بدم،

توی مقایسه فریمورک‌های بکند بین دو مورد Axum, Actix گفتم که شخصاً رفتم سمت axum (اسمش از یک پادشاهی - حکومت اومده فکر کنم چون کلی مطلب تاریخی برام اومده، البته دقیق بررسی نکردم.)

ولی داستان این هست که توی مصاحبه‌ها بسیار کار بیشتری برای actix بود درحالی که وقتی وارد می‌شدم اکثراً axum رو هم می‌پرسیدند.

یک حسی مثل Django, FastApi توی پایتون بهم دست داد؛ خلاصه چون بیش‌از ۸۰٪ موارد مهم یکسان هست، شخصاً دارم روی هردو فریمورک کار می‌کنم.

گفتم اطلاع بدم که کسی اشتباه نکنه برای شغل درحال حاضر اولویت رو روی Axum بذاره؛ هرچند توی کارهای من Axum گزینه بهتر هست.
👍19🔥3
#Quick

اگر از vscode برای Rust استفاده می‌کنید حتما این extension رو نصب کنید که دستورات sql رو براتون وسط کدهای rs به خوبی highlight می‌کنه ( از حالت str& خالی در میاد)

الان اومد یک کدی رو بزنم چندتا از Sql Query هاش خیلی طولانی و سخت شد بدون highlight خوندنش قطعا آزار دهنده بود با سرچ به این رسیدم و بنظرم گزینه بسیار کمک کننده و عالی‌ای هست.
👍143🙏1
Rust for Python developers
#Quick اگر از vscode برای Rust استفاده می‌کنید حتما این extension رو نصب کنید که دستورات sql رو براتون وسط کدهای rs به خوبی highlight می‌کنه ( از حالت str& خالی در میاد) الان اومد یک کدی رو بزنم چندتا از Sql Query هاش خیلی طولانی و سخت شد بدون highlight…
توی بعضی شرایط rust-analyzer ممکنه رو دستش بیاد؛ اونوقت highlight به درستی انجام نمیشه اگر اینطوری شد توی تنظیمات
Rust-analyzer > Semantic Highlighting > String

وارد بشید و گزینه‌اش رو غیر فعال کنید موقتا ( تا آخر پروژه مثلا)
👌62👍2
Rust for Python developers
#Quick اگر از vscode برای Rust استفاده می‌کنید حتما این extension رو نصب کنید که دستورات sql رو براتون وسط کدهای rs به خوبی highlight می‌کنه ( از حالت str& خالی در میاد) الان اومد یک کدی رو بزنم چندتا از Sql Query هاش خیلی طولانی و سخت شد بدون highlight…
سر یک موضوع احمقانه ۱ ساعت وقتم رفت.
توی تصویر می‌بینید که خط رو شکونده دقیقا باید توی rust همینکارو بکنید وگرنه query درست نیست و بدتر از اون خطایی هم دریافت نمی‌کنید.
r#"--sql SELECT name FROM users;"

چیزی که بدون مشکل هست:
r#"--sql
SELECT name FROM users;
"


خلاصه که حواستون باشه؛ من حتی توی کدهای دیگران هم دیدم این مورد رو.
😐10👍4
#Quick

توی پایتون (باقی زبان‌ها) وقتی کسی بهم می‌گفت سریعترین راه برای پیشرفت کردن جیه می‌گفتم یاد بگیر خطاهارو خیلی زود بفهمی.
توی Rust این موضوع صادق نیست چون کامپایلر خیلی دقیق خطارو می‌کوبه تو صورتت اما یک چیز معادل داریم که توی تجربه این مدت بهش رسیدم.

توی Rust برای پیشرفت سریعتر باید یادبگیری داکیومنت اون crate ایی که داری باهاش کار می‌کنی رو توی سایت
https://docs.rs/
به راحتی داخلش بچرخی و به راحتی بخونی و درک کنی (چیزی که ندیدم جایی آموزش بده) این موضوع رو توی سنیورهای Rust به خوبی میشه دید سریعا متدهای struct, enum, ... رو پیدا می‌کنند trait هایی که باید پیاده‌سازی بشه و نحوه استفاده و ...
ولی برای جونیورها خیلی خیلی سخت هست انگار و اکثرا سمت داکیومنت نمیرن (خیلی دیر این سمتی میروند)
👍29😁1
مصاحبه شرکتی در کره جنوبی رو قبول شدم.
روزی که Rust رو شروع کردم و بابت کاری که می‌خوام انجام بدم کره جنوبی رو مقصد انتخاب کردم؛ با هدف یادگیری بیشتر.
اول هفته درگیر ارسال مدارک بودم و امروز تماس تصویری داشتم و نتیجه :

متاسفانه امکان ادامه پروسه همکاری با شما را نخواهیم داشت.

شما درگیر جنگ هستید؛ دسترسی به شما سخت خواهد بود.
امیدواریم زودتر به صلح دست پیدا کنید.

به پیشرفت ادامه بده.
💔76😁14🗿5🤣4🤯2😢2😡21😨1
Rust for Python developers
مصاحبه شرکتی در کره جنوبی رو قبول شدم. روزی که Rust رو شروع کردم و بابت کاری که می‌خوام انجام بدم کره جنوبی رو مقصد انتخاب کردم؛ با هدف یادگیری بیشتر. اول هفته درگیر ارسال مدارک بودم و امروز تماس تصویری داشتم و نتیجه : متاسفانه امکان ادامه پروسه همکاری با…
کد زدن بعد ی همچین شرایطی واقعا سخت هست مخصوصا اینکه هم هدفم بود هم خیلی روش حساب کرده بودم.
ولی
ما دیگه عادت کردیم.

شب قبل با یک crate به اسم secrecy آشنا شدم بسیار عالی هست (نیازی نیست خودتون دیتاهای مهم رو mask کنید.)
👍13😁64💔2
Rust for Python developers
کد زدن بعد ی همچین شرایطی واقعا سخت هست مخصوصا اینکه هم هدفم بود هم خیلی روش حساب کرده بودم. ولی ما دیگه عادت کردیم. شب قبل با یک crate به اسم secrecy آشنا شدم بسیار عالی هست (نیازی نیست خودتون دیتاهای مهم رو mask کنید.)
چون صحبت شد secrecy بنظر crate خیلی ساده‌ای میاد ولی چون مثال نداره توی Rust community دیدم یک نفر درموردش سوال پرسیده و خب جوابی که بهش داده بودند بنظرم خوب نبود؛ بنظرم جواب ساده‌ترین راهکار نبود برای همین رفتم سراغ داکیومنت و ...

توی همین تصویر بالا بخوام مثال بزنم :
cargo add secrecy


شما توی این پکیج یک struct اصلی دارید به اسم SecretBox که خب از اسمش پیداس ی Box باید ایجاد کنید براش (جلوتر میگم) و دوتا هم TypeAlias دارید به اسم SecretString, SecretSlice که خب من تو این مثال میرم سراغ SecretString ولی دقیقا داستان برای SecretSlice هم یکسان هست.

بر اساس داکیومنت خود secrecy ؛ خود SecretString هم چیزی نیست جز SecretBox که براش تریت From پیاده سازی شده (اصن برای همین بهش میگه TypeAlias) :

This is a type alias for SecretBox<str> which supports some helpful trait impls.
Notably it has a From<String> impl which is the preferred method for construction.


پس بنظرم بهترین مورد برای یادگیری اینه که From trait رو سورس کدش رو ببینیم :
pub type SecretString = SecretBox<str>;

impl From<&str> for SecretString {
fn from(s: &str) -> Self {
Self::from(String::from(s))
}
}

که خب وقتی میریم سراغ SecretBox هم می‌بیبنیم
pub struct SecretBox<S: Zeroize + ?Sized> {
inner_secret: Box<S>,
}

اوکی پس همه چیز از zeroize میاد (اگر باهاش کار نکردید یک نگاهی بهش بندازید جزو crate های مهم هست)

از From فهمیدم که می‌تونم مستقیم String بهش بدم و SecretString بگیرم و همین نیازمندی من بود و کد بالا میشه :

use secrecy::{SecretString, ExposeSecret};

...
password: SecretString::from(
env::var("DATABASE_PASSWORD").expect("DATABASE_PASSWORD env not provided."),
),
...

من توی کد بالا یک trait دیگه رو هم آوردم به اسم ExposeSecret چون password دیگه از تایپ String نیست برای اینکه توی مواقع مورد نیاز (مثل ساخت کانکشن دیتابیس) بتونم ازش استفاده کنم به این trait نیاز دارم و برای خوندنش هم مباید از
password.expose_secret()

استفاده کنم. این crate از من دربرابر اینکه حواسم نباشه و یک چیزی رو لو بدم محافظت می‌کنه مثل نوشتن پسورد توی println یا توی لاگ‌ها اتفاقی که برای فیسبوک؛ گوگل قبلا افتاده.

برگردم سراغ مطلبی که توی Rust Community بود؛ به همین راحتی مشکل طرف حل می‌شد یعنی استفاده از from یا .into که زیرش از from استفاده می‌شه ولی پیچونده بودنش سراغ پیاده‌سازی trait و ... ( نمی‌دونم برم درستش کنم یا نه چون به راه‌حل تیک سبز داده بود)

بگذریم اگر خواستید از new هم استفاده کنید میشه این :
let mystring = "My Sample String".to_owned();
let mybox = Box::new(mystring);
let secret_string = SecretString::new(mybox);


با توجه به توضیحاتی که دادم اگر مثل من Junior هستید داکیومنت این crate گزینه خوبی هست برای مطلبی که چندروز قبل نوشتم
https://news.1rj.ru/str/pyrust/96

بخصوص اینکه سورس کد ساده‌ای هم داره.
👍74
Forwarded from Python Hints
بگذارید هرکس به آیین خودش باشد.
زنان را گرامی بدارید.
فرودستان را دریابید.
اجازه دهید هرکسی به تکلم قبیله‌ی خویش سخن بگوید.

آدمی تنها در مقام خویش به منزلت خواهد رسید.

۷ آبان روز بزرگداشت کوروش کبیر، همایون باد.
❤‍🔥275💔2👎1
پاسخ من به یک سوال در مورد multi-stage dockerfile که توی گروه بحث آزادمون شده بود دیدم روی rust دارم مثال میزنم گفتم اینجا هم بذارم.

——————————————————————————————

توی این داکرفایل من اول اومدم از یک ایمیج کامل rust استفاده کردم برای بخش اول اسم این بخش رو گذاشتم builder؛ این ایمیج شامل همه چیزهایی که من لازم دارم هست مثل یک لینوکس دبیان کامل و اگر سایزش رو هم ببینید بصورت خام 1.47 GB هست.

یک توی خط ۴ دارم پکیج‌های دیگه‌ای که برای کامپایل سریعتر نیاز دارم رو نصب می‌‌کنم؛ نکته مهم هم همینجاس من این‌ها رو فقط برای کامپایل نیاز دارم و نه برای اجرای کد نهایی

توی خط ۵ Cargo.toml, Cargo.lock رو کپی می‌کنم که dependency هارو داشته باشم ولی Rust مثل python نیست؛ یعنی نمیشه بدون داشتن سورس کد dependency هارو دانلود کرد و cache کرد یا بگی روی این environment نصبش کن و ...
پس خط ۶ رو دارم که یک main.rs خالی میسازم برای اینکه بتونم dependency هارو بگیرم و cache کنم مراحل رو ایده هم اینه :
اگر سورس کد من ی خط تغییر کرد ولی dependency عوض نشد نباید مجبور بشم dependency هارو مجدد دانلود کنم و ...

همینجا اضافه کنم ی crate داریم به اسم cargo chef که برای همین کار هست؛ من تا جایی که مجبور نباشم ازش استفاده نمی‌کنم که یک dependency کمتر برای داکر داشته باشم.

خط ۸ و ۹ پروژه خودم رو کپی و کامپایل می‌کنم.


توی خط ۱۲ دارم از یک ایمیج دیگه استفاده می‌کنم که اصلا rust, rustc, cargo , ... رو هم نداره و image مرحله قبل بر پایه این هست حجم این ایمیج فقط و فقط 75MB هست.
خط ۱۴ تا ۱۸ پکیج‌هایی که این ایمیج نداره و نیاز دارم رو نصب می‌کنم مثل openssl, ca-certificates اینم برای دسترسی به سرویس دیتابیس هست چون روی یک سرور دیگه هست.

در نهایت از مرحله قبل نتیجه compile رو بر میدارم + .env پروژه و پروژه رو اجرا می‌کنم
حجم نهایی کانتینر پروژه روی 200MB هست درحالی که اگر از multi-stage استفاده نمی‌کردم و می‌خواستم روی ایمیج 1.47GB اجراش کنم حجمش به بیش از 3GB میرسید و با هر تغییر توی کدهام باید حتی منتظر دانلود شدم پکیج‌ها و .. هم می‌موندم.

اضافه کنم :
راجب cargo-chef هم مزیتش رو نمی‌فهمم (بنظرم یک bottleneck و یک نگرانی اضافه هست) قطعا یک discussion جدید می‌سازم روی rust community ببینم مزیتش چیه.


پ.ن :
سورس توی کامنت؛ اگر نمی‌تونید فونت رو بخونید.
👍112
Rust for Python developers
پاسخ من به یک سوال در مورد multi-stage dockerfile که توی گروه بحث آزادمون شده بود دیدم روی rust دارم مثال میزنم گفتم اینجا هم بذارم. —————————————————————————————— توی این داکرفایل من اول اومدم از یک ایمیج کامل rust استفاده کردم برای بخش اول اسم این بخش…
یک چندتا ادیت روی این مورد بدم؛ همونطور که گفتم من تازه داشتم اینجا داکرفایل رو برای پروژه‌ام می‌نوشتم که توی گروه یکی از دوستان سوال پرسید و ترجیح دادم روی نمونه جواب بدم.
اینکه این dockerfile درست هست خوبه یا نه هدف نبود و هدف درک multi-stage بود.

اما چندتا نکته (بر خلاف دنیای پایتون) :

۱- استفاده از اسم src قطعا اینجا مناسب نیست؛ من حواسم نبود ولی cargo, rustc رو این اسم حساب می‌کنند پس app رو جایگزین کردم

۲- از cargo-chef استفاده کردم به ۲ دلیل :
۲-۱: توی کد بالا من compile انجام نمیدادم و فقط پکیج‌هارو دانلود میکردم؛ قصدم این بود توی استپ بعدی سراغش برم ولی خب توی بعضی شرایط خاص دردسرش زیاد میشه که الان فرصتش رو نداشتم.
۲-۲: توی همون شرایط و crate های خاص (که اتفاقا یکی از دوستان توی پروژه‌اش بهم نشون داد) باعث میشه قابلیت cache رو از دست بدید؛ دلیل اصلیش رو نمی‌دونم.

۳- بجای استفاده از اداکر ایمیج‌های معرفی شده توسط پروژه cargo-chef از همون rust:1.82.0 استفاده کردم و فقط یک استیج بیشتر ساختم که دستورات زیر رو داشته باشه :
RUN apt update && apt install lld clang -y && cargo install cargo-chef


۴- وقتی sqlx رو توی پروژه دارم؛ توی استیج runtime حتما باید sqlx migrate runtime رو اجرا کنم. (برایحجم کمتر این مورد رو با migrate macro اجرا کردم.

۵- خیلی بهتره موقع استفاده از cargo build —release توی استیج builder باید از فلگ:
—bin <appname>
استفاده کنم


نهایتا شد این :
FROM rust:1.82.0 AS chef
WORKDIR /app
RUN apt update && apt install lld clang -y && cargo install cargo-chef

FROM chef as planner
COPY . .
RUN cargo chef prepare --recipe-path recipe.json

FROM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json
COPY . .
ENV SQLX_OFFLINE true
RUN cargo build --release --bin XYZ

FROM debian:bookworm-slim AS runtime
WORKDIR /app
RUN apt update -y \
&& apt install -y --no-install-recommends openssl ca-certificates \
&& apt autoremove -y \
&& apt clean -y \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/XYZ XYZ
COPY .env .env
ENTRYPOINT [ "./XYZ" ]
👍102
چندتا مقاله قدیمی دارم می‌خونم درمورد Rust خیلی جالب بود برام.

ًRust in production at figma (2018)

دیسکورد هم یک پست درمورد اینکه چرا از Go به Rust رفته منتشر کرده (همون سال ۲۰۲۰)

Why discord is switching from go to rust

نکته آخر اینکه؛
۱- توجه کنید به نیازمندی‌ها و ساختار سیستم‌هاشون
۲- درمود بدی‌هایی که با Rust گفته شده بسیاریش توی این چندسال رفع شده و توی پرفورمنس حتی Rust سریعتر هم شده.
👍14