| کانال توسعه‌دهندگان |
1.75K subscribers
55 photos
1 video
30 links
⭕️ کانال توسعه‌دهندگان دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
✨ برش دوم: نصب و کانفیگ Vim و Neovim

🪟 ویندوز:
🔸از صفحه اصلی Vim یا ریپازتوری آن فایل نصبی GVim را دانلود کنید.
زمان نصب، در مرحله Choose Components، گزینه Full را برای استفاده از تمام ویژگی‌های Vim انتخاب کنید. در مراحل بعدی نیز چیزی را تغییر ندهید. هم‌اکنون شما Vim و یک نسخه گرافیکی از آن را به همراه یک کانفیگ پیش‌فرض نصب کردید.

🔸برای نصب Neovim نیز از این صفحه، در آخرین Release، فایل‌های msi. یا zip. را دانلود کنید. (bin/nvim.exe در zip. فایل اجرایی برنامه است)


🐧 لینوکس:
برای دانلود فایل‌های AppImage به ریپازتوری Vim و Neovim مراجعه کنید.


Ubuntu:
sudo apt update
sudo apt install vim


sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt install neovim



Fedora/RHEL/CentOS:
sudo dnf install -y vim-enhanced


sudo dnf install -y neovim



Arch:
sudo pacman -Syu vim


sudo pacman -Syu neovim



🍏 مک:
به سادگی با استفاده از Homebrew:
brew install vim


brew install neovim


و به همین ترتیب برای نصب MacVim (یک نسخه دارای GUI و امکانات اضافی):
brew install macvim



🛠 کانفیگ Vim:
برای فعال‌سازی برخی امکانات، شخصی‌سازی ظاهری و تنظیم بخشی از رفتارها، به سراغ فایل vimrc. در لینوکس و مک یا vimrc_ در ویندوز می‌رویم که با زبان VimScript نوشته می‌شود.
می‌توانید از کانفیگ زیر برای بهبود تجربه کاربری خود استفاده کنید:
" Show line numbers
set number

" Enable syntax highlighting
syntax on

" Disable compatibility with vi which can cause unexpected issues
set nocompatible

" Highlight cursor line underneath the cursor horizontally
set cursorline

" Show the command being typed
set showcmd

" Show the mode you are on the last line
set showmode

" Show cursor position in the status line
set ruler

" Highlight matching parentheses or brackets
set showmatch

" Enable auto completion menu after pressing TAB
set wildmenu

" Show suggestions as a list and complete up to the longest match
set wildmode=list:longest

" Wildmenu will ignore files with these extensions
set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx

" Enable type file detection
filetype on

" Enable plugins and load plugin for the detected file type
filetype plugin on

" Load an indent file for the detected file type
filetype indent on

" Set the number of spaces for a tab
set tabstop=2

" Set the number of spaces for auto-indentation
set shiftwidth=2

" Automatically maintain indentation on new lines
set autoindent

" Improve tab behavior for smarter indentation
set smarttab

" Convert tabs to spaces
set expandtab

" Enable backup files
set backup

" Enable undo history persistence
set undofile

" Directory for backup files
set backupdir=~/.vim/backups

" Directory for undo files
set undodir=~/.vim/undo

" Ignore case in search patterns
set ignorecase

" Override ignorecase if search includes uppercase letters
set smartcase

" Highlight matching words during incremental search
set incsearch

" Highlight search results
set hlsearch

" Use the system clipboard for copy/paste
set clipboard=unnamedplus

" Show special characters like tabs and trailing spaces
set list

" Define symbols for tabs and trailing spaces
set listchars=tab:▸\ ,trail:·


" STATUS LINE ========================================

" Clear status line when vimrc is reloaded
set statusline=

" Left section of the status line: show file name, modified status, file type, and readonly flag
set statusline+=\ %F\ %M\ %Y\ %R

" Add a divider to separate left and right sections
set statusline+=%=

" Right section of the status line: show file details
set statusline+=\ ascii:\ %b\ hex:\ 0x%B\ row:\ %l\ col:\ %c\ percent:\ %p%%

" Display the status line on the second to last line of the screen
set laststatus=2


🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
🔥4👍1
⚙️ کانفیگ Neovim:
در NVim علاوه بر VimScript برای کانفیگ، از زبان خوب Lua نیز پشتیبانی می‌شود و فایل آن init.lua نام دارد. برای شروع، پیشنهاد می‌کنیم محیط ادیتور خود را مانند ما کانفیگ کنید:
-- General settings
vim.o.number = true -- Show line numbers
vim.o.relativenumber = true -- Show relative line numbers
vim.o.syntax = 'on' -- Enable syntax highlighting
vim.o.clipboard = 'unnamedplus' -- Use system clipboard for copy/paste
vim.o.wrap = true -- Enable line wrapping
vim.o.ignorecase = true -- Ignore case while searching
vim.o.smartcase = true -- Override ignorecase if search includes uppercase letters
vim.o.hlsearch = true -- Highlight search results
vim.o.incsearch = true -- Incremental search
vim.o.smartindent = true -- Smart indentation
vim.o.expandtab = true -- Convert tabs to spaces
vim.o.tabstop = 4 -- Set tab width to 4 spaces
vim.o.shiftwidth = 4 -- Set indent width to 4 spaces
vim.o.softtabstop = 4 -- Set soft tab width to 4 spaces
vim.o.autoindent = true -- Automatically maintain indentation
vim.o.showmatch = true -- Highlight matching brackets
vim.o.cursorline = true -- Highlight the current line
vim.o.scrolloff = 8 -- Keep 8 lines visible when scrolling
vim.o.termguicolors = true -- Enable true color support

-- Set up a better status line
vim.o.statusline = '%F %y %l/%L %p%%' -- Show file path, type, and line info

-- File type settings
vim.cmd('filetype plugin indent on') -- Enable file type detection, plugins, and indentation

-- Key mappings (keybindings)
vim.api.nvim_set_keymap('n', '<leader>w', ':w<CR>', { noremap = true, silent = true }) -- Save file with \w
vim.api.nvim_set_keymap('n', '<leader>q', ':q<CR>', { noremap = true, silent = true }) -- Quit Vim with \q


🎯 به نظر می‌آید همین‌ها برای شروع کافی باشند. در ادامه به سراغ کامندهای این ادیتور و کار در modeهای مختلف آن خواهیم رفت و سپس بهترین پلاگین‌های Vim و Neovim را نصب و راه‌اندازی می‌کنیم.

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
🔥5❤3👍3👎3
Forwarded from | Erfan's Notes |
حدودا یک ماه از ریلیز شدن نسخه 3.0 وب‌اسمبلی (WASM) می‌گذره و الان فرصت کردم درموردش بخونم، تغییرات مهمی که داشته رو پایین می‌نویسم.

💠 پشتیبانی از Address Space های 64 بیت
تا قبل از این نسخه، وب‌اسمبلی محدود به آدرس‌های i32 بود و نمی‌تونست بیشتر از 4GB رو آدرس‌دهی کنه، ولی پشتیبانی از i64 اضافه شده و این محدودیت عملا بی‌نهایت شده، هرچند که همچنان مرورگرها حداکثر اجازه allocate کردن 16GB رو می‌دن.

💠 پشتیبانی از Memory های چندگانه
تا قبل از این نسخه، هر ماژول وب‌اسمبلی فقط محدود به یک Memory بود و برای تفکیک باید ماژول‌ها Split می‌شدند، ولی در این نسخه قابلیت داشتن Memory های متعدد برای یک ماژول اضافه شده.

💠 پشتیبانی از Garbage Collection
در این نسخه یک افزونه با عنوان wasm-gc اضافه شده که در سطوح پایین می‌تونه مموری رو به‌صورت خودکار مدیریت کنه، کامپایلرها می‌تونند Struct ها و آرایه‌ها و بعضی Integer ها رو به صورت تگ شده تعریف کنند و خود wasm وظیفه allocation و lifetime شون رو برعهده بگیره.

💠 پشتیبانی از Tail Call ها
قابلیت Tail Call به وب‌اسمبلی اضافه شده، این ویژگی از زبان‌های فانکشنال الگو گرفته، به این معنی که فانکشن‌ها می‌تونند در آخرین اکشن‌شون یک فانکشن دیگه‌ای رو کال کنند بدون اینکه فضایی از Stack رو اشغال کنند، این موضوع در کال های Recursive اهمیت زیادی داره.

💠 پشتیبانی از Exception ها
پشتیبانی از Exception های try و catch در وب‌اسمبلی اضافه شده، تا قبل از این برای چنین کاری باید از JS استفاده می‌شد.

💠 پشتیبانی از String های جاوا اسکریپت
قابلیت رد و بدل کردن مستقیم String های جاوا اسکریپت بدون نیاز به تبدیل دو طرفه اضافه شده، می‌تونید مقادر String رو به صورت مستقیم به‌عنوان externref پاس بدید و سمت wasm تغییرات لازم رو روش اعمال کنید و سمت JS تحویل بگیرید.

و البته کلی قابلیت دیگه که اگر دوست داشتید می‌تونید اینجا بخونید.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👎3👍1
سیستم توصیه‌گر - Recommendation System 💡

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

‏Recommenderها یا موتورهای پیشنهاددهنده مجموعه الگوریتم‌هایی هستند که با بررسی رفتار کاربران یا ویژگی‌های آیتم‌ها به‌صورت خودکار مواردی به آن‌ها پیشنهاد می‌دهند — سیستم‌هایی که به طور گسترده در پلتفرم‌هایی مانند آمازون، نتفلیکس، لینکدین و یکتانت(!) استفاده می‌شوند. در اینگونه سیستم‌ها هدف، دادن پیشنهادهای مفید و مرتبط است؛ نه درک کامل سلیقه کاربر.

⚡️ سیستم‌های Recommendation شامل 4 نوع اصلی هستند:
‏Collaborative: استفاده مستقیم از رفتار کاربران.

‏Content-Based: بر مبنای خصوصیات مشترک بین آیتم‌ها. مثلا دو فیلم که هر دو ژانر کمدی دارند مشابه محسوب می‌شوند.

‏Hybrid: ترکیب دو روش قبلی.

‏Knowledge-Based: بر اساس قوانین از پیش تعریف‌شده و ویژگی‌های صریح. مثلا دستیار خرید می‌پرسد «بودجه‌تان چقدر است؟» یا «هدفتان عکاسی حرفه‌ای است؟». سپس بر اساس پاسختان پیشنهاداتی ارائه می‌دهد.

در این پست تنها به معرفی معروف‌ترین نوع یعنی Collaborative Filtering و روش‌های رایج در آن می‌پردازیم.

اما اجازه دهید قبل از شروع، به تعریف چند مفهوم بپردازیم.

0️⃣ متغیرها در این زمینه به دو شکل بررسی می‌شوند:
‏Explicit یا صریح: کاربر عمدا نظر می‌دهد؛ مثلا برای اپلیکیشنی بازخورد مثبت ثبت کرده یا یک ویدیو را دیس‌لایک می‌کند.

‏Implicit یا ضمنی
: رفتارهای روزمره که نشان‌دهنده علاقه‌های‌ کلی کاربر هستند، مثل تعداد کلیک روی یک محصول، دفعات پخش یک آهنگ یا مدت زمان تماشای یک فیلم.
در کل داده‌های ضمنی رایج‌ترند اما می‌توانند گمراه‌کننده هم باشند؛ مثلا کلیک تصادفی روی یک ویدیو الزاما به معنای علاقه‌مند بودن به آن نیست.


1️⃣ اساس کار این روش‌ها استفاده از ماتریسی دو بعدی به نام Utility Matrix یا User–Item Interaction Matrix (ماتریس تعامل کاربر×آیتم) می‎‌باشد. در این ماتریس سطرها نشان‌دهنده کاربران و ستون‌ها نشان‌دهنده آیتم‌ها (مثل فیلم و کالا) هستند.
خانه‌های این ماتریس مقدار تعامل کاربر با آیتم را نگه می‌دارند این مقدار می‌تواند امتیاز داده شده به سریال، کلیک روی پست، خرید کالا و... باشد.

اکثر خانه‌های این ماتریس خالی هستند و هدف الگوریتم‌ها پر کردن آن‌ها با یک پیش‌بینی منطقی است.
یعنی هدف نهایی رسیدن به عددی به نام Predicted Rating می‌باشد. نمره‌ای که توسط سیستم به چند آیتم، تعلق می‌گیرد که احتمالا کاربر به آن‌ها علاقه‌مند است. آیتم‌ها بر این اساس اولویت‌بندی شده و پیشنهاد می‌شوند.


2️⃣ هر کاربر و هر آیتم به صورت یک بردار عددی (لیستی از اعداد) نمایش داده می‌شود.
مثلا شما می‌توانید برداری شبیه [0.8, 0.2-, 0.5] داشته باشید. یک پست می‌تواند به صورت بردار [0.6-, 0.3, 0.6] باشد.
حاصل ضرب داخلی این دو بردار یا میزان شباهت و هم‌جهتی آن‌ها نشان می‌دهد که با چه احتمالی شما به این پست علاقه دارید.


۱) الگوریتم‌های مبتنی بر کاربر — User-based
👥

اگر شخصی شبیه گروهی از کاربران رفتار کرده، چیزهایی را خواهد پسندید که آن گروه از افراد دوست داشته‌اند.


این روش در سرویس‌های موسیقی اولیه مثل Last.fm دیده می‌شد اما امروزه به ندرت استفاده می‌شود. چرا که محاسبه شباهت‌ها بین میلیون‌ها کاربر سخت بوده و از طرف دیگر، آیتم‌های جدید اطلاعات کمی دارند (مسئله Cold Start).

برای پیاده‌سازی این سیستم ابتدا یک Utility Matrix می‌سازیم. حال برای هر کاربر یک بردار رفتار داریم. با محاسبه شباهت بین بردارهای کاربران، همسایه‌های نزدیک را می‌یابیم و میانگین وزن‌دار امتیازات همان همسایه‌ها را به دست می‌آوریم تا به Predicted Rating برسیم. وزن‌ها بر اساس شباهت بین کاربران محاسبه می‌شود.


۲) الگوریتم‌های مبتنی بر آیتم — Item-based
🧩

اگر تعدادی از کاربرها دو چیز را با هم پسندیده‌اند، آن دو چیز شبیه هم‌اند.


در دیجی‌کالا در صفحه مربوط به یک محصول بخشی را با این عنوان پیدا می‌کنید: کاربرانی که این را خریده‌اند، چنین خریدهایی نیز داشته‌اند.

در اینجا نیز از ساخت یک ماتریس تعامل شروع می‌کنیم اما این بار برای هر آیتم یک بردار در نظر می‌گیریم تحت این عنوان که «چه کسانی با این آیتم تعامل داشته‌اند». با محاسبه شباهت یا هم‌رخدادی (Co-occurrence) بین این بردارها، یک ماتریس شباهت آیتم×آیتم می‌سازیم که معمولا از قبل محاسبه شده و کش می‌شود. در نهایت نمرات آیتم‌های مطلوب را جمع وزن‌دار می‌کنیم. حاصل همان Predicted Rating ‌می‌باشد.

ادامه در پست بعدی...

💎 Channel: @DevelopixChannel
👍14👎3❤1
۳) الگوریتم‌های مبتنی بر تجزیه ماتریس و عوامل پنهان — Matrix Factorization / Latent-factor ✨

این مورد یکی از پیشرفته‌ترین و موثرترین‌هاست. به زبان ساده در این روش به ‌جای نگاه کردن به هر تعامل جداگانه، سعی می‌کنیم Latent Variable یا عوامل پنهان پشت هر انتخاب را پیدا کنیم. در واقع سیستم یاد می‌گیرد چه الگوهای پنهانی در رفتار کاربران وجود دارد، سپس بر اساس آن‌ها پیشنهادهایی می‌دهد.
این الگوهای پنهان یا Latent Variableها ترکیب‌هایی هستند که نمی‌توان آن‌ها را با یک برچسب ساده مشخص کرد. متغیرهایی که با وضوح قابل توصیف نیستند.

برای مثال یک Latent Variable می‌تواند نشان‌دهنده الگویی باشد که طبق آن گروهی از کاربران به مجموعه‌ای خاص از سریال‎ها امتیاز بالایی داده‌اند — سیستم هرگز نمی‌داند این عامل دقیقا به ژانر سریال مربوط می‌شود یا بازیگران برجسته و سطح کارگردانی آن. او تنها رابطه‌ای را در قالب بردارهای عددی پیدا می‌کند.

مثلا کاربرانی با بردار کاربری [0.9,0.3,0.1] و سریال‌هایی با بردار آیتمی [0.7,0.2-,0.4] به ‌هم مرتبط می‌شوند.

مدل‌هایی که در مسابقه Netflix Prize مطرح شدند و کیفیت پیشنهاد فیلم را به‌طرز چشم‌گیری بهتر کردند از این روش استفاده می‌کنند.

طبق این الگوریتم ماتریس تعامل را به‌ دو ماتریس کوچک‌تر "کاربران" و "آیتم‌ها" تجزیه می‌کنیم. هر سطر از ماتریس کاربران یک بردار برای کاربرها و هر سطر ماتریس آیتم‌ها نیز یک بردار برای آیتم‌ها محسوب می‌شود. این بردارها به‌وسیله بهینه‌سازی یک Loss Function (تابع خطا) و با استفاده از روش‌هایی مانند SGD یا ALS استخراج می‌شوند. حاصل‌ضرب داخلی این بردارها Predicted Rating را می‌سازد.


‏۴) الگوریتم‌های مبتنی بر شبکه عصبی - Deep Learning / Neural Models
🧠

در نسخه‌های جدیدتر سیستم‌های پیشنهاددهی، از Deep Learning (یادگیری عمیق) استفاده می‌شود تا الگوهای پیچیده‌تری بین کاربران و آیتم‌ها را شناسایی شود — روابطی که مدل Matrix Factorization هم قادر به درک کامل آن‌ها نیست.

یکی از برتری‌‎های این الگوریتم‌ها این است که می‌توانند اطلاعات جانبی مثل زمان، موقعیت جغرافیایی و دستگاه کاربر را نیز به دقت تحلیل کنند.

در این مدل‌ها، هر کاربر و آیتم با یک Learned Embedding یا Trainable Embedding Vector (بردار قابل آموزش) نمایش داده می‌شود. این بردارها وارد شبکه عصبی می‌شوند تا مدل بتواند الگوهای غیرخطی و ترکیب‌های پنهان بین کاربرها و آیتم‌ها را کشف کند، بردارها را تغییر داده و دقیق‌ترین نتیجه را ارائه دهد.

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

در عمل، خروجی مدل معمولا برای تعیین Predicted Rating یا Re-ranking آیتم‌ها استفاده می‌شود.
‏Re-Ranking همان فرایندی است که در پلتفرم‌های بزرگی مثل یوتیوب انجام می‌شود. ابتدا مدل نسبتا ساده‌ای از بین میلیون‌ها ویدیو چند صد کاندید اولیه انتخاب می‌کند و سپس یک مدل پیشرفته‌تر با دقت بالا آن‌ها را مجددا مرتب می‌کند.


🎯 ‏Recommenderها از الگوریتم‌های ساده‌ به مدل‌های پیچیده‌ای تبدیل شده‌اند که عمیق‌ترین الگوها را به سرعت استخراج می‌کنند. هرچند این سیستم‌ها هنوز کامل نیستند و با چالش‌هایی مثل Filter Bubble (حباب فیلتر) مواجهند، اما بی‌شک به بخش جدایی‌ناپذیر تجربه دیجیتال تبدیل شده‌اند.
موتورهایی که در پس‌زمینه، ذهنمان را می‌خوانند و سلیقه‌مان را به زبان ریاضی ترجمه می‌کنند.

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
❤13🔥7👍3
FastAPI — فریم‌ورک وب سریع برای Python

FastAPI برای ساخت APIهای سریع، تایپ‌ایمن و قابل مقیاس طراحی شده. مشکل ولیدیشن دستی، مستندسازی و کار با async را با Pydantic و طراحی مبتنی بر نوع حل می‌کند.

ویژگی‌ها:
- پشتیبانی async/await
- اعتبارسنجی و تبدیل داده با Pydantic
- مستندات خودکار OpenAPI/Swagger
- عملکرد بالا و کم‌کد

نمونه نصب و استفاده:
pip install fastapi uvicorn

# main.py
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def read_root():
return {"hello": "world"}

# اجرا: uvicorn main:app --reload


موارد کاربرد: میکروسرویس‌ها، APIهای REST، پروتوتایپ سریع و بک‌اند سرویس‌های تحت ترافیک بالا. مستندات و سورس:
Docs — GitHub

نظرتون و تجربه‌هاتون با FastAPI رو بنویسید؛ استقبال می‌کنیم.

🔖 #Programming #برنامه_نویسی #python #fastapi #api #web #pydantic

👤 Developix

💎 Channel: @DevelopixChannel
👍6
استفاده از print برای دیباگ ساده و وسوسه‌برانگیز است، اما در پروژه‌های واقعی مشکلات متعددی ایجاد می‌کند: خروجی‌های نامنظم، فقدان سطح‌بندی (info/debug/error)، و مشکل در خاموش/روشن کردن لاگها. استفاده از ماژول استاندارد logging در پایتون یک تغییر کوچک ولی بسیار اثربخش است. ✅

توضیح کوتاه و کاربردی:
- در هر ماژول یک logger با نام ماژول بسازید و لاگینگ را در نقطه ورود برنامه (مثلاً main) پیکربندی کنید.
- از logger.debug/info/warning/error/exception استفاده کنید تا سطح و فرمت را کنترل کنید.

نمونهٔ کوچک و عملی:
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(levelname)s [%(name)s] %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

def divide(a, b):
try:
return a / b
except Exception:
logger.exception("error dividing %s by %s", a, b)
return None

if __name__ == "__main__":
logger.info("start")
print(divide(10, 0))


چرا مفید است و نکات عملی:
- می‌توانید سطح لاگ (DEBUG/INFO/ERROR) را بدون تغییر کد تغییر دهید. ⚙️
- لاگ‌ها قابل هدایت به فایل، کنسول یا سرویس‌های خارجی هستند. 📁
- در except از logger.exception() استفاده کنید تا استک‌تریس ثبت شود. 🧾
- اجتناب از فراخوانی basicConfig در کتابخانه‌ها؛ فقط در برنامهٔ اصلی پیکربندی کنید.

پایانی کوتاه: این تغییر ساده کیفیت دیباگ و نگهداری کد را سریعاً بالا می‌برد — چند دقیقه وقت بذارید و لاگینگ را در پروژه‌هایتان جایگزین print کنید. 🔧

منبع معتبر: Python logging — official docs

#python #logging #دیباگ

🔖 #Programming #برنامه_نویسی #python #logging #debug #دیباگ #best_practices

👤 Developix

💎 Channel: @DevelopixChannel
👍4🔥1
مسئله: در تصویر بالا این قطعه‌کد پایتون اجرا می‌شود. خروجی اجرای آن چه خواهد بود؟

🔖 #Programming #برنامه_نویسی

👤 Developix

💎 Channel: @DevelopixChannel
❤3
Pydantic یکی از کتابخانه‌های جدی و پراستفاده در Python برای کار با data models و validation است؛ مخصوصاً وقتی از FastAPI، اسکریپت‌های ETL یا سرویس‌های داخلی استفاده می‌شود.

ایده‌اش ساده است: به‌جای if&mdash;elseهای تکراری برای چک کردن ورودی‌ها، یک مدل تعریف می‌کنی و Pydantic خودش نوع‌ها را تبدیل و داده را اعتبارسنجی می‌کند ✅

ویژگی‌های مهم:
• تایپ‌محور بر اساس type hints پایتون
• تبدیل خودکار انواع (مثلاً str به int در صورت امکان)
• پیام خطای قابل‌خواندن برای API و لاگ‌ها
• ادغام عالی با FastAPI و ابزارهای async

نمونه استفاده ساده:
from pydantic import BaseModel, ValidationError

class User(BaseModel):
id: int
name: str
is_active: bool = True

try:
user = User(id="1", name="Sara")
print(user.id, type(user.id)) # 1 <class 'int'>
except ValidationError as e:
print(e.json())


برای پروژه‌هایی که ورودی‌شان از API، فرم، Message Queue یا فایل JSON می‌آید، Pydantic کمک می‌کند باگ‌های مربوط به داده را خیلی زودتر شکار کنی 🧪

Docs رسمی:
docs.pydantic.dev
GitHub:
github.com/pydantic/pydantic

امتحانش کن روی یکی از سرویس‌های داخلی‌ات و ببین چقدر validation تمیزتر و قابل‌اعتمادتر می‌شود 🚀

🔖 #Programming #برنامه_نویسی #Python #Pydantic #Validation #FastAPI #Data_Modeling

👤 Developix

💎 Channel: @DevelopixChannel
👍4
اصل Single Responsibility: هر کلاس فقط یک دلیل برای تغییر 💡

یکی از مهم‌ترین اصول SOLID که واقعاً در پروژهٔ روزمره جواب می‌دهد، Single Responsibility Principle (SRP) است:

هر ماژول، کلاس یا فانکشن باید فقط یک مسئولیت داشته باشد.

یعنی چه؟ یعنی اگر فردا قرار باشد این کلاس تغییر کند، فقط یک «دلیل منطقی» برای آن وجود داشته باشد، نه چند دلیل مختلف و نامربوط.

مثال ساده ⬇️

class OrderService:
def create_order(self, data):
# 1) اعتبارسنجی دیتا
# 2) ذخیره در دیتابیس
# 3) ارسال ایمیل تایید
pass


این کلاس ۳ مسئولیت دارد:

• منطق بیزینسی سفارش 🧠
• دسترسی به دیتابیس 💾
• ارسال ایمیل 📧

هر بار که قوانین ایمیل عوض شود، این کلاس باید عوض شود.
هر بار که ساختار دیتابیس عوض شود، باز هم همین کلاس.
این دقیقاً خلاف SRP است و در طول زمان به کد شکننده و پر باگ تبدیل می‌شود.

ری‌فکتور با SRP ✅

class OrderRepository:
def save(self, order):
pass

class EmailService:
def send_order_confirmation(self, order):
pass

class OrderService:
def __init__(self, repo, email_service):
self.repo = repo
self.email_service = email_service

def create_order(self, data):
# منطق سفارش
order = self._build_order(data)
self.repo.save(order)
self.email_service.send_order_confirmation(order)


حالا:

• تغییر دیتابیس فقط OrderRepository را درگیر می‌کند.
• تغییر متن/قوانین ایمیل فقط در EmailService انجام می‌شود.
• خود OrderService روی منطق سفارش تمرکز می‌کند.

چرا این کار در عمل ارزش دارد؟

• تست کردن راحت‌تر می‌شود؛ چون می‌توان EmailService و OrderRepository را mock کرد و فقط منطق سفارش را تست گرفت ✅
• تغییرات بیزینسی، UI یا زیرساخت، بخش‌های جداگانه را لمس می‌کند، نه کل سیستم را 🔧
• خوانایی بالاتر: هر کلاس را که باز می‌کنی، تقریباً می‌توانی با خواندن نامش حدس بزنی چه کاری انجام می‌دهد 👀

نشانه‌های نقض SRP (Code Smell) 🚨

• کلاس‌هایی با نام‌های مبهم مثل Manager، Helper، Util که همه کار می‌کنند.
• فانکشن‌هایی که ۱۰۰+ خط کد دارند و هم validate می‌کنند، هم log، هم call به API.
• هر بار که فیچر جدیدی می‌آید، مجبور می‌شوی همان فایل‌های قدیمی «همه‌فن‌حریف» را باز کنی.

لینک‌های مفید برای مطالعهٔ بیشتر:
Refactoring.Guru - Single Responsibility Principle
Martin Fowler - Single Responsibility Principle

قدم‌های کوچک ری‌فکتور بر اساس SRP، در طول زمان کیفیت کد را به‌طرز عجیبی بالا می‌برد. از فانکشن‌های طولانی و کلاس‌های همه‌کاره شروع و به تدریج مسئولیت‌ها را جدا کنید 🌱

🔖 #Programming #برنامه_نویسی #Clean_Code #SOLID #SRP #Software_Architecture #Refactoring #Python

👤 Developix

💎 Channel: @DevelopixChannel
❤4🔥2
در این قطعه‌کد Python از رفتار mutable default argument در توابع استفاده شده است.

خروجی نهایی اجرای این برنامه چیست؟

def extend_list(val, lst=[]):
lst.append(val)
return lst

a = extend_list(1)
b = extend_list(2, [])
c = extend_list(3)

print(a)
print(b)
print(c)


🔖 #Programming #برنامه_نویسی

👤 Developix

💎 Channel: @DevelopixChannel
❤2
اصل Single Responsibility در عمل 🧩

یکی از مهم‌ترین اصول SOLID که عملاً هر روز سر و کار داریم، Single Responsibility Principle (SRP) است:

«هر کلاس یا ماژول باید فقط یک دلیل برای تغییر داشته باشد.»

این یعنی:

• هر قطعه کد روی یک کار مشخص تمرکز کند.
• وقتی نیاز به تغییر یک رفتار داریم، فقط به یک جای مشخص سر بزنیم.

چرا مهم است؟

• کد قابل فهم‌تر می‌شود.
• Bugها کمتر در جاهای نامربوط نشت می‌کنند.
• تست‌ها ساده‌تر و Refactor کردن کم‌ریسک‌تر می‌شود. ✅

نمونه کد بدون رعایت SRP 😵

این تابع هم ورودی را می‌خواند، هم پردازش می‌کند، هم لاگ می‌گیرد و هم نتیجه را ذخیره می‌کند:

def process_order(request):
# 1) validate input
if not request.get("user_id"):
print("[ERROR] missing user_id")
return

# 2) calculate price
total = 0
for item in request["items"]:
total += item["price"] * item["qty"]

# 3) log result
print(f"[INFO] user={request['user_id']} total={total}")

# 4) save to db (fake)
db["orders"].append({"user": request["user_id"], "total": total})


این تابع حداقل چهار مسئولیت دارد؛ هر تغییر کوچکی (مثلاً فرمت لاگ یا ساختار دیتابیس) باعث تغییر در همین تابع می‌شود.

تقسیم به مسئولیت‌های جدا ✂️

با SRP، مسئولیت‌ها را جدا می‌کنیم:

def validate_request(request):
if not request.get("user_id"):
raise ValueError("missing user_id")


def calculate_total(items):
return sum(i["price"] * i["qty"] for i in items)


def log_order(user_id, total, logger):
logger.info(f"user={user_id} total={total}")


def save_order(user_id, total, repo):
repo.save({"user": user_id, "total": total})


def process_order(request, logger, repo):
validate_request(request)
total = calculate_total(request["items"])
log_order(request["user_id"], total, logger)
save_order(request["user_id"], total, repo)


حالا:

• منطق محاسبه قیمت جداست؛ اگر تخفیف یا Tax اضافه شود، فقط همان بخش را تغییر می‌دهیم.
• تغییر سیستم لاگ یا دیتابیس، منطق دامنه را دست‌کاری نمی‌کند.
• تست کردن calculate_total و validate_request به‌صورت واحد بسیار ساده است. 🧪

نکتهٔ مهم

SRP را افراطی تفسیر نکنید؛ منظور این نیست برای هر خط یک تابع بسازیم. معیار خوب این است:

• وقتی می‌گویید «این کلاس/تابع کارش چیه؟»، بتوانید با یک جملهٔ کوتاه جواب بدهید.

برای مطالعهٔ بیشتر:

• کتاب Clean Code – Robert C. Martin
• توضیح SRP در Refactoring.Guru: refactoring.guru/design-patterns/solid

این اصل به‌ظاهر ساده، اگر واقعاً در هر Pull Request به آن فکر شود، کیفیت بلندمدت کدبیس را عوض می‌کند. 🌱

🔖 #Programming #برنامه_نویسی #SRP #SOLID #clean_code #refactoring #architecture #Python

👤 Developix

💎 Channel: @DevelopixChannel
🔥4
کتابخونهٔ معروف Requests توی Python عملاً استانداردِ کار با HTTP شده؛ به‌جای درگیر شدن با urllib و جزئیات خسته‌کننده، با چند خط کد می‌شه API صدا زد و JSON گرفت و فرستاد. 😉

Requests مشکل «کد شلوغ و پر از boilerplate برای request ساده» رو حل می‌کنه و خوندن/دیباگ‌کردن کدهای مرتبط با شبکه رو خیلی راحت‌تر می‌کنه.

ویژگی‌های مهم:
• سینتکس خیلی خوانا و نزدیک به زبان طبیعی 🧠
• پشتیبانی راحت از headers، query params، timeout، session و cookie
• هندل سادهٔ JSON و status code ها
• مناسب برای کار با REST API، اسکریپت‌های اتوماسیون و crawlerهای سبک

pip install requests

import requests

resp = requests.get("https://api.github.com/repos/psf/requests")
if resp.status_code == 200:
data = resp.json()
print(data["full_name"], data["stargazers_count"])


برای پروژه‌هایی مثل مانیتورینگ سرویس‌ها، نوشتن bot، یا اتصال سریع به سرویس‌های third-party، Requests انتخاب امن و پرکاربردیه. 🤝

Docs رسمی:
requests.readthedocs.io
GitHub:
github.com/psf/requests

امتحانش کن و کم‌کم هر جا اسم HTTP تو Python بیاد، یاد Requests می‌افتی. 🚀

🔖 #Programming #برنامه_نویسی #Python #HTTP #Requests #Web #API

👤 Developix

💎 Channel: @DevelopixChannel
اصل Single Responsibility (SRP) از اصول معروف SOLID می‌گوید:

«هر ماژول، کلاس یا تابع باید فقط یک دلیل برای تغییر داشته باشد.» ✅

یعنی چی؟ یعنی یک کلاس نباید هم منطق کسب‌وکار را انجام دهد، هم لاگ بنویسد، هم با دیتابیس صحبت کند، هم ایمیل بفرستد. این دقیقاً همان جایی است که کد شروع به بو دادن می‌کند (Code Smell) 😅

نمونه‌ی بد: کلاس همه‌کاره
class UserService:
def register(self, user_data):
# validate
if not user_data["email"]:
raise Exception("email required")

# save to db
db.save(user_data)

# send welcome email
email_client.send(user_data["email"], "welcome")

# log
logger.info("user registered")


اینجا UserService چند مسئولیت دارد:

• validation ✅
• ذخیره در دیتابیس 🗄️
• ارسال ایمیل 📧
• logging 📜

تست کردنش سخت می‌شود، تغییر هر بخش روی بقیه اثر می‌گذارد، و هر تغییری ریسک Bug را بالا می‌برد.

بازطراحی با SRP
class UserValidator:
def validate(self, user_data):
if not user_data["email"]:
raise Exception("email required")

class UserRepository:
def save(self, user_data):
db.save(user_data)

class EmailNotifier:
def send_welcome(self, email):
email_client.send(email, "welcome")

class UserService:
def __init__(self, validator, repo, notifier, logger):
self.validator = validator
self.repo = repo
self.notifier = notifier
self.logger = logger

def register(self, user_data):
self.validator.validate(user_data)
self.repo.save(user_data)
self.notifier.send_welcome(user_data["email"])
self.logger.info("user registered")


حالا:

• هر کلاس یک مسئولیت واضح دارد ✔️
• تست واحد برای هر بخش ساده‌تر است ✔️
• تغییر ایمیل یا دیتابیس، UserService را نمی‌شکند ✔️

چند نکته‌ی کاربردی 🔍

• اگر در توضیح یک کلاس مجبورید از «و» زیاد استفاده کنید (این کلاس X و Y و Z انجام می‌دهد)، احتمالاً SRP نقض شده.
• متدهایی که بیش از حد طولانی‌اند و کارهای ناهمگن انجام می‌دهند، نامزد جدی Refactor هستند.
• SRP کمک می‌کند معماری تمیزتر داشته باشید و Design Patternها (مثل Strategy، Repository) را راحت‌تر پیاده کنید.

برای مطالعه‌ی بیشتر می‌توان به Refactoring.Guru - SRP یا فصل‌های ابتدایی کتاب Clean Code سر زد.

اجرای مستمر SRP روی کدهای روزمره، در بلندمدت پروژه‌ را قابل‌تغییرتر، تست‌پذیرتر و کم‌استرس‌تر می‌کند. از همین الان روی یکی از فایل‌های شلوغ پروژه شروع شود و مسئولیت‌ها را جدا کنید ✨

🔖 #Programming #برنامه_نویسی #Clean_Code #SOLID #SRP #Refactoring #Architecture #Design_Principles #Python

👤 Developix

💎 Channel: @DevelopixChannel
🚀 ساخت یک REST API ساده با FastAPI (ولی حرفه‌ای!)

FastAPI این‌قدر سریع و تمیزه که برای ساخت REST APIهای کوچک تا سرویس‌های جدی تولید (Production) عالی جواب می‌ده. توی این پست، بر اساس داک رسمی FastAPI (https://fastapi.tiangolo.com)، یک API واقعی و قابل استفاده برای مدیریت "تسک‌ها" می‌سازیم؛ چیزی شبیه todo-service کوچیک، ولی تمیز و قابل توسعه. 😎

ایده اینه:

• یک API می‌سازیم که لیست تسک‌ها رو بده، تسک جدید بگیره و وضعیتش رو عوض کنه.
• از Pydantic models برای اعتبارسنجی ورودی استفاده می‌کنیم.
• خروجی JSON تمیز و قابل مصرف برای Front-end یا mobile app داریم.

اول با نصب شروع کن:
pip install "fastapi[all]" uvicorn


حالا یک فایل به اسم main.py بساز و این کد رو بذار داخلش:

from typing import List, Optional
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI(title="Tasks API")

class Task(BaseModel):
id: int
title: str
done: bool = False
description: Optional[str] = None

# دیتابیس موقتی در حافظه
TASKS_DB: List[Task] = []

@app.get("/tasks", response_model=List[Task])
async def list_tasks():
return TASKS_DB

@app.post("/tasks", response_model=Task, status_code=201)
async def create_task(task: Task):
for t in TASKS_DB:
if t.id == task.id:
raise HTTPException(status_code=400, detail="Task id already exists")
TASKS_DB.append(task)
return task

@app.patch("/tasks/{task_id}", response_model=Task)
async def mark_done(task_id: int):
for t in TASKS_DB:
if t.id == task_id:
t.done = True
return t
raise HTTPException(status_code=404, detail="Task not found")


اجرا روی لوکال:
uvicorn main:app --reload


بعد از اجرا، دو چیز خیلی کاربردی داری:

1️⃣ خود API روی:
http://127.0.0.1:8000/tasks


2️⃣ داکیومنت خودکار با Swagger UI روی:
http://127.0.0.1:8000/docs


همون‌جا می‌تونی POST /tasks رو تست کنی، JSON بفرستی و خروجی رو ببینی. این همون چیزی‌یه که تو سرویس‌های واقعی برای Front-end، موبایل یا حتی microserviceهای دیگه فرستاده می‌شه.

نکته‌های ریز ولی مهم:

• استفاده از response_model باعث می‌شه خروجی همیشه شکل مشخصی داشته باشه و Pydantic اون رو validate کنه.
• با HTTPException خطاها رو استاندارد و قابل پیش‌بینی برمی‌گردونی.
• چون TASKS_DB فقط تو حافظه‌ست، برای محیط واقعی باید به یک دیتابیس واقعی مثل PostgreSQL وصلش کنی (مثلاً با SQLModel یا SQLAlchemy).

این اسکلت ساده، پایه خیلی از APIهای واقعی‌ه: فقط کافیه endpointها و مدل‌هات رو گسترش بدی. 👨‍💻👩‍💻

امتحانش کن، یک mini todo-service برای خودت بساز و روی پروژه‌های شخصی یا تمرینی‌ات سوارش کن. اگر مفید بود برای بقیه دولوپرها هم بفرست تا از FastAPI لذت ببرن. 😄

🔖 #Programming #برنامه_نویسی #FastAPI #Python #REST_API #Backend #Web

👤 Developix

💎 Channel: @DevelopixChannel
👍3❤1
📌 سوال برنامه‌نویسی (Intermediate/Hard)

خروجی اجرای کد زیر در زبان Python چیست؟

دقت کنید که یک متغیر mutable بین فراخوانی‌های تابع به‌اشتراک گذاشته شده و فقط برای بعضی ورودی‌ها تغییر می‌کند.

🔖 #Programming #برنامه_نویسی

👤 Developix

💎 Channel: @DevelopixChannel
👍1
Forwarded from ابر ویراک
ویراک کلود | تجربه‌ی ابری بدون محدودیت ☁️🚀

🎁 ۲۰٪ شارژ هدیه روی اولین واریزی

مزیت‌هایی که واقعاً فرق می‌سازن:
⚡️ پهنای باند 980 مگ
🌐با IP مازاد
⏱️ راه‌اندازی فوری
💳 پرداخت ساعتی
🛡 پشتیبانی ۲۴/۷

💬 هر سوالی داشتی، تیم ما کنارتـه
✅ مناسب استارتاپ‌ها، تیم‌های فنی، تا سازمان‌های بزرگ

همین الان شروع کن و با حداکثر منابع، سریع‌تر رشد کن 👇🏻

📞 تماس سریع: 02191555530
🔗 https://virakcloud.com
📌 یک سوال برای توسعه‌دهندگان Python:

به خروجی این کد دقت کنید. رفتار mutable default argument در Python اینجا کمی غافلگیرکننده است.

به‌نظر شما اجرای این کد چه خروجی‌ای در کنسول چاپ می‌کند؟

def add_item(item, items=[]):
items.append(item)
return items

print(add_item(1))
print(add_item(2))
print(add_item(3, []))
print(add_item(4))


پاسخ را به‌صورت دقیق و مطابق با خروجی واقعی Python بنویسید.

🔖 #Programming #برنامه_نویسی

👤 Developix

💎 Channel: @DevelopixChannel
🧪 استفاده از assert برای گرفتن باگ‌ها، قبل از دیر شدن

خیلی وقت‌ها یک فرض توی کد داریم که "مطمئنیم" همیشه برقرار است؛ مثلا این‌که ورودی خالی نیست یا مقدار نال نمی‌آید. این‌جور جاها assert دوست خوب ماست 😄

با assert می‌شود این فرض‌ها را به شکل چکِ خودکار داخل کد ثبت کرد تا اگر جایی نقض شد، همان‌جا و همان لحظه سرِ اجرا بترکد، نه دو روز بعد توی لاگ‌های مشتری.

یک مثال ساده در Python:
def average(nums: list[float]) -> float:
assert len(nums) > 0, "nums must not be empty"
return sum(nums) / len(nums)

print(average([1, 2, 3])) # 2.0
print(average([])) # AssertionError


نکته مهم 👇
- در Python اگر با فلگ -O اجرا شود، assertها حذف می‌شوند. پس برای validation ورودی کاربر از assert استفاده نمی‌شود؛ فقط برای چک‌کردن منطق داخلی و فرضیات برنامه‌نویس مناسب است.

امروز یکی از فرض‌های مهم کدت را با یک assert ساده محکم‌تر کن و نتیجه‌اش را در باگ‌های آینده ببین 🤝

📚 مرجع: Python Docs - assert statement

🔖 #Programming #برنامه_نویسی #assert #debugging #python #clean_code #defensive_programming

👤 Developix

💎 Channel: @DevelopixChannel
👍3🔥1
خروجی اجرای این کد در Python چیست؟

به تفاوت بین alias شدن لیست و ساختن کپی با slicing دقت کنید.

a = [[1], [2], [3]]
b = a
c = a[:]

b[0].append(99)
a[1] = [42]
c[2].append(7)

print("a =", a)
print("b =", b)
print("c =", c)


🔖 #Programming #برنامه_نویسی

👤 Developix

💎 Channel: @DevelopixChannel
👍1
در کد بالا در نسخهٔ اشتباه، همهٔ lambda ها به یک متغیّر مشترک i (به‌دلیل Late Binding در Python) اشاره می‌کنند و در نتیجه در زمان اجرا همگی آخرین مقدار حلقه را برمی‌گردانند؛ در حالی‌که در نسخهٔ درست با بستن مقدار i داخل پارامتر پیش‌فرض i=i برای هر iteration یک closure مستقل ساخته می‌شود و رفتار تابع‌ها قابل پیش‌بینی و درست خواهد بود. در چنین شرایطی استفاده از این تکنیک یا حتی تعریف تابع جداگانه به‌جای تکیه بر متغیر حلقه، هم خوانایی و هم پایداری کد را در پروژه‌های متوسط و بزرگ به‌طور محسوسی بهبود می‌دهد.

🔖 #Programming #برنامه_نویسی

👤 Developix

💎 Channel: @DevelopixChannel
👍2