جواب پست بالایی رو بدید اگه دوست داشتید
چون واقعیتش دارم برنامه ریزی میکنم برا یه سری آموزش و چیزای باحال
شب بیشتر درموردش حرف میزنم، بعد از پست خفن علی
شمام نظری پیشنهادی چیزی دارید زیر همین پست بگید
ری اکشن قلب بزنید به یاد قدیما ❤️😍
چون واقعیتش دارم برنامه ریزی میکنم برا یه سری آموزش و چیزای باحال
شب بیشتر درموردش حرف میزنم، بعد از پست خفن علی
شمام نظری پیشنهادی چیزی دارید زیر همین پست بگید
ری اکشن قلب بزنید به یاد قدیما ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
❤19
🧶 چطور یک برنامه رو thread safe کنیم؟
وقتی برنامه ای مینویسم که قراره از threading ( یا async ) برای اجرای همزمان چند پروسه استفاده کنه، بحث thread safe موضوع حساسی میشه.
ما به تابعی یا classی میگیم thread-safe که اگر همزمان در یک لحظه چندین بار تغییرات در اون ایجاد بشه و خونده بشه، بدون هیچ مشکلی عمل کنه.
این دقیقا زمانی هستش که دو نفر همزمان به چیزی مشترک دسترسی پیدا میکنن که مشکلات عجیبی پیش میاد اینجا:
فرض کنید متغییر counter برابر با 0 هستش.
فرد x و y همزمان بهش دسترسی پیدا میکنن.
فرد y یک عدد به counter اضافه میکنه.
فرد x متغییر counter رو میخونه و استفادش میکنه.
چه اتفاقی میوفته؟ فرد y یکی به counter اضافه کرده و شده 1، ولی فرد x همچنان از مقدار 0 استفاده کرده.
یا یه مثال بهتر؛ همزمان دو نفر میخوان یک فایل رو تغییر بدن، کلا محتوای فایل یچیز عجیب غریب میشه
به این اتفاقات میگن race condition.
🔒 درک بهتر کاربرد GIL توی async
چرا میگم از requests یا socket توی ربات هاتون ( حالت اسینک ) استفاده نکنین؟ دلیلش همینجاست.
تمام لایبرری های پایتون ( ۹۰ درصدشون ) برای اینکه thread-safe باشن، هرکاری میخوان بکنن میزنن GIL رو قفل میکنن که مشکلی پیش نیاد؛ حتی تمام تایپ های پایتون همینکار رو میکنن
وقتی GIL قفل میشه برنامه متوقف میشه تا وقتی آزاد بشه
وقتی این کد رو اجرا کنین متوجه میشین وقتی requests میخواد کارش رو انجام بده کل برنامه رو میزنه متوقف میکنه، چرا؟
داخل requests از socket استفاده میشه که socket برای انجام هرکاری اول GIL رو قفل میکنه که این باعث میشه کل برنامتون متوقف میشه ( باید از aiohttp یا httpx یا ... استفاده کنید )
همونطور که گفتم «تمام لایبرری های پایتون ( ۹۰ درصدشون ) برای اینکه thread-safe باشن، هرکاری میخوان بکنن میزنن GIL رو قفل میکنن» درست مثل socket.
حتی دیکشنری هم برای هرکاری GIL رو قفل میکنه اما اینقدر سریع عمل میکنه آسیبی به برنامه نمیزنه
همتون داخل برنامه های async، هر تابعی رو گیر میارید async def مینویسید، خب این اشتباهه چون تاثیری نداره.
خب این چه تاثیری داشت؟ هیچی. اصلا نیازی نیست async def بنویسین چون تاثیری نداره.
این چی؟ بازم هیچ تاثیری نداره چون اصلا نیازی به async بودن تابع نیست،فقط باعث میشین تابع کند تر عمل بکنه
فقط زمانی حق دارید تابعی رو async def تعریف کنید که مجبورید
من اینجا مجبورم async def تعریف کنم چون اگه نباشه نمیتونم await کنم
🌟 ادامه داستان توی پست های بعدی ...
@CodingLovers_OFF
وقتی برنامه ای مینویسم که قراره از threading ( یا async ) برای اجرای همزمان چند پروسه استفاده کنه، بحث thread safe موضوع حساسی میشه.
البته که پایتون درحالت عادی کلا thread safe هستش، اما توی شرایطی مثل نوشتن همزمان فایل یا کار با یسری لایبرری ها به مشکل میخوریم.🧶 مفهوم thread-safe
ما به تابعی یا classی میگیم thread-safe که اگر همزمان در یک لحظه چندین بار تغییرات در اون ایجاد بشه و خونده بشه، بدون هیچ مشکلی عمل کنه.
تمام تایپ های اصلی پایتون از نسخه ۳.۸ یا ۳.۹ به بعد thread safe هستن؛ dict list set int float ...🏎️ مفهوم race condition
توی کاربرد GIL بهتر درک میکنین
این دقیقا زمانی هستش که دو نفر همزمان به چیزی مشترک دسترسی پیدا میکنن که مشکلات عجیبی پیش میاد اینجا:
فرض کنید متغییر counter برابر با 0 هستش.
فرد x و y همزمان بهش دسترسی پیدا میکنن.
فرد y یک عدد به counter اضافه میکنه.
فرد x متغییر counter رو میخونه و استفادش میکنه.
چه اتفاقی میوفته؟ فرد y یکی به counter اضافه کرده و شده 1، ولی فرد x همچنان از مقدار 0 استفاده کرده.
اگه امتحان کنین همچین اتفاقی رو نمیبینین چون پایتون خودش جلوشو میگیره
یا یه مثال بهتر؛ همزمان دو نفر میخوان یک فایل رو تغییر بدن، کلا محتوای فایل یچیز عجیب غریب میشه
اینو میتونین راحت امتحان کنین
به این اتفاقات میگن race condition.
🔒 درک بهتر کاربرد GIL توی async
چرا میگم از requests یا socket توی ربات هاتون ( حالت اسینک ) استفاده نکنین؟ دلیلش همینجاست.
اول بنظرم این پست رو بخونین
تمام لایبرری های پایتون ( ۹۰ درصدشون ) برای اینکه thread-safe باشن، هرکاری میخوان بکنن میزنن GIL رو قفل میکنن که مشکلی پیش نیاد؛ حتی تمام تایپ های پایتون همینکار رو میکنن
وقتی GIL قفل میشه برنامه متوقف میشه تا وقتی آزاد بشه
async def loop():
for i in range(10000):
print(i)
async def req():
requests.get("https://google.com")
async def main():
asyncio.create_task(loop())
await req()
asyncio.run(main())
وقتی این کد رو اجرا کنین متوجه میشین وقتی requests میخواد کارش رو انجام بده کل برنامه رو میزنه متوقف میکنه، چرا؟
داخل requests از socket استفاده میشه که socket برای انجام هرکاری اول GIL رو قفل میکنه که این باعث میشه کل برنامتون متوقف میشه ( باید از aiohttp یا httpx یا ... استفاده کنید )
همونطور که گفتم «تمام لایبرری های پایتون ( ۹۰ درصدشون ) برای اینکه thread-safe باشن، هرکاری میخوان بکنن میزنن GIL رو قفل میکنن» درست مثل socket.
حتی دیکشنری هم برای هرکاری GIL رو قفل میکنه اما اینقدر سریع عمل میکنه آسیبی به برنامه نمیزنه
همتون داخل برنامه های async، هر تابعی رو گیر میارید async def مینویسید، خب این اشتباهه چون تاثیری نداره.
async def req():
requests.get("https://google.com")
خب این چه تاثیری داشت؟ هیچی. اصلا نیازی نیست async def بنویسین چون تاثیری نداره.
async def select():
cursor = conn.cursor()
cursor.execute("SELECT * FROM users;")
return cursor.fetchall()
این چی؟ بازم هیچ تاثیری نداره چون اصلا نیازی به async بودن تابع نیست،فقط باعث میشین تابع کند تر عمل بکنه
فقط زمانی حق دارید تابعی رو async def تعریف کنید که مجبورید
async def req():
await httpx.get("https://google.com")
من اینجا مجبورم async def تعریف کنم چون اگه نباشه نمیتونم await کنم
این قانون رو رعایت نکنین فقط باعث میشید تابع کند تر عمل کنه
🌟 ادامه داستان توی پست های بعدی ...
@CodingLovers_OFF
❤10👍2
Coding Lovers
🧶 چطور یک برنامه رو thread safe کنیم؟ وقتی برنامه ای مینویسم که قراره از threading ( یا async ) برای اجرای همزمان چند پروسه استفاده کنه، بحث thread safe موضوع حساسی میشه. البته که پایتون درحالت عادی کلا thread safe هستش، اما توی شرایطی مثل نوشتن همزمان فایل…
🧶 چطور یک برنامه رو thread safe کنیم؟ ( پارت دوم )
بهضی مفاهیم رو متوجه شدیم، حالا بریم سراغ راه حل ها.
برای ایجاد یک برنامه thread-safe ما از چیزایی مثل Lock و RwLock استفاده میکنیم
💭 نحوه کارکرد mutual exclusion
ما برای اینکه مشکلاتی مثل race condition هارو برطرف کنیم به سیستمی نیاز داریم تا از دسترسی همزمان به یک متغیر ( یا حافظه مموری ) رو مدیریت کنه.
اسم این سیستم رو میزاریم mutual exclusion.
برای اینکه نحوه کارکرد رو متوجه بشید، یه شبیه سازی انجام میدم:
یک متغیر locked رو فرض کنید که میتونه True یا False باشه.
دو تِرِد همزمان دارن اجرا میشن که قراره یک فایل رو ادیت بزنن.
اگه بدون هیچ توجهی به race condition کارشون رو انجام بدن، محتویات فایل میریزه بهم، پس نیازه که یجوری بهم خبر بدن که «داداش صبر کن من دارم ادیت میزنم، بعد من ادیت بزن».
چجوری خبر میدن؟ هرکی قراره ادیت بزنه باید locked رو True کنه، کارش تموم شد False کنه.
اینجوری نفر دوم میتونه بررسی کنه آیا مقدار locked به True تبدیل شده ؟ ( یعنی نفر اول داره ادیت میزنه یا نه؟ )
اگه اره خب صبر میکنه تا locked دوباره بشه False.
🔒 انواع Lock در پایتون
- نوع مخصوص thread:
- نوع مخصوص async
🌟 اموزش استفاده از threading.Lock
یک تابع رو فرض کنید که فایلی رو ادیت بزنه:
اگه بدون استفاده از lock، همزمان اجراش کنیم کل محتویات فایل میریزه بهم.
اینجوری اگه همزمان در یک لحظه ادیت بزنن محتویات میریزه بهم
پس میایم از threading.Lock استفاده میکنیم:
اینجوری مشکل حل میشه و برنامه thread-safe پیش میره.
🌟 ادامه داستان توی پست های بعدی ...
@CodingLovers_OFF
بهضی مفاهیم رو متوجه شدیم، حالا بریم سراغ راه حل ها.
برای ایجاد یک برنامه thread-safe ما از چیزایی مثل Lock و RwLock استفاده میکنیم
تو زبان های سطح پایین بهشون میگن Mutex و RwMutex ( و دقیق تر میشه mutual exclusion )
💭 نحوه کارکرد mutual exclusion
ما برای اینکه مشکلاتی مثل race condition هارو برطرف کنیم به سیستمی نیاز داریم تا از دسترسی همزمان به یک متغیر ( یا حافظه مموری ) رو مدیریت کنه.
اسم این سیستم رو میزاریم mutual exclusion.
برای اینکه نحوه کارکرد رو متوجه بشید، یه شبیه سازی انجام میدم:
یک متغیر locked رو فرض کنید که میتونه True یا False باشه.
locked = True # or False
دو تِرِد همزمان دارن اجرا میشن که قراره یک فایل رو ادیت بزنن.
اگه بدون هیچ توجهی به race condition کارشون رو انجام بدن، محتویات فایل میریزه بهم، پس نیازه که یجوری بهم خبر بدن که «داداش صبر کن من دارم ادیت میزنم، بعد من ادیت بزن».
چجوری خبر میدن؟ هرکی قراره ادیت بزنه باید locked رو True کنه، کارش تموم شد False کنه.
اینجوری نفر دوم میتونه بررسی کنه آیا مقدار locked به True تبدیل شده ؟ ( یعنی نفر اول داره ادیت میزنه یا نه؟ )
اگه اره خب صبر میکنه تا locked دوباره بشه False.
سیستم mutual exclusion دقیقا کار locked رو انجام میده
🔒 انواع Lock در پایتون
- نوع مخصوص thread:
طبق مثال خودمون، وقتی ببینه locked شده True، کل تِرِد رو متوقف میکنه، تا یه تِرِد دیگه بیاد locked رو بکنه False
- نوع مخصوص async
طبق مثال خودمون، وقتی ببینه locked شده True، کل task رو متوقف میکنه، تا یه task دیگه بیاد locked رو بکنه False
🌟 اموزش استفاده از threading.Lock
یک تابع رو فرض کنید که فایلی رو ادیت بزنه:
def write(text):
with open("a.txt", "w") as fd:
fd.write(text)
اگه بدون استفاده از lock، همزمان اجراش کنیم کل محتویات فایل میریزه بهم.
t1 = threading.Thread(target=write, args=("Hello Man",))
t2 = threading.Thread(target=write, args=("Im amazing",))
t1.start()
t2.start()اینجوری اگه همزمان در یک لحظه ادیت بزنن محتویات میریزه بهم
ممکنه تست کنین نریزه بهم، یکم تعداد ترد هارو بیشتر کنین جواب میده؛ به cpuتون بستگی داره.
پس میایم از threading.Lock استفاده میکنیم:
lock = threading.Lock()
def write(text):
with lock:
with open("a.txt", "w") as fd:
fd.write(text)
# rest of code ...
اینجوری مشکل حل میشه و برنامه thread-safe پیش میره.
🌟 ادامه داستان توی پست های بعدی ...
@CodingLovers_OFF
❤3
سال نو میلادی مبارک 🎉
ایشالله سالی پر از پروژه، بدون باگ، و پیشرفت داشته باشید
ایشالله سالی پر از پروژه، بدون باگ، و پیشرفت داشته باشید
❤14👍3🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤11👍2👎1
Coding Lovers
🧶 چطور یک برنامه رو thread safe کنیم؟ ( پارت دوم ) بهضی مفاهیم رو متوجه شدیم، حالا بریم سراغ راه حل ها. برای ایجاد یک برنامه thread-safe ما از چیزایی مثل Lock و RwLock استفاده میکنیم تو زبان های سطح پایین بهشون میگن Mutex و RwMutex ( و دقیق تر میشه mutual…
🧶 چطور یک برنامه رو thread safe کنیم؟ ( پارت سوم )
🌟 اموزش استفاده از asyncio.Lock
استفاده از این هم دقیقا مثل threading.Lock انجام میشه
با این تفاوت که به async with احتیاج داره:
🔏 پس RwLock چیه و فرقش با Lock چیه
برخلاف Lock، بین خوندن و نوشتن تفاوت قائل میشه. یعنی چی؟
همزمان خوندن یک حافظه مموری یا فایل، هیچ مشکلی نداره و هزاران نفر همزمان میتونن بخونن. اما در مورد نوشتن، فقط حتما باید یک نفر اینکار رو انجام بده وگرنه مشکل ساز میشه.
توی Lock اهمیت نداره قراره بخونی، یا بنویسی پس درهرصورت یک نفر میتونست کاری رو انجام بده.
اما توی RwLock بهمون این امکان رو میده که فرق قائل بشیم. بهمون اجازه میده هزاران نفر بخونن، ولی یک نفر حق نوشتن داره.
خلاصه اگه پایتون همچین چیزی داشت، تقریبا باید همچین سینتکسی میداشت:
💭 سخن پایانی
امیدوارم بدردتون خورده باشه و از این به بعد حواستون به این مسائل باشه. خصوصا توی نوشتن و خوندن فایل ها خیلی دقت کنید
@CodingLovers_OFF
🌟 اموزش استفاده از asyncio.Lock
استفاده از این هم دقیقا مثل threading.Lock انجام میشه
با این تفاوت که به async with احتیاج داره:
async with lock:
# rest of code ...
🔏 پس RwLock چیه و فرقش با Lock چیه
اول بهتره بگم متصفانه پایتون توی کتابخونه های استانداردش اینو نداره، پس فقط توضیحش میدم
برخلاف Lock، بین خوندن و نوشتن تفاوت قائل میشه. یعنی چی؟
همزمان خوندن یک حافظه مموری یا فایل، هیچ مشکلی نداره و هزاران نفر همزمان میتونن بخونن. اما در مورد نوشتن، فقط حتما باید یک نفر اینکار رو انجام بده وگرنه مشکل ساز میشه.
توی Lock اهمیت نداره قراره بخونی، یا بنویسی پس درهرصورت یک نفر میتونست کاری رو انجام بده.
اما توی RwLock بهمون این امکان رو میده که فرق قائل بشیم. بهمون اجازه میده هزاران نفر بخونن، ولی یک نفر حق نوشتن داره.
خلاصه اگه پایتون همچین چیزی داشت، تقریبا باید همچین سینتکسی میداشت:
lock = RwLock()
with lock.read():
# for reading ...
with lock.write():
# for writing ...
📌 یه نکته: پایتون یچی داره به اسم RLock. مزخرفه تفاوت زیادی با Lock نداره.
💭 سخن پایانی
امیدوارم بدردتون خورده باشه و از این به بعد حواستون به این مسائل باشه. خصوصا توی نوشتن و خوندن فایل ها خیلی دقت کنید
- یادتون باشه الکی async def ننویسین
- از لایبرری هایی مثل requests که برنامه رو قفل میکنن توی برنامه های async استفاده نکنین
@CodingLovers_OFF
👍6
🔥 چند تا لایبرری پر سرعت توی پایتون
• میخوای درخواست http بزنی؟ HttpX
• میخوای با JSON کار کنی؟ orjson
• دنبال رمزنگاری هستی؟ cryptography
• میخوای با Yaml کار کنی؟ msgspec
• میخوای با Toml کار کنی؟ msgspec
• میخوای با MsgPack کار کنی؟ msgspec
• میخوای کار cache انجام بدی؟ cachebox
• میخوای با UUID کار کنی؟ fastuuid
• میخوای با دیتافریم ها کار کنی؟ polars ( مثل pandas ولی سریعتره )
ادیت: لایبرری آمادس markupever
@CodingLovers_OFF
• میخوای درخواست http بزنی؟ HttpX
• میخوای با JSON کار کنی؟ orjson
• دنبال رمزنگاری هستی؟ cryptography
• میخوای با Yaml کار کنی؟ msgspec
• میخوای با Toml کار کنی؟ msgspec
• میخوای با MsgPack کار کنی؟ msgspec
• میخوای کار cache انجام بدی؟ cachebox
• میخوای با UUID کار کنی؟ fastuuid
• میخوای با دیتافریم ها کار کنی؟ polars ( مثل pandas ولی سریعتره )
• میخوای اسکریپنگ انجام بدی؟ منتظر لایبرریم بمون ❤️😂
ادیت: لایبرری آمادس markupever
@CodingLovers_OFF
1👍7🔥4❤2
این لایبرری شبیه pydantic عمل میکنه ( قابلیت هاش کمتره ) و میتونید باهاش فرمت های json، toml، yaml، و msgpack رو با سرعت بالا بخونید یا بنویسید.
روش نصب:
pip3 install msgspec
تفاوتش با لایبرری های دیگه اینه که سرعتش واقعا بالاست توی json و msgpack حتی از orjson هم سریع تره.
و قابلیت خفنی که داره مثل pydantic میتونید کلاس تعریف کنید و براتون فرمت هارو به کلاس تبدیل کنه
داکیومنت
با تشکر از нυн?
@CodingLovers_OFF
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4👎3🤣2🔥1
Forwarded from جادی | Jadi
شاید این ماهها من به نظر خیلی کم کار بیام (: ولی در عمل ماجرا اینه که دارم یه دوره جدید و کامل پایتون با مکتبخونه ضبط می کنم و پیگیری و دقت اونها کار رو مفصل می کنه! فعلا حدود ۶۰ تا ویدئو داریم و نکات مقدماتی تا پیشرفته پایتون جدید رو توش توضیح می دم. تقریبا آخرهاشه و امیدوارم به زودی منتشر بشه.
1❤21👍7🔥2👎1
جادی | Jadi
شاید این ماهها من به نظر خیلی کم کار بیام (: ولی در عمل ماجرا اینه که دارم یه دوره جدید و کامل پایتون با مکتبخونه ضبط می کنم و پیگیری و دقت اونها کار رو مفصل می کنه! فعلا حدود ۶۰ تا ویدئو داریم و نکات مقدماتی تا پیشرفته پایتون جدید رو توش توضیح می دم. تقریبا…
نمیدونم چرا، ولی خوشحال شدم اینو شنیدم
👍24
سلام رفقا 😏
امروز میخوام درباره یه ابزار خفن به اسم Celery صحبت کنم 🥬
گاهی وقتا توی برنامههامون کارایی داریم که یکم طول میکشه. مثلاً:
- پردازش تصویر
- جنریت کردن فایلهای سنگین
خب نمیخوایم کاربر پشت سایت بمونه و Loading ببینه
Celery دقیقاً همینجا به کارمون میاد💀
اصلا سلری چیه؟
سلری یه Task Queue هست که با پایتون نوشته شده و کارش اینه که وظایف سنگین برنامه رو به صورت ایسینک (غیرهمزمان) اجرا کنه.
معماریش خیلی سادهست:
1.Producer:
همون برنامه اصلی که تسکها رو میسازه (مثلاً جنگو)
2. Broker:
یه واسطه مثل Redis یا RabbitMQ که تسکها رو نگه میداره
3. Worker:
اونی که میاد تسکها رو از صف برمیداره و اجرا میکنه
نکته جالب اینه که میتونید چندتا Worker داشته باشید که همزمان دارن کار میکنن
همچنین Celery از Retry هم پشتیبانی میکنه. یعنی اگه تسک با خطا مواجه شد، میتونه دوباره تلاش کنه
مثال،
فرض کنید یه سایت داریم که کاربر عکس آپلود میکنه و میخواد فیلتر روش اعمال کنه. کد سادش میشه:
بزن قلبو❤️
امروز میخوام درباره یه ابزار خفن به اسم Celery صحبت کنم 🥬
گاهی وقتا توی برنامههامون کارایی داریم که یکم طول میکشه. مثلاً:
- پردازش تصویر
- جنریت کردن فایلهای سنگین
خب نمیخوایم کاربر پشت سایت بمونه و Loading ببینه
Celery دقیقاً همینجا به کارمون میاد
اصلا سلری چیه؟
سلری یه Task Queue هست که با پایتون نوشته شده و کارش اینه که وظایف سنگین برنامه رو به صورت ایسینک (غیرهمزمان) اجرا کنه.
معماریش خیلی سادهست:
1.Producer:
همون برنامه اصلی که تسکها رو میسازه (مثلاً جنگو)
2. Broker:
یه واسطه مثل Redis یا RabbitMQ که تسکها رو نگه میداره
3. Worker:
اونی که میاد تسکها رو از صف برمیداره و اجرا میکنه
نکته جالب اینه که میتونید چندتا Worker داشته باشید که همزمان دارن کار میکنن
همچنین Celery از Retry هم پشتیبانی میکنه. یعنی اگه تسک با خطا مواجه شد، میتونه دوباره تلاش کنه
مثال،
فرض کنید یه سایت داریم که کاربر عکس آپلود میکنه و میخواد فیلتر روش اعمال کنه. کد سادش میشه:
from celery import Celery
from PIL import Image
app = Celery('image_app', broker='redis://localhost:6379/0')
@app.task
def process_image(image_path):
img = Image.open(image_path)
img.filter(ImageFilter.BLUR).save('processed.jpg')
return "تصویر آماده شد"
@app.route('/upload', methods=['POST'])
def upload():
process_image.delay(image_path)
return "لطفاً منتظر بمونید!"
بزن قلبو
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👍6🔥1
👎15🤣7❤3👍1😁1
🔥8
یک ادیتور خفن با فرانت بساز❗
یه لایبرری خفن به اسم Ace وجود داره که تازه باهاش آشنا شدم و خواستم معرفیش کنم.
با این لایبرری خفن که برای JavaScript هستش میتونین با چند خط کد یه ادیتور تمام و کمال داخل یه صفحه وب بسازید.
- 110 زبان رو پشتیبانی میکنه
- 20 مدل تم داره
- قابلیت اتوکامپلیت داره
- کاملا key binding ها رو میشه کاستومایز کرد
- حتی قابلیت command line داره!
- و ...
کمپانی های Mozilla و Cloud9 باهم دارن هنوز توسعهش میدن🔥
سایت:
https://ace.c9.io/
گیتهاب پروژه:
https://github.com/ajaxorg/ace
دمو:
https://ace.c9.io/build/kitchen-sink.html
@CodingLovers_OFF
یه لایبرری خفن به اسم Ace وجود داره که تازه باهاش آشنا شدم و خواستم معرفیش کنم.
با این لایبرری خفن که برای JavaScript هستش میتونین با چند خط کد یه ادیتور تمام و کمال داخل یه صفحه وب بسازید.
- 110 زبان رو پشتیبانی میکنه
- 20 مدل تم داره
- قابلیت اتوکامپلیت داره
- کاملا key binding ها رو میشه کاستومایز کرد
- حتی قابلیت command line داره!
- و ...
کمپانی های Mozilla و Cloud9 باهم دارن هنوز توسعهش میدن🔥
سایت:
https://ace.c9.io/
گیتهاب پروژه:
https://github.com/ajaxorg/ace
دمو:
https://ace.c9.io/build/kitchen-sink.html
@CodingLovers_OFF
👍7❤4🔥1
پایه اید بریم توی عمق روانشناسی رنگ ها؟
کلی تحقیق و مقاله بخونیم و روانشناسی رنگ ها رو بفهمیم.
روانشناسی رنگ ها داخل طراحی سایت و برندینگ و لوگوسازی کمک میکنه
کلی تحقیق و مقاله بخونیم و روانشناسی رنگ ها رو بفهمیم.
روانشناسی رنگ ها داخل طراحی سایت و برندینگ و لوگوسازی کمک میکنه
👍18👎3🔥2❤1