Panic Dev – Telegram
Panic Dev
1.11K subscribers
123 photos
29 videos
2 files
132 links
Panic Dev; your Panic's solution 🔥

🍿 Telegram
🔰 t.me/PanicDev

🍿 Laravel Community
🔰 t.me/LaravelGroups

😇 Contact Me
🔰 t.me/MentionHex

Thanks for sharing us 💛
Download Telegram
نمیدونم راهتون به API چت بات ها خورده یا نه
ولی یه مشکلی که شاید داشته باشید این هست که
وقتی میخواید سوال کاربر و OpenAi بدید تا جواب بهتون بده .
تو حالت عادی که rest api کال میکنید . به این صورت


$client = OpenAI::client(config('services.openai.key'));

$response = $client->chat()->create([
'model' => 'gpt-4o',
'messages' => $messages,
]);

return response()->json([
'message' => $response
->choices[0]
->message,
], 200);


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

البته از نظر فرانتی امده بودن بهش انیمیشن داده بودن ،‌
وقتی جواب از API میرسید همه رو یه جا چاپ نمیکرد
مثل همون چت بات ها با انیمیشن چاپ میکرد

ولی این باعث نمیشد جواب زودتر جنریت بشه و باز اون انتظار زیاد بود


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


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

پلتفرم هایی مثل openAi این قابلیت و دارن که درخواست بدی به صورت استریم بهت جواب بدن .

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

برای این کار شما یه endpoint میخواید که به صورت SSE به فرانت شما وصل بشه .

بعد شما درخواستش رو به openAi میدید و میگید به صورت استریم بهم جواب بده .

وقتی جواب و میگیرید پارس میکنید و با همون SSE به فرانت خودتون بر میگردونید .

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

در تصاویر هم میتونید نمونه کد سمپل رو ببنید .

شاید در آینده به دردتون خورد 😊


@panicdev
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥6🕊1
چرا لاراول sail استفاده نکنیم ...

اگر شما هم با تعداد متعددی پروژه همزمان کار میکنید یا بین پروژه های لاراولی زیاد سوئیچ میشید .

اجرا همزمان پروژه ها با sail منابع زیادی میطلبه یا باید یکی رو down کنید بعد یکی رو up یا کانفیگ و پورت متفاوت برای هرکدوم روی env ست کنید .


ولی از همه مهم تر که من دیروز باهاش برخورد کردم

اشغال فضای زیادی دیسک هست .
برای هر پروژه لاراولی که بخواید با sail اون رو راه اندازی کنید
از اول یه image براش بیلد میشه و دوباره تمام کانتیر های mysql , redis و ... براش از اول ساخته میشه .

مسئله اول ،‌اون سردرد موقع هر بار بیلد و pull که به جای خودش

ولی در این بین کلی image دارید هر بار به اضافه کلی volume

من وقتی دیروز فضای دیکسم به شدت پر شده بود امدم تمیز کاری کنم
وقتی یه docker prune زدم ۴۵ گیگ فضا ازاد شد!

اینجا بود که فهمیدم برای دولوپری که تو تمام پروژه ها تمام enviroment اش تقریبا یکی هست

خیلی زیاد داره فضا و اینترنت مصرف میشه .


خوب به این فک کردم بریم سراغ جایگزین .
همونطور که میدونید هستن ابزار هایی مثل herd , longhorn , valet که یا برای ویندوز یا قشر پولدار خانواده اپل

و چیز به درد بخوری پیدا نکردم که یکبار اجرا بشه و تمام پروژه ها رو ساپورت کنه . و همش در حال سوئیچ نباشم .


در اخر به این نتیجه رسیدم باید برگردم به خودم یه چیزی بزنم .

که تهش شد این ریپازیتوری ساده .


‍‍https://github.com/mohaphez/larasaur


شما با استفاده از این یه پوشه دارید به اسم projects مثلا

بعد داخلش یه فولدر میسازید dev-env و فایل های این ریپازیتوری میره داخلش

بعد یه

bash install-dev-shortcuts.sh


این تمام کامند هایی که نیاز دارید بهتون میده

حالا پروژه هاتون میره داخل پوشه projects

مثلا با این ساختار

~/projects/
├── dev-env/
├── x/
│ ├── a-laravel/
│ └── b-laravel/
├── y/
│ ├── c-laravel/
│ └── v-laravel/
└── z/
├── h-old-laravel/
└── b-new-laravel/


همه چی امادست

اول یه دستور up میزنید

up


که بیلد اولیه گرفته بشه و سرویس ها بیاد بالا

بعد داخل هر پروژه که دارید یا جدید میسازید داخل خود مسیرش مثلا

cd  ~/projects/a-laravel 


یه دستور

addsite 


میزنید این براتون یه کانفیگ nginx میسازه میندازه برای داکر و یه دامین با پسوند .local میسازه
مثلا این میشه

a-laravel.local


و تمام

کلا بعد از این دیگه هر چی پروژه میسازید یه addsite میزنید و یه دستور restart

بعد همه چی امادست .


هم روی محیط ایزولست هم در مصرف اینترنت و وقت صرفه جویی شده هم فضای کمتری میگیره

هم روی سیستمتون نیاز به نصب دپندسی های زیادی ندارید برای راه اندازی lamp


گذاشتم شاید به درد شما هم خورد .

الان فقط زمانی سراغ sail میرم که پروژه واقعا محیط متفاوت خاصی بخواد مثل php 7.4

@panicdev
🔥13👍3❤‍🔥1
🐛
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7
🎯 وقتی شرطی نوشتن قشنگ‌تر می‌شه!

🤔 میدونی Conditionable چیه؟

یه Trait جدیده که به کلاس Fluent اضافه شده و بهت اجازه می‌ده توی زنجیره‌ی متدها (method chaining) شرط بذاری، بدون اینکه if/else وسط کدت بیاد و ظاهرشو به هم بزنه.

🔁 قبل از Conditionable:

$data = Fluent::make([
'name' => 'Michael Nabil',
'developer' => true,
'posts' => 25,
]);

if (auth()->isAdmin()) {
$data = $data->set('role', 'admin');
} else {
$data = $data->forget('posts');
}


بعد از Conditionable:

$data = Fluent::make([...])
->when(auth()->isAdmin(), fn ($d) => $d->set('role', 'admin'))
->unless(auth()->isAdmin(), fn ($d) => $d->forget('posts'));


زیبا نیست؟ 😍

📦 مثال واقعی توی API Resource:


return Fluent::make([
'id' => $user->id,
'name' => $user->name,
])
->when($request->user()->can('view-statistics'), fn ($d) =>
$d->set('post_count', $user->posts()->count())
->set('comment_count', $user->comments()->count()))
->when($user->isVerified(), fn ($d) =>
$d->set('verified', true)
->set('verification_date', $user->verified_at->toDateString()))
->unless($request->includesPersonalData(), fn ($d) =>
$d->forget('email'))
->toArray();


همه چیز شرطیه، ولی هنوز قشنگ و قابل‌خونده! 🔥


🧠 نتیجه‌گیری:
با when() و unless()، می‌تونی شرط‌ها رو تو دل همون زنجیره بنویسی و خوندن کدت رو فوق‌العاده راحت کنی.
لاراول بازم یه قدم دیگه برای تجربه بهتر توسعه‌دهنده برداشته. 👨‍💻💚



منبع : مقاله

@panicdev
👍22👎3👌2🔥1
بله دوستان 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
اگه دوس دارید با مفهوم اسکوپ و کوئری رجیستری توی لاراول عمیقا آشنا بشید و بتونید مثل یه Pro Player ازشون استفاده کنید این مقاله زیبا و کامل رو از دست 👀

https://laravel-news.com/query-scopes
🔥9
🚀 متد Dispatch در Laravel یعنی چی؟ پشت صحنه‌اش چیه؟

وقتی توی لاراول می‌نویسی:

MyJob::dispatch($data);


داری یه job رو می‌فرستی به صف (queue)، ولی پشت پرده کلی داستان اتفاق می‌افته که فهمیدنش می‌تونه کمکت کنه حرفه‌ای‌تر کار کنی 👇

🔹 اولین مرحله:
لاراول با dispatch()، Bus::dispatch() یا helper با نام dispatch() شروع می‌کنه. این‌ها همه از کامپوننت Bus استفاده می‌کنن تا job رو آماده‌ی ارسال کنن.

🔹 چطوری آماده می‌کنه؟

بسته به نوع job، یکی از این ۳ شیء ساخته می‌شه:

متد PendingDispatch —> برای job معمولی

متد PendingChain —> برای job‌های زنجیره‌ای

متد PendingBatch —> برای batch‌ها

🔐 جاب یکتا (Unique):
اگه job از ShouldBeUnique استفاده کنه، لاراول بررسی می‌کنه که توی صف، همین job با همون شناسه (ID) وجود داره یا نه.
اگه باشه و هنوز پردازش نشده، job جدید ارسال نمی‌شه.

فقط برای job معمولی فعاله، نه chain یا batch.

🔄 وقتی از chain یا batch استفاده می‌کنی:

Bus::chain([...]);
Bus::batch([...]);


توی chain همه jobها به اولین job چسبید‌ان.
توی batch اطلاعاتشون توی دیتابیس ذخیره می‌شه.

💾 بعد از این آماده‌سازی‌ها، اگه dispatch بعد از commit تنظیم شده باشه:
لاراول صبر می‌کنه تا همه تراکنش‌های دیتابیس تموم شن (موفقیت‌آمیز).
اگه rollback شه، job هم اصلاً فرستاده نمی‌شه.

🧬 تبدیل job به payload:

لاراول باید یه payload بسازه که شامل اینا می‌شه:

تنظیمات مثل maxTries, timeout, retryUntil

سریالایز کردن job با serialize() (و تبدیل مدل‌ها با trait مخصوص)

رمزنگاری job اگه از ShouldBeEncrypted استفاده کرده باشه

اجرای hook‌ها مثل Queue::createPayloadUsing()

در نهایت تبدیل به JSON و ارسال به صف (database, Redis, SQS و...)

📬 برای event listener، mail, notification و broadcastها:
اگه ShouldQueue رو پیاده‌سازی کرده باشن، مستقیم میان توی queue (و نه Bus).
یعنی قابلیت‌هایی مثل unique، chain یا batch اینجا اعمال نمی‌شن.

🧠 و اما closure؟
اگه بخوای یه closure رو بفرستی به صف، Laravel با SerializableClosure سریالایزش می‌کنه، رمزنگاری‌ش می‌کنه و با job مخصوصش (CallQueuedClosure) می‌فرسته صف.

🎯 جمع‌بندی:
دستور Job dispatch فقط یه خط نیست! یه مکانیزم کامل پشتشه که با قدرت و امنیت بالا job رو آماده می‌کنه، serialize و encrypt می‌کنه، و با دقت می‌فرسته صف. یاد گرفتنش کمک می‌کنه کدت تمیزتر و قابل کنترل‌تر باشه 💪


🔗 منبع : مقاله

@panicdev
👌13👍1
تجربه کسی که راه زیادی رو رفته تا گلوگاه های یک زیرساخت و شناسایی کنه برای اینکه بتونه پاسخگوئه یک میلیون یوزر باشه .


https://medium.com/@kanishks772/scaling-to-1-million-users-the-architecture-i-wish-i-knew-sooner-39c688ded2f1
14👍2🔥1
اگه شما هم براتون سواله که مدل های Max توی Cursor چقدر هزینه برمیدارن دعوتتون میکنم به دیدن این اسکرین شات :))


من از Claude 4 Opus Thinking Max استفاده کردم و خروجی این شده!

یک prompt = مصرف ۱۰۳.۶ تا فست ریکوئست و ۵ دلار هزینه مازاد 👀
🤣6😢2👍1
دوتا پکیج زیبا ببینیم ، هم کاراییشون زیباست هم سورس کدشون

https://prismphp.com

https://laragent.ai

خودم به شخصه prism پسندیدم ، ولی خوب laragent هم تحت توسعست ، احتمالا به زودی چیزای بهتری و بیشتری ساپورت کنه .

@panicdev
👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 حافظه رم Redis پر شد؟ باید چه کار کنیم؟

همون طور که میدونید Redis یه پایگاه داده‌ سریع و درون‌حافظه‌ایه که خیلی وقتا به‌عنوان کش (Cache) استفاده می‌شه.

اما سؤال مهم: وقتی حافظه Redis پر شد، چه اتفاقی می‌افته؟ 🤔

📦 ردیس چندین پالسی حذف داده (Eviction Policy) داره که می‌تونی با maxmemory-policy تنظیمشون کنی.
بیا با هم این سیاست‌ها رو مرور کنیم:

🔒 1. پالسی noeviction (بدون حذف):

هیچ داده‌ای حذف نمی‌شه.

اگه حافظه پر باشه، خطا می‌ده و کلید جدیدی نمی‌ذاره.

📌 مناسب برای مواقعی که حذف داده اصلاً مجاز نیست.

🧠 2. پالسی volatile-lru:

فقط کلیدهایی که expire دارن و کمتر استفاده شدن حذف می‌شن.

📌 خوب برای داده‌های موقتی و نه چندان مهم.

📊 3. پالسی allkeys-lru:

کلیدهایی که کمتر استفاده شدن حذف می‌شن، فرقی نداره expire دارن یا نه.

📌 ایده‌آل برای کش‌هایی که دسترسی بهشون الگوی مشخصی نداره.

🎲 4. پالسی volatile-random:

یه کلید رندوم که expire داره حذف می‌شه.

📌 ساده، ولی شاید کلید مهمی رو حذف کنه.

🎲 5. پالسی allkeys-random:

هر کلیدی ممکنه رندوم حذف شه، چه expire داشته باشه چه نه.

📌 برای سیستم‌های خیلی حساس توصیه نمی‌شه.

6.پالسی volatile-ttl:

کلیدی که زودتر expire می‌شه اول حذف می‌شه.

📌 منطقی برای داده‌هایی که زمان مصرفشون مهمه.

📉 7. پالسی volatile-lfu:

کلیدهایی با expire که کم استفاده شدن حذف می‌شن.

📌 خوب برای حفظ داده‌های پرکاربرد و حذف داده‌های کم‌مصرف.

📉 8. پالسی allkeys-lfu:

هر کلیدی (با یا بدون expire) که کم استفاده شده باشه حذف می‌شه.

📌 برای کش‌هایی که رفتار مصرف داده‌هاش مدام تغییر می‌کنه عالیه.


@panicdev
🔥11👍2
استخدام برنامه‌نویس ارشد (Full-Stack (PHP

شرط بررسی رزومه:
حداقل ۵ سال سابقه کار حرفه‌ای در حوزه توسعه نرم‌افزار و برنامه‌نویسی

حقوق:
+۵۰ میلیون تومان
* طبیعتا بسته به تخصص و رزومه میتونید عدد مدنظرتون رو پیشنهاد بدید و محدودیتی وجود نداره)

مهارت‌های فنی مورد نیاز:
تسلط کامل به PHP
آشنایی عمیق با معماری نرم‌افزار (Software Architecture)
آشنایی با Redis
تجربه در طراحی و توسعه API
آشنایی با Docker
و ...

https://jobinja.ir/1370018
🔥3
Audio
خلاصه کتاب نردبان شکسته از آقای علی بندی

برای من جالب بود ،‌ گفتم به اشتراک بزارم .
نابرابری چی هست
نابرابری لازم هست ؟ اگر بله ! چقدر لازم هست
تفاوت فقر با نابرابری چی هست
اینکه نابرابری و فقر چقدر تاثیر دار روی تصمیماتتون،‌ روی تفکراتتون
🔥6
دوستان کسی تاحالا کورس سافت اسکیل از جایی شرکت کرده؟ نتیجه‌ش چی بوده؟
کلا چطوری سافت اسکیل هاتون رو بهبود میدید؟
⚠️ Update: #Iran has now been disconnected from the global internet for 36 hours; live metrics show national connectivity remains in the low few percent of ordinary levels with only a handful of users able to connect via multi-hop VPNs 📉

🔗 NetBlocks (@netblocks)
Forwarded from Armin's Notes 🪴
به زووودی 🤩
حدس میزنید چی باشه؟ :))