| AmirHossein | – Telegram
| AmirHossein |
592 subscribers
44 photos
8 videos
2 files
73 links
نوشته‌های یک برنامه‌نویس ناشی

🫂 @StartUnity
Download Telegram
کاش می‌فهمیدم کدوم یکی از ممبر ها زیر پست ها اسپم می‌کنه
روانی شدم از بس بن کردم
🗿4
استریم‌ ها در PHP - قسمت دوازدهم

- ساخت فیلترهای سفارشی


در بخش سوم با استریم php://filter آشنا شدیم. همان‌طور که می‌دانید، این استریم امکان فیلتر کردن و پردازش داده‌های ورودی یا خروجی را در حین خواندن و نوشتن فراهم می‌کند. همچنین با فیلترهایی مانند string.toupper و string.strip_tags آشنا شدیم.

در PHP، کلاس php_user_filter پایه‌ای است برای تعریف فیلترهای استریم سفارشی (Custom Stream Filters). وقتی شما یک فیلتر سفارشی می‌سازید، باید از این کلاس ارث‌بری کنید و متدهای آن را پیاده‌سازی کنید تا بتوانید روی داده‌های استریم، پردازش دلخواه خود را انجام دهید.

- ساختار کلی کلاس php_user_filter

1- متد filter
این متد مهم‌ترین بخش فیلتر است. داده‌های ورودی از استریم در قالب یک یا چند "باکت" (bucket) به این متد می‌آیند. هدف شما این است که داده‌ها را در هر باکت پردازش کنید و سپس آن را به باکت‌های خروجی منتقل کنید.
public function filter(resource $in, resource $out, int &$consumed, bool $closing): int
{
//
}

پارامتر in : استریم ورودی که داده‌های خام در قالب باکت‌ها داخلش هستند.
پارامتر out : استریم خروجی که باید داده‌های پردازش شده داخلش قرار بگیرد.
پارامتر consumed : تعداد بایت‌هایی که از ورودی خوانده و مصرف شده‌اند. باید این مقدار را به‌روز کنید.
پارامتر closing : اگر true باشد، استریم در حال بسته شدن است و باید پردازش نهایی انجام شود.

این متد باید یک عدد صحیح را return کند، این عدد بین 0 تا 2 می باشد که در قالب ثابت های زیر موجود هستند:
ثابت PSFS_PASS_ON : ادامه معمولی پردازش (عدد 0)
ثابت PSFS_FEED_ME : منتظر داده بیشتر باش (عدد 1)
ثابت PSFS_ERR_FATAL : خطای بحرانی (عدد 2)

در ادامه یک فیلتر برای بزرگ کردن حروف ایجاد می کنیم:
public function filter(resource $in, resource $out, int &$consumed, bool $closing): int
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = strtoupper($bucket->data);

$consumed += $bucket->datalen;

stream_bucket_append($out, $bucket);
}

return PSFS_PASS_ON;
}

در هر تکرار، تابع stream_bucket_make_writeable($in) یک "باکت" داده‌ای از ورودی دریافت می‌کند.
باکت یک ساختار است که شامل داده‌های خام ($bucket->data) و طول داده‌ها ($bucket->datalen) است.
اگر داده‌ای وجود داشته باشد، باکت به صورت نوشتنی بازگردانده می‌شود.

در این مثال، داده‌های موجود در باکت به حروف بزرگ تبدیل می‌شوند:
$bucket->data = strtoupper($bucket->data);

یعنی هر رشته‌ای که از ورودی آمده، با strtoupper تبدیل به حروف بزرگ می‌شود.

تعداد بایت‌هایی که از ورودی خوانده شده است باید به $consumed اضافه شود:
$consumed += $bucket->datalen;

این به PHP کمک می‌کند بفهمد چقدر از داده‌ها مصرف شده‌اند.

پس از پردازش، باکت به استریم خروجی ارسال می‌شود:
stream_bucket_append($out, $bucket);

به این ترتیب، داده‌های پردازش شده آماده خواندن در خروجی هستند.

در نهایت، مقدار PSFS_PASS_ON برگردانده می‌شود، این مقدار به معنی "ادامه پردازش عادی" است و نشان می‌دهد که فیلتر با موفقیت کار خود را انجام داده است.

———

2- متد onCreate
این متد هنگام ایجاد فیلتر و اتصال آن به استریم فراخوانی می‌شود.
public function onCreate(): bool
{
//
}

می‌توانید در اینجا پارامترهای ورودی در $this->params را پردازش یا مقداردهی اولیه انجام دهید.
اگر مقدار true بازگردد، اجازه ساخت استریم داده می شود. در غیر این صورت ایجاد فیلتر به شکست می‌خورد.

———

3- متد onClose
زمانی که استریم بسته می‌شود، این متد فراخوانی می‌شود تا فیلتر بتواند منابع را آزاد کند یا تمیزکاری کند.
public function onClose(): void
{
//
}


نکته: تنها پیاده سازی متد filter اجباری می باشد.

- مثال کامل
class UppercaseFilter extends php_user_filter
{
public function filter($in, $out, &$consumed, $closing): int
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}

stream_filter_register('my_uppercase', 'UppercaseFilter') or die('Failed to register filter');

$fp = fopen('php://memory', 'r+');
fwrite($fp, "hello");
rewind($fp);
stream_filter_append($fp, 'my_uppercase');
echo stream_get_contents($fp); // HELLO

// OR

echo file_get_contents("php://filter/read=my_uppercase/resource=input.txt");


#PHP #PHP_streams
@AmirhDeveloper
.
🔥4🍓3👍1
حدود ۲۰ دقیقه منتظر بیلد یه برنامه بودم، آخرای کار برق رفت
🤣5💔4
| AmirHossein |
حدود ۲۰ دقیقه منتظر بیلد یه برنامه بودم، آخرای کار برق رفت
جدا چطور می‌فهمن که من دارم کامپایل می‌کنم تا برقو قطع کنن

سیستم ذغالیه، یه کامپایل ۱۰ دیقه طول میکشه
بعد صاف وسطش برق قطع میشه
🗿2
| AmirHossein |
درود به همه 🤝 دیشب حوصله م سر رفته بود و کاملا منطقی تصمیم گرفتم کتابخانه Laraquest که یک کتابخانه برای کار با ربات تلگرام به زبان PHP بود رو با زبان Go پیاده سازی کنم. تا امروز مشغولش بود و تونستم یک نسخه از اون رو تحت عنوان پکیجی برای Go توسعه بدم. - این…
دفعه قبلی که حوصله‌م سررفته بود نسشتم و پکیج Laraquest رو با زبان GoLang بازنویسی کردم و حاصلش شد Laraquest-Go.

ولی با خودم فکر کردم که شاید خیلی حوصله‌م سرنرفته بوده، در نتیجه اینبار بیشتر حوصله‌م سر رفت، و struct ها رو به PHP اضافه کردم.
نمی‌دونم اینبار به اندازه کافی حوصله‌م سر رفته بوده یا نه، ولی به نظر برای الان کافیه.

در نتیجه من الان یک PHP دارم که می‌تونم توش از struct استفاده کنم.
البته که اضافه کردن چیزی مثل structها به PHP به این سادگی ها نیست و هنوز کلی کار نیاز داره، مثلا الان با یک کلاس هیچ تفاوتی نداره جز محدودیت هاش.
یعنی توی این استراکت نمی‌تونیم مجیک‌متد استفاده کنیم، یا ارث‌بری داشته باشیم و...
ولی در نهایت مثل یک کلاس رجیستر میشه، که این یعنی هیچ تفاوتی با ساخت یک کلاس نداره و عملا وجودش بی‌فایده‌س.
به همین دلیل اگر حوصله‌م بازم سر رفت کمی بیشتر روش وقت میذارم و در کنار class_entryها، struct_entry هم اضافه می‌کنم که از کلاس‌ها کاملا جدا بشه و سبک تر.
و در نهایت سینتکس رو به صورت زیر تغییر می‌دم:
Square{1, 2}

اما در کل برای تفریح و کسب تجربه چیز جالبی بود.

@AmirhDeveloper
.
🔥11🍓1
این VPNهای ارزون قیمتی که توی کانال‌ها تبلیغ می‌کنند رو ازشون فرار کنید.

اکانت نامحدود فقط ۴۹ هزار تومن


چنین چیزهایی یا بعد یک هفته از کار میوفتن، یا اطلاعات رو شنود می‌کنند.
وگرنه چنین قیمتی برای VPN، اونم نامحدود اصلا منطقی نیست.

از جای معتبر و آشنا بخرید.
👍9🤣1🍓1
Forwarded from Start Unity (ali reza)
🎯 پکیج Magic WebAds منتشر شد! (نسخه آزمایشی)

یکی از مشکلات همیشگی ما توی ایران، نبود دسترسی به تبلیغات درون‌برنامه‌ای معروف مثل AdMob یا Unity Ads بوده. تحریم‌ها، پیچیدگی‌ها و نیاز به حساب بانکی خارجی باعث شده خیلی از بازی‌سازهای مستقل نتونن به راحتی ازشون استفاده کنن.

واسه همین تصمیم گرفتم یه پکیج سبک و ساده بسازم برای نمایش تبلیغات از طریق WebView، بدون نیاز به SDK و دردسر! یعنی هر لینکی که تبلیغات شما رو نشون میده، می‌تونید مستقیم توی بازی لود کنید. مخصوصاً برای پروژه‌های Web3 و تبلیغات کریپتویی خیلی کاربردیه.

🧪 این نسخه هنوز اولیه‌ست و ممکنه باگ داشته باشه یا هنوز به‌درد پروژه‌های خیلی جدی نخوره، ولی پایه‌اش رو گذاشتم تا کم‌کم روش بسازم.

📱 حتماً نسخه دمو اندروید رو تست کنید، تبلیغ لود میشه و می‌تونید عملکرد کلی رو ببینید.
یه سمپل هم همراه پکیجه که خیلی راحت نشون میده چطوری ازش استفاده کنید.
به‌زودی داکیومنت کامل و ویدیوهای آموزشی هم براش می‌سازم.

اگه به‌دردت می‌خوره یا دوست داری همچین ابزاری قوی‌تر بشه، لطفاً یه ⭐️ بهش بده توی گیت‌هاب.
همین حمایت کوچیک کلی بهم انگیزه میده که قوی‌تر و سریع‌تر توسعه‌اش بدم.

🔗 لینک پکیج: Magic WebAds on GitHub

🔗 دمو اندروید: دانلود فایل APK

مرسی که همیشه حمایتم می‌کنید ❤️
9🍓2
خیلی از مردم واکنش عجیبی به این وضعیت فعلی دارن
نمی‌دونم چرا ولی انگار خوشحالن که جنگ شده
با هیجان و اشتیاق ازش صحبت می‌کنن
اون رو مسخره می‌کنن
و حرفای بچه‌گونه

نمی‌دونیم هدف از حمله چی بوده
سران مملکت؟ یا کی؟
مهم نیست، مهم اینه وسط مردم عادی هم آسیب دیدن
ویدیوهایی هست که نشون میده بچه‌های کوچیک کشته شدن، یا زیر آوار موندن

شاید شما توی خونتون آرامش داشته باشید(هنوز) ولی یه عده عزیزانشون رو از دست دادن

جنگ، جنگه؛ اونو بچه‌بازی ندونید، مسخره نکنید، نخندید، فاز هجیان و خوشحالی نگیرید

به امید آزادی و امنیت، تسلیت به مردم از دست رفته(جز مسئولین)
👍174👎1🍓1
وزارت قطع‌ارتباطات وصل‌شدن #ایران به اینترنت بین‌الملل رو تکذیب کرد.

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

🔍 ircf.space
@ircfspace
💔5
Forwarded from جادی | Jadi
به مناسبت شرایط جنگی و بی اینترنت و بقیه خباثت‌ها، محتوای دوره جدید «جامع پایتون» من در مکتبخونه حالا صد در صد رایگانه تا شاید کمکی باشه برای تمرین و یاد گرفتن و دور شدن از جنگی که برامون درست کردن.

برای تخفیف صد در صد، تیک «دسترسی کامل» رو بردارید، به سبد اضافه کنید و کد PEACE رو بزنید.

https://maktabkhooneh.org/course/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-mk346/
1🍓1
اگر دنبال VPN رایگان و پرسرعت هستید، پیشنهاد می‌کنم از نپسترنت استفاده کنید.

- آموزش اتصال در اندروید
- آموزش اتصال در آیفون

توی کانلش هم کانفیگ‌های بروز و پرسرعت رو به صورت رایگان قرار میده:
@mitivpn

البته برای ویندوز، مک و لینوکس کلاینتی نداره. ولی می پ‌تونید با استفاده از برنامه‌هایی مثل Every Proxy اون رو برای ویندوز و ... به اشتراک بگذارید، و همچنین با برنامه‌هایی مثل Proxifire کل سیستم رو بر پایه اون پروکسی تانل کنید.

@AmirhDeveloper
.
2🍓1
خروجی کد بالا کدام است؟

A
Outer 1
Inner 1
Outer 2
Inner 1

B
Outer 1
Inner 1
Inner 2
Outer 2
Inner 1

C
Outer 1
Inner 1

D
Outer 1
Inner 1
Inner 2

💢 نکته : لطفا اندکی تامل کنید، از اجرای کد و استفاده از هوش مصنوعی خودداری کنید.

⚜️ پاسخ خود را همراه با توضیح ارسال کنید.

#PHP
@AmirhDeveloper
.
1🍓1
| AmirHossein |
خروجی کد بالا کدام است؟ A Outer 1 Inner 1 Outer 2 Inner 1 B Outer 1 Inner 1 Inner 2 Outer 2 Inner 1 C Outer 1 Inner 1 D Outer 1 Inner 1 Inner 2 💢 نکته : لطفا اندکی تامل کنید، از اجرای کد و استفاده از هوش مصنوعی…
🔰 این سوال بسیار راحت است، درصورتی که با break و continue که با یک عدد همراه است آشنا باشید.

🔸 کد ما به این صورت است:
for ($i = 1; $i < 3; $i++) {
echo "Outer $i\n";
for ($j = 1; $j < 3; $j++) {
echo "\tInner $j\n";
if ($j == 1) break 2;
if ($j == 2) continue 2;
}
}

🔹 و خروجی آن گزینه C، یعنی:
Outer 1
Inner 1


⁉️ اما چرا؟
⚜️ بیایید ابتدا با دستورات break، و continue به صورت دقیق تر آشنا شویم.

🔻 ‏break N چیست؟
‏break به صورت معمول از یک حلقه خارج می‌شود. اما اگر بنویسیم break 2، به معنی خروج از دو سطح حلقه است.
یعنی در این کد:
if ($j == 1) break 2;

اگر شرط ‎$j == 1 برقرار شود، هم از حلقه داخلی و هم خارجی خارج می‌شود. یعنی اجرای کل حلقه‌ها متوقف می‌شود.

🔻continue N چیست؟
‏continue معمولاً ادامه حلقه جاری را رها می‌کند و می‌رود سراغ تکرار بعدی همان حلقه. اما continue 2 می‌گوید برو سراغ تکرار بعدی حلقه سطح دوم.
در این کد:
if ($j == 2) continue 2;

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

🔸 در هر دو حالت، عدد بعد از break یا continue مشخص می‌کند که چند سطح از حلقه را تحت تأثیر قرار می‌دهد.
⭕️ نکته: عدد بعد از break یا continue باید به تعداد سطوح حلقه باشد.

⚜️ حالا بیایید ببینیم این کد دقیقاً چطور اجرا می‌شود:

اولین دور حلقه بیرونی: ‎$i = 1
Outer 1
اولین دور حلقه داخلی: ‎$j = 1
Inner 1
سپس:
if ($j == 1) break 2;


شرط درست است، پس اجرای break 2 انجام می‌شود. یعنی از هر دو حلقه خارج می‌شویم و برنامه پایان می‌یابد.

⭕️ نکته: دستور continue هرگز اجرا نخواهد شد.

#PHP
@AmirhDeveloper
.
🍓52
فکر کنید دما ۴۳ درجه‌س، گرم‌ترین ساعت روزه و وسط کارتون هستید که دارید به نتیجه‌ای که کلی براش زمان گذاشتید می‌رسید و زارت برق قطع میشه
💔7🗿1
Forwarded from Start Unity (ali reza)
درود دلاوران 🌟
یکی از دوستان برام یه کد تخفیف ۱۰۰٪ فرستاد برای سایت فرادرس
فرادرس الان تخفیف ۱۰۰ درصد گذاشته، فقط برای یه دوره!

من خودم یه دوره فن بیان گرفتم، گفتم قبل اینکه تموم شه،
براتون بذارم شاید به دردتون بخوره ❤️

🔹 کد تخفیف: IRAN (با حروف بزرگ)

یادتون نره فقط می‌تونید یه دوره رو با این کد بگیرید
پس اون دوره‌ای که واقعاً لازم دارید رو انتخاب کنید 😉
موفق باشید رفقا 🌱
4🍓1
قرار بود تا 25 خرداد ورژن 3 LaraGram منتشر بشه، ولی خب اتفاقات زیادی افتاد که باعث شد پروژه خیلی عقب بیوفته.

تا الان بخش‌های زیادیش توسعه داده شده و یک سری زیره کاری ازشون باقی مونده.

اما سرویس هایی مثل
Validation, Auth, Divider, Broadcast
و احتمالا یک سری چیز دیگه هنوز باقی موندن.

در بهترین حالت امیدوارم تا دو هفته دیگه منتشر بشه.

از الان بهتون اطمینان میدم که مثل LaraGram رو ندیدید و یک فریم‌ورک تمام‌اعیار برای توسعه ربات تلگرامی هست(فخر فروشی)😁
7🍓1
| AmirHossein |
قرار بود تا 25 خرداد ورژن 3 LaraGram منتشر بشه، ولی خب اتفاقات زیادی افتاد که باعث شد پروژه خیلی عقب بیوفته. تا الان بخش‌های زیادیش توسعه داده شده و یک سری زیره کاری ازشون باقی مونده. اما سرویس هایی مثل Validation, Auth, Divider, Broadcast و احتمالا یک…
وقتی ورژن 3 منتشر بشه بیکار نمی‌مونیم و توسعه ورژن 4 رو شروع می‌کنیم تا برای سال آینده آماده باشه.

خیلی سعی کردم جلوی خودم رو بگیرم و نگم توی ورژن 4 چه‌خبره، ولی خب نمیشه😂

ورژن 4 روی دو چیز متمرکز میشه:
1- MTProto
2- TMAs

به عنوان اولین قابلیت به شما امکان توسعه ربات‌های کلاینتی و کار با متدهای MTProto رو میده، که قبلا هم زیاد ازش نام برده بودم

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

اما همه چیز توی بک‌اند تموم نمیشه، لاراگرام برای فرانت‌هم قابلیت‌هایی در اختیارتون میذاره، اگر لاراول کار باشید با پکیج هایی مثل inertia.js و livewire آشنا هستید، که قرار مشابه‌ش رو توی لاراگرام داشته باشیم.
شما می‌تونید ری‌اکت یا ویو بنویسید و با یک متد ساده اون رو رندر کنید.
بدون هیچ دردسر اضافی یا نیاز به پکیج‌ها و فریم‌ورک‌های جاوااسکریپتی
🔥11🍓2