LinAcademy
前往频道在 Telegram
635
订阅者
-124 小时
-27 天
+930 天
数据加载中...
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
七月 '26
七月 '26
+16
在1个频道中
六月 '26
+13
在0个频道中
Get PRO
五月 '26
+8
在0个频道中
Get PRO
四月 '26
+3
在0个频道中
Get PRO
三月 '26
+2
在1个频道中
Get PRO
二月 '26
+23
在2个频道中
Get PRO
一月 '26
+9
在0个频道中
Get PRO
十二月 '25
+9
在0个频道中
Get PRO
十一月 '25
+9
在0个频道中
Get PRO
十月 '25
+13
在0个频道中
Get PRO
九月 '25
+11
在0个频道中
Get PRO
八月 '25
+6
在1个频道中
Get PRO
七月 '25
+11
在0个频道中
Get PRO
六月 '25
+13
在0个频道中
Get PRO
五月 '25
+34
在3个频道中
Get PRO
四月 '25
+10
在1个频道中
Get PRO
三月 '25
+14
在1个频道中
Get PRO
二月 '25
+17
在2个频道中
Get PRO
一月 '25
+17
在1个频道中
Get PRO
十二月 '24
+2
在2个频道中
Get PRO
十一月 '240
在1个频道中
Get PRO
十月 '240
在1个频道中
Get PRO
九月 '24
+24
在4个频道中
Get PRO
八月 '24
+18
在0个频道中
Get PRO
七月 '24
+11
在4个频道中
Get PRO
六月 '24
+23
在4个频道中
Get PRO
五月 '24
+34
在5个频道中
Get PRO
四月 '24
+36
在5个频道中
Get PRO
三月 '24
+10
在4个频道中
Get PRO
二月 '24
+9
在4个频道中
Get PRO
一月 '24
+25
在2个频道中
Get PRO
十二月 '23
+14
在4个频道中
Get PRO
十一月 '23
+19
在3个频道中
Get PRO
十月 '23
+27
在4个频道中
Get PRO
九月 '23
+18
在0个频道中
Get PRO
八月 '23
+44
在0个频道中
Get PRO
七月 '23
+26
在0个频道中
Get PRO
六月 '23
+60
在0个频道中
Get PRO
五月 '23
+20
在0个频道中
Get PRO
四月 '23
+22
在0个频道中
Get PRO
三月 '23
+29
在0个频道中
Get PRO
二月 '23
+14
在0个频道中
Get PRO
一月 '23
+18
在0个频道中
Get PRO
十二月 '22
+19
在0个频道中
Get PRO
十一月 '22
+21
在0个频道中
Get PRO
十月 '22
+25
在0个频道中
Get PRO
九月 '22
+21
在0个频道中
Get PRO
八月 '22
+18
在0个频道中
Get PRO
七月 '22
+14
在0个频道中
Get PRO
六月 '22
+41
在0个频道中
Get PRO
五月 '22
+25
在0个频道中
Get PRO
四月 '22
+8
在0个频道中
Get PRO
三月 '220
在0个频道中
Get PRO
二月 '220
在0个频道中
Get PRO
一月 '220
在0个频道中
Get PRO
十二月 '210
在0个频道中
Get PRO
十一月 '210
在0个频道中
Get PRO
十月 '210
在0个频道中
Get PRO
九月 '210
在0个频道中
Get PRO
八月 '210
在0个频道中
Get PRO
七月 '210
在0个频道中
Get PRO
六月 '210
在0个频道中
Get PRO
五月 '210
在0个频道中
Get PRO
四月 '210
在0个频道中
Get PRO
三月 '21
+16
在0个频道中
Get PRO
二月 '21
+20
在0个频道中
Get PRO
一月 '21
+42
在0个频道中
Get PRO
十二月 '20
+389
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 30 七月 | 0 | |||
| 29 七月 | 0 | |||
| 28 七月 | +1 | |||
| 27 七月 | 0 | |||
| 26 七月 | 0 | |||
| 25 七月 | 0 | |||
| 24 七月 | +1 | |||
| 23 七月 | +1 | |||
| 22 七月 | 0 | |||
| 21 七月 | 0 | |||
| 20 七月 | +1 | |||
| 19 七月 | 0 | |||
| 18 七月 | +1 | |||
| 17 七月 | +1 | |||
| 16 七月 | +1 | |||
| 15 七月 | +2 | |||
| 14 七月 | 0 | |||
| 13 七月 | 0 | |||
| 12 七月 | +1 | |||
| 11 七月 | +2 | |||
| 10 七月 | 0 | |||
| 09 七月 | 0 | |||
| 08 七月 | 0 | |||
| 07 七月 | 0 | |||
| 06 七月 | 0 | |||
| 05 七月 | +1 | |||
| 04 七月 | +3 | |||
| 03 七月 | 0 | |||
| 02 七月 | 0 | |||
| 01 七月 | 0 |
频道帖子
لینوس توروالدز ، خالق لینوکس ، به منتقدهای استفاده از AI توی توسعهی لینوکس جواب داده که یا فورکش کنید، یا از کنارش رد بشید
این جمله وسط یه بحث طولانی توی میلینگلیست لینوکس دربارهی Sashiko اومد ، یه ابزار Ai برای بررسی خودکار پچهای کرنل که ادعا میشه حدود ۵۳ درصد باگهایی که بعدا توسعه دهنده ها پیدا میکنن رو زودتر کشف میکنه، هرچند حدود ۲۰ درصد گزارشهای اشتباه هم میده وقتی یکی به بیانیه یه Software Freedom Conservancy اشاره کرد که میگه جامعه باید از مخالفان صددرصدی AI هم حمایت کنه، لینوس گفت که کسی رو مجبور به استفاده از ابزار های LLM نمیکنم ولی به کسی که بخواد مخالفتی بکنه هیچ اهمیتی نخواهم داد منبع #LinNews@LinAcademy
| 2 | تیم راهبری GCC (مجموعه کامپایلر های گنو) یه سیاست جدید دربارهی استفاده از AI در کدنویسی تصویب کرده
اگه یه مشارکت از نظر حقوقی "مهم" (legally significant) باشه و حتی بخشی ازش از یه مدل زبانی (LLM) اومده باشه، GCC اون رو قبول نمیکنه.
منظور از legally significant چیه؟ ، طبق تعریف نگهدارنده های GCC بیشتر از ۱۵ خط کد ، جایی که کپیرایت وارد میشه
تغییرات کوچیکتر بهتنهایی حساب نمیشن، ولی اگه همون فرد چند تا تغییر کوچیک بده که رویهم بیشتر از این حد بشه، بازم مشمول قانون میشه.
مشارکتهای کوچیک Ai Generated که به این حد نرسن مشکلی ندارند، به شرطی که واضح مشخص بشن و استانداردهای پروژه رو رعایت کنند
این سیاست فقط شامل خود GCC میشه؛ کدی که از پروژههای دیگه برای وابستگی ها وارد میشه مشکلی نداره
منبع
#LinNews@LinAcademy | 68 |
| 3 | به وقت #TuxTips | اپیزود پنجم: UMU از داخل چطور کار میکنه؟ 🐧⚙️
تو اپیزود قبل گفتیم UMU چیه و نصبش کردیم. حالا بریم ببینیم واقعا پشتصحنه چیکار میکنه.
UMU در واقع یه پل بین Wine و Proton هست.
وقتی تو لانچرهایی مثل Heroic تنظیم میکنید که از UMU استفاده بشه اون لانچر پشتصحنه این دستور رو اجرا میکنه:
WINEPREFIX=~/Games/umu/game PROTONPATH=GE-Proton umu-run game.exe
یعنی خود لانچر UI قشنگی داره ولی از UMU و چندتا ابزار دیگه استفاده میکنه برای اجرای بازیها و این چیزیه که باعث میشه بازیها رو با همون پایداری Steam اجرا کنه، حتی بدون Steam.
و برای استفاده از UMU دو متغیر اصلی رو باید بشناسید:
- WINEPREFIX → مسیر پوشه اختصاصی هر بازی
- PROTONPATH → مسیر نسخه پروتون
اگه بخوای نسخه آخر GE-Proton رو داشته باشی:
PROTONPATH=GE-Proton
نکته: UMU به کمک دیتابیس کامیونیتی (protonfixes) مشکلات بازیها رو میشناسه و خودکار برطرف میکنه.
آموزش کامل دستورات و فلگهای UMU رو تو سری #FlagLab میذاریم.
سوالی بود تو گروه بپرسید 👇
@GamerTux | @GamerTuxChat
#TuxTips #LinuxGaming #SteamRuntime #UMULauncher #Proton | 44 |
| 4 | اخبار هفته 🐧 | #TuxNews
آپدیت D7VK به نسخه 2.0
بهبود عملکرد برای بازیهای قدیمی Direct3D 7 روی لینوکس.
بیشتر بدون: GamingOnLinux
انتشار DXVK 3.0.2
رفع باگهایی که رو چند بازی مدرن مثل Dying Light: The Beast و Halo مشکل داشتن.
بیشتر بدون: GamingOnLinux
شبیهساز RPCS3 به ۷۵٪ رسید.
از ۳,۵۵۹ بازی تستشده ، حالا ۷۵٪ درصدشون کاملا Playable هستن.
بازیهای بزرگی مثل The Last of Us و God of War 3 هنوز مشکل دارن.
بیشتر بدون: GamingOnLinux
نسخه جدید Faugus Launcher منتشر شد.
لانچر ساده رقیب Lutris/Heroic به GTK4 منتقل شد و SteamGridDB برای دانلود خودکار کاور بازیها اضافه شد.
بیشتر بدون: GamingOnLinux
@GamerTux | @GamerTuxChat
#TuxNews #LinuxGaming #SteamOS #DXVK #D7VK #RPCS3 | 60 |
| 5 | خیلی بچه ها کنجکاو بودن که منظورم از Evoid چیه، رفقا Evoid یه Runtime برای یه پرادایم جدید برنامه نویسی هستش ( چند پست بالاتر درمورد IOP توضیح دادم براتون )
روز های آینده بیشتر آشنا میشید باهاش ولی برای کسای که دوست دارن زودتر اسپویل بشن :
https://evolvebeyond.github.io/EVOID/docs/getting-started/iop-philosophy/
@LinAcademy | 126 |
| 6 | بچه ها من از حدود دی ماه گذشته ( شایدم یه ماه زودتر ) داشتم روی Evoid کار می کردم و بالاخره به نقطه ای رسیده ( تحقیقات و توسعه من ) که Evoid آماده انتشار عمومی هستش.
در روز های آینده پست های بیشتری درموردش براتون میزنم امیدوارم که دوست داشته باشید و استفاده کنید.
@LinAcademy | 127 |
| 7 | به وقت #TuxTips | اپیزود چهارم: نصب Steam Runtime و UMU 🐧
تو اپیزود قبل گفتیم Steam Runtime چیه، حالا بریم سراغ نصبش:
نصب خودکار (پیشفرض):
در داخل استیم معمولاً کاری لازم نیست بکنید.
استیم به صورت هوشمند نسخه مناسب
(Scout , Soldier , Sniper , Medic)
رو دانلود میکنه.
اما بازیهای خارج از Steam چی؟
لانچرهای دیگه مثل GOG اصلا Runtime ندارن چون به Steam وصل نیستن.
اینجا UMU Launcher به کمک میاد.
اصلا UMU چیه و چرا متولد شد؟
پروژهای از تیم Open‑Wine‑Components که محیط ایزوله و فیکسهای استیم رو کاملاً مستقل شبیهسازی میکنه تا لانچرهای دیگه هم بازیها رو دقیقا با همون پایداریِ استیم اجرا کنن.
حتی بدون اینکه نیاز باشه خود استیم رو سیستمتون نصب باشه.
نصبش:
کافیه پکیج umu-launcher رو از مخزن توزیعتون نصب کنید.
بعدش چیکار کنیم؟
هیچی لانچرها خودکار شناساییش میکنن.
خود UMU رانتایمهای لازم رو دانلود و تو مسیر
$HOME/.local/share/umu
ذخیره میکنه.
برای بازیهای خارج از استیم از چه لانچری استفاده میکنید؟ تو گروه بگید 👇
@GamerTux | @GamerTuxChat
#TuxTips #LinuxGaming #SteamRuntime #UMULauncher #Proton | 96 |
| 8 | معرفی ابزار این هفته با تاخیر : GameHub 🐧🎮
با ابزار جدید Parch Linux کلنجار رفتم یه مشکلی دیدم.
حالا GameHub چی هست؟
یه هاب مرکزی برای گیمینگه که لانچرهای دیگه مثل
Lutris ، Bottles ، Steam
رو یکجا نصب و مدیریت میکنه.
یه بخش هم برای فعال کردن Chaotic AUR داره.
مشکل چی بود؟
لانچرهای که با کمک GameHub باز میشد
زبانشون یهو میرفت رو فارسی.
مشکل از LANGUAGE=en_US:fa بود و gettext چون فایل ترجمه انگلیسی نداره میره سراغ فارسی.
اگه رو Parch یا Arch-based هستید یه نگاه بهش بندازید.
مشکل رو پیدا کردم ، با کمک هوش مصنوعی دیباگ کردم و issues ثبت کردم خوبی اوپنسورس همینه یه باگ دیدی؟
خودت گزارش میدی یا حل میکنی.
بیشتر بدون: GameHub
سوالی بود تو گروه بپرسید 👇
@GamerTux | @GamerTuxChat
#TuxTools #LinuxGaming #GameHub #OpenSource #ParchLinux #Rust | 106 |
| 9 | شاید نت رو از دست دادیم
کار از محکم کاری عیب نمی کنه
#LinChatBridge:pnyx.ir
گپ لین چت در ماتریکس
@LinAcademy | 173 |
| 10 | به وقت #FlagLab 🔬 | اپیزود سوم: فلگهای عیبیابی 🐧
بازی کرش میکنه؟ فریز میشه؟ اصلاً بالا نمیاد؟
قبل از اینکه تو گروه بپرسید، این فلگها رو یکییکی امتحان کنید:
بازی بیدلیل بسته میشه یا فریز میکنه:
PROTON_NO_ESYNC=1 PROTON_NO_FSYNC=1 %command%
سیستم سرعتبخش رو خاموش میکنه که بعضی بازیهای قدیمی باهاش مشکل دارن.
میخوای HDR رو تست کنی:
PROTON_ENABLE_WAYLAND=1 PROTON_ENABLE_HDR=1 %command%
اگه مانیتور HDR دارید و روی Wayland هستید ، این فلگها اجرای Wayland و HDR را در Proton فعال میکنند.
سوالی بود تو کامنتها یا گروه بپرسید 👇
@GamerTux | @GamerTuxChat
#FlagLab #TuxTips #LinuxGaming #Steam #Proton #Troubleshooting | 134 |
| 11 | #روزی_یک_نکته با پاکروح
#آموزشی #کاربردی #لینوکس #گیمینگ #بلوتوث
خب قطعا می دونید که من عاشق بازی کردنم، اما چند وقتی بود که یه چیزی داشت اذیتم می کرد، یه دسته tsco داشتم که روی اندروید درست بود ولی از یه زمانی به بعد دیگه بصورت بلوتوثی به لینوکس وصل نمیشد، یکم تحقیق کردم و فهمیدم این فقط مشکل من نیست، خیلی از دسته های چینی این مشکل رو دارن، ولی خب قیمت خوب و مشخصات عالی دارن چه حیف که نمیشه به لینوکس وصلشون کرد نه ؟
#ماجرا_چیه :
اول فکر می کردم ماجرا به کرنل بر می گرده و چون این دسته ها فیکن درایور سونی باهاشون مشکل داره ( شایدم xbox ) ولی نه ماجرا اون نبود، مشکل bluez بود اون بشدت حساس به پروفایل hid هستش و حتی اگه یک بخشش کامل نباشه دیوایس رو بلاک می کنه، چه برسه این دسته ها که حتی خانواده و id معرف کلیدشون رو هم درست تعریف نمی کنن پس راه حل چی بود ؟
#راهـحل :
سادست ما فقط باید یه پچ برای bluez می نوشتیم،
اگه یه فایل کوچیک به اسم quirks به Bluez اضافه می کردیم که بهش بگه «فلان دستگاه رو ول کن بابا، بیا اینطوی شناساییش کن»، کل قضیه حل میشد.
دقیقاً مثل داستان چند وقت پیش که Adobe Connect رو با یه ترفند مجبور کردیم بره سمت HTML5، اینجا هم قراره Bluez رو گول بزنیم!
امروز یاد میگیریم چطور با نصب یه بستهی ساده، این مشکل رو یکبار برای همیشه حل کنیم. ( البته درخواست مرج رو به تیم bluez دادم نمی دونم کی اضافه میشه فعلا دستی پیش میریم )
#نصب ( فعلا فقط برای آرچ )
اگه از آرچلینوکس یا مشتقاتش مثل مانجارو استفاده میکنید، کافیه توی ترمینال این دستور رو بزنید (با توجه به AUR Helper خودتون):
paru -S bluez-gamepad-quirks
یا اگر yay دارید:
yay -S bluez-gamepad-quirks
بعد از نصب، فقط سرویس بلوتوث رو ریبوت کنید:
systemctl restart bluetooth
حالا فقط توی تنظیمات سیستم دسته رو pair کنید و تمام ( اگه نشد بعد از تلاش برای اتصال یک بار دسته رو خاموش کنید و دکمه home رو بزنید )
همین!
این بسته دقیقاً چیکار میکنه؟
یه فایل fallback به مسیر /usr/lib/udev/rules.d/ و یه سری Quirks به Bluez اضافه میکنه که بهش میگه اگه دستگاه استاندارد نبود، بیخیال SDP نشه و از روش جایگزین استفاده کنه. خلاصه اینکه دیگه لازم نیست برای هر دسته، برید توی دیتاشیتها دنبال Vendor ID بگردید!
و تمام!
بدون دستکاری دستی در فایلهای سیستمی، بدون کامپایل دستی Bluez، فقط با یه نصب ساده و یه ریاستارت کوچیک ✨
#LinFAQ@LinAcademy | 197 |
| 12 | درود رفقا، من به تازگی بسته
https://github.com/Pakrohk/linux-hifi-suite
رو توسعه دادم که برای مدیریت صدا و امکانات هدفون ها توی لینوکس می توندی ازش استفاده کنید، اگه مشتاق بودین بسته رو برای توزیع خودتون پکیج کنید و من هم منتشر می کنمش.
@LinAcademy | 544 |
| 13 | استفادهی نهایی (سمت کاربر):
خب این جا توضیحات رو میزاریم بعد از کد :
#برنامه_نویسی #معماری_نرم_افزار #ارکستراتور
#CleanCode #OOP #IOP
# مقداردهی اولیه وابستگیها
deps = {
"hasher": MyHasher(),
"db": MyDB(),
"mailer": MyMailer(),
"cipher": MyCipher() # برای رمزنگاری
}
# ساخت ارکستراتور
orch = Orchestrator(deps)
# ساخت اینتنت با قابلیتهای خاص
intent = Intent(
data={"email": "a@b.com", "password": "123"},
purpose="REGISTER",
capabilities=["ENCRYPT"] # این باعث میشه مسیر تغییر کنه
)
# پردازش
result = orch.process(intent)
print(result) # {"id": 1, "email": "a@b.com"} | 383 |
| 14 | گام دوم: توابع پردازشی (قطعات لگو)
#برنامه_نویسی #معماری_نرم_افزار #ارکستراتور
#CleanCode #OOP #IOP
اما خب قبل از این که کل رفتار پروژه ما به شکل بالا باشه، باید پیشزمینهی اون رو تأمین کنیم (مگر این که از فریمورکی استفاده کنیم که خودش پیشزمینه رو برامون تأمین کرده باشه).
دوستانی که با برنامهنویسی فانکشنال آشنایی دارن، قطعاً با این تفکر که هر فانکشن فقط باید یک کار رو انجام بده، آشنایی دارن. این بخش از برنامهنویسی مقصدگرا هم دقیقاً با همین تفکر پیش میره. هر تابع فقط یک کار رو انجام میده، ورودی میگیره و خروجی میده. خروجی هر تابع، ورودی تابع بعدیه.
def validate(intent):
if "@" not in intent.data["email"]:
raise ValueError("Invalid email")
return intent
def hash_password(intent, hasher):
intent.data["password_hash"] = hasher.hash(intent.data["password"])
del intent.data["password"]
return intent
def store(intent, db):
# دیگه نمیگیم توی کدوم جدول ذخیره کن
# فقط بر اساس purpose تصمیم میگیره
if intent.purpose == "REGISTER":
saved = db.save(intent.data) # هرجایی که خودش میدونه
elif intent.purpose == "TEMP":
saved = db.save_temp(intent.data)
return {"id": saved.id, "email": saved.email}
def notify(result, mailer):
mailer.send_welcome(result["email"])
return result
گام سوم: Orchestrator و مفسر مسیر (Route Interpreter)
یک کلاس کوچک به نام Orchestrator که کارش فقط اینه: حلقه بزنه و توابع رو به ترتیب صدا بزنه. اما قبلش، نیاز به یه مفسر (Interpreter) داریم که مشخص کنه هر purpose قراره از چه زنجیرهای از توابع عبور کنه.
مفسر مسیر چطور کار میکنه؟
مفسر، یک دیکشنری یا فایل کانفیگ رو میخونه که در اون مشخص شده:
هر purpose به چه ترتیبی از توابع باید پردازش بشه.
هر تابع به چه وابستگیهایی (dependencies) نیاز داره.
در صورت وجود capabilities خاص، چطور مسیر تغییر کنه.
class Orchestrator:
def __init__(self, deps):
self.deps = deps
# نقشهی مسیرها (میتونه از فایل کانفیگ یا دیتابیس هم بیاد)
self.route_map = {
"REGISTER": {
"steps": [
{"func": validate, "deps": []},
{"func": hash_password, "deps": ["hasher"]},
{"func": store, "deps": ["db"]},
{"func": notify, "deps": ["mailer"]}
],
"fallback": None # مسیر جایگزین در صورت خطا
},
"TEMP": {
"steps": [
{"func": validate, "deps": []},
{"func": store, "deps": ["db"]}
],
"fallback": None
}
}
def _interpret_route(self, intent: Intent):
"""تفسیر مسیر بر اساس purpose و capabilities"""
purpose = intent.purpose
if purpose not in self.route_map:
raise ValueError(f"Unknown purpose: {purpose}")
route = self.route_map[purpose]
steps = route["steps"]
# اگر capabilities خاصی وجود داره، میتونیم مسیر رو تغییر بدیم
if "ENCRYPT" in intent.capabilities:
# اضافه کردن تابع رمزنگاری قبل از ذخیرهسازی
steps.insert(2, {"func": encrypt_data, "deps": ["cipher"]})
return steps
def process(self, intent: Intent):
# ۱. تفسیر مسیر
steps = self._interpret_route(intent)
# ۲. اجرای زنجیرهای
result = intent
for step in steps:
func = step["func"]
# وابستگیهای مورد نیاز رو از deps میگیریم
args = [self.deps[dep] for dep in step["deps"]]
result = func(result, *args)
return result
#Edu@LinAcademy | 297 |
| 15 | نگاه دوم: ثبتنام به سبک «رهبر ارکسترا» (Intent-Aware) 🎼
توی دو پست قبلی دیدیم که OOP برای نظم دادن به کد عالیه، اما وقتی تغییرات زیاد بشه، کلاسها به تودههای بادکنکی تبدیل میشن که نگهداریشون سخت میشه. حالا بیایید دقیقاً همین کار رو با رویکرد Intent-Aware بکنیم ببنیدم مسییر اینجا چطوریه.
#برنامه_نویسی #معماری_نرم_افزار #ارکستراتور
#CleanCode #OOP #IOP
اینجا دیگه خبری از کلاسها و سرویس بزرگ و غول آسا نیست. فقط سه عنصر ساده داریم:
گام اول : تعریف Intent (همینجا همهچیز تعریف میشه)
یک کلاس Pydantic که همهچیز رو توی خودش جا داده: خود داده، هدف، اولویت، و لیست کارهایی که باید روش انجام بشه.( دقت کنید Pydantic اینجا فقط یه کمک کنندست ما می تونیم از dataclass یا tag گذاری در لیست هم استفاده کنیم )
from pydantic import BaseModel
from enum import Enum
class Priority(str, Enum):
HIGH = "high"
LOW = "low"
class Intent(BaseModel):
data: dict # هر دادهای که وارد میشه
purpose: str # هدف نهایی (مثلاً "REGISTER")
capabilities: list[str] = [] # کارهایی که باید انجام بشن
priority: Priority = Priority.LOW
حالا برای ثبت نام فقط کافیه این ها رو بسازیم :
intent = Intent(
data={"email": "ali@mail.com", "password": "1234"},
purpose="REGISTER",
capabilities=["VALIDATE", "HASH", "STORE", "NOTIFY"],
priority="HIGH"
)
به همین سادگی دیگه نیازی به تعریف کلاس جدا برای هر نوع داده ای نیست.
ولی نیاز داریم زیر ساخت رو داشته باشیم ( پست بعدی )!
#Edu@LinAcademy | 220 |
| 16 | گام دوم: کلاس سرویس (Service)
حالا کل منطق ثبتنام توی یک کلاس جمع میشه. هر وابستگی (دیتابیس، ایمیلفرست، هشکننده) از طریق constructor تزریق میشه.
#برنامه_نویسی #معماری_نرم_افزار #ارکستراتور
#CleanCode #OOP #IOP
class UserService:
def init(self, db, mailer, hasher):
self.db = db
self.mailer = mailer
self.hasher = hasher
# متد داخلی برای ارسال ایمیل (جداسازی مسئولیت)
def _send_welcome(self, email: str):
self.mailer.send_welcome(email)
# متد اصلی ثبتنام
def register(self, email: str, password: str) -> User:
# ۱. چک کردن تکراری نبودن
if self.db.find_by_email(email):
raise Exception("User already exists!")
# ۲. هش کردن پسورد
hashed = self.hasher.hash(password)
# ۳. ساخت مدل و ذخیره در دیتابیس
new_user = User(email=email, password_hash=hashed)
saved_user = self.db.save(new_user)
# ۴. ارسال ایمیل خوشآمدگویی
self._send_welcome(email)
return saved_user
گام سوم: استفاده (سمت کاربر)
# مقداردهی اولیه وابستگیها
db = SQLiteDB()
mailer = EmailService()
hasher = BcryptHasher()
# ساخت سرویس
service = UserService(db, mailer, hasher)
# ثبتنام کاربر
user = service.register("ali@mail.com", "123456")
print(user.id) # ۱
#چراـعالیه :
نظم ساختاری: مدل، سرویس، و وابستگیها همه چیز سرجای خودشه.
تستپذیری بالا: خیلی راحت میتونیم db, mailer, hasher رو با نمونههای (Mock) جایگزین کنیم.
متدهای داخلی: میشه راحت کارهای فرعی مثل ارسال ایمیل توی رو برد جداگانه متود کرد که کد اصلی رو شلوغ نکنه.
مناسب برای پروژههای کوچیک و ایستا: وقتی قوانین ثبتنام قرار نیست هر هفته عوض بشه، این روش بهترین انتخابه.
#چراـعالیـنیست :
چی میشه اگه فردا بگیم ؟
اگه کاربر از ایران بود، براش پیامک بفرست، نه ایمیل.
اگه پسورد ضعیف بود، قبل از ذخیره اعتبارسنجی بیشتری روش انجام بده.
اگه ادمین ثبتنام کرد، براش جدول جداگانهای توی دیتابیس در نظر بگیر.
برای هر کدوم از اینا، باید بریم توی کلاس UserService و شرط (if/else) جدید اضافه کنیم. کلاس روزبهروز بزرگتر میشه، تستهاش پیچیدهتر، و هر بار که یه قانون جدید میاد، کل تیم تر از ماکریشن جدید و ترسس هایی مثل این که مبادا کد قبلی رو خراب کنیم خواهند داشت.
#Edu@LinAcademy | 197 |
| 17 | برنامهنویسی مثل یک رهبر ارکسترا 🎼 (قسمت دوم: عملگرایی در برابر نظم )
#برنامه_نویسی #معماری_نرم_افزار #ارکستراتور
#CleanCode #OOP #IOP
توی پست قبلی ما با قصد در داده ها آشنا شدیم، حالا وقتشه ببینیم در عمل چطوری می تونه باشه ؟
نگاه اول : ثبتنام به سبک شیگرایی (OOP)
در واقعگرا ترین شکل oop بهترین ابزار برای نظم دادن به کد بحساب میاد ؛ برای نمونه در مثال زیر ما یک سیستم ثبت نام ساده رو با oop می نویسیم:
گام اول : تعریف اتصال ( db model )
باید ساختار دادهمون رو که قراره توی SQLite ذخیره بشه، به شکل یک مدل (Model) تعریف کنیم:
from dataclasses import dataclass
from typing import Optional
# معادل همون رکوردی که توی جدول users توی SQLite داریم
@dataclass
class User:
id: Optional[int] = None
email: str = ""
password_hash: str = ""
بخاطر طولانی بودن پست ها هر گام رو بصورت یک پست میفرستم بخونید.
#Edu@LinAcademy | 240 |
| 18 | برنامهنویسی مثل یک رهبر ارکسترا 🎼 (قسمت دوم: عملگرایی در برابر نظم )
#برنامه_نویسی #معماری_نرم_افزار #ارکستراتور
#CleanCode #OOP #IOP
توی پست قبلی ما با قصد در داده ها آشنا شدیم، حالا وقتشه ببینیم در عمل چطوری می تونه باشه ؟
نگاه اول : ثبتنام به سبک شیگرایی (OOP)
در واقعگرا ترین شکل oop بهترین ابزار برای نظم دادن به کد بحساب میاد ؛ برای نمونه در مثال زیر ما یک سیستم ثبت نام ساده رو با oop می نویسیم:
گام اول : تعریف اتصال ( db model )
باید ساختار دادهمون رو که قراره توی SQLite ذخیره بشه، به شکل یک مدل (Model) تعریف کنیم:
from dataclasses import dataclass
from typing import Optional
# معادل همون رکوردی که توی جدول users توی SQLite داریم
@dataclass
class User:
id: Optional[int] = None
email: str = ""
password_hash: str = ""
بخاطر طولانی بودن پست ها هر گام رو بصورت یک پست میفرستم بخونید.
#Edu@LinAcademy | 1 |
| 19 | به وقت #FlagLab 🔬 | اپیزود دوم: فلگهایی که باید بلد باشی 🐧
پرفورمنس بهتر با یه خط:
gamemoderun %command%
موقع بازی سیستم رو میبره رو حالت حداکثر عملکرد
نیاز به نصب پکیج gamemode داره.
ببین چقدر FPS داری:
mangohud %command%
دما و مصرف CPU/GPU رو گوشه صفحه نشون میده.
نیاز به نصب پکیج mangohud داره.
بازی فکر میکنه Steam Deck هستی
SteamDeck=1 %command%
خیلی از بازیها با دیدن این فلگ تنظیمات بهینهشده رو فعال میکنن.
اجرا تو محیط ایزوله با Gamescope:
gamescope -w 1920 -h 1080 -f -- %command%
بازی رو تو یه پنجره مجازی با رزولوشن دلخواه اجرا میکنه.
برای بازیهای قدیمی که رزولوشن رو به هم میریزن مفیده.
نیاز به نصب پکیج gamescope داره.
فلگ محبوب شما چیه؟ تو کامنتها یا گروه بگید 👇
@GamerTux | @GamerTuxChat
#FlagLab #TuxTips #LinuxGaming #Steam #GameMode #GameScope #Troubleshooting | 137 |
| 20 | کدنویسی مثل یک ارکستر! 🎼 (چرا باید «قصد» دادهها رو جدی بگیریم؟)
قسمت اول
#Tutorial #Architecture #CleanCode #IntentAware
#اصلا_شیگرایی (OOP) چی_بود؟
تا حالا فکر کردی چرا توی کدهامون مدام درگیر شرطهای تکراری (If/Else) هستیم؟
مثلاً «اگر این داده حساسه این کارو کن... اگه سنگینه اون کارو...».
ما عادت کردیم همهچیز رو بر اساس «قالب» ببینیم. شیگرایی (OOP) مثل یه قالب شیرینیپزی بود که بهمون نظم داد، اما توی پروژههای بزرگ، ما رو غرق کرد توی جزئیاتِ دستوپایگیر.
ما همیشه به سیستم میگفتیم «این متغیر یه رشتهست یا یه عدد»، ولی هیچوقت نمیگفتیم «ماهیت و قصدش چیه».
#برنامهنویسی_مبتنی_بر_قصد (Intent-Aware) یعنی چی؟
اینجا همونجاییه که باید مسیرمون رو عوض کنیم.
توی روش Intent-Aware، دادهها منفعل نیستند؛ اونا «هویت» و «قصد» خودشون رو با خودشون حمل می کنن.
دیگه لازم نیست ما به سیستم بگیم «این کارو بکن»؛ ما فقط برچسب میزنیم و سیستم خودش میفهمه با هر ورودی چطور برخورد کنه.
#مدل_نوار_نقاله_هوشمند!
این سیستم دقیقاً مثل بخش بار فرودگاه کار میکنه:
برچسبگذاری (Intent): دادهها در لحظه اولیه ورود برچسب میخورن (مثلاً: حساس، حجیم، عمومی).
موتور روتر (Router): یک بخش مرکزی وجود داره که بر اساس برچسب، مسیر رو مشخص میکنه.
لگوهای پردازشی (Functions): مجموعهای از توابع مستقل داریم که مثل قطعات لگو، فقط وظیفه انجام یک کار مشخص (مثل رمزنگاری، ذخیرهسازی، کش کردن) رو دارن.
#چرا_این_روش_انقلابیه؟
خداحافظی با کدهای تکراری: نیازی نیست برای هر سناریو مسیر جدید بچینید. فقط قطعات لگو رو به هم وصل میکنید.
مقیاسپذیری بینظیر: اگه فردا بخواید یک پردازش جدید (مثلاً لاگ کردن دادهها) اضافه کنید، فقط کافیه اون «قطعه لگو» رو به مسیرهای مورد نظر اضافه کنید.
کد تمیز (Clean Code): منطقِ «چه کاری باید انجام بشه» از «چطور انجام بشه» کاملاً جدا میشه.
خلاصه کلام: 💡
برنامهنویسی مبتنی بر قصد یعنی ساختن سیستمهایی که هوشمندتر از کدهای ما هستن.
سیستمهای Intent-Aware خودشون میفهمن با هر ورودی چطور برخورد کنن، چون هدفِ داده، مشخص می کنه رفتارِ نهایی اون چی باشه.
قسمت بعدی به این می پردازیم که توی حالت های مختلف و زبان های مختلف Intent-Aware چطوری استفاده میشه و اصلا چه زمانی باید جایگزینش بکنیم با سیستم های قدیمی که داشتیم.
#LinEdu@LinAcademy | 631 |
