This media is not supported in your browser
VIEW IN TELEGRAM
Animejs
یه کتابخونه لایتویت و قدرتمنده که با چند خط کد میتونی هر چیزی رو به حرکت دربیاری از متن و دکمه گرفته تا SVG و گرافیک
-میشه گفت anime.js یه جورایی برای وب مثل یه نسخهی مینی و سبک از After Effects عمل میکنه
توی After Effects انیمیشنهای گرافیکی میسازی و خروجی ویدئو میگیری
توی anime.js همون سبک انیمیشنها رو ولی با کد جاوااسکریپت مستقیم روی المانهای صفحهی وب اجرا میکنی
یه کتابخونه لایتویت و قدرتمنده که با چند خط کد میتونی هر چیزی رو به حرکت دربیاری از متن و دکمه گرفته تا SVG و گرافیک
-میشه گفت anime.js یه جورایی برای وب مثل یه نسخهی مینی و سبک از After Effects عمل میکنه
توی After Effects انیمیشنهای گرافیکی میسازی و خروجی ویدئو میگیری
توی anime.js همون سبک انیمیشنها رو ولی با کد جاوااسکریپت مستقیم روی المانهای صفحهی وب اجرا میکنی
❤2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
ی چیز باحال که دیدم این دمو بود که با استفاده از کتابخونه های Three.js و Anime.js ساخته شده که تغییر شکل پیچیده ذرات را بین چند شکل مختلف نشون میده
🔥3
کار با متغیر های محیطی (Environment Variables) در پایتون 🐍
احتمالا برات پیش اومده که اطلاعات حساسی مثل API Keyها، رمز عبور دیتابیس یا تنظیمات مهم اپلیکیشنت رو مستقیم توی کد بذاری. مثلا:
خب این روش 👎 امن نیست! چون اگه کسی کد رو ببینه، راحت به اطلاعات حساس شما دسترسی پیدا میکنه.
✅ راهحل: استفاده از فایل
حالا فایل
فایل
کافیه یه فایل
این شکلی همه چیز مرتب و امن میمونه ✅
استفاده از python-dotenv 🐍
برای اینکه بتونیم متغیرهای موجود در فایل
نحوه نصب:
نحوه استفاده:
فایل
حالا کافیه تو فایل
به همین سادگی میشه از متغیر های تعریف شده استفاده کرد. البته که راه های دیگه هم وجود داره!
برای مثال میتونیم به جای استفاده از تابع
کافیه کدمون رو به این شکل تغییر بدیم:
تابع
نکته مهم: همیشه فایل
چند ترفند جذاب با .env 🍭
📂 جدا کردن متغیرهای عمومی و خصوصی:
فرض کنید که بخوایم یک سری اطلاعات رو به صورت عمومی در دسترس بقیه قرار بدیم و باقی موارد حساس رو نگه داریم، برای این کار میتونیم یک فایل
داخل فایل
داخل فایل
حالا داخل فایل
از اونجایی که تابع
🔗 استفاده از متغیرهای تو در تو:
مزایای استفاده از .env:
🎯 مزایای استفاده از .env
🔒 امنیت: اطلاعات مهم داخل کد نیست.
🔄 انعطافپذیری: راحت میتونی برای محیطهای مختلف (dev/test/prod) تغییر بدی.
🗂 نظم: کدت تمیزتر و حرفهایتر میمونه.
برای اطلاعات بیشتر میتونید به مستندات رسمی python-dotenv مراجعه کنید
امیدوارم این پست براتون مفید باشه! اگه سوالی دارید، همینجا بپرسید. 👇
احتمالا برات پیش اومده که اطلاعات حساسی مثل API Keyها، رمز عبور دیتابیس یا تنظیمات مهم اپلیکیشنت رو مستقیم توی کد بذاری. مثلا:
# API Key
api_key = 'your_api_key'
# DataBase Config
db_user = 'root'
db_password = 'your_db_password'
خب این روش 👎 امن نیست! چون اگه کسی کد رو ببینه، راحت به اطلاعات حساس شما دسترسی پیدا میکنه.
✅ راهحل: استفاده از فایل
.envحالا فایل
.env چی هست؟ 🤔فایل
.env (مخفف environment) یک فایل متنی سادهست که برای نگهداری متغیرهای محیطی (Environment Variables) استفاده میشه. این متغیرها به ما این امکان رو میدن که اطلاعات حساس و تنظیمات مختلف رو از کدمون جدا کنیم!کافیه یه فایل
.env تو root پروژه خودمون بسازیم و متغیر های خودمون رو به صورت key=value توش بنویسیم. مثلا:# API Key
API_KEY=your_api_key
# DataBase Config
DB_USER=root
DB_PASSWORD=your_db_password
این شکلی همه چیز مرتب و امن میمونه ✅
استفاده از python-dotenv 🐍
برای اینکه بتونیم متغیرهای موجود در فایل
.env رو در پروژه پایتون خودمون لود کنیم، بهترین راه استفاده از کتابخانه python-dotenv هست.نحوه نصب:
pip install python-dotenv
نحوه استفاده:
فایل
.env که ساختیم رو در نظر بگیرید:# API Key
API_KEY=your_api_key
# DataBase Config
DB_USER=root
DB_PASSWORD=your_db_password
حالا کافیه تو فایل
main.py ، به این شکل متغیر ها رو لود کنیم:import os
from dotenv import load_dotenv
# لود کردن متغیرها از فایل .env
load_dotenv()
# دسترسی به متغیرها
db_user = os.getenv("DB_USER")
db_pass = os.getenv("DB_PASSWORD")
api_key = os.getenv("API_KEY")
print(f"Database User: {db_user}")
print(f"API Key: {api_key}")
به همین سادگی میشه از متغیر های تعریف شده استفاده کرد. البته که راه های دیگه هم وجود داره!
برای مثال میتونیم به جای استفاده از تابع
load_dotenv() از dotenv_values() استفاده کنیم.کافیه کدمون رو به این شکل تغییر بدیم:
from dotenv import dotenv_values
# لود کردن متغیر ها به شکل دیکشنری
config = dotenv_values('.env')
# دسترسی به متغیرها
db_user = config['DB_USER']
db_pass = config['DB_PASSWORD']
api_key = config['API_KEY']
تابع
dotenv_values() یک دیکشنری با مقادیر parse شده از فایل .env رو بر میگردونه!نکته مهم: همیشه فایل
.env رو به فایل .gitignore اضافه کنید تا به صورت تصادفی تو مخزن گیتهاب شما منتشر نشه!چند ترفند جذاب با .env 🍭
📂 جدا کردن متغیرهای عمومی و خصوصی:
فرض کنید که بخوایم یک سری اطلاعات رو به صورت عمومی در دسترس بقیه قرار بدیم و باقی موارد حساس رو نگه داریم، برای این کار میتونیم یک فایل
.env.shared و یک فایل .env.secret ایجاد کنیم. حالا باید اطلاعات حساس خودمون رو داخل فایل .env.secret و باقی اطلاعات رو داخل فایل .env.shared قرار بدیم 👇.
├── main.py
├── .gitignore
├── .env.shared
└── .env.secret
داخل فایل
.env.shared# shared.env
API_PATH="/api/v1"
ENV_NAME="shared"
داخل فایل
.env.secret# secret.env
API_KEY=your_api_key
DB_USER=root
DB_PASSWORD=your_db_password
حالا داخل فایل
main.py به این شکل متغیر ها رو لود میکنیم:from dotenv import dotenv_values
config = {
**dotenv_values('.env.shared'),
**dotenv_values('.env.secret')
}
api_key = config['API_KEY']
api_path = config['API_PATH']
از اونجایی که تابع
dotenv_values() به عنوان خروجی یه دیکشنری بر میگردونه، میتونیم با استفاده از عملگر ** مقادیر رو unpack کنیم و یک دیکشنری شامل همه متغیر ها داشته باشیم🔗 استفاده از متغیرهای تو در تو:
SERVER=127.0.0.1
PORT=5500
ADDRESS=${SERVER}:${PORT}
from dotenv import dotenv_values
config = dotenv_values('.env')
print(config['ADDRESS']) # 127.0.0.1:5500
مزایای استفاده از .env:
🎯 مزایای استفاده از .env
🔒 امنیت: اطلاعات مهم داخل کد نیست.
🔄 انعطافپذیری: راحت میتونی برای محیطهای مختلف (dev/test/prod) تغییر بدی.
🗂 نظم: کدت تمیزتر و حرفهایتر میمونه.
برای اطلاعات بیشتر میتونید به مستندات رسمی python-dotenv مراجعه کنید
امیدوارم این پست براتون مفید باشه! اگه سوالی دارید، همینجا بپرسید. 👇
👏3🔥1
👨💻 برنامه نویسی رو از صفر مطلق یاد بگیر با ساخت پروژه های واقعی و حل تمرین ها
هوش مصنوعی OpenLume مثل یه معلم خصوصی برات نقشه راه شخصی میچینه و قدم به قدم کمکت میکنه
➖ اول سطح دانش تو رو میسنجه و بعد براساسش یه برنامه آموزشی با کیس های واقعی میسازه
➖ هر پایه ای که لازم داشته باشی از الگوریتم و ساختمان داده ها گرفته تا فریم ورک ها و کتابخونه های تخصصی
➖ بدون هیچ روتین و درس خسته کننده همه چی رو در عمل حل میکنی و یاد میگیری
➖ سرویس حتی با صدا هم باهات حرف میزنه مثل یه معلم مهربون ولی جدی دقیق بهت میگه کجا اشتباه کردی
#ai
هوش مصنوعی OpenLume مثل یه معلم خصوصی برات نقشه راه شخصی میچینه و قدم به قدم کمکت میکنه
➖ اول سطح دانش تو رو میسنجه و بعد براساسش یه برنامه آموزشی با کیس های واقعی میسازه
➖ هر پایه ای که لازم داشته باشی از الگوریتم و ساختمان داده ها گرفته تا فریم ورک ها و کتابخونه های تخصصی
➖ بدون هیچ روتین و درس خسته کننده همه چی رو در عمل حل میکنی و یاد میگیری
➖ سرویس حتی با صدا هم باهات حرف میزنه مثل یه معلم مهربون ولی جدی دقیق بهت میگه کجا اشتباه کردی
#ai
👍2🔥1
بررسی کد فقط در چند دقیقه!
سرویسی اومده که با استفاده از هوش مصنوعی، کد رو اسکن میکنه، آسیبپذیریها رو پیدا میکنه و حتی با ابزارهای پنتست حمله رو شبیهسازی میکنه.
در واقع Strix بهصورت خودکار پروژهت رو بررسی میکنه، مشکلات رو رفع میکنه و گزارش آماده میکنه — کاملاً امن و روی سیستم خودت اجرا میشه.
سرویسی اومده که با استفاده از هوش مصنوعی، کد رو اسکن میکنه، آسیبپذیریها رو پیدا میکنه و حتی با ابزارهای پنتست حمله رو شبیهسازی میکنه.
در واقع Strix بهصورت خودکار پروژهت رو بررسی میکنه، مشکلات رو رفع میکنه و گزارش آماده میکنه — کاملاً امن و روی سیستم خودت اجرا میشه.
🔥4👍1
This media is not supported in your browser
VIEW IN TELEGRAM
👨💻کتابخونه Muuri: جادوگر چیدمانهای وب! ✨
تا حالا شده بخوای یه گالری عکس بسازی که بشه عکسها رو با Drag-and-drop توش جابهجا کرد؟ یا یه داشبورد که کاربر خودش بتونه کارتها رو بچینه؟ اگه اینجور کارها به نظرت سخت میاد، Muuri دقیقاً همون چیزیه که دنبالشی!
این کتابخونه جاوااسکریپت مثل یه دستیار حرفهای، بهت کمک میکنه تا راحتترین و جذابترین طرحبندیها رو برای وبسایتت بسازی. کار باهاش خیلی سادهست و بدون دردسر میتونی چیدمانهای پیچیده رو پیادهسازی کنی.
کتابخونه Muuri هم خیلی قدرتمنده و هم خیلی سبکه، برای همین عملکردش عالیه و با فریمورکهایی مثل React و Vue هم به خوبی هماهنگ میشه. اگه دنبال یه راه ساده و حرفهای برای ساختن چیدمانهای تعاملی و زیبا هستی، حتماً یه سر بهش بزن!
🔗 https://muuri.dev
#library #js
تا حالا شده بخوای یه گالری عکس بسازی که بشه عکسها رو با Drag-and-drop توش جابهجا کرد؟ یا یه داشبورد که کاربر خودش بتونه کارتها رو بچینه؟ اگه اینجور کارها به نظرت سخت میاد، Muuri دقیقاً همون چیزیه که دنبالشی!
این کتابخونه جاوااسکریپت مثل یه دستیار حرفهای، بهت کمک میکنه تا راحتترین و جذابترین طرحبندیها رو برای وبسایتت بسازی. کار باهاش خیلی سادهست و بدون دردسر میتونی چیدمانهای پیچیده رو پیادهسازی کنی.
کتابخونه Muuri هم خیلی قدرتمنده و هم خیلی سبکه، برای همین عملکردش عالیه و با فریمورکهایی مثل React و Vue هم به خوبی هماهنگ میشه. اگه دنبال یه راه ساده و حرفهای برای ساختن چیدمانهای تعاملی و زیبا هستی، حتماً یه سر بهش بزن!
🔗 https://muuri.dev
#library #js
❤3🔥1
تایپهینتینگ (Type Hinting) در پایتون 🐍
پایتون ذاتاً داینامیک تایپ هست یعنی وقتی یه متغیر تعریف میکنی، لازم نیست نوعش رو مشخص کنی:
✅ نکته مثبت: این موضوع داینامیک بودن سرعت کدنویسی رو بالا میبره
❌ اما تو پروژههای بزرگ میتونه باعث خطاهای سردرگم بشه (مثلاً خطا میده ولی نمیدونی مشکل از کجاست)
ورود Type Hinting
اینجاست که Type Hinting به کمکت میاد. در واقع این مفهوم میگه که تو میتونی به طور پیشفرض نوع داده رو مشخص کنی.
مثال ساده
مثال در توابع
اینجا گفتیم متغیرهای a و b از نوع عددی باشن و خروجی تابع هم عددی باشه
📦 مثال پیچیدهتر
اینجا گفتیم پارامتر items باید از نوع لیست رشتهای باشه
⚠️ یک نکته خیلی مهم
در واقع Type Hinting فقط راهنماست پایتون خودش جلو اجرای کد رو نمیگیره
print(add("5", "10")) # اجرا میشه
print(add(5, "10")) # خطا میده (TypeError)
🔹 همونطور که میبینید خروجی تابع میتونه خلاف چیزی باشه که تعریف کردی ولی ابزارهایی مثل mypy یا IDEها (مثل PyCharm و VS Code) بهت اخطار میدن
🛠 موارد پرکاربرد در Type Hinting
۱. Optional (مقدار میتونه None باشه)
Optional[str] ?
یعنی پارامتر name میتونه رشته (str) یا None باشه
اگر هیچ مقداری بهش ندی یا مقدارش None باشه، تابع همچنان درست اجرا میشه.
۲. Union (چند نوع مختلف مجاز)
Union[int, float] ?
یعنی پارامتر x میتونه عدد صحیح (int) یا اعشاری (float) باشه
یعنی تابع میتونه با هر دو نوع کار کنه و خروجی رو به صورت float برگردونه
۳. Any (هر نوعی قبول کنه)
Any ?
یعنی پارامتر data میتونه از هر نوعی باشه: عدد، رشته، لیست، دیکشنری، حتی شیء
در واقع هیچ محدودیتی روی نوع داده وجود نداره.
🚀 نسخههای جدید پایتون (3.9+)
از پایتون 3.9 به بعد نوشتن Type Hint سادهتر شد:
دیگه لازم نیست از typing.List یا typing.Dict استفاده کنی.
🏆 چرا Type Hinting مهمه؟
🔍 خطاها رو زودتر پیدا میکنیم (قبل از اجرا).
🧑🤝🧑 کار تیمی راحتتر میشه
📝 مستندات کد واضحتر و خواناتر میشن.
🤖 ابزارهایی مثل mypy یا VS Code کمک میکنن سریعتر دیباگ کنیم
📌 جمعبندی
استفاده از Type Hinting اجباری نیست، اما توی پروژههای جدی شدیداً توصیه میشه.
بهتره حتی تو پروژههای کوچیک هم کمکم ازش استفاده کنی، تا وقتی کدت بزرگتر شد مدیریت راحتتر باشه
پایتون ذاتاً داینامیک تایپ هست یعنی وقتی یه متغیر تعریف میکنی، لازم نیست نوعش رو مشخص کنی:
x = 10 # از نوع عددی
y = "Hi" # از نوع رشته
✅ نکته مثبت: این موضوع داینامیک بودن سرعت کدنویسی رو بالا میبره
❌ اما تو پروژههای بزرگ میتونه باعث خطاهای سردرگم بشه (مثلاً خطا میده ولی نمیدونی مشکل از کجاست)
ورود Type Hinting
اینجاست که Type Hinting به کمکت میاد. در واقع این مفهوم میگه که تو میتونی به طور پیشفرض نوع داده رو مشخص کنی.
مثال ساده
name: str = "CodePode"
age: int = 1
height: float = 1.88
is_active: bool = True
مثال در توابع
def add(a: int, b: int) -> int:
return a + b
اینجا گفتیم متغیرهای a و b از نوع عددی باشن و خروجی تابع هم عددی باشه
📦 مثال پیچیدهتر
def process_items(items: list[str]):
for item in items:
print(item)
اینجا گفتیم پارامتر items باید از نوع لیست رشتهای باشه
⚠️ یک نکته خیلی مهم
در واقع Type Hinting فقط راهنماست پایتون خودش جلو اجرای کد رو نمیگیره
def add(a: int, b: int) -> int:
return a + b
print(add("5", "10")) # اجرا میشه
print(add(5, "10")) # خطا میده (TypeError)
🔹 همونطور که میبینید خروجی تابع میتونه خلاف چیزی باشه که تعریف کردی ولی ابزارهایی مثل mypy یا IDEها (مثل PyCharm و VS Code) بهت اخطار میدن
🛠 موارد پرکاربرد در Type Hinting
۱. Optional (مقدار میتونه None باشه)
from typing import Optional
def greet(name: Optional[str]) -> str:
return f"Hello {name}" if name else "Hello Stranger"
Optional[str] ?
یعنی پارامتر name میتونه رشته (str) یا None باشه
اگر هیچ مقداری بهش ندی یا مقدارش None باشه، تابع همچنان درست اجرا میشه.
۲. Union (چند نوع مختلف مجاز)
from typing import Union
def square(x: Union[int, float]) -> float:
return x * x
Union[int, float] ?
یعنی پارامتر x میتونه عدد صحیح (int) یا اعشاری (float) باشه
یعنی تابع میتونه با هر دو نوع کار کنه و خروجی رو به صورت float برگردونه
۳. Any (هر نوعی قبول کنه)
from typing import Any
def log(data: Any) -> None:
print(data)
Any ?
یعنی پارامتر data میتونه از هر نوعی باشه: عدد، رشته، لیست، دیکشنری، حتی شیء
در واقع هیچ محدودیتی روی نوع داده وجود نداره.
🚀 نسخههای جدید پایتون (3.9+)
از پایتون 3.9 به بعد نوشتن Type Hint سادهتر شد:
def process(data: list[int]) -> dict[str, int]:
return {str(i): i for i in data}
دیگه لازم نیست از typing.List یا typing.Dict استفاده کنی.
🏆 چرا Type Hinting مهمه؟
🔍 خطاها رو زودتر پیدا میکنیم (قبل از اجرا).
🧑🤝🧑 کار تیمی راحتتر میشه
📝 مستندات کد واضحتر و خواناتر میشن.
🤖 ابزارهایی مثل mypy یا VS Code کمک میکنن سریعتر دیباگ کنیم
📌 جمعبندی
استفاده از Type Hinting اجباری نیست، اما توی پروژههای جدی شدیداً توصیه میشه.
بهتره حتی تو پروژههای کوچیک هم کمکم ازش استفاده کنی، تا وقتی کدت بزرگتر شد مدیریت راحتتر باشه
🔥6❤🔥1
Forwarded from Geek Engineers ([ Taha. Dostifam ])
این هم از زبان برنامه نویسی Cyrus که ما موفق به ساختش شدیم.
قدیمیای کانال از روند توسعه ش خبر دارن :)
منتها حقیقتا راه دور و درازی در پیش داریم که توسعه کامپایلر مصیبت های خودشو داره. منتها با کمک و همراهی شما دوستان پیشرفت خیلی زیادی داشتیم و امیدواریم که از پس جبران حمایت های شما بر بیایم.
در حال حاضر داریم type system رو تست میکنیم تا اینکه تا حدی stable بشه. هر موقع استیبل بشه به ادامه دولوپ فیچر های high level مثل error handling و macro ها و generic type ها خواهیم پرداخت انشالله.
#cyrus
@cyrus_lang
https://github.com/cyrus-lang/Cyrus
قدیمیای کانال از روند توسعه ش خبر دارن :)
منتها حقیقتا راه دور و درازی در پیش داریم که توسعه کامپایلر مصیبت های خودشو داره. منتها با کمک و همراهی شما دوستان پیشرفت خیلی زیادی داشتیم و امیدواریم که از پس جبران حمایت های شما بر بیایم.
در حال حاضر داریم type system رو تست میکنیم تا اینکه تا حدی stable بشه. هر موقع استیبل بشه به ادامه دولوپ فیچر های high level مثل error handling و macro ها و generic type ها خواهیم پرداخت انشالله.
#cyrus
@cyrus_lang
https://github.com/cyrus-lang/Cyrus
❤1😁1
Forwarded from EBooks World
اگر همیشه کنجکاو بودهاید که پشت صحنهی مدلهای زبانی بزرگ مثل ChatGPT چه میگذرد، کتابی که به دنبالش بودید همینجاست!
کتاب Build a Large Language Model (From Scratch) نوشتهی Sebastian Raschka، فرصتی بینظیر برای یادگیری ساخت یک مدل زبانی از صفر است—کاملاً کاربردی، گامبهگام، و مناسب اجرا روی لپتاپ شخصی شما.
در این کتاب، نهتنها با مفاهیم اصلی مانند معماری ترنسفورمر و مکانیزم توجه آشنا میشوید، بلکه از پیشپردازش دادهها تا آموزش و تنظیم دقیق مدل برای وظایف خاص مثل طبقهبندی متن و پاسخ به دستورات انسانی را بهصورت کامل پیادهسازی خواهید کرد.
🔗https://www.ebooksworld.ir/post/index/1032
کتاب Build a Large Language Model (From Scratch) نوشتهی Sebastian Raschka، فرصتی بینظیر برای یادگیری ساخت یک مدل زبانی از صفر است—کاملاً کاربردی، گامبهگام، و مناسب اجرا روی لپتاپ شخصی شما.
در این کتاب، نهتنها با مفاهیم اصلی مانند معماری ترنسفورمر و مکانیزم توجه آشنا میشوید، بلکه از پیشپردازش دادهها تا آموزش و تنظیم دقیق مدل برای وظایف خاص مثل طبقهبندی متن و پاسخ به دستورات انسانی را بهصورت کامل پیادهسازی خواهید کرد.
🔗https://www.ebooksworld.ir/post/index/1032
❤3
خط بریل برای نابینایان:
در دهههای اخیر، خط بریل برای عموم مردم آشناتر شده است، زیرا آسانسورها و دستگاههای خودپرداز از بریل برای دسترسی آسانتر استفاده کردهاند(نمومش در آدامس های ایرانی )
این سیستم از الگویی از نقاط برجسته روی کاغذ ضخیم استفاده میکنه و برای استفاده سربازان در هنگام یادداشتبرداری به یکدیگر در تاریکی زمانی که سکوت ضروری بود در نظر گرفته شده بود سربازان میتوانستند این نقاط را با استفاده از یک قلم درفش(نوعی قلم خاص) در پشت کاغذ فرو کنند سپس نقاط برجسته را میشد با انگشتان خواند
نحوه کد گذاری:
در بریل، هر نمادی که در زبان نوشتاری معمولی استفاده میشود به طور خاص، حروف، اعداد و علائم نگارشی - به صورت یک یا چند نقطه برجسته در یک خانه دو در سه کدگذاری میشود
نقاط خانه معمولاً از ۱ تا ۶ شمارهگذاری میشوند
در دهههای اخیر، خط بریل برای عموم مردم آشناتر شده است، زیرا آسانسورها و دستگاههای خودپرداز از بریل برای دسترسی آسانتر استفاده کردهاند(نمومش در آدامس های ایرانی )
این سیستم از الگویی از نقاط برجسته روی کاغذ ضخیم استفاده میکنه و برای استفاده سربازان در هنگام یادداشتبرداری به یکدیگر در تاریکی زمانی که سکوت ضروری بود در نظر گرفته شده بود سربازان میتوانستند این نقاط را با استفاده از یک قلم درفش(نوعی قلم خاص) در پشت کاغذ فرو کنند سپس نقاط برجسته را میشد با انگشتان خواند
نحوه کد گذاری:
در بریل، هر نمادی که در زبان نوشتاری معمولی استفاده میشود به طور خاص، حروف، اعداد و علائم نگارشی - به صورت یک یا چند نقطه برجسته در یک خانه دو در سه کدگذاری میشود
نقاط خانه معمولاً از ۱ تا ۶ شمارهگذاری میشوند
❤2
TheCodəPod
خط بریل برای نابینایان: در دهههای اخیر، خط بریل برای عموم مردم آشناتر شده است، زیرا آسانسورها و دستگاههای خودپرداز از بریل برای دسترسی آسانتر استفاده کردهاند(نمومش در آدامس های ایرانی ) این سیستم از الگویی از نقاط برجسته روی کاغذ ضخیم استفاده میکنه…
مثال :
نقاط ۱، ۳ ،۵ برجسته هستند و نقاط ۲، ۴ و ۶ برجسته نیستند
دلیل اینکه این موضوع مطرح کردم و برای ما جالب هست این موضوع است، که نقاط دودویی هستند(مثل 0 و 1) یک نقطه یاصافه یا برجسته
نقاط ۱، ۳ ،۵ برجسته هستند و نقاط ۲، ۴ و ۶ برجسته نیستند
دلیل اینکه این موضوع مطرح کردم و برای ما جالب هست این موضوع است، که نقاط دودویی هستند(مثل 0 و 1) یک نقطه یاصافه یا برجسته
❤3
TheCodəPod
مثال : نقاط ۱، ۳ ،۵ برجسته هستند و نقاط ۲، ۴ و ۶ برجسته نیستند دلیل اینکه این موضوع مطرح کردم و برای ما جالب هست این موضوع است، که نقاط دودویی هستند(مثل 0 و 1) یک نقطه یاصافه یا برجسته
اگه به کد مورس هم دقت کنیم همین موضوع باینری بودن رو میبینیم یا نقطه یا خط تیره
2❤3👍1
وقتی کسی ازت میپرسه "با چه زبانی برنامه نویسی رو شروع کنم؟"
صرفا زبان مورد علاقه خودت رو بهش پیشنهاد نده!
بهتره که اول از اون شخص بپرسی دوست داره تو چه حوزهای فعالیت کنه. برای مثال:
فرانت اند: جاوااسکریپت
بک اند: جاوااسکریپت
موبایل: جاوااسکریپت
بازی: جاوااسکریپت
هوش مصنوعی: جاوااسکریپت
خلاصه که درست راهنمایی کنید 🫡
صرفا زبان مورد علاقه خودت رو بهش پیشنهاد نده!
بهتره که اول از اون شخص بپرسی دوست داره تو چه حوزهای فعالیت کنه. برای مثال:
فرانت اند: جاوااسکریپت
بک اند: جاوااسکریپت
موبایل: جاوااسکریپت
بازی: جاوااسکریپت
هوش مصنوعی: جاوااسکریپت
خلاصه که درست راهنمایی کنید 🫡
🤣3🤝3🖕1
TheCodəPod
Photo
خب خب خب… داستان این منطق عجیب جاوااسکریپت چیه؟! 🤔
برای اینکه بفهمیم چه اتفاقی میفته، باید یه کمی عملگرهای
💡 عملگر
عملگر
• وقتی هر دو operand عدد باشن ← ساده و منطقی جمع میکنه:
• وقتی هر دو operand رشته (string) باشن ← اونها رو به هم میچسبونه (concat):
• اما وقتی یکی عدد و یکی رشته باشه…
اینجاست که داستان عجیب میشه:
دلیلش اینه که عملگر
💡 عملگر
داستان عملگر
• وقتی هر دو operand عدد باشن ← درست مثل تفریق ریاضی عمل میکنه:
• وقتی یکی یا هر دو operand رشته باشن ← جاوااسکریپت اونها رو به عدد تبدیل میکنه و بعد تفریق میکنه:
🔑 جمعبندی رفتار
• عملگر
• باقی عملگرها مثل
📚 چند مثال جذاب
مثال ۱ – عدد ساده:
مثال ۲ – ترکیب رشته و عدد:
اینجا ابتدا عملگر
✅ جمعبندی نهایی
• عملگر
• عملگر
• اولویت اجرای عملگرهای
برای اینکه بفهمیم چه اتفاقی میفته، باید یه کمی عملگرهای
+ و - رو زیر ذرهبین ببریم.💡 عملگر
+ یا Binary Plusعملگر
+ رفتار متفاوتی نسبت به نوع داده operandها داره:• وقتی هر دو operand عدد باشن ← ساده و منطقی جمع میکنه:
2 + 2 = 4
• وقتی هر دو operand رشته (string) باشن ← اونها رو به هم میچسبونه (concat):
"2" + "2" = "22"
• اما وقتی یکی عدد و یکی رشته باشه…
اینجاست که داستان عجیب میشه:
"2" + 2 = "22"
دلیلش اینه که عملگر
+ وقتی نوع operandها یکی نباشه، اونها رو به رشته تبدیل میکنه."2" + 2 → "2" + "2" → "22"
💡 عملگر
- یا Binary Minusداستان عملگر
- کمی فرق داره:• وقتی هر دو operand عدد باشن ← درست مثل تفریق ریاضی عمل میکنه:
10 - 2 = 8
• وقتی یکی یا هر دو operand رشته باشن ← جاوااسکریپت اونها رو به عدد تبدیل میکنه و بعد تفریق میکنه:
"10" - 4 → 10 - 4 → 6
"10" - "4" → 10 - 4 → 6
🔑 جمعبندی رفتار
+ و - در جاوااسکریپت• عملگر
+ ← وقتی نوعها یکی نباشن، operandها رو تبدیل به string میکنه.• باقی عملگرها مثل
- * / operandها رو تبدیل به number میکنن و عملیات ریاضی انجام میدن.📚 چند مثال جذاب
مثال ۱ – عدد ساده:
2 + 2 - 2 → 4 - 2 → 2
مثال ۲ – ترکیب رشته و عدد:
"2" + 2 - 2 → "22" - 2 → 22 - 2 → 20
اینجا ابتدا عملگر
+ رشته و عدد رو تبدیل به "22" میکنه، بعد - اونها رو به عدد تبدیل میکنه و نتیجه 20 میشه.✅ جمعبندی نهایی
• عملگر
+ ← ترکیب رشتهها یا جمع اعداد. وقتی نوع operand ها ترکیبی از رشته و عدد باشه، هر دو به رشته تبدیل میشن.• عملگر
- ← تفریق اعداد. اگه هر دو operand یا یکی از اونها رشته باشن، جاوااسکریپت اونها رو به عدد تبدیل میکنه.• اولویت اجرای عملگرهای
+ و - از چپ به راست هست و همین باعث میشه بعضی ترکیبها عجیب به نظر برسن!👍2👏2
TheCodəPod
خب خب خب… داستان این منطق عجیب جاوااسکریپت چیه؟! 🤔 برای اینکه بفهمیم چه اتفاقی میفته، باید یه کمی عملگرهای + و - رو زیر ذرهبین ببریم. 💡 عملگر + یا Binary Plus عملگر + رفتار متفاوتی نسبت به نوع داده operandها داره: • وقتی هر دو operand عدد باشن ← ساده…
این موضوع توی پایتون هم اینجوریه که :
وقتی تو پایتون مینویسید
توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام
Object-Oriented Programming
یا برنامه نویسی شئ گرایی
در پایتون همه چیز یک شئ (Object) است از اعداد و رشتهها گرفته تا توابع هر شیء دارای نوع (Type) و متدهای (Methods) خاص خودشو داره
مکانیسم داخلی پایتون
شناسایی نوع داده:
وقتی شما عبارت 2 + 2 را مینویسید، پایتون ابتدا دادههای اطراف عملگر + را بررسی میکند. پایتون تشخیص میدهد که هر دو 2 شیءهایی از نوع int (عدد صحیح) هستند
❗️فراخوانی متد add:
با توجه به اینکه هر دو شیء از نوع int هستند پایتون به سراغ کلاس int و متد مخصوص add رو که مربوط به این کلاس هست رو اجرا میکنه
این متد کد اجرا میکنه که عملیات جمع ریاضی را انجام میده
حالا فرض کنید کد زیر را بنویسید:
این حالت، پایتون نوع دادهها را از نوع str (رشته) تشخیص میده حالا پایتون به سراغ کلاس str میره و متد add مربوط به این کلاس را اجرا میکنه متد add در کلاس str که کد اون دو رشته به یکدیگر میچسبونه نه جمع ریاضی که تو متد add از کلاس int هست به همین دلیل خروجی این کد 22 خواهد بود
توجه کردید تو هردوتا مسله + بود ولی جواب متفاوت ؟
ویژگی پلی مورفیسم (Polymorphism):
سعنی یک عملگر(مثل +) رفتارهای مختلف داره
این ویژگی پایتون که یک عملگر (مثل +) رفتارهای متفاوتی بر اساس نوع دادههای اطراف خود داره، پلیمورفیسم (Polymorphism) نام دارد
پلیمورفیسم باعث میشود که کدهای پایتون بسیار انعطافپذیر و قابل فهم باشه چون عملگرها رفتار خود را با توجه به نوع شیء مورد نظر تنظیم میکنند
وقتی تو پایتون مینویسید
print(2 + 2)
توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام
Object-Oriented Programming
یا برنامه نویسی شئ گرایی
در پایتون همه چیز یک شئ (Object) است از اعداد و رشتهها گرفته تا توابع هر شیء دارای نوع (Type) و متدهای (Methods) خاص خودشو داره
مکانیسم داخلی پایتون
شناسایی نوع داده:
وقتی شما عبارت 2 + 2 را مینویسید، پایتون ابتدا دادههای اطراف عملگر + را بررسی میکند. پایتون تشخیص میدهد که هر دو 2 شیءهایی از نوع int (عدد صحیح) هستند
❗️فراخوانی متد add:
با توجه به اینکه هر دو شیء از نوع int هستند پایتون به سراغ کلاس int و متد مخصوص add رو که مربوط به این کلاس هست رو اجرا میکنه
این متد کد اجرا میکنه که عملیات جمع ریاضی را انجام میده
حالا فرض کنید کد زیر را بنویسید:
print("2" + "2")این حالت، پایتون نوع دادهها را از نوع str (رشته) تشخیص میده حالا پایتون به سراغ کلاس str میره و متد add مربوط به این کلاس را اجرا میکنه متد add در کلاس str که کد اون دو رشته به یکدیگر میچسبونه نه جمع ریاضی که تو متد add از کلاس int هست به همین دلیل خروجی این کد 22 خواهد بود
توجه کردید تو هردوتا مسله + بود ولی جواب متفاوت ؟
ویژگی پلی مورفیسم (Polymorphism):
سعنی یک عملگر(مثل +) رفتارهای مختلف داره
این ویژگی پایتون که یک عملگر (مثل +) رفتارهای متفاوتی بر اساس نوع دادههای اطراف خود داره، پلیمورفیسم (Polymorphism) نام دارد
پلیمورفیسم باعث میشود که کدهای پایتون بسیار انعطافپذیر و قابل فهم باشه چون عملگرها رفتار خود را با توجه به نوع شیء مورد نظر تنظیم میکنند
❤🔥3👍2
TheCodəPod
این موضوع توی پایتون هم اینجوریه که : وقتی تو پایتون مینویسید print(2 + 2) توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام Object-Oriented Programming یا برنامه نویسی شئ گرایی در…
این موضوع Polymorphism تو دنیای واقعی مثل ادمی که هرجا ی رنگی داره
پیش من بد تورو میگه پیش تو بد منو 😶🌫️
پیش من بد تورو میگه پیش تو بد منو 😶🌫️
👏4🤣4💩1👌1
تبدیل آبجکت به Primitive توی جاوااسکریپت
خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع میکنی (
✋ اول اینو بدون
برخلاف زبانهایی مثل پایتون یا ++C، توی جاوااسکریپت نمیتونی بیای رفتار عملگرها رو مستقیم تغییر بدی.
یعنی خبری از متدهای جادویی (Magic Methods) مثل
پس نمیتونی بگی: "آبجکت من وقتی با + جمع شد، فلان کارو بکن!"
👈 جاوااسکریپت قبل از هر عملیات، آبجکتهارو خودکار تبدیل به primitive میکنه. بعد تازه میره سراغ اجرای اون عملگر.
📌 حالا اصلا primitive یعنی چی؟
توی جاوااسکریپت دو نوع داده اصلی داریم:
نوع اول 👈 Primitive ها: سادهترین نوع دادهها مثل number, string, boolean, null, undefined, symbol, bigint.
نوع دوم 👈 Objects: هر چیزی غیر از primitive ها! مثل object
حالا وقتی جاوااسکریپت نیاز داره روی یه آبجکت عملیاتی انجام بده (مثل جمع، تفریق، یا پرینت)، باید اون رو تبدیل کنه به یکی از primitive ها.
🔑 ماجرا با هینت (hint) شروع میشه
جاوااسکریپت بسته به شرایط مختلف، از سه تا hint استفاده میکنه تا بفهمه آبجکت رو به چی تبدیل کنه:
حالت اول 👈 "string": وقتی انتظار رشته داره.
مثال:
حالت دوم 👈 "number": وقتی نیاز به عدد هست.
مثال:
حالت سوم 👈 "default": وقتی جاوااسکریپت مطمئن نیست (مثل عملگر + که هم جمع عددی انجام میده هم رشتهها رو بهم میچسبونه).
مثال:
⚙️ الگوریتم تبدیل
وقتی یه آبجکت توی همچین موقعیتی باشه، جاوااسکریپت این مراحل رو میره جلو:
اگه متد obj[Symbol.toPrimitive](hint) وجود داشته باشه 👈 از همون استفاده میکنه.
اگه هینت string باشه 👈 اول متود toString() رو صدا میزنه، اگه وجود نداشت میره سراغ متود valueOf().
اگه هینت number یا default باشه 👈 اول متود valueOf() رو صدا میزنه، و اگه وجود نداشت میره سراغ متود toString().
📦 اگه چیزی پیادهسازی نکنیم چی؟
متود toString() برای یه آبجکت معمولی به صورت پیش فرض این رو برمیگردونه:
مثال:
متود valueOf() هم خود آبجکت رو برمیگردونه (که بیمصرفه) 🫤
🔧 مثال کاستومایز شده
حالا اگه بخوای رفتار رو کنترل کنی:
⚠️ نکته مهم:
متود های
📊 مقایسه با زبانهای دیگه
توی پایتون یا ++C میتونی مستقیماً رفتار عملگرها رو تغییر بدی (
ولی توی جاوااسکریپت، عملگرها دستکاری نمیشن.
فقط میتونی تعیین کنی وقتی آبجکت به primitive تبدیل شد، دقیقا چه مقداری برگرده.
📝 جمعبندی
جاوااسکریپت همیشه آبجکتها رو قبل از عملیات تبدیل به primitive میکنه.
سه حالت داره: "string", "number", "default".
متدهای کلیدی: Symbol.toPrimitive, toString, valueOf.
خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع میکنی (
obj1 + obj2) یا از هم کم میکنی (obj1 - obj2) چه اتفاقی میفته؟ 🤔✋ اول اینو بدون
برخلاف زبانهایی مثل پایتون یا ++C، توی جاوااسکریپت نمیتونی بیای رفتار عملگرها رو مستقیم تغییر بدی.
یعنی خبری از متدهای جادویی (Magic Methods) مثل
__add__ یا __sub__ تو پایتون نیست.پس نمیتونی بگی: "آبجکت من وقتی با + جمع شد، فلان کارو بکن!"
👈 جاوااسکریپت قبل از هر عملیات، آبجکتهارو خودکار تبدیل به primitive میکنه. بعد تازه میره سراغ اجرای اون عملگر.
📌 حالا اصلا primitive یعنی چی؟
توی جاوااسکریپت دو نوع داده اصلی داریم:
نوع اول 👈 Primitive ها: سادهترین نوع دادهها مثل number, string, boolean, null, undefined, symbol, bigint.
نوع دوم 👈 Objects: هر چیزی غیر از primitive ها! مثل object
{} و array []حالا وقتی جاوااسکریپت نیاز داره روی یه آبجکت عملیاتی انجام بده (مثل جمع، تفریق، یا پرینت)، باید اون رو تبدیل کنه به یکی از primitive ها.
🔑 ماجرا با هینت (hint) شروع میشه
جاوااسکریپت بسته به شرایط مختلف، از سه تا hint استفاده میکنه تا بفهمه آبجکت رو به چی تبدیل کنه:
حالت اول 👈 "string": وقتی انتظار رشته داره.
مثال:
alert(user);
anotherObj[user] = 123;
حالت دوم 👈 "number": وقتی نیاز به عدد هست.
مثال:
let n = +obj;
let delta = date1 - date2;
let bigger = user1 > user2;
حالت سوم 👈 "default": وقتی جاوااسکریپت مطمئن نیست (مثل عملگر + که هم جمع عددی انجام میده هم رشتهها رو بهم میچسبونه).
مثال:
let total = obj1 + obj2;
if (user == 1) { ... }
⚙️ الگوریتم تبدیل
وقتی یه آبجکت توی همچین موقعیتی باشه، جاوااسکریپت این مراحل رو میره جلو:
اگه متد obj[Symbol.toPrimitive](hint) وجود داشته باشه 👈 از همون استفاده میکنه.
اگه هینت string باشه 👈 اول متود toString() رو صدا میزنه، اگه وجود نداشت میره سراغ متود valueOf().
اگه هینت number یا default باشه 👈 اول متود valueOf() رو صدا میزنه، و اگه وجود نداشت میره سراغ متود toString().
📦 اگه چیزی پیادهسازی نکنیم چی؟
متود toString() برای یه آبجکت معمولی به صورت پیش فرض این رو برمیگردونه:
[object Object]
مثال:
let user = { name: "Ali" };
alert(user); // [object Object]
alert(user + 1); // [object Object]1متود valueOf() هم خود آبجکت رو برمیگردونه (که بیمصرفه) 🫤
🔧 مثال کاستومایز شده
حالا اگه بخوای رفتار رو کنترل کنی:
let user = {
name: "Ali",
money: 100,
[Symbol.toPrimitive](hint) {
return hint === "string" ? `{User: ${this.name}}` : this.money;
}
};
alert(user); // "{User: Ali}" (string hint)
alert(+user); // 100 (number hint)
alert(user + 50); // 150 (default hint)⚠️ نکته مهم:
متود های
[Symbol.toPrimitive](hint)، toString() و valueOf() باید به عنوان خروجی یک primitive برگردونن📊 مقایسه با زبانهای دیگه
توی پایتون یا ++C میتونی مستقیماً رفتار عملگرها رو تغییر بدی (
__add__، __str__ و …).ولی توی جاوااسکریپت، عملگرها دستکاری نمیشن.
فقط میتونی تعیین کنی وقتی آبجکت به primitive تبدیل شد، دقیقا چه مقداری برگرده.
📝 جمعبندی
جاوااسکریپت همیشه آبجکتها رو قبل از عملیات تبدیل به primitive میکنه.
سه حالت داره: "string", "number", "default".
متدهای کلیدی: Symbol.toPrimitive, toString, valueOf.
❤3