پارادایم رویهای 🛠
مهمترین مفاهیم برنامهنویسی رویهای(Procedural Programming)، از بنیادینترین پارادایمها، عبارتاند از:
Procedural Calls 🗂
کد به مجموعهای از رویهها یا توابع تقسیم میشود که وظیفه خاصی را انجام میدهند.
Linear Program Flow ➡️
دستورات به صورت خطی و در یک ترتیب مشخص اجرا میشوند.
Parameter Passing 📬
ارسال دادهها به توابع به دو شکل Pass by Value(ارسال کپی مقدار) و Pass by Reference(ارسال آدرس متغیر) انجام میشود.
Top-Down Design ⬇️
مشکلات پیچیده به زیرمسئلههای کوچکتر تقسیم میشوند و هر زیرمسئله با یک رویه خاص حل میشود.
Global/Local Variables 🌐
از متغیرهای محلی و جهانی برای ذخیرهسازی دادهها استفاده میشود.
⚡️ مزایای برنامهنویسی رویهای:
دسترسی ساده به دادهها در داخل یا بین رویهها
مدیریت بهتر و فهم آسانتر جریان برنامه
قابلیت استفاده مجدد و نگهداری بالا
دیباگ و تست ساده
💡 از جمله زبانهای برنامهنویسی که از این رویکرد پشتیبانی میکنند، میتوان به C و Pascal و Python و ALGOL اشاره کرد.
🔗 اطلاعات بیشتر
🔖 #Programming, #برنامه_نویسی
👤 Soheil
💎 Channel: @DevelopixChannel
مهمترین مفاهیم برنامهنویسی رویهای(Procedural Programming)، از بنیادینترین پارادایمها، عبارتاند از:
Procedural Calls 🗂
کد به مجموعهای از رویهها یا توابع تقسیم میشود که وظیفه خاصی را انجام میدهند.
Linear Program Flow ➡️
دستورات به صورت خطی و در یک ترتیب مشخص اجرا میشوند.
Parameter Passing 📬
ارسال دادهها به توابع به دو شکل Pass by Value(ارسال کپی مقدار) و Pass by Reference(ارسال آدرس متغیر) انجام میشود.
Top-Down Design ⬇️
مشکلات پیچیده به زیرمسئلههای کوچکتر تقسیم میشوند و هر زیرمسئله با یک رویه خاص حل میشود.
Global/Local Variables 🌐
از متغیرهای محلی و جهانی برای ذخیرهسازی دادهها استفاده میشود.
⚡️ مزایای برنامهنویسی رویهای:
دسترسی ساده به دادهها در داخل یا بین رویهها
مدیریت بهتر و فهم آسانتر جریان برنامه
قابلیت استفاده مجدد و نگهداری بالا
دیباگ و تست ساده
💡 از جمله زبانهای برنامهنویسی که از این رویکرد پشتیبانی میکنند، میتوان به C و Pascal و Python و ALGOL اشاره کرد.
🔗 اطلاعات بیشتر
🔖 #Programming, #برنامه_نویسی
👤 Soheil
💎 Channel: @DevelopixChannel
👍4
✨ بُرِش اول: معرفی یک دوست قدیمی؛ Vim
ادیتور Vim (مخفف "Vi IMproved") یک ویرایشگر متن screen-based قدرتمند، انعطافپذیر، open source و رایگان است که در سال ۱۹۹۱ توسط برام مولینار (Bram Moolenaar) ساخته شد. Vim بر اساس ویرایشگر Vi طراحی شده و در ابتدا برای ویرایش متن در سیستمهای مبتنی بر یونیکس (Unix) ایجاد شد.
این ادیتور امروزه با امکانات پیشرفتهتر و قابلیت شخصیسازی بیشتر، به یکی از ابزارهای محبوب در میان توسعهدهندگان تبدیل شده است.
✍ در ادامه به معرفی کامل Vim میپردازیم. سپس نحوه نصب/کانفیگ را آموزش داده و دستورات و ویژگیهای مختلف آن را با هم کشف میکنیم. پیشنهاد میکنم اگر در مقابل این ادیتور گارد خاصی دارید یا به چشم یک هیولا به آن نگاه میکنید، این سری پستها را از دست ندهید!
🏆 برتریها نسبت رقبا
⚡️ سرعت بالا: بسیار سبک بوده و طراحی سادهای دارد که آن را نسبت به IDEها و ویرایشگرهای دیگر سریعتر میکند.
🎨 کانفیگ گسترده: از طریق فایل .vimrc، محیط کاری خود را به شکلی که دوست دارید تنظیم میکنید.
📦 پشتیبانی از پلاگینها: پلاگینهای متنوعی وجود دارند که میتوانند قابلیتهای Vim را گسترش دهند.
🖥 مناسب برای محیطهای CLI: اگر با سرور یا محیطهای command line کار میکنید، Vim ابزاری ایدهآل برای ویرایش فایلها است.
⚠️ معایب و چالشها
👨🦯 نبود رابط گرافیکی: برخی کاربران ترجیح میدهند از ابزارهایی دارای رابط گرافیکی (GUI) استفاده کنند؛ که این ویژگی در Vim وجود ندارد.
🛣 منحنی یادگیری تند: کار در modeهای مختلف و یادگیری دستورات ممکن است برای تازهکارها سخت باشد.
🌀 پیچیدگی تنظیمات: پیکربندی Vim زمانبر و استفاده از پلاگینها در آن نسبتا سخت است.
💡 چرا باید برویم سراغ Vim؟
برای ویرایش فایلهای کانفیگ و اسکریپتهای Bash استفاده از Vim بسیار مناسب است. همچنین Vim ویژگیهای متنوعی از جمله syntax highlighting و bracket matching یا split window را در عین سادگی به شما ارائه میدهد و ابزارهای خوبی هم برای جستجو و جایگزینی متن در فایلهای بزرگ دارد.
❗️ البته Vim در درجه اول یک ادیتور ساده بوده و هر چه هم خوب باشد، باز گزینه مناسبی برای پروژههای بزرگ نیست. هر چند میتوانید با نصب پلاگینهایی مثل NERDTree یا Airline، به آن امکانات متنوعی اضافه کرده و مانند یک IDE تنظیمش کنید 🛠
🔥 تاثیر در بهرهوری
⏱️ سرعت: با تسلط بر دستورات، قابلیتهای پیشرفته مثل macro و حالتهای مختلف خواندن و نوشتن فایلها، زمان زیادی را در ویرایش داکیومنتها و کدنویسی صرفهجویی میکنید.
🔄 جریان کاری بیوقفه: نیازی به ماوس ندارید و تمام عملیاتها را با کیبورد انجام میدهید.
🌐 استفاده در سیستم عاملهای مختلف
🐧 لینوکس و یونیکس: نصب شده به طور پیشفرض.
🍎 مک و ویندوز: قابل نصب و راهاندازی به راحتی هر چه تمامتر.
🖼 تعامل راحتتر؛ GVim و MacVim
اگر نبود رابط گرافیکی اذیتتان میکند، راه حل GVim/MacVim است. ورژنهایی از Vim که GUI را به کاربران هدیه میدهند. اگر به استفاده از ماوس و تجربه بصری عادت دارید، این نسخهها گزینههای جذابتری برای شما هستند. نگران هم نباشید؛ بیشتر امکانات و ویژگیهای اصلی Vim در این نسخهها نیز وجود دارند.
🔍 قابلیتهای بیشتر؛ Neovim
ادیتور Neovim نسخهای مدرن و بهبودیافته از Vim است که از مشکلات و محدودیتهای Vim کم کرده است:
➕ معماری پلاگینها: Neovim با API مدرن خود، امکان توسعه پلاگینهای پیشرفتهتر با زبانهای برنامهنویسی مختلف را فراهم میکند.
🚀 قابلیت multithreading: وظایف سنگین به صورت همزمان انجام میشوند؛ در واقع با استفاده از job control چندین فرایند در پسزمینه اجرا میشوند که تجربه کاربری بهتری را ارائه میدهد.
⚙ پشتیبانی از LSP: با استفاده از language server، ویژگیهایی مانند تکمیل خودکار (code completion) و شناسایی ارورها حین نوشتن کد را فراهم میکند.
🌍 پشتیبانی و کامیونیتی فعال: به طور منظم بهروزرسانی شده و ویژگیهای جدیدی به آن اضافه میشود.
🔗 و چندین ویژگی خوب دیگر
🔖 #Programming, #برنامه_نویسی
👤 Soheil
💎 Channel: @DevelopixChannel
ادیتور Vim (مخفف "Vi IMproved") یک ویرایشگر متن screen-based قدرتمند، انعطافپذیر، open source و رایگان است که در سال ۱۹۹۱ توسط برام مولینار (Bram Moolenaar) ساخته شد. Vim بر اساس ویرایشگر Vi طراحی شده و در ابتدا برای ویرایش متن در سیستمهای مبتنی بر یونیکس (Unix) ایجاد شد.
این ادیتور امروزه با امکانات پیشرفتهتر و قابلیت شخصیسازی بیشتر، به یکی از ابزارهای محبوب در میان توسعهدهندگان تبدیل شده است.
✍ در ادامه به معرفی کامل Vim میپردازیم. سپس نحوه نصب/کانفیگ را آموزش داده و دستورات و ویژگیهای مختلف آن را با هم کشف میکنیم. پیشنهاد میکنم اگر در مقابل این ادیتور گارد خاصی دارید یا به چشم یک هیولا به آن نگاه میکنید، این سری پستها را از دست ندهید!
🏆 برتریها نسبت رقبا
⚡️ سرعت بالا: بسیار سبک بوده و طراحی سادهای دارد که آن را نسبت به IDEها و ویرایشگرهای دیگر سریعتر میکند.
🎨 کانفیگ گسترده: از طریق فایل .vimrc، محیط کاری خود را به شکلی که دوست دارید تنظیم میکنید.
📦 پشتیبانی از پلاگینها: پلاگینهای متنوعی وجود دارند که میتوانند قابلیتهای Vim را گسترش دهند.
🖥 مناسب برای محیطهای CLI: اگر با سرور یا محیطهای command line کار میکنید، Vim ابزاری ایدهآل برای ویرایش فایلها است.
⚠️ معایب و چالشها
👨🦯 نبود رابط گرافیکی: برخی کاربران ترجیح میدهند از ابزارهایی دارای رابط گرافیکی (GUI) استفاده کنند؛ که این ویژگی در Vim وجود ندارد.
🛣 منحنی یادگیری تند: کار در modeهای مختلف و یادگیری دستورات ممکن است برای تازهکارها سخت باشد.
🌀 پیچیدگی تنظیمات: پیکربندی Vim زمانبر و استفاده از پلاگینها در آن نسبتا سخت است.
💡 چرا باید برویم سراغ Vim؟
برای ویرایش فایلهای کانفیگ و اسکریپتهای Bash استفاده از Vim بسیار مناسب است. همچنین Vim ویژگیهای متنوعی از جمله syntax highlighting و bracket matching یا split window را در عین سادگی به شما ارائه میدهد و ابزارهای خوبی هم برای جستجو و جایگزینی متن در فایلهای بزرگ دارد.
❗️ البته Vim در درجه اول یک ادیتور ساده بوده و هر چه هم خوب باشد، باز گزینه مناسبی برای پروژههای بزرگ نیست. هر چند میتوانید با نصب پلاگینهایی مثل NERDTree یا Airline، به آن امکانات متنوعی اضافه کرده و مانند یک IDE تنظیمش کنید 🛠
🔥 تاثیر در بهرهوری
⏱️ سرعت: با تسلط بر دستورات، قابلیتهای پیشرفته مثل macro و حالتهای مختلف خواندن و نوشتن فایلها، زمان زیادی را در ویرایش داکیومنتها و کدنویسی صرفهجویی میکنید.
🔄 جریان کاری بیوقفه: نیازی به ماوس ندارید و تمام عملیاتها را با کیبورد انجام میدهید.
🌐 استفاده در سیستم عاملهای مختلف
🐧 لینوکس و یونیکس: نصب شده به طور پیشفرض.
🍎 مک و ویندوز: قابل نصب و راهاندازی به راحتی هر چه تمامتر.
🖼 تعامل راحتتر؛ GVim و MacVim
اگر نبود رابط گرافیکی اذیتتان میکند، راه حل GVim/MacVim است. ورژنهایی از Vim که GUI را به کاربران هدیه میدهند. اگر به استفاده از ماوس و تجربه بصری عادت دارید، این نسخهها گزینههای جذابتری برای شما هستند. نگران هم نباشید؛ بیشتر امکانات و ویژگیهای اصلی Vim در این نسخهها نیز وجود دارند.
🔍 قابلیتهای بیشتر؛ Neovim
ادیتور Neovim نسخهای مدرن و بهبودیافته از Vim است که از مشکلات و محدودیتهای Vim کم کرده است:
➕ معماری پلاگینها: Neovim با API مدرن خود، امکان توسعه پلاگینهای پیشرفتهتر با زبانهای برنامهنویسی مختلف را فراهم میکند.
🚀 قابلیت multithreading: وظایف سنگین به صورت همزمان انجام میشوند؛ در واقع با استفاده از job control چندین فرایند در پسزمینه اجرا میشوند که تجربه کاربری بهتری را ارائه میدهد.
⚙ پشتیبانی از LSP: با استفاده از language server، ویژگیهایی مانند تکمیل خودکار (code completion) و شناسایی ارورها حین نوشتن کد را فراهم میکند.
🌍 پشتیبانی و کامیونیتی فعال: به طور منظم بهروزرسانی شده و ویژگیهای جدیدی به آن اضافه میشود.
🔗 و چندین ویژگی خوب دیگر
🔖 #Programming, #برنامه_نویسی
👤 Soheil
💎 Channel: @DevelopixChannel
❤7👍2🔥1
Forwarded from | Erfan's Notes | via @DevelopixBot
⭕️ دوره آموزش برنامهنویسی مینی اپ تلگرام
💠 در این دوره به آموزش برنامهنویسی مینی اپ تلگرام میپردازیم، از مباحث پایه و عمومی شروع میکنیم و مفاهیم رو یاد میگیریم.
💠 در این دوره به آموزش برنامهنویسی مینی اپ تلگرام میپردازیم، از مباحث پایه و عمومی شروع میکنیم و مفاهیم رو یاد میگیریم.
👍4
✨ برش دوم: نصب و کانفیگ Vim و Neovim
🪟 ویندوز:
🔸از صفحه اصلی Vim یا ریپازتوری آن فایل نصبی GVim را دانلود کنید.
زمان نصب، در مرحله Choose Components، گزینه Full را برای استفاده از تمام ویژگیهای Vim انتخاب کنید. در مراحل بعدی نیز چیزی را تغییر ندهید. هماکنون شما Vim و یک نسخه گرافیکی از آن را به همراه یک کانفیگ پیشفرض نصب کردید.
🔸برای نصب Neovim نیز از این صفحه، در آخرین Release، فایلهای msi. یا zip. را دانلود کنید. (bin/nvim.exe در zip. فایل اجرایی برنامه است)
🐧 لینوکس:
Ubuntu:
Fedora/RHEL/CentOS:
Arch:
🍏 مک:
به سادگی با استفاده از Homebrew:
و به همین ترتیب برای نصب MacVim (یک نسخه دارای GUI و امکانات اضافی):
🛠 کانفیگ Vim:
برای فعالسازی برخی امکانات، شخصیسازی ظاهری و تنظیم بخشی از رفتارها، به سراغ فایل vimrc. در لینوکس و مک یا vimrc_ در ویندوز میرویم که با زبان VimScript نوشته میشود.
میتوانید از کانفیگ زیر برای بهبود تجربه کاربری خود استفاده کنید:
🔖 #Programming, #برنامه_نویسی
👤 Soheil
💎 Channel: @DevelopixChannel
🪟 ویندوز:
🔸از صفحه اصلی 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 نام دارد. برای شروع، پیشنهاد میکنیم محیط ادیتور خود را مانند ما کانفیگ کنید:
🎯 به نظر میآید همینها برای شروع کافی باشند. در ادامه به سراغ کامندهای این ادیتور و کار در modeهای مختلف آن خواهیم رفت و سپس بهترین پلاگینهای Vim و Neovim را نصب و راهاندازی میکنیم.
🔖 #Programming, #برنامه_نویسی
👤 Soheil
💎 Channel: @DevelopixChannel
در 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 تحویل بگیرید.
و البته کلی قابلیت دیگه که اگر دوست داشتید میتونید اینجا بخونید.
تا قبل از این نسخه، وباسمبلی محدود به آدرسهای i32 بود و نمیتونست بیشتر از 4GB رو آدرسدهی کنه، ولی پشتیبانی از i64 اضافه شده و این محدودیت عملا بینهایت شده، هرچند که همچنان مرورگرها حداکثر اجازه allocate کردن 16GB رو میدن.
تا قبل از این نسخه، هر ماژول وباسمبلی فقط محدود به یک Memory بود و برای تفکیک باید ماژولها Split میشدند، ولی در این نسخه قابلیت داشتن Memory های متعدد برای یک ماژول اضافه شده.
در این نسخه یک افزونه با عنوان wasm-gc اضافه شده که در سطوح پایین میتونه مموری رو بهصورت خودکار مدیریت کنه، کامپایلرها میتونند Struct ها و آرایهها و بعضی Integer ها رو به صورت تگ شده تعریف کنند و خود wasm وظیفه allocation و lifetime شون رو برعهده بگیره.
قابلیت Tail Call به وباسمبلی اضافه شده، این ویژگی از زبانهای فانکشنال الگو گرفته، به این معنی که فانکشنها میتونند در آخرین اکشنشون یک فانکشن دیگهای رو کال کنند بدون اینکه فضایی از Stack رو اشغال کنند، این موضوع در کال های Recursive اهمیت زیادی داره.
پشتیبانی از Exception های try و catch در وباسمبلی اضافه شده، تا قبل از این برای چنین کاری باید از JS استفاده میشد.
قابلیت رد و بدل کردن مستقیم 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
دقت کردهاید وقتی در اینستاگرام چند بار یک نوع محتوا را تماشا میکنید اکسپلورتان پر از همان محتوا میشود؟ یا به این فکر کردهاید که پلیلیستهای پیشنهادی اسپاتیفای بر چه اساس برایتان ساخته میشوند؟
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
این مورد یکی از پیشرفتهترین و موثرترینهاست. به زبان ساده در این روش به جای نگاه کردن به هر تعامل جداگانه، سعی میکنیم 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
- عملکرد بالا و کمکد
نمونه نصب و استفاده:
موارد کاربرد: میکروسرویسها، APIهای REST، پروتوتایپ سریع و بکاند سرویسهای تحت ترافیک بالا. مستندات و سورس:
Docs — GitHub
نظرتون و تجربههاتون با FastAPI رو بنویسید؛ استقبال میکنیم.
🔖 #Programming #برنامه_نویسی #python #fastapi #api #web #pydantic
👤 Developix
💎 Channel: @DevelopixChannel
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) پیکربندی کنید.
- از
نمونهٔ کوچک و عملی:
چرا مفید است و نکات عملی:
- میتوانید سطح لاگ (DEBUG/INFO/ERROR) را بدون تغییر کد تغییر دهید. ⚙️
- لاگها قابل هدایت به فایل، کنسول یا سرویسهای خارجی هستند. 📁
- در except از
- اجتناب از فراخوانی
پایانی کوتاه: این تغییر ساده کیفیت دیباگ و نگهداری کد را سریعاً بالا میبرد — چند دقیقه وقت بذارید و لاگینگ را در پروژههایتان جایگزین print کنید. 🔧
منبع معتبر: Python logging — official docs
#python #logging #دیباگ
🔖 #Programming #برنامه_نویسی #python #logging #debug #دیباگ #best_practices
👤 Developix
💎 Channel: @DevelopixChannel
توضیح کوتاه و کاربردی:
- در هر ماژول یک 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
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
❤3
Pydantic یکی از کتابخانههای جدی و پراستفاده در Python برای کار با data models و validation است؛ مخصوصاً وقتی از FastAPI، اسکریپتهای ETL یا سرویسهای داخلی استفاده میشود.
ایدهاش ساده است: بهجای if—elseهای تکراری برای چک کردن ورودیها، یک مدل تعریف میکنی و Pydantic خودش نوعها را تبدیل و داده را اعتبارسنجی میکند ✅
ویژگیهای مهم:
• تایپمحور بر اساس type hints پایتون
• تبدیل خودکار انواع (مثلاً str به int در صورت امکان)
• پیام خطای قابلخواندن برای API و لاگها
• ادغام عالی با FastAPI و ابزارهای async
نمونه استفاده ساده:
برای پروژههایی که ورودیشان از 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
ایدهاش ساده است: بهجای if—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) است:
هر ماژول، کلاس یا فانکشن باید فقط یک مسئولیت داشته باشد.
یعنی چه؟ یعنی اگر فردا قرار باشد این کلاس تغییر کند، فقط یک «دلیل منطقی» برای آن وجود داشته باشد، نه چند دلیل مختلف و نامربوط.
مثال ساده ⬇️
این کلاس ۳ مسئولیت دارد:
• منطق بیزینسی سفارش 🧠
• دسترسی به دیتابیس 💾
• ارسال ایمیل 📧
هر بار که قوانین ایمیل عوض شود، این کلاس باید عوض شود.
هر بار که ساختار دیتابیس عوض شود، باز هم همین کلاس.
این دقیقاً خلاف SRP است و در طول زمان به کد شکننده و پر باگ تبدیل میشود.
ریفکتور با SRP ✅
حالا:
• تغییر دیتابیس فقط OrderRepository را درگیر میکند.
• تغییر متن/قوانین ایمیل فقط در EmailService انجام میشود.
• خود OrderService روی منطق سفارش تمرکز میکند.
چرا این کار در عمل ارزش دارد؟
• تست کردن راحتتر میشود؛ چون میتوان
• تغییرات بیزینسی، 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
یکی از مهمترین اصول 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 در توابع استفاده شده است.
خروجی نهایی اجرای این برنامه چیست؟
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
خروجی نهایی اجرای این برنامه چیست؟
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 😵
این تابع هم ورودی را میخواند، هم پردازش میکند، هم لاگ میگیرد و هم نتیجه را ذخیره میکند:
این تابع حداقل چهار مسئولیت دارد؛ هر تغییر کوچکی (مثلاً فرمت لاگ یا ساختار دیتابیس) باعث تغییر در همین تابع میشود.
تقسیم به مسئولیتهای جدا ✂️
با SRP، مسئولیتها را جدا میکنیم:
حالا:
• منطق محاسبه قیمت جداست؛ اگر تخفیف یا Tax اضافه شود، فقط همان بخش را تغییر میدهیم.
• تغییر سیستم لاگ یا دیتابیس، منطق دامنه را دستکاری نمیکند.
• تست کردن
نکتهٔ مهم
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
یکی از مهمترین اصول 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های سبک
برای پروژههایی مثل مانیتورینگ سرویسها، نوشتن 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
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) 😅
نمونهی بد: کلاس همهکاره
اینجا
• validation ✅
• ذخیره در دیتابیس 🗄️
• ارسال ایمیل 📧
• logging 📜
تست کردنش سخت میشود، تغییر هر بخش روی بقیه اثر میگذارد، و هر تغییری ریسک Bug را بالا میبرد.
بازطراحی با SRP
حالا:
• هر کلاس یک مسئولیت واضح دارد ✔️
• تست واحد برای هر بخش سادهتر است ✔️
• تغییر ایمیل یا دیتابیس،
چند نکتهی کاربردی 🔍
• اگر در توضیح یک کلاس مجبورید از «و» زیاد استفاده کنید (این کلاس 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
«هر ماژول، کلاس یا تابع باید فقط یک دلیل برای تغییر داشته باشد.» ✅
یعنی چی؟ یعنی یک کلاس نباید هم منطق کسبوکار را انجام دهد، هم لاگ بنویسد، هم با دیتابیس صحبت کند، هم ایمیل بفرستد. این دقیقاً همان جایی است که کد شروع به بو دادن میکند (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 داریم.
اول با نصب شروع کن:
حالا یک فایل به اسم
اجرا روی لوکال:
بعد از اجرا، دو چیز خیلی کاربردی داری:
1️⃣ خود API روی:
2️⃣ داکیومنت خودکار با Swagger UI روی:
همونجا میتونی
نکتههای ریز ولی مهم:
• استفاده از
• با
• چون
این اسکلت ساده، پایه خیلی از APIهای واقعیه: فقط کافیه endpointها و مدلهات رو گسترش بدی. 👨💻👩💻
امتحانش کن، یک mini todo-service برای خودت بساز و روی پروژههای شخصی یا تمرینیات سوارش کن. اگر مفید بود برای بقیه دولوپرها هم بفرست تا از FastAPI لذت ببرن. 😄
🔖 #Programming #برنامه_نویسی #FastAPI #Python #REST_API #Backend #Web
👤 Developix
💎 Channel: @DevelopixChannel
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
خروجی اجرای کد زیر در زبان Python چیست؟
دقت کنید که یک متغیر mutable بین فراخوانیهای تابع بهاشتراک گذاشته شده و فقط برای بعضی ورودیها تغییر میکند.
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
👍1
Forwarded from ابر ویراک
ویراک کلود | تجربهی ابری بدون محدودیت ☁️🚀
🎁 ۲۰٪ شارژ هدیه روی اولین واریزی
مزیتهایی که واقعاً فرق میسازن:
⚡️ پهنای باند 980 مگ
🌐با IP مازاد
⏱️ راهاندازی فوری
💳 پرداخت ساعتی
🛡 پشتیبانی ۲۴/۷
💬 هر سوالی داشتی، تیم ما کنارتـه
✅ مناسب استارتاپها، تیمهای فنی، تا سازمانهای بزرگ
همین الان شروع کن و با حداکثر منابع، سریعتر رشد کن 👇🏻
📞 تماس سریع: 02191555530
🔗 https://virakcloud.com
🎁 ۲۰٪ شارژ هدیه روی اولین واریزی
مزیتهایی که واقعاً فرق میسازن:
⚡️ پهنای باند 980 مگ
🌐با IP مازاد
⏱️ راهاندازی فوری
💳 پرداخت ساعتی
🛡 پشتیبانی ۲۴/۷
💬 هر سوالی داشتی، تیم ما کنارتـه
✅ مناسب استارتاپها، تیمهای فنی، تا سازمانهای بزرگ
همین الان شروع کن و با حداکثر منابع، سریعتر رشد کن 👇🏻
📞 تماس سریع: 02191555530
🔗 https://virakcloud.com
📌 یک سوال برای توسعهدهندگان Python:
به خروجی این کد دقت کنید. رفتار mutable default argument در Python اینجا کمی غافلگیرکننده است.
بهنظر شما اجرای این کد چه خروجیای در کنسول چاپ میکند؟
پاسخ را بهصورت دقیق و مطابق با خروجی واقعی Python بنویسید.
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
به خروجی این کد دقت کنید. رفتار 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