Forwarded from Linuxor ?
بخاطر اشتباه یک مدرس، ریپازیتوری فریمورک اکسپرس به گند کشیده شده
یه نفر توی ویدیوی آموزشی یاد داده چطوری تازه کار ها برن کانتریبیوت کنن ولی واقعی روی ریپازیتوی اکسپرس تستش کرده و اسم خودش رو به README اکسپرس اضافه کرده و حالا اون تازه کارایی که ویدیوش رو میبینن فکر میکنن اونجا باید اسم خودشونو اضافه کنن، و دارن اسم خودشون رو به README اکسپرس اضافه میکننن و ریپازیتوری اکسپرس به گند کشیده شده و پر از PR برای اضافه کردن اسم تازه کارا شده.
@Linuxor
یه نفر توی ویدیوی آموزشی یاد داده چطوری تازه کار ها برن کانتریبیوت کنن ولی واقعی روی ریپازیتوی اکسپرس تستش کرده و اسم خودش رو به README اکسپرس اضافه کرده و حالا اون تازه کارایی که ویدیوش رو میبینن فکر میکنن اونجا باید اسم خودشونو اضافه کنن، و دارن اسم خودشون رو به README اکسپرس اضافه میکننن و ریپازیتوری اکسپرس به گند کشیده شده و پر از PR برای اضافه کردن اسم تازه کارا شده.
@Linuxor
Forwarded from SoniaCircuit (Sonia Fatholahi)
YouTube
رادیوجادی ۲۰۰ - هکرهای انانیموس و ۴چن و بقیه قصههاشون
در شماره ۲۰۰ رادیو جادی بالاخره سراغ بحث اصلی میریم: هکرهای ناشناس و فروم افسانهای ۴چن. توی این شماره براتون از تاریخ می گم و از خاطره و از مبارزه علیه کسانی که نمیخوان اینترنت، اینترنت ما باشه!
ما ناشناس هستیم، ما یک ارتش هستیم، ما نمیبخشیم، ما فراموش…
ما ناشناس هستیم، ما یک ارتش هستیم، ما نمیبخشیم، ما فراموش…
Forwarded from Gopher Academy
این بخش دربارهی مفهوم Span Class در مدیریت حافظهی Go است، و توضیح میدهد چطور وجود یا نبود اشارهگرها (pointers) روی عملکرد Garbage Collector تأثیر میگذارد. خلاصه و نکات مهمش به شکل زیر است 👇
📌 اSpan Class در Go
د🔹 Garbage Collector (GC در Go از نوع tracing است؛ یعنی برای یافتن آبجکتهای زنده، کل گراف حافظه را پیمایش میکند.
🔹 اگر یک نوع داده (type) هیچ اشارهگری نداشته باشد — مستقیم یا غیرمستقیم — GC میتواند آن را اسکن نکند**، چون مطمئن است که آن شیء به هیچ آبجکت دیگری اشاره ندارد.
🔹 این ویژگی در زمان کامپایل مشخص میشود، بنابراین هیچ هزینهی زمان اجرا (runtime cost) ندارد.
🧩 مفهوم Span Class:
برای استفاده از این بهینهسازی، Go مفهوم **Span Class را معرفی میکند.
هر Span Class بر اساس دو ویژگی تعریف میشود:
1.ا Size Class آبجکتهایی که در آن قرار دارند
2. وجود یا نبود اشارهگر در آن آبجکتها
🔸 اگر آبجکتهای Span شامل اشارهگر باشند → Scan Class
🔸 اگر اشارهگر نداشته باشند → NoScan Class
چون وجود اشارهگر یک ویژگی دودویی است (دارد یا ندارد)،
تعداد کل Span Classها برابر است با:
> 68 (تعداد Size Classها) × 2 = 136 Span Class
🔢 نحوهی تشخیص:
* هر Span Class یک عدد بین 0 تا 135 دارد.
* عدد زوج → Scan Class
* عدد فرد → NoScan Class
* Size Class = spanClass / 2
✅ جمعبندی
هر Span در Go نه فقط به یک Size Class بلکه به یک Span Class خاص تعلق دارد.
این تفکیک باعث میشود GC سریعتر و بهینهتر کار کند، چون لازم نیست آبجکتهای بدون اشارهگر را اسکن کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
📌 اSpan Class در Go
د🔹 Garbage Collector (GC در Go از نوع tracing است؛ یعنی برای یافتن آبجکتهای زنده، کل گراف حافظه را پیمایش میکند.
🔹 اگر یک نوع داده (type) هیچ اشارهگری نداشته باشد — مستقیم یا غیرمستقیم — GC میتواند آن را اسکن نکند**، چون مطمئن است که آن شیء به هیچ آبجکت دیگری اشاره ندارد.
🔹 این ویژگی در زمان کامپایل مشخص میشود، بنابراین هیچ هزینهی زمان اجرا (runtime cost) ندارد.
🧩 مفهوم Span Class:
برای استفاده از این بهینهسازی، Go مفهوم **Span Class را معرفی میکند.
هر Span Class بر اساس دو ویژگی تعریف میشود:
1.ا Size Class آبجکتهایی که در آن قرار دارند
2. وجود یا نبود اشارهگر در آن آبجکتها
🔸 اگر آبجکتهای Span شامل اشارهگر باشند → Scan Class
🔸 اگر اشارهگر نداشته باشند → NoScan Class
چون وجود اشارهگر یک ویژگی دودویی است (دارد یا ندارد)،
تعداد کل Span Classها برابر است با:
> 68 (تعداد Size Classها) × 2 = 136 Span Class
🔢 نحوهی تشخیص:
* هر Span Class یک عدد بین 0 تا 135 دارد.
* عدد زوج → Scan Class
* عدد فرد → NoScan Class
* Size Class = spanClass / 2
✅ جمعبندی
هر Span در Go نه فقط به یک Size Class بلکه به یک Span Class خاص تعلق دارد.
این تفکیک باعث میشود GC سریعتر و بهینهتر کار کند، چون لازم نیست آبجکتهای بدون اشارهگر را اسکن کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
این بخش به ساختار Span Set در مدیریت حافظهی Go میپردازد. در واقع توضیح میدهد چطور runtime با کارایی بالا مجموعهای از spanها را سازماندهی میکند. خلاصهی دقیق و نکات کلیدی 👇
📘 Span Set در Go Runtime
🔹 برای مدیریت بهتر spanها، Go از ساختاری به نام Span Set استفاده میکند.
🔹 هر Span Set شامل مجموعهای از mspan**هایی است که همگی متعلق به **یک Span Class مشخص هستند
🧩 ساختار درونی Span Set
* از نظر فنی، Span Set یک slice از آرایهها است.
* اندازهی هر آرایه 512 خانه دارد.
* هر خانه شامل یک mspan object است (ممکن است null باشد).
* سلولهای بنفش → mspan معتبر (non-null)
* سلولهای سفید → تهی (null)
⚙️ عملیات (Push / Pop)
* دو متغیر کلیدی دارد: head و tail
*
*
* هنگام pop از head شروع میکند (بالا به پایین، چپ به راست).
* هنگام push از tail ادامه میدهد (بالا به پایین، چپ به راست).
* اگر آرایهای خالی شود، حذف شده و به pool آزاد برای استفادهی آینده برگردانده میشود.
🧵 همزمانی (Concurrency)
* متغیرهای
* به همین دلیل، چند goroutine میتوانند همزمان span اضافه یا حذف کنند
بدون نیاز به قفل (lock).
---
✅ خلاصه:
این ساختار ساده اما قدرتمند، به runtime اجازه میدهد تا مدیریت حافظه را سریع، بدون قفل و با حداقل سربار انجام دهد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
📘 Span Set در Go Runtime
🔹 برای مدیریت بهتر spanها، Go از ساختاری به نام Span Set استفاده میکند.
🔹 هر Span Set شامل مجموعهای از mspan**هایی است که همگی متعلق به **یک Span Class مشخص هستند
🧩 ساختار درونی Span Set
* از نظر فنی، Span Set یک slice از آرایهها است.
* اندازهی هر آرایه 512 خانه دارد.
* هر خانه شامل یک mspan object است (ممکن است null باشد).
* سلولهای بنفش → mspan معتبر (non-null)
* سلولهای سفید → تهی (null)
⚙️ عملیات (Push / Pop)
* دو متغیر کلیدی دارد: head و tail
*
head → اولین span معتبر (برای pop)*
tail → آخرین span معتبر (برای push)* هنگام pop از head شروع میکند (بالا به پایین، چپ به راست).
* هنگام push از tail ادامه میدهد (بالا به پایین، چپ به راست).
* اگر آرایهای خالی شود، حذف شده و به pool آزاد برای استفادهی آینده برگردانده میشود.
🧵 همزمانی (Concurrency)
* متغیرهای
head و tail atomic هستند.* به همین دلیل، چند goroutine میتوانند همزمان span اضافه یا حذف کنند
بدون نیاز به قفل (lock).
---
✅ خلاصه:
اSpan Set در Go ابزاری کارآمد برای نگهداری و مدیریت همزمان مجموعهای از spanهاست.این ساختار ساده اما قدرتمند، به runtime اجازه میدهد تا مدیریت حافظه را سریع، بدون قفل و با حداقل سربار انجام دهد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
این بخش وارد جزئیات مهمی از نحوهی تشخیص محل اشارهگرها (pointers) در حافظه توسط Garbage Collector در Go میشود. در ادامه توضیح مختصر و مفیدش 👇
📘 Heap Bits و Malloc Header در Go Runtime
🔹 در زبان Go، Garbage Collector (GC) باید بداند کدام قسمت از یک شیء شامل pointer است تا بتواند به درستی گراف حافظه را پیمایش کند.
اما بررسی تکتک فیلدهای هر struct در زمان اجرا (runtime) بسیار پرهزینه خواهد بود، مخصوصاً برای ساختارهای بزرگ یا تو در تو.
💡 راهحل Go: استفاده از متادیتا (Metadata)
برای حل این مشکل، Go از دو سازوکار اصلی استفاده میکند:
1. Heap Bits
* برای هر ناحیه از حافظهی heap، اطلاعاتی بهصورت بیتفیلد ذخیره میشود که مشخص میکند
هر بخش از آن حافظه شامل pointer است یا دادهی معمولی (non-pointer).
* این بیتها توسط کامپایلر در زمان کامپایل ساخته و در زمان اجرا توسط GC استفاده میشوند.
* نتیجه: GC میتواند مستقیماً بداند کدام قسمتها را باید دنبال کند، بدون نیاز به اسکن کل struct.
2. Malloc Header
* هر شیء در heap یک هدر (header) دارد که اطلاعات مدیریتی مثل اندازه، نوع و آدرس بیتهای مربوط به آن (heap bits) را نگهداری میکند.
ا * GC از این هدر برای دسترسی سریع به متادیتای مورد نیاز در زمان جمعآوری حافظه استفاده میکند.
⚙️ نتیجه
با ترکیب heap bits و malloc header**، GC در Go میتواند:
* تنها بخشهای لازم را اسکن کند (به جای کل حافظه)
* با سرعت و دقت بالا گراف اشیاء را پیمایش کند
* و در عین حال، **کارایی بالایی در مدیریت حافظه حفظ کند.
✅ خلاصه:
اGo با استفاده از *Heap Bits* و *Malloc Header*، مکان pointerها را از پیش میداند و به این ترتیب، فرآیند جمعآوری زباله را بسیار سریع و بهینه انجام میدهد — بدون نیاز به بررسی تکیتکی فیلدها در زمان اجرا.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
📘 Heap Bits و Malloc Header در Go Runtime
🔹 در زبان Go، Garbage Collector (GC) باید بداند کدام قسمت از یک شیء شامل pointer است تا بتواند به درستی گراف حافظه را پیمایش کند.
اما بررسی تکتک فیلدهای هر struct در زمان اجرا (runtime) بسیار پرهزینه خواهد بود، مخصوصاً برای ساختارهای بزرگ یا تو در تو.
💡 راهحل Go: استفاده از متادیتا (Metadata)
برای حل این مشکل، Go از دو سازوکار اصلی استفاده میکند:
1. Heap Bits
* برای هر ناحیه از حافظهی heap، اطلاعاتی بهصورت بیتفیلد ذخیره میشود که مشخص میکند
هر بخش از آن حافظه شامل pointer است یا دادهی معمولی (non-pointer).
* این بیتها توسط کامپایلر در زمان کامپایل ساخته و در زمان اجرا توسط GC استفاده میشوند.
* نتیجه: GC میتواند مستقیماً بداند کدام قسمتها را باید دنبال کند، بدون نیاز به اسکن کل struct.
2. Malloc Header
* هر شیء در heap یک هدر (header) دارد که اطلاعات مدیریتی مثل اندازه، نوع و آدرس بیتهای مربوط به آن (heap bits) را نگهداری میکند.
ا * GC از این هدر برای دسترسی سریع به متادیتای مورد نیاز در زمان جمعآوری حافظه استفاده میکند.
⚙️ نتیجه
با ترکیب heap bits و malloc header**، GC در Go میتواند:
* تنها بخشهای لازم را اسکن کند (به جای کل حافظه)
* با سرعت و دقت بالا گراف اشیاء را پیمایش کند
* و در عین حال، **کارایی بالایی در مدیریت حافظه حفظ کند.
✅ خلاصه:
اGo با استفاده از *Heap Bits* و *Malloc Header*، مکان pointerها را از پیش میداند و به این ترتیب، فرآیند جمعآوری زباله را بسیار سریع و بهینه انجام میدهد — بدون نیاز به بررسی تکیتکی فیلدها در زمان اجرا.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
🧠د Heap Bits در Go — هوشمندی در مدیریت حافظه
در Go، اشیاء کوچکتر از ۵۱۲ بایت درون spanهایی نگهداری میشن که خودشون چندین شیء هماندازه دارن.
اما چطور Garbage Collector میفهمه کدوم بخش از این اشیاء شامل pointer هست؟
پاسخ: با Heap Bitmap ✅
🔹 هر span یک نقشهی بیتی (bitmap) در انتهای خودش داره.
🔹 هر بیت مربوط به یک "word" از حافظه (معمولاً ۸ بایت) هست:
1️⃣ = شامل pointer
0️⃣ = دادهی عادی (non-pointer)
به این ترتیب، GC فقط بخشهایی رو اسکن میکنه که واقعاً pointer دارن — سریعتر و بهینهتر از اینکه کل حافظه بررسی بشه.
📦 هر span علاوهبر فضای مورد نیاز برای اشیاء، مقداری فضا برای این bitmap کنار میگذاره.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
در Go، اشیاء کوچکتر از ۵۱۲ بایت درون spanهایی نگهداری میشن که خودشون چندین شیء هماندازه دارن.
اما چطور Garbage Collector میفهمه کدوم بخش از این اشیاء شامل pointer هست؟
پاسخ: با Heap Bitmap ✅
🔹 هر span یک نقشهی بیتی (bitmap) در انتهای خودش داره.
🔹 هر بیت مربوط به یک "word" از حافظه (معمولاً ۸ بایت) هست:
1️⃣ = شامل pointer
0️⃣ = دادهی عادی (non-pointer)
به این ترتیب، GC فقط بخشهایی رو اسکن میکنه که واقعاً pointer دارن — سریعتر و بهینهتر از اینکه کل حافظه بررسی بشه.
📦 هر span علاوهبر فضای مورد نیاز برای اشیاء، مقداری فضا برای این bitmap کنار میگذاره.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
برای اشیایی که اندازهشان بیشتر از ۵۱۲ بایت باشد، استفاده از یک بیتمپ بزرگ برای مدیریت حافظه کارآمد نیست. به جای آن، هر شیء با یک هدر ۸ بایت به نام "malloc header" همراه میشود. این هدر شامل یک اشارهگر به اطلاعات نوع شیء (type information) است.
این اطلاعات نوع شامل یک فیلد به نام "GCData" است که چیدمان اشارهگرها (pointer layout) در نوع شیء را کدگذاری میکند. جمعآوری زباله (garbage collector) از این دادهها استفاده میکند تا به طور دقیق و کارآمد فقط فیلدهایی که حاوی اشارهگرها هستند را هنگام پیمایش گراف اشیاء پیدا کند.
به زبان ساده، این روش به جمعآوری زباله کمک میکند تا بدون نیاز به بررسی کل حافظه، فقط بخشهای مهم را که به اشیاء دیگر اشاره دارند، شناسایی و مدیریت کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
این اطلاعات نوع شامل یک فیلد به نام "GCData" است که چیدمان اشارهگرها (pointer layout) در نوع شیء را کدگذاری میکند. جمعآوری زباله (garbage collector) از این دادهها استفاده میکند تا به طور دقیق و کارآمد فقط فیلدهایی که حاوی اشارهگرها هستند را هنگام پیمایش گراف اشیاء پیدا کند.
به زبان ساده، این روش به جمعآوری زباله کمک میکند تا بدون نیاز به بررسی کل حافظه، فقط بخشهای مهم را که به اشیاء دیگر اشاره دارند، شناسایی و مدیریت کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
♥️جزییات فنی این بخش از مقالات رو می تونید توی لینک زیر بخونید
- https://github.com/golang/go/blob/go1.24.0/src/runtime/runtime2.go#L529-L529
🎯 کد تنظیمات اولیه runtime در Go - بخش اصلی اجرا!
- https://github.com/golang/go/blob/go1.24.0/src/runtime/proc.go#L117-L117
🚀 مدیریت فرآیندها (goroutines) در runtime Go.
- https://man7.org/linux/man-pages/man2/mmap.2.html
📚 مستندات mmap لینوکس - تخصیص حافظه به فرآیندها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L245-L311
🗂 مدیریت هیپ در Go - تخصیص و آزادسازی صفحات حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L402-L496
🔧 مدیریت پیشرفته هیپ - ردیابی و تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L6
📏 تعریف کلاسهای اندازه اولیه برای حافظه کارآمد.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L61
🧮 محاسبات دقیقتر برای کلاسهای اندازه حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L44
⚙️ تنظیمات اضافی برای دستهبندی اندازهها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go
📂 فایل کامل کلاسهای اندازه حافظه در Go.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L556-L562
♻️ کد آزادسازی صفحات حافظه در هیپ.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mspanset.go#L14-L52
🌐 مدیریت مجموعه اسپنها برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mbitmap.go#L549-L582
🖼 مدیریت بیتمپ برای ردیابی حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/malloc.go#L1470-L1470
💾 بخشی از تابع malloc برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/internal/abi/type.go#L31-L42
📋 تعریف ساختار نوع و متادیتای ABI در Go.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
- https://github.com/golang/go/blob/go1.24.0/src/runtime/runtime2.go#L529-L529
🎯 کد تنظیمات اولیه runtime در Go - بخش اصلی اجرا!
- https://github.com/golang/go/blob/go1.24.0/src/runtime/proc.go#L117-L117
🚀 مدیریت فرآیندها (goroutines) در runtime Go.
- https://man7.org/linux/man-pages/man2/mmap.2.html
📚 مستندات mmap لینوکس - تخصیص حافظه به فرآیندها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L245-L311
🗂 مدیریت هیپ در Go - تخصیص و آزادسازی صفحات حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L402-L496
🔧 مدیریت پیشرفته هیپ - ردیابی و تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L6
📏 تعریف کلاسهای اندازه اولیه برای حافظه کارآمد.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L61
🧮 محاسبات دقیقتر برای کلاسهای اندازه حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L44
⚙️ تنظیمات اضافی برای دستهبندی اندازهها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go
📂 فایل کامل کلاسهای اندازه حافظه در Go.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L556-L562
♻️ کد آزادسازی صفحات حافظه در هیپ.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mspanset.go#L14-L52
🌐 مدیریت مجموعه اسپنها برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mbitmap.go#L549-L582
🖼 مدیریت بیتمپ برای ردیابی حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/malloc.go#L1470-L1470
💾 بخشی از تابع malloc برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/internal/abi/type.go#L31-L42
📋 تعریف ساختار نوع و متادیتای ABI در Go.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
🔵 عنوان مقاله
The new() Function Will Take an Expression in Go 1.26
🟢 خلاصه مقاله:
در Go 1.26 یک بهبود کوچک اما کاربردی میآید: تابع new() میتواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح میدهد که این تغییر برخی الگوهای تخصیص و مقداردهی را سادهتر و خواناتر میکند. Tim Little با استفاده از raylib-go یک شبیهسازی آب بلادرنگ در Go میسازد و نشان میدهد چگونه میتوان با ترکیب کارایی Go و سادگی raylib، رندر و فیزیک ساده را پیادهسازی کرد. Vladimir Makarov به تخصیص ثبات در کامپایلر Go میپردازد و تأثیر آن بر کارایی، استراتژیها و ملاحظات بخش SSA را شرح میدهد. در نهایت، Ted Unangst یادآوری میکند که «دم» برشها در Go بینهایت رشد نمیکند و باید به ظرفیت، بازبرش و رفتار append توجه کرد تا از خطاها و افت کارایی جلوگیری شود.
#Go #Golang #Go126 #Compiler #RegisterAllocation #raylib #GameDev #Slices
🟣لینک مقاله:
https://golangweekly.com/link/175062/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
The new() Function Will Take an Expression in Go 1.26
🟢 خلاصه مقاله:
در Go 1.26 یک بهبود کوچک اما کاربردی میآید: تابع new() میتواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح میدهد که این تغییر برخی الگوهای تخصیص و مقداردهی را سادهتر و خواناتر میکند. Tim Little با استفاده از raylib-go یک شبیهسازی آب بلادرنگ در Go میسازد و نشان میدهد چگونه میتوان با ترکیب کارایی Go و سادگی raylib، رندر و فیزیک ساده را پیادهسازی کرد. Vladimir Makarov به تخصیص ثبات در کامپایلر Go میپردازد و تأثیر آن بر کارایی، استراتژیها و ملاحظات بخش SSA را شرح میدهد. در نهایت، Ted Unangst یادآوری میکند که «دم» برشها در Go بینهایت رشد نمیکند و باید به ظرفیت، بازبرش و رفتار append توجه کرد تا از خطاها و افت کارایی جلوگیری شود.
#Go #Golang #Go126 #Compiler #RegisterAllocation #raylib #GameDev #Slices
🟣لینک مقاله:
https://golangweekly.com/link/175062/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
مثال از مقاله
یکی از مثالهای مقاله مربوط به ساخت یک struct به نام Person است:
type Person struct {
Name string
Age *int
}
func newPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: new(age), // ایجاد اشارهگر به کپی مقدار age
}
}
در اینجا، new(age) یک اشارهگر به کپی مقدار age میسازد. این کار قبلاً با &age ممکن بود، اما استفاده از new(age) میتواند در مواردی مثل بهینهسازیهای کامپایلر (مانند آنالیز فرار یا escape analysis) مفید باشد، چون متغیر ورودی age ممکن است روی پشته (stack) باقی بماند و نیازی به تخصیص در هیپ (heap) نداشته باشد.
نکته در مورد ثابتها (Constants)
یک نکته که در مقاله ذکر شده، این است که وقتی از new() با یک ثابت عددی (مثل 10) استفاده میکنید، نوع پیشفرض آن *int است، که ممکن است در برخی موارد باعث خطای نوع (type mismatch) شود. برای مثال:
var ui uint
var uip *uint
ui = 10 // درست است، چون 10 به طور خودکار به uint تبدیل میشود
uip = new(10) // خطا: نوع *int نمیتواند به *uint اختصاص یابد
برای رفع این مشکل، باید نوع ثابت را صراحتاً مشخص کنید:
uip = new(uint(10)) // درست است
چرا این تغییر مفید است؟
- سادگی کد: حذف نیاز به متغیرهای موقت باعث کوتاهتر و خواناتر شدن کد میشود.
- بهینهسازی: کامپایلر Go ممکن است بتواند کدهای نوشتهشده با new(expr) را بهتر بهینه کند.
- یکنواختی: این تغییر باعث میشود که کار با انواع ساده و پیچیده در Go یکسانتر شود.
- محبوبیت: به نظر میرسد که معادلهای این قابلیت (مثل تابع ref()) در جامعه Go رایج بوده و این ویژگی جدید پاسخ به نیاز واقعی توسعهدهندگان است.
مثال تکمیلی
فرض کنید میخواهید یک اشارهگر به یک مقدار محاسبهشده بسازید:
func calculateValue(x, y int) *int {
return new(x + y) // اشارهگری به نتیجه x + y
}
func main() {
p := calculateValue(5, 3) // p اشارهگری به مقدار 8 است
fmt.Println(*p) // خروجی: 8
}
این کد بدون نیاز به متغیر موقت، یک اشارهگر به نتیجه x + y میسازد.
نتیجهگیری
تغییر در تابع new() در Go 1.26 یک بهبود کوچک اما کاربردی است که کد را سادهتر و انعطافپذیرتر میکند. این قابلیت به توسعهدهندگان اجازه میدهد تا بدون متغیرهای موقت، اشارهگرهایی به مقادیر محاسبهشده یا کپیهای مقادیر دیگر بسازند، و در عین حال ممکن است به بهینهسازیهای کامپایلر کمک کند.
یکی از مثالهای مقاله مربوط به ساخت یک struct به نام Person است:
type Person struct {
Name string
json:"name"Age *int
json:"age" // سن اگر مشخص باشد؛ در غیر این صورت nil}
func newPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: new(age), // ایجاد اشارهگر به کپی مقدار age
}
}
در اینجا، new(age) یک اشارهگر به کپی مقدار age میسازد. این کار قبلاً با &age ممکن بود، اما استفاده از new(age) میتواند در مواردی مثل بهینهسازیهای کامپایلر (مانند آنالیز فرار یا escape analysis) مفید باشد، چون متغیر ورودی age ممکن است روی پشته (stack) باقی بماند و نیازی به تخصیص در هیپ (heap) نداشته باشد.
نکته در مورد ثابتها (Constants)
یک نکته که در مقاله ذکر شده، این است که وقتی از new() با یک ثابت عددی (مثل 10) استفاده میکنید، نوع پیشفرض آن *int است، که ممکن است در برخی موارد باعث خطای نوع (type mismatch) شود. برای مثال:
var ui uint
var uip *uint
ui = 10 // درست است، چون 10 به طور خودکار به uint تبدیل میشود
uip = new(10) // خطا: نوع *int نمیتواند به *uint اختصاص یابد
برای رفع این مشکل، باید نوع ثابت را صراحتاً مشخص کنید:
uip = new(uint(10)) // درست است
چرا این تغییر مفید است؟
- سادگی کد: حذف نیاز به متغیرهای موقت باعث کوتاهتر و خواناتر شدن کد میشود.
- بهینهسازی: کامپایلر Go ممکن است بتواند کدهای نوشتهشده با new(expr) را بهتر بهینه کند.
- یکنواختی: این تغییر باعث میشود که کار با انواع ساده و پیچیده در Go یکسانتر شود.
- محبوبیت: به نظر میرسد که معادلهای این قابلیت (مثل تابع ref()) در جامعه Go رایج بوده و این ویژگی جدید پاسخ به نیاز واقعی توسعهدهندگان است.
مثال تکمیلی
فرض کنید میخواهید یک اشارهگر به یک مقدار محاسبهشده بسازید:
func calculateValue(x, y int) *int {
return new(x + y) // اشارهگری به نتیجه x + y
}
func main() {
p := calculateValue(5, 3) // p اشارهگری به مقدار 8 است
fmt.Println(*p) // خروجی: 8
}
این کد بدون نیاز به متغیر موقت، یک اشارهگر به نتیجه x + y میسازد.
نتیجهگیری
تغییر در تابع new() در Go 1.26 یک بهبود کوچک اما کاربردی است که کد را سادهتر و انعطافپذیرتر میکند. این قابلیت به توسعهدهندگان اجازه میدهد تا بدون متغیرهای موقت، اشارهگرهایی به مقادیر محاسبهشده یا کپیهای مقادیر دیگر بسازند، و در عین حال ممکن است به بهینهسازیهای کامپایلر کمک کند.
Forwarded from Reza Jafari
نگاهی به مدل تازه سامسونگ به اسم Tiny Recursive Model
وقتی مقاله مربوط به «مدل بازگشتی کوچیک» یا همون Tiny Recursive Model (TRM) از سامسونگ رو خوندم، واقعاً ذهنم سوت کشید. باورم نمیشد یه مدل با فقط ۷ میلیون پارامتر تونسته باشه تو تستهای استدلالی مثل ARC-AGI-1 و ARC-AGI-2 از مدلهای بزرگ و گرونقیمتی مثل DeepSeek-R1، Gemini 2.5 Pro و o3-mini بهتر عمل کنه. این مدل رو تیم تحقیقاتی Samsung SAIL Montreal ساخته و عملاً نشون داده که برای باهوش بودن، الزاماً نیازی به مدلهای غولپیکر و هزینههای میلیاردی نیست؛ گاهی طراحی هوشمندانه از هر چیز دیگهای مهمتره.
کاری که TRM میکنه با مدلهای زبانی معمولی خیلی فرق داره. به جای اینکه مثل یه LLM معمولی، کلمهبهکلمه جمله بسازه، اول یه پیشنویس کامل از جواب تولید میکنه — یه جور حدس اولیه از راهحل. بعد وارد مرحلهای میشه که خودش یه فضای فکری جدا به اسم «اسکرچپد ذهنی» درست میکنه. اینجا جاییه که مدل با خودش فکر میکنه، منطقش رو زیر سؤال میبره و شروع میکنه به اصلاح اشتباههاش. طبق مقاله، این چرخه تا شش بار تکرار میشه؛ هر بار از خودش میپرسه: «منطقم درسته؟ ایرادم کجاست؟» بعد دوباره جواب رو بازنویسی میکنه. این فرایند «پیشنویس، فکر کردن، اصلاح» تا ۱۶ بار پشتسر هم انجام میشه تا به جوابی برسه که از نظر خودش منطقی و درست باشه.
جالبتر اینه که معماری مدل خیلی سادهست. فقط از دو لایه تشکیل شده و میتونه یا بهصورت یه شبکهی ساده (MLP) یا با ساختار self-attention کار کنه. در واقع، سامسونگ پیچیدگیهای اضافی مثل سلسلهمراتب یا نظریههای سنگین ریاضی رو کنار گذاشته و تمرکزش رو گذاشته روی اینکه مدل بتونه واقعاً فکر کنه. هر بار که TRM به مسئلهای نگاه میکنه، حالت ذهنی خودش رو بهروزرسانی میکنه، یعنی یاد میگیره چطور بهتر فکر کنه، بعد با اون تفکر تازه پاسخ رو بازنویسی میکنه — درست مثل آدمی که چند بار به یه موضوع فکر میکنه تا بالاخره راه درست رو پیدا کنه.
نتایجش هم واقعاً قابل توجهه. تو پازلهای سختی مثل Sudoku-Extreme و Maze-Hard دقتش بالای ۸۵٪ بوده، و تو تستهای استدلالی ARC-AGI-1 و ARC-AGI-2 بهترتیب حدود ۴۵٪ و ۸٪ دقت گرفته — عددهایی که از بعضی مدلهای خیلی بزرگتر هم بالاترن. برای مقایسه، مدل HRM با ۲۷ میلیون پارامتر عملکرد ضعیفتری داشته. این یعنی TRM تونسته با یه دهم یا حتی یکهزارم اندازهی اونها، نتیجهی بهتری بده.
اهمیت این پیشرفت فقط در اعداد نیست، بلکه در تفکریه که پشتش قرار داره. برای مدیران و کسبوکارها، این یعنی برتری الگوریتمی — یعنی بهجای خرج کردن میلیونها دلار برای قدرت پردازشی، میشه با طراحی هوشمندتر، نتیجهی بهتری گرفت. برای محققها هم این یه تأیید جدی روی ایدهی مدلهای عصبی-نمادینه؛ مدلهایی که قبل از اینکه پاسخ بدن، چندبار در موردش فکر میکنن.
البته نویسندگان مقاله خودشونم اشاره کردن که TRM هنوز یه مدل نسبتاً ساده و آزمایشیه. فعلاً فقط تو تسکهای نظارتشده تست شده و هنوز وارد دنیای متن و گفتار نشده. تازه، هنوز دقیق مشخص نیست چرا بازگشت درونی (recursion) تا این حد مؤثره — آیا به خاطر یادگیری عمیقتره، یا شاید فقط نوع خاصی از دادهها این تأثیر رو نشون میده. با این حال، نتایج فعلیش نشون میده که آیندهی هوش مصنوعی فقط توی «بزرگتر شدن» نیست، بلکه توی «باهوشتر فکر کردن»ه.
در کل، TRM فقط یه مدل کوچیکتر نیست؛ یه طرز فکر جدیده دربارهی حل مسئله. مدلی که بهجای اینکه عجولانه جواب بده، چند بار فکر میکنه، خودش رو نقد میکنه، و از اشتباههاش یاد میگیره. اگه بخوایم ساده بگیم، سامسونگ داره نشون میده هوش مصنوعی واقعی اونیه که بهجای بیشتر گفتن، بیشتر فکر کنه.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
🥇 اهورا اولین اپراتور هوش مصنوعی راهبردی ایران در حوزه ارائه خدمات و سرویسهای زیرساخت هوش مصنوعی
🌐 لینک ارتباط با اهورا
@reza_jafari_ai
وقتی مقاله مربوط به «مدل بازگشتی کوچیک» یا همون Tiny Recursive Model (TRM) از سامسونگ رو خوندم، واقعاً ذهنم سوت کشید. باورم نمیشد یه مدل با فقط ۷ میلیون پارامتر تونسته باشه تو تستهای استدلالی مثل ARC-AGI-1 و ARC-AGI-2 از مدلهای بزرگ و گرونقیمتی مثل DeepSeek-R1، Gemini 2.5 Pro و o3-mini بهتر عمل کنه. این مدل رو تیم تحقیقاتی Samsung SAIL Montreal ساخته و عملاً نشون داده که برای باهوش بودن، الزاماً نیازی به مدلهای غولپیکر و هزینههای میلیاردی نیست؛ گاهی طراحی هوشمندانه از هر چیز دیگهای مهمتره.
کاری که TRM میکنه با مدلهای زبانی معمولی خیلی فرق داره. به جای اینکه مثل یه LLM معمولی، کلمهبهکلمه جمله بسازه، اول یه پیشنویس کامل از جواب تولید میکنه — یه جور حدس اولیه از راهحل. بعد وارد مرحلهای میشه که خودش یه فضای فکری جدا به اسم «اسکرچپد ذهنی» درست میکنه. اینجا جاییه که مدل با خودش فکر میکنه، منطقش رو زیر سؤال میبره و شروع میکنه به اصلاح اشتباههاش. طبق مقاله، این چرخه تا شش بار تکرار میشه؛ هر بار از خودش میپرسه: «منطقم درسته؟ ایرادم کجاست؟» بعد دوباره جواب رو بازنویسی میکنه. این فرایند «پیشنویس، فکر کردن، اصلاح» تا ۱۶ بار پشتسر هم انجام میشه تا به جوابی برسه که از نظر خودش منطقی و درست باشه.
جالبتر اینه که معماری مدل خیلی سادهست. فقط از دو لایه تشکیل شده و میتونه یا بهصورت یه شبکهی ساده (MLP) یا با ساختار self-attention کار کنه. در واقع، سامسونگ پیچیدگیهای اضافی مثل سلسلهمراتب یا نظریههای سنگین ریاضی رو کنار گذاشته و تمرکزش رو گذاشته روی اینکه مدل بتونه واقعاً فکر کنه. هر بار که TRM به مسئلهای نگاه میکنه، حالت ذهنی خودش رو بهروزرسانی میکنه، یعنی یاد میگیره چطور بهتر فکر کنه، بعد با اون تفکر تازه پاسخ رو بازنویسی میکنه — درست مثل آدمی که چند بار به یه موضوع فکر میکنه تا بالاخره راه درست رو پیدا کنه.
نتایجش هم واقعاً قابل توجهه. تو پازلهای سختی مثل Sudoku-Extreme و Maze-Hard دقتش بالای ۸۵٪ بوده، و تو تستهای استدلالی ARC-AGI-1 و ARC-AGI-2 بهترتیب حدود ۴۵٪ و ۸٪ دقت گرفته — عددهایی که از بعضی مدلهای خیلی بزرگتر هم بالاترن. برای مقایسه، مدل HRM با ۲۷ میلیون پارامتر عملکرد ضعیفتری داشته. این یعنی TRM تونسته با یه دهم یا حتی یکهزارم اندازهی اونها، نتیجهی بهتری بده.
اهمیت این پیشرفت فقط در اعداد نیست، بلکه در تفکریه که پشتش قرار داره. برای مدیران و کسبوکارها، این یعنی برتری الگوریتمی — یعنی بهجای خرج کردن میلیونها دلار برای قدرت پردازشی، میشه با طراحی هوشمندتر، نتیجهی بهتری گرفت. برای محققها هم این یه تأیید جدی روی ایدهی مدلهای عصبی-نمادینه؛ مدلهایی که قبل از اینکه پاسخ بدن، چندبار در موردش فکر میکنن.
البته نویسندگان مقاله خودشونم اشاره کردن که TRM هنوز یه مدل نسبتاً ساده و آزمایشیه. فعلاً فقط تو تسکهای نظارتشده تست شده و هنوز وارد دنیای متن و گفتار نشده. تازه، هنوز دقیق مشخص نیست چرا بازگشت درونی (recursion) تا این حد مؤثره — آیا به خاطر یادگیری عمیقتره، یا شاید فقط نوع خاصی از دادهها این تأثیر رو نشون میده. با این حال، نتایج فعلیش نشون میده که آیندهی هوش مصنوعی فقط توی «بزرگتر شدن» نیست، بلکه توی «باهوشتر فکر کردن»ه.
در کل، TRM فقط یه مدل کوچیکتر نیست؛ یه طرز فکر جدیده دربارهی حل مسئله. مدلی که بهجای اینکه عجولانه جواب بده، چند بار فکر میکنه، خودش رو نقد میکنه، و از اشتباههاش یاد میگیره. اگه بخوایم ساده بگیم، سامسونگ داره نشون میده هوش مصنوعی واقعی اونیه که بهجای بیشتر گفتن، بیشتر فکر کنه.
@reza_jafari_ai
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Linuxor ?
دوستان اگه کار قشنگی کردین توی کامپیوتر، یا ریپازیتوری و کانال خاصی دارین برای من بفرستین که توی کانال معرفیش کنم.
علت اینکه بعضی ریپو هایی که میفرستین رو نمیذارم بخاطر ضعیف بودن محتواش نیست بخاطر اینه که گذاشتن توی کانال یه قانون داره، اونم این که یه "چیزی برای ارائه و نمایش داشته باشه" و این فکر میکنم مهم ترین قانون طبیعت و زندگی هم هست.
@Linuxor
علت اینکه بعضی ریپو هایی که میفرستین رو نمیذارم بخاطر ضعیف بودن محتواش نیست بخاطر اینه که گذاشتن توی کانال یه قانون داره، اونم این که یه "چیزی برای ارائه و نمایش داشته باشه" و این فکر میکنم مهم ترین قانون طبیعت و زندگی هم هست.
@Linuxor
Forwarded from Gopher Academy
🔵 عنوان مقاله
Building a Coding Agent in Go from Scratch
🟢 خلاصه مقاله:
این مجموعه سه مطلب عملی برای توسعهدهندگان Go را کنار هم میگذارد: ساخت یک coding agent از صفر در Go، استفاده از Timing Wheels برای انقضای کارآمد ۱۰ میلیون کلید بدون اسکنهای O(n)، و مروری دقیق بر sync شامل Mutex، RWMutex، WaitGroup، Once، Cond و Pool. بخش agent بر معماری ماژولار، هماهنگی goroutine و channel، sandbox امن و حلقه بازخورد برای اجرای کد و بهبود تدریجی تأکید دارد. نوشته Bill Kennedy نشان میدهد چگونه با سطلبندی زمانسنجها و حرکت چرخ، سربار و نوسان تأخیر کاهش مییابد و حتی در مقیاس بزرگ پایدار میماند. در نهایت، مرور sync توصیههای عملی برای انتخاب درست بین primitives و channel، کاهش contention، و ارزیابی با benchmark، pprof و race detector ارائه میکند تا سامانههای Go هم هوشمند و هم سریع باشند.
#Go #Golang #Concurrency #TimingWheels #sync #SystemsProgramming #GoInternals #Performance
🟣لینک مقاله:
https://golangweekly.com/link/175365/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Building a Coding Agent in Go from Scratch
🟢 خلاصه مقاله:
این مجموعه سه مطلب عملی برای توسعهدهندگان Go را کنار هم میگذارد: ساخت یک coding agent از صفر در Go، استفاده از Timing Wheels برای انقضای کارآمد ۱۰ میلیون کلید بدون اسکنهای O(n)، و مروری دقیق بر sync شامل Mutex، RWMutex، WaitGroup، Once، Cond و Pool. بخش agent بر معماری ماژولار، هماهنگی goroutine و channel، sandbox امن و حلقه بازخورد برای اجرای کد و بهبود تدریجی تأکید دارد. نوشته Bill Kennedy نشان میدهد چگونه با سطلبندی زمانسنجها و حرکت چرخ، سربار و نوسان تأخیر کاهش مییابد و حتی در مقیاس بزرگ پایدار میماند. در نهایت، مرور sync توصیههای عملی برای انتخاب درست بین primitives و channel، کاهش contention، و ارزیابی با benchmark، pprof و race detector ارائه میکند تا سامانههای Go هم هوشمند و هم سریع باشند.
#Go #Golang #Concurrency #TimingWheels #sync #SystemsProgramming #GoInternals #Performance
🟣لینک مقاله:
https://golangweekly.com/link/175365/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
YouTube
Building a coding agent from scratch - Bill Kennedy
In this talk, Bill will share how AI agents fundamental work and interact with LLMs to perform basic tasks like listing, reading, and editing files. During the talk, Bill will live code an agent and explain all the parts of the code needed to make this work.…
Forwarded from DevTwitter | توییت برنامه نویسی
ایجنت رایگان با گراک 4 !
اخیراً گروک 4 رایگان شده و منم رفتم تستش کنم. ولی توی این مسیر یه حرکت باحال زدم!
اول بگم گروک 4 چیه و چرا باحاله:
- مدل جدید xAI با پنجره زمینه ۲ میلیون توکن
- سرعت پردازش بالا
- رایگان! (الان حداقل اینطوریه)
- برای تحلیل کد و حل مسائل پیچیده عالیه
یه افزونه VS Code به اسم Roo Code پیدا کردم!
( توی کرسر و اینا هم میشه نصبش کرد دیگه )
این افزونه مثل یه agent هوشمند عمل میکنه:
- فایلهاتو ایندکس میکنه و میشناسه
- میتونی تسکهای مشخص براش تعریف کنی و انجام بده
- از OpenRouter API پشتیبانی میکنه
- میتونی از مدلهای مختلف مثل همون گروک 4 توش استفاده کنی
بهترین بخش اینجاست که Roo Code از OpenRouter API پشتیبانی میکنه و گروک 4 هم توش هست.
یعنی میتونی توی IDE خودت یه agent هوشمند و رایگان داری که فایلهاتو میشناسه و میتونی براش تسک تعریف کنی!
من تست کردم باحال بود .کار راه بندازه و رایگان بدون محدودیت .
تستش ضرر نداره کامنت کنید اگر حال کردید
https://openrouter.ai/
https://roocode.com/
@DevTwitter | <Ali Arghyani/>
اخیراً گروک 4 رایگان شده و منم رفتم تستش کنم. ولی توی این مسیر یه حرکت باحال زدم!
اول بگم گروک 4 چیه و چرا باحاله:
- مدل جدید xAI با پنجره زمینه ۲ میلیون توکن
- سرعت پردازش بالا
- رایگان! (الان حداقل اینطوریه)
- برای تحلیل کد و حل مسائل پیچیده عالیه
یه افزونه VS Code به اسم Roo Code پیدا کردم!
( توی کرسر و اینا هم میشه نصبش کرد دیگه )
این افزونه مثل یه agent هوشمند عمل میکنه:
- فایلهاتو ایندکس میکنه و میشناسه
- میتونی تسکهای مشخص براش تعریف کنی و انجام بده
- از OpenRouter API پشتیبانی میکنه
- میتونی از مدلهای مختلف مثل همون گروک 4 توش استفاده کنی
بهترین بخش اینجاست که Roo Code از OpenRouter API پشتیبانی میکنه و گروک 4 هم توش هست.
یعنی میتونی توی IDE خودت یه agent هوشمند و رایگان داری که فایلهاتو میشناسه و میتونی براش تسک تعریف کنی!
من تست کردم باحال بود .کار راه بندازه و رایگان بدون محدودیت .
تستش ضرر نداره کامنت کنید اگر حال کردید
https://openrouter.ai/
https://roocode.com/
@DevTwitter | <Ali Arghyani/>
Forwarded from a pessimistic researcher (Kc)
PhD, Master, and Intern in Software Testing @ Monash University
————————————————
توی اعلامیه بیشتر به دکتری اشاره کرده ولی توی لینک در مورد اینترن و مستر هم توضیح داده
🚀 Join My Research Group at Monash Information Technology!
I’m looking for motivated PhD students who are passionate about software testing and debugging — particularly in LLM-aided testing/debugging and testing AI systems.
Learn more about my research here 👉 https://yqtian.com/openings.html
Feel free to contact me via [email protected].
————————————————
توی اعلامیه بیشتر به دکتری اشاره کرده ولی توی لینک در مورد اینترن و مستر هم توضیح داده
🚀 Join My Research Group at Monash Information Technology!
I’m looking for motivated PhD students who are passionate about software testing and debugging — particularly in LLM-aided testing/debugging and testing AI systems.
Learn more about my research here 👉 https://yqtian.com/openings.html
Feel free to contact me via [email protected].
Forwarded from DevTwitter | توییت برنامه نویسی
دیگه CSS هم داره میشه زبان برنامه نویسی
آیا میدونستید که CSS به تازگی داره قابلیت شرطیسازی به سبک زبانهای برنامهنویسی رو به خودش اضافه میکنه؟
با معرفی تابع if() در CSS (در نسخههای جدید Chrome) میتونیم شرایط داخل خود CSS تعریف کنیم، با کمترین نیاز به JavaScript برای تغییر استایل!
این ویژگی، CSS رو بیشتر از همیشه به یک زبان برنامهنویسیِ Declarative نزدیکتر میکنه و این یعنی مجبور نیستیم برای “اگر فلان بود فلان کن” به JavaScript رجوع کنیم، بلکه منطق ساده را مستقیماً در خود CSS بنویسیم.
البته فعلاً پشتیبانی مرورگرها محدود هستش، پس برای پروژههای تولیدی باید با احتیاط بهش رجوع کرد.
اگه دوست داری خودت این مثال رو امتحان کن تو کدپن گذاشتم:
https://codepen.io/Ali-Nazari-Uzman/pen/MYKmWxQ
@DevTwitter | <Ali Nazari/>
آیا میدونستید که CSS به تازگی داره قابلیت شرطیسازی به سبک زبانهای برنامهنویسی رو به خودش اضافه میکنه؟
با معرفی تابع if() در CSS (در نسخههای جدید Chrome) میتونیم شرایط داخل خود CSS تعریف کنیم، با کمترین نیاز به JavaScript برای تغییر استایل!
این ویژگی، CSS رو بیشتر از همیشه به یک زبان برنامهنویسیِ Declarative نزدیکتر میکنه و این یعنی مجبور نیستیم برای “اگر فلان بود فلان کن” به JavaScript رجوع کنیم، بلکه منطق ساده را مستقیماً در خود CSS بنویسیم.
البته فعلاً پشتیبانی مرورگرها محدود هستش، پس برای پروژههای تولیدی باید با احتیاط بهش رجوع کرد.
اگه دوست داری خودت این مثال رو امتحان کن تو کدپن گذاشتم:
https://codepen.io/Ali-Nazari-Uzman/pen/MYKmWxQ
@DevTwitter | <Ali Nazari/>
Forwarded from code2 - تکنولوژی و فناوری
This media is not supported in your browser
VIEW IN TELEGRAM
مدیرعاملی که بدون هیچ تلاشی احترام را جلب کرد
در گرند پری چین ۲۰۱۸، مارتین براندل، مفسر فرمول یک، پرسید: «آیا انگلیسی صحبت میکنید؟» - بدون اینکه متوجه شود با دکتر لیزا سو، مدیرعامل AMD، صحبت میکند.
او آرام، خونسرد و با اعتماد به نفس، ثابت کرد که نفوذ واقعی ربطی به ظاهر ندارد - بلکه به بینش، تخصص و قدرت حضور در لحظه مربوط میشود.
@code2_ir
در گرند پری چین ۲۰۱۸، مارتین براندل، مفسر فرمول یک، پرسید: «آیا انگلیسی صحبت میکنید؟» - بدون اینکه متوجه شود با دکتر لیزا سو، مدیرعامل AMD، صحبت میکند.
او آرام، خونسرد و با اعتماد به نفس، ثابت کرد که نفوذ واقعی ربطی به ظاهر ندارد - بلکه به بینش، تخصص و قدرت حضور در لحظه مربوط میشود.
@code2_ir
Forwarded from Accio
Microrizz | A simple proxy protocol meant to be used on cheap Nodejs application services (works over websocket and webrtc). This is one of my older repos but I find it useful from time to time. You can deploy it on a serverless provider and get a local socks5 proxy with its client
https://github.com/Keivan-sf/microrizz
https://github.com/Keivan-sf/microrizz