This media is not supported in your browser
VIEW IN TELEGRAM
اگه نتونستید اسکن کنید، ویدیو رو میتونید ببینید
👍6
فرض کنید یک فانکشن مینویسید توی پایتون که دو ورودی میگیره
و بعد اون ورودی ها رو باهم جمع میکنه و نتیجه رو بر میگردونه.
حالا اگه خودتون یک تایپ جدید مثلا یک کلاسی که خودتون ساختین رو بهش بعنوان ورودی بدین چی میشه؟
بیایین با کد این مثال رو برسی کنیم:
اگه این کد رو یک تایپ جدید در نظر بگیریم
و این فانکشن رو در نظر بگیریم که قراره دو مقدار رو جمع کنه:
حالا دو متغییر درست کنیم از جنس Person
خب بیایین حالا این دو متغییر رو جمع کنیم
اما قبلش باید بگم فانکشنی که ساختیم صرفا باید دو چیز را جمع کند که اصلا جنسش مشخص نیست
و پایتون حتی اگر جنس ورودی های فانکشن رو هم مشخص کنیم باز هم هر نوعی میتونیم بعنوان ورودی به فانکشن بدیم
و فانکشن سعی میکنه اون وردی ها رو جمع کنه
اما وقتی کلاسی که ما نوشتیم این رو ساپورت نمیکنه، چه اتفاقی میوفته؟ خب اینجاست که run time ارور میگیریم.
اما یک مسئله دیگه.
اگه کلاس ما اپراتور جمع رو ساپورت کنه ولی مقدار اشتباهی بعنوان ورودی به فانکشن داده بشه چی میشه؟ خطای لاجیکال یا همون خطای منطقی رخ میده.
این یعنی برنامه هیچ اروری بر نمیگردنه اما از لحاظ منطقی برنامه دچار اشکاله و درست عمل نمیکنه. اگه بخام مثال بزنم، میتونم بگم فرض کنید شما فانکشنی میخواهید که فقط دو استرینگ رو جمع بزنه اما این فانکشن میتونه هر چیزی که dunder به اسم
حالا همین مسئله توی زبان rust در زمان compile جلوش گرفته میشه. حالا چطوری؟ برای من خیلی جالبه.
اینکه یک چیزی داره به اسم trait. شما میتونی موقعی که ورودی یک فانکشن رو مشخص میکنی، مشخص کنی که اون ورودی ها باید چه فانکشن هایی رو باید پیادهسازی کرده باشند!
البته rust یک زبان static type هم هست، این یعنی اصلا همون اول باید فانکشنی که مینویسی مشخص باشه چه تایپی میگیره و اگه تایپی غیر از اون بهش بدی بازم کامپایل تایم بهت ارور میده.
ولی قابلیتی توی این زبان هست به اسم generics که باهاش میشه مشخص کرد که فانکشن هر تایپی رو بتونه از ورودی بگیره.
اینطوری کامپایلر وقتی میبینی یک فانکشن سه بار با ورودی های مختلف صدا زده شده، اون فانکشن رو خودش سه بار انگار از نو مینویسه.
و خب برای اینکه جلوی مسئله ران تایم اروری گرفته بشه که فانکشن یک متد روی یک تایپ استفاده کنه که اون پیاده سازی نشده، قابلیت trait boundary رو بهت میده.
سینتکس جالبی هم داره:
و بعد اون ورودی ها رو باهم جمع میکنه و نتیجه رو بر میگردونه.
حالا اگه خودتون یک تایپ جدید مثلا یک کلاسی که خودتون ساختین رو بهش بعنوان ورودی بدین چی میشه؟
بیایین با کد این مثال رو برسی کنیم:
اگه این کد رو یک تایپ جدید در نظر بگیریم
class Person:
def __init__(self, name):
self.name = name
و این فانکشن رو در نظر بگیریم که قراره دو مقدار رو جمع کنه:
def summer(n, m):
return n + m
حالا دو متغییر درست کنیم از جنس Person
a = Person("arash")
b = Person("someOne")خب بیایین حالا این دو متغییر رو جمع کنیم
اما قبلش باید بگم فانکشنی که ساختیم صرفا باید دو چیز را جمع کند که اصلا جنسش مشخص نیست
و پایتون حتی اگر جنس ورودی های فانکشن رو هم مشخص کنیم باز هم هر نوعی میتونیم بعنوان ورودی به فانکشن بدیم
و فانکشن سعی میکنه اون وردی ها رو جمع کنه
اما وقتی کلاسی که ما نوشتیم این رو ساپورت نمیکنه، چه اتفاقی میوفته؟ خب اینجاست که run time ارور میگیریم.
summer(a, b)
TypeError: unsupported operand type(s) for +: 'Person' and 'Person'
اما یک مسئله دیگه.
اگه کلاس ما اپراتور جمع رو ساپورت کنه ولی مقدار اشتباهی بعنوان ورودی به فانکشن داده بشه چی میشه؟ خطای لاجیکال یا همون خطای منطقی رخ میده.
این یعنی برنامه هیچ اروری بر نمیگردنه اما از لحاظ منطقی برنامه دچار اشکاله و درست عمل نمیکنه. اگه بخام مثال بزنم، میتونم بگم فرض کنید شما فانکشنی میخواهید که فقط دو استرینگ رو جمع بزنه اما این فانکشن میتونه هر چیزی که dunder به اسم
__add__ رو پیاده سازی کرده جمع بزنه.حالا همین مسئله توی زبان rust در زمان compile جلوش گرفته میشه. حالا چطوری؟ برای من خیلی جالبه.
اینکه یک چیزی داره به اسم trait. شما میتونی موقعی که ورودی یک فانکشن رو مشخص میکنی، مشخص کنی که اون ورودی ها باید چه فانکشن هایی رو باید پیادهسازی کرده باشند!
البته rust یک زبان static type هم هست، این یعنی اصلا همون اول باید فانکشنی که مینویسی مشخص باشه چه تایپی میگیره و اگه تایپی غیر از اون بهش بدی بازم کامپایل تایم بهت ارور میده.
ولی قابلیتی توی این زبان هست به اسم generics که باهاش میشه مشخص کرد که فانکشن هر تایپی رو بتونه از ورودی بگیره.
اینطوری کامپایلر وقتی میبینی یک فانکشن سه بار با ورودی های مختلف صدا زده شده، اون فانکشن رو خودش سه بار انگار از نو مینویسه.
و خب برای اینکه جلوی مسئله ران تایم اروری گرفته بشه که فانکشن یک متد روی یک تایپ استفاده کنه که اون پیاده سازی نشده، قابلیت trait boundary رو بهت میده.
سینتکس جالبی هم داره:
fn summer<T: std::ops::Add>(n: T, m: T) {
return n + m
}
👍4
Bit Orbit 🪐
فرض کنید یک فانکشن مینویسید توی پایتون که دو ورودی میگیره و بعد اون ورودی ها رو باهم جمع میکنه و نتیجه رو بر میگردونه. حالا اگه خودتون یک تایپ جدید مثلا یک کلاسی که خودتون ساختین رو بهش بعنوان ورودی بدین چی میشه؟ بیایین با کد این مثال رو برسی کنیم: اگه…
الان متوجه شدم یک مکانیزمی هست توی پایتون که میشه اونو استفاده کرد تا چک کنیم ایا میشه dunder که برای اپراتور + یعنی
اونکار با استفاده از فانکشن isinstance() هست، ولی مسئله اینجاست که بازم ارور توی ران تایم اتفاق میوفته.
__add__ هست رو صدا بزنیم یا نه.اونکار با استفاده از فانکشن isinstance() هست، ولی مسئله اینجاست که بازم ارور توی ران تایم اتفاق میوفته.
یک مدت پیش یک کد زدم با جنگو
وسطش گفتم بیام خب از هوش مصنوعی کمک بگیرم ببینم اینکه همه دارن ازش کمک میگیرن توی کد چیه
بعد ازش پرسیدم چطوری باید user رو هندل کنم توی جنگو کدش رو بزن
هوش مصنوعی متاسفانه نمیدونست اخرین ورژن جنگو 4 هست و کدی که بهم داد برای جنگو 3 بود
در نهایت که کد رو نوشتم بر اساس اون دیتا، هنوزم گاهی نیاز میشه که برم یک مشکل رو پچ کنم
صرفا بخاطر اینکه کورکورانه تصمیم گرفتم از کدی که سر در نمیارم استفاده کنم.
وسطش گفتم بیام خب از هوش مصنوعی کمک بگیرم ببینم اینکه همه دارن ازش کمک میگیرن توی کد چیه
بعد ازش پرسیدم چطوری باید user رو هندل کنم توی جنگو کدش رو بزن
هوش مصنوعی متاسفانه نمیدونست اخرین ورژن جنگو 4 هست و کدی که بهم داد برای جنگو 3 بود
در نهایت که کد رو نوشتم بر اساس اون دیتا، هنوزم گاهی نیاز میشه که برم یک مشکل رو پچ کنم
صرفا بخاطر اینکه کورکورانه تصمیم گرفتم از کدی که سر در نمیارم استفاده کنم.
👍6
یه کانسپتی هست توی دواپس که بهش میگن scale up یا vertical scaling حالا این یعنی چی؟
وقتی ما یک برنامهای توسعه دادیم و بعد روی یک سرور با یک ریسورس خاص اوردیم بالا
بعد از مدتی با بالاتر رفتن تعداد کاربران ممکنه ریسورس ما کم بیاد
برای همین ما میزان اون منابع رو بیشتر میکنیم، مثلا بجای 2GB از رم، بهش 4GB رم میدیم.
حالا کنار این یک کلمه دیگهای داریم به اسم scale out یا horizontal scaling این یعنی چی؟
وقتی یک برنامهای نیاز به ریسورس پیدا میکنه، منابع برنامه رو بیشتر نمیکنی،
بجای منابع بیشتر یک رپلیکا ازش میاری بالا، یعی دقیقا یک نسخه دیگه ازش میاری و یک چیزی به اسم لود بالانسر میذاری بینش
با اینکار بار بین هر دو ریپلیکا تقسیم میشه. فایده این روش بیشتره، چرا؟
فرض کنیم یک دیتاسنتر داریم و یک نسخه از سرویس فقط و فقط روی اون یک دیتاسنتره، اگه مشکلی برای دیتاسنتر پیش بیاد، سرویس ما هم میاد پایین
برای همین ریپلیکا رو روی دیتاسنتر های دیگه میسازی
از طرف دیگه توی هزینه هم کمک میکنه
هر تایم که یوزر ها زیاد شدن شما برنامه رو scale out میکنی و هر تایم که یوزر ها کمتر بودن برنامه رو scale down میکنه
وقتی ما یک برنامهای توسعه دادیم و بعد روی یک سرور با یک ریسورس خاص اوردیم بالا
بعد از مدتی با بالاتر رفتن تعداد کاربران ممکنه ریسورس ما کم بیاد
برای همین ما میزان اون منابع رو بیشتر میکنیم، مثلا بجای 2GB از رم، بهش 4GB رم میدیم.
حالا کنار این یک کلمه دیگهای داریم به اسم scale out یا horizontal scaling این یعنی چی؟
وقتی یک برنامهای نیاز به ریسورس پیدا میکنه، منابع برنامه رو بیشتر نمیکنی،
بجای منابع بیشتر یک رپلیکا ازش میاری بالا، یعی دقیقا یک نسخه دیگه ازش میاری و یک چیزی به اسم لود بالانسر میذاری بینش
با اینکار بار بین هر دو ریپلیکا تقسیم میشه. فایده این روش بیشتره، چرا؟
فرض کنیم یک دیتاسنتر داریم و یک نسخه از سرویس فقط و فقط روی اون یک دیتاسنتره، اگه مشکلی برای دیتاسنتر پیش بیاد، سرویس ما هم میاد پایین
برای همین ریپلیکا رو روی دیتاسنتر های دیگه میسازی
از طرف دیگه توی هزینه هم کمک میکنه
هر تایم که یوزر ها زیاد شدن شما برنامه رو scale out میکنی و هر تایم که یوزر ها کمتر بودن برنامه رو scale down میکنه
❤4
خب radio.wiregeek.ir رو که یادتون نرفته؟
یک سایت ساده که صرفا فقط موزیک پخش میکرد و امکانات خاصی نمیداد به کاربر، که گیج نشه.
حالا یکی از مشکلات خودم اینبود که خب چون با موزیک پلیر های دیگه گیج میشدم، اینو نوشتم.
باز یه مشکل دیگه پیش اومد، اونم اینکه باید آهنگایی که دوست دارم رو داخلش خودم اپلودم میکرد
چند تا راه داشتم برای اینکار
یکی اینکه ریپو رو داخل سروری چیزی کلون کنم، آهنگم رو با wget یا ytdlp دانلود کنم بعد پوش کنم تغییرات رو.
راه دیگه اینبود که درگ کنم توی ریپوی گیتهاب :)
اما من اکثر آهنگ های قشنگ رو از دوستام داخل تلگرام میگیرم، برای همین کار سخت میشد.
یک ربات ساده درست کردم که الان وقتی شما براش اهنگ بفرستید آهنگ رو بذاره داخل ریپو.
اما چطوری؟
یک ریپو ساده داریم الان که به صورت دیفالت خالیه برای کسایی که بخان یک استیشن برای خودشون داشته باشن
فرض کنید این ریپو رو کلون کردین، اسمشو به مثلا jazz تغییر دادین، حالا چطوری آهنگ قرار بدین داخلش؟
کافیه فقط داخل @BotFather یک ربات بسازید، توکن بات رو روی گیتهاب اکشن ست کنید، تمام! هر آهنگی که خواستین رو برای بات فروارد کنید
تا خودکار داخل ریپو قرار بگیره.
چطوری؟ یک گیتهاب اکشن سادهست که هر چند ساعت ران میشه اگه فایل جدیدی براش ارسال کرده باشین توی بات تلگرام، اون فایل رو میگیره تبدیل میکنه به فرمت opus که حجم خیلی کمتری داره و برای وب مناسبه و بعد پوش میکنه توی خود ریپو.
الان دیگه بهانهای برای اضافه کردن پلی لیست jazz ندارید دیگه؟ :)
یک label هم هست به اسم manual-run که اگه یک ایشو به این اسم بسازید، action خودکار ران میشه :)
> البته یه ایراد هم بگمِ، تلگرام به بات اجازه نمیده که فایل با حجم بالای 20MB بگیره
یک سایت ساده که صرفا فقط موزیک پخش میکرد و امکانات خاصی نمیداد به کاربر، که گیج نشه.
حالا یکی از مشکلات خودم اینبود که خب چون با موزیک پلیر های دیگه گیج میشدم، اینو نوشتم.
باز یه مشکل دیگه پیش اومد، اونم اینکه باید آهنگایی که دوست دارم رو داخلش خودم اپلودم میکرد
چند تا راه داشتم برای اینکار
یکی اینکه ریپو رو داخل سروری چیزی کلون کنم، آهنگم رو با wget یا ytdlp دانلود کنم بعد پوش کنم تغییرات رو.
راه دیگه اینبود که درگ کنم توی ریپوی گیتهاب :)
اما من اکثر آهنگ های قشنگ رو از دوستام داخل تلگرام میگیرم، برای همین کار سخت میشد.
یک ربات ساده درست کردم که الان وقتی شما براش اهنگ بفرستید آهنگ رو بذاره داخل ریپو.
اما چطوری؟
یک ریپو ساده داریم الان که به صورت دیفالت خالیه برای کسایی که بخان یک استیشن برای خودشون داشته باشن
فرض کنید این ریپو رو کلون کردین، اسمشو به مثلا jazz تغییر دادین، حالا چطوری آهنگ قرار بدین داخلش؟
کافیه فقط داخل @BotFather یک ربات بسازید، توکن بات رو روی گیتهاب اکشن ست کنید، تمام! هر آهنگی که خواستین رو برای بات فروارد کنید
تا خودکار داخل ریپو قرار بگیره.
چطوری؟ یک گیتهاب اکشن سادهست که هر چند ساعت ران میشه اگه فایل جدیدی براش ارسال کرده باشین توی بات تلگرام، اون فایل رو میگیره تبدیل میکنه به فرمت opus که حجم خیلی کمتری داره و برای وب مناسبه و بعد پوش میکنه توی خود ریپو.
الان دیگه بهانهای برای اضافه کردن پلی لیست jazz ندارید دیگه؟ :)
یک label هم هست به اسم manual-run که اگه یک ایشو به این اسم بسازید، action خودکار ران میشه :)
> البته یه ایراد هم بگمِ، تلگرام به بات اجازه نمیده که فایل با حجم بالای 20MB بگیره
GitHub
GitHub - js-radio/station_schema: the schema of station and workflow to download musics
the schema of station and workflow to download musics - js-radio/station_schema
🔥4👏2
Bit Orbit 🪐
خب radio.wiregeek.ir رو که یادتون نرفته؟ یک سایت ساده که صرفا فقط موزیک پخش میکرد و امکانات خاصی نمیداد به کاربر، که گیج نشه. حالا یکی از مشکلات خودم اینبود که خب چون با موزیک پلیر های دیگه گیج میشدم، اینو نوشتم. باز یه مشکل دیگه پیش اومد، اونم اینکه باید…
البته یه چیز دیگه هم نوشته بودم برای این کلا به کسی نگفتم
یکی از اکشن ها از پلی لیست یوتوب میگیره آهنگ ها رو
ولی مشکل اینجاست که یوتیوب میاد و ip گیتهاب رو بعنوان بات شناسایی میکنه و این اکشن درست کار نمیکنه. :(
یکی از اکشن ها از پلی لیست یوتوب میگیره آهنگ ها رو
ولی مشکل اینجاست که یوتیوب میاد و ip گیتهاب رو بعنوان بات شناسایی میکنه و این اکشن درست کار نمیکنه. :(
❤4👏1
به بخش راک دارم بیشتر از 300 آهنگ اضافه میکنم :)
یادمون باشه همه این روند، درواقع از دانلود آهنگ تا کانورت به فرمت مناسب برای وب تا نگهداری موزیک ها و حتی خود سایت روی گیتهاب داره انجام میشه و هیچ سرور که از خودم باشه درگیر نیست!
گیتهاب ازم شکایت نکنه امیدوارم :)
radio.wiregeek.ir
یادمون باشه همه این روند، درواقع از دانلود آهنگ تا کانورت به فرمت مناسب برای وب تا نگهداری موزیک ها و حتی خود سایت روی گیتهاب داره انجام میشه و هیچ سرور که از خودم باشه درگیر نیست!
گیتهاب ازم شکایت نکنه امیدوارم :)
radio.wiregeek.ir
👍5🔥3🤬1
یک نوع حمله DDOS وجود داره که بهش میگن DNS amplify
خیلی روش جالبیه، روش کارش اینه که شما میتونی یک کوئری DNS به یک سرور DNS بزنی ولی source ip رو دستکاری کنی و سیستم خودت قرار ندی
اینطوری یک ریکوئست میره به سمت سرور ولی جوابش برای یک هدف دیگهای میره.
و خودت هیچ درگیری این وسط نداری، حالا شما اینجا میتونی از باتنت هم استاده کنی و کاری کنی ملیون ها سیستم این ریکوئست ها رو به DNS سرور بزنند.
حمله جالبیه.
https://www.cloudflare.com/learning/ddos/dns-amplification-ddos-attack/
خیلی روش جالبیه، روش کارش اینه که شما میتونی یک کوئری DNS به یک سرور DNS بزنی ولی source ip رو دستکاری کنی و سیستم خودت قرار ندی
اینطوری یک ریکوئست میره به سمت سرور ولی جوابش برای یک هدف دیگهای میره.
و خودت هیچ درگیری این وسط نداری، حالا شما اینجا میتونی از باتنت هم استاده کنی و کاری کنی ملیون ها سیستم این ریکوئست ها رو به DNS سرور بزنند.
حمله جالبیه.
https://www.cloudflare.com/learning/ddos/dns-amplification-ddos-attack/
Cloudflare
DNS amplification DDoS attack | Cloudflare
This DDoS attack leverages open DNS resolvers in order to overwhelm a server or network with an amplified amount of traffic, rendering the server and its surrounding infrastructure inaccessible.
❤6👍1
این بلاگ پست خیلی جالبه، یکی اومده از DNS بعنوان file storage استفاده میکنه.
حالا چطوری؟ همینطور که میدونید dns به جز اینکه میتونه ip ها رو پشت دامنه نگهداری کنه
میتونه رکورد های دیگه هم داشته باشه، مثلا رکورد mx که برای mail exchange هست
یا رکورد AAAA برای IPV6 یا مثلا PTR که برعکس عمل میکنه
یعنی ip رو به دامنه تبدیل میکنه!
یکی از این رکورد ها که توی این مورد استفاده شده رکورد TXT هست. ولی خب ذخیره یک دیتا روی رکورد txt محدودیت خیلی زیادی داره
چون بیشتر از 255 کاراکتر نمیتونید توی این رکورد ذخیره کنید
از طرف دیگه هم بیشتر از 9 رکورد txt روی یک دامنه بیشتر نمیتونید داشته باشید، پس دیتای زیادی رو نمیشه ذخیره کرد.
ولی طوری که عمل میکنه، به این شکل هست که یک ریکوئست میزنه به سمت یک resolver مثلا 1.1.1.1 بعد ازش میخاد که بگه رکورد های txt مثلا ساب دامنه fli.example.com چیه
بعد که ریزالور جوابشو نداشت، مجبوره بره جواب رو بدست بیاره و کش کنه، جواب رو از NS سرور میپرسه که توی این مورد خود ما باید باشیم،
حالا به اندازه 9 چانک از دیتا روی کش ذخیره شده
برای اینکه مطمئن باشیم که دیتای ما سر جاش میمونه باید رپلیکا کنیم و از چندین ریزالور استفاده کنیم که دیتای ما رو ذخیره کنند.
بعد حالا چانک های دیگه هم باید روی ریزالور های دیگه ست بشن، پس این روند رو تا آخر همه چانک های فایل ادامه میدیم.
محدودیت اینه که ما بیشتر از 250 مگابایت نمیتونیم ذخیره کنیم، چون تعداد ریزاور ها 438 هزار تاست. و اینکه نهایتا کش تا یک روز دیتا رو ذخیره میکنه.
حالا چطوری؟ همینطور که میدونید dns به جز اینکه میتونه ip ها رو پشت دامنه نگهداری کنه
میتونه رکورد های دیگه هم داشته باشه، مثلا رکورد mx که برای mail exchange هست
یا رکورد AAAA برای IPV6 یا مثلا PTR که برعکس عمل میکنه
یعنی ip رو به دامنه تبدیل میکنه!
یکی از این رکورد ها که توی این مورد استفاده شده رکورد TXT هست. ولی خب ذخیره یک دیتا روی رکورد txt محدودیت خیلی زیادی داره
چون بیشتر از 255 کاراکتر نمیتونید توی این رکورد ذخیره کنید
از طرف دیگه هم بیشتر از 9 رکورد txt روی یک دامنه بیشتر نمیتونید داشته باشید، پس دیتای زیادی رو نمیشه ذخیره کرد.
ولی طوری که عمل میکنه، به این شکل هست که یک ریکوئست میزنه به سمت یک resolver مثلا 1.1.1.1 بعد ازش میخاد که بگه رکورد های txt مثلا ساب دامنه fli.example.com چیه
بعد که ریزالور جوابشو نداشت، مجبوره بره جواب رو بدست بیاره و کش کنه، جواب رو از NS سرور میپرسه که توی این مورد خود ما باید باشیم،
حالا به اندازه 9 چانک از دیتا روی کش ذخیره شده
برای اینکه مطمئن باشیم که دیتای ما سر جاش میمونه باید رپلیکا کنیم و از چندین ریزالور استفاده کنیم که دیتای ما رو ذخیره کنند.
بعد حالا چانک های دیگه هم باید روی ریزالور های دیگه ست بشن، پس این روند رو تا آخر همه چانک های فایل ادامه میدیم.
محدودیت اینه که ما بیشتر از 250 مگابایت نمیتونیم ذخیره کنیم، چون تعداد ریزاور ها 438 هزار تاست. و اینکه نهایتا کش تا یک روز دیتا رو ذخیره میکنه.
👏2👍1
برای نوشتن یه بات تلگرام که به ازای هر دستور یه متن یا فایل خاصی ارسال کنه
همیشه کدی که میزدم از یه مشت if و else تو در تو،
دیشب گفتم خب چکاریه؟ کارای تکراری رو دیگه اینطوری نکنم!
یه کد زدم که yaml از شما میگیره
و به ازای هر دستور شما میتونید متن، عکس، ویدیو یا وویس مشخص کنید
هر تایم کاربر دستور رو داخل تلگرام وارد کرد، مقدار هایی که تایین کردین براشون ارسال میشه
اینطوری میتونید بینهایت دستور داشته باشید.
کد رو هم نیاز نیست تغییر بدین برای اضافه کردن دستور جدید، کافیه کانفیگ رو عوض کنید!
https://github.com/shabane/commodore
همیشه کدی که میزدم از یه مشت if و else تو در تو،
دیشب گفتم خب چکاریه؟ کارای تکراری رو دیگه اینطوری نکنم!
یه کد زدم که yaml از شما میگیره
و به ازای هر دستور شما میتونید متن، عکس، ویدیو یا وویس مشخص کنید
هر تایم کاربر دستور رو داخل تلگرام وارد کرد، مقدار هایی که تایین کردین براشون ارسال میشه
اینطوری میتونید بینهایت دستور داشته باشید.
کد رو هم نیاز نیست تغییر بدین برای اضافه کردن دستور جدید، کافیه کانفیگ رو عوض کنید!
https://github.com/shabane/commodore
❤1
Bit Orbit 🪐
برای نوشتن یه بات تلگرام که به ازای هر دستور یه متن یا فایل خاصی ارسال کنه همیشه کدی که میزدم از یه مشت if و else تو در تو، دیشب گفتم خب چکاریه؟ کارای تکراری رو دیگه اینطوری نکنم! یه کد زدم که yaml از شما میگیره و به ازای هر دستور شما میتونید متن، عکس،…
این کد رو داکرایز هم کردم الان، میتونید با یه کامند رانش کنید،
بعد یه کار جالبی که کردم اینه که اگه فایل prompts.yaml رو هر زمانی تغییر بدین
نیاز نیست که کانتینر رو ریست کنید، خود برنامه فایل رو reLoad میکنه.
بعد یه کار جالبی که کردم اینه که اگه فایل prompts.yaml رو هر زمانی تغییر بدین
نیاز نیست که کانتینر رو ریست کنید، خود برنامه فایل رو reLoad میکنه.
docker run -d -v ./prompts.yaml:/code/prompts.yaml -v ./assets:/code/assets -e API_KEY='<API_KEY>' mshabane/commodore:1.0.0
👏1
Bit Orbit 🪐
به بخش راک دارم بیشتر از 300 آهنگ اضافه میکنم :) یادمون باشه همه این روند، درواقع از دانلود آهنگ تا کانورت به فرمت مناسب برای وب تا نگهداری موزیک ها و حتی خود سایت روی گیتهاب داره انجام میشه و هیچ سرور که از خودم باشه درگیر نیست! گیتهاب ازم شکایت نکنه…
به radio دو ایستگاه دیگه هم اضافه کردم
یکی به اسم jazz و یکی دیگه هم به اسم خواننده محبوب گذشتهام Leonard Cohen.
نظرتون چیه یه فورک از این ریپو بگیرید و وصلش کنید به بات تلگرام تا استیشن خودتون رو داشته باشید؟
هنوز سبک و خواننده های زیادی هستن که اینجا جاشون کمه، جدا از اینها
یه پلی لیست موزیک برای برنامه نویسی هم جای خالی بزرگی داره اینجا.
یکی به اسم jazz و یکی دیگه هم به اسم خواننده محبوب گذشتهام Leonard Cohen.
نظرتون چیه یه فورک از این ریپو بگیرید و وصلش کنید به بات تلگرام تا استیشن خودتون رو داشته باشید؟
هنوز سبک و خواننده های زیادی هستن که اینجا جاشون کمه، جدا از اینها
یه پلی لیست موزیک برای برنامه نویسی هم جای خالی بزرگی داره اینجا.
GitHub
GitHub - js-radio/station_schema: the schema of station and workflow to download musics
the schema of station and workflow to download musics - js-radio/station_schema
❤4
Bit Orbit 🪐
به radio دو ایستگاه دیگه هم اضافه کردم یکی به اسم jazz و یکی دیگه هم به اسم خواننده محبوب گذشتهام Leonard Cohen. نظرتون چیه یه فورک از این ریپو بگیرید و وصلش کنید به بات تلگرام تا استیشن خودتون رو داشته باشید؟ هنوز سبک و خواننده های زیادی هستن که اینجا جاشون…
احتمالا به دو دلیل مشارکت نمیکنید:
1. از رقیبم اسپاتیفای استفاده میکنید
2. توی تیم گیتهاب هستین :)
دلیل سوم که داخل کامنت بهش اشاره شد: سرتون شلوغه :_
1. از رقیبم اسپاتیفای استفاده میکنید
2. توی تیم گیتهاب هستین :)
دلیل سوم که داخل کامنت بهش اشاره شد: سرتون شلوغه :_
😁6