یک زمانی شهردار تهران رو بخاطر ترافیک تهران اعدام کردند.
آخوند جز ویرانی، برای ایران دستاورد نداشت.
El contenido más reciente compartido por Rust for Python developers en Telegram
SQLite
رو بهتر مینویسیم و با یک زبان امن که خب گزینهاش شده Rust
و اینبار همه اجازه دارند کد Contribute
کنند.cli/app.rs
Cargo.toml
خودش رو داره که باحال بود (دفعه اول بود میدیدم)clap
رو ببینید؛ من برای پروژه چند وقت پیشم بیچاره شدم تا همه اینارو کنار هم درک کنم و بیارم.Best Practice
ها و خوبیش اینه که هممون به اندازه کافی از SQLite
میدونیم و دانش خوبی داریم ازش. fs::read_to_string
down
میشه چک میکنیم میبینیم دقیقا قبلش دیوایس (Edge Device
) اونم داره ریستارت میشه.build, compile, ....
پروژه شرکت دیروز این رو شروع کردم و امروز دارم ویدئوهای بعدی رو ادامه میدم.NAS
ایجاد کرده بودم چندسال قبل NextCloud, ...
crate
هایی که توی مصاحبهها ازم پرسیده شد رو باید درست درک کنید برای پیادهسازیRSA
هم برای اولین بار شکسته شد.Encryption
جدید و قویترRust
خیلی جالب بود برام.Go
به Rust
رفته منتشر کرده (همون سال ۲۰۲۰)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
باید از فلگ: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" ]
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
ببینم مزیتش چیه.