Ninja Learn | نینجا لرن
1.26K subscribers
96 photos
36 videos
11 files
307 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
☁️ ـAmazon S3 Blob Storage چیه و چرا انقدر مهمه؟

ـAmazon S3 (Simple Storage Service) یکی از پرکاربردترین سرویس‌های AWS برای ذخیره‌سازی داده‌هاست.
این سرویس از نوع Object Storage محسوب می‌شه و برای ذخیره‌سازی حجم‌های زیادی از داده‌های ساختارنیافته (مثل فایل‌ها، تصاویر، ویدیوها یا بکاپ‌ها) طراحی شده.
تو AWS، S3 مثل یه انبار دیجیتاله که داده‌هات رو می‌ذاری و هر وقت بخوای با یه درخواست API بهشون دسترسی پیدا می‌کنی. سادگی در استفاده و مقیاس‌پذیریش باعث شده انتخاب اول خیلی از شرکت‌های بزرگ باشه.

🔍 چه ویژگی هایی داره؟

1⃣ـ **Object Storage:
توی Object Storage، داده‌ها تو قالب Object ذخیره می‌شن. هر Object شامل:
ـData: خود داده (مثل یه فایل)
ـMetadata: اطلاعات اضافی در مورد فایل
ـKey: یه شناسه منحصربه‌فرد برای پیدا کردن فایل

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


2⃣ـ Buckets
تو S3، داده‌ها توی چیزی به اسم Bucket ذخیره می‌شن.
هر Bucket مثل یه پوشه سراسریه که می‌تونی داده‌هات رو توش ذخیره کنی. چند نکته درباره Buckets:
اسماش باید یکتا باشن
می‌تونن عمومی یا خصوصی باشن
تو هر منطقه جغرافیایی (Region) جداگانه ساخته می‌شن


3⃣ مقیاس‌پذیری
فرقی نمی‌کنه بخوای 1 گیگ ذخیره کنی یا 100 ترابایت. S3 خودش مقیاس‌پذیری رو مدیریت می‌کنه و نگران منابع سخت‌افزاری نیستی.


4⃣ ـDurability و Availability

ـDurability:
ـS3 ادعا می‌کنه داده‌ها رو با تضمین 99.999999999% (11 9) ذخیره می‌کنه. این یعنی حتی با خرابی‌های سخت‌افزاری، دیتات از بین نمی‌ره.

ـAvailability:
زمان دسترسی به داده‌ها هم نزدیک به 99.99 درصد.


5⃣ امنیت داده‌ها
ـEncryption:
می‌تونی داده‌هات رو هم در زمان انتقال (SSL/TLS) و هم در زمان ذخیره‌سازی رمزنگاری کنی.

ـIAM Policies:
مدیریت دسترسی کاربران به Bucket و Objectها


ـBucket Policies:
قوانین امنیتی برای کنترل سطح دسترسی‌ها


6⃣ ـStorage Classes
ـS3 برای کاهش هزینه‌ها چند کلاس ذخیره‌سازی ارائه می‌ده:

ـStandard:
مناسب برای دسترسی‌های مکرر


ـIntelligent-Tiering:
خودش به‌صورت خودکار داده‌هایی که کمتر استفاده می‌شن رو به کلاس ارزون‌تر انتقال می‌ده

ـGlacier:
برای آرشیو کردن داده‌هایی که خیلی کم استفاده می‌شن


ـOne Zone-IA:
برای داده‌هایی که فقط تو یه منطقه ذخیره می‌شن



جمع‌بندی
فهمیدیم Amazon S3 یکی از قوی‌ترین و انعطاف‌پذیرترین ابزارهای ذخیره‌سازی داده‌ست که با امکاناتی مثل امنیت بالا، مقیاس‌پذیری بی‌نهایت و تنوع Storage Classes، بهت اجازه می‌ده هر سناریویی رو پیاده کنی.

امید وارم مفید بوده باشه :)

#AWS #تکنلوژوی #برنامه_نویسی


🔆 CHANNEL | GROUP
👍115
🤖 آیا هوش مصنوعی جای ما برنامه‌نویس‌ها رو می‌گیره؟

این سوالی که شاید خیلی از ماها بهش فکر کردیم: با رشد سرسام‌آور هوش مصنوعی و ابزارهایی مثل ChatGPT، Copilot و CodeWhisperer، قراره دیگه ما پشت کیبورد ننشینیم؟ بریم سر اصل ماجرا.


💡 هوش مصنوعی چیکار می‌کنه؟
هوش مصنوعی با خوندن حجم عظیمی از داده‌ها و کدهای برنامه‌نویسی یاد گرفته کد بنویسه یا مشکلات ساده رو حل کنه. مثلاً:

ـAutocomplete:
مثل Copilot که خطوط کامل کد رو پیش‌بینی می‌کنه


ـDebugging:
ابزارهایی که با پیشنهادهای رفع مشکل، سرعت دیباگ رو زیاد می‌کنن


ـCode Generation:
تولید بخش‌های خاصی از کد (CRUD‌ها یا اسکریپت‌های تکراری)



ولی آیا این یعنی ما حذف می‌شیم؟
نه دقیقاً. چون هنوز هوش مصنوعی برای حل مسائل پیچیده یا خلق معماری‌های خاص کافیه؟ نه. بیاید چند جنبه رو بررسی کنیم.

1⃣ کپی کردن یا خلاقیت؟
هوش مصنوعی یه ابزار فوق‌العاده برای تکرار کارهای روتین یا تولید کدهای پایه‌ایه. ولی وقتی پای معماری سیستم‌های پیچیده، تصمیم‌گیری توی طراحی و حل چالش‌های منحصر‌به‌فرد وسط باشه، هنوز هم به دانش انسانی نیاز داره.
مثلاً اگه ازش بخوای یه API Design مناسب برای یه پروژه خاص با محدودیت‌های خاص پیشنهاد بده، به سختی می‌تونه چیزی بسازه که کاملاً بهینه باشه.

2⃣ـ Context رو کامل درک نمی‌کنه
هوش مصنوعی مثل یه نویسنده تازه‌کار می‌مونه که توی زمینه خاصی مهارته ولی اگه ازش بخوای چند بخش از سیستم رو به هم وصل کنه، ممکنه گیج بشه.
مثلاً تو پروژه‌ای که چندین سیستم مستقل دارن با هم کار می‌کنن، طراحی ارتباطات بین اجزا و مدیریت خطاها چیزی نیست که یه ابزار ساده بتونه انجام بده.

3⃣ مسئله اخلاقی و امنیتی
کدی که هوش مصنوعی تولید می‌کنه ممکنه از لحاظ امنیتی قابل اعتماد نباشه. ابزارهای AI ممکنه کدی تولید کنن که از پروژه‌های متن‌باز یا دیتابیس‌های قبلی دزدیده شده باشه و حقوق مالکیت رو نقض کنه.

💼 برنامه‌نویس‌های آینده چه کارهایی می‌کنن؟

اگه می‌خوای تو دنیای AI دوام بیاری، بهتره این مهارت‌ها رو یاد بگیری:

ـSystem Design
چیزی که ابزارهای هوش مصنوعی نمی‌تونن انجام بدن، طراحی سیستمه.

ـProblem-Solving Skills
توانایی شکستن یه مسئله پیچیده به بخش‌های کوچیک هنوز هم هنر انسانه.

ـAI Integration
یاد بگیر چطور از ابزارهای هوش مصنوعی برای افزایش بهره‌وری خودت استفاده کنی.

ـSoft Skills
توانایی کار تیمی، ارتباطات موثر و تفکر خلاق چیزیه که هوش مصنوعی نداره.

آینده برنامه‌نویسی
هوش مصنوعی جایگزین ما نمی‌شه، ولی مثل یه ابزار قوی کمک می‌کنه سریع‌تر و بهتر کار کنیم. کسی که یاد بگیره با هوش مصنوعی کنار بیاد، از بقیه جلوتره.

#هوش_مصنوعی #برنامه_نویسی


🔆 CHANNEL | GROUP
👍133
🧵 ـGenerator ها در جنگو؛ یه ابزار خاص برای بهینه‌سازی کدها

اگه با پایتون آشنا باشی، احتمالاً می‌دونی که generator ها توی صرفه‌جویی حافظه و تولید داده به صورت lazy خیلی کاربرد دارن. اما این ابزار توی جنگو چطوری استفاده می‌شه؟ چجوری می‌تونیم ازشون بیشترین بهره رو ببریم؟ بیا با هم بررسی کنیم.

💡 ـGenerator چیه؟
ـGenerator یه نوع iterator خاصه که وقتی نیاز داری داده تولید می‌کنه، نه اینکه کل داده رو یه‌جا توی حافظه نگه داره. توی جنگو این ابزار وقتی مفید می‌شه که بخوای با داده‌های بزرگ کار کنی.

مثلاً:
◀️ کار با QuerySetهای سنگین
◀️ پردازش Streamهای داده‌ای
◀️ تولید گزارش‌های حجیم

🏗 چرا توی جنگو به generator نیاز داریم؟

تصور کن یه جدول دیتابیس با میلیون‌ها رکورد داری و باید اطلاعات رو به مرور پردازش کنی. اگه همه رکوردها رو یه‌جا لود کنی، سرور به احتمال زیاد می‌ترکه. اینجا generator ها به دادت می‌رسن. Lazy Evaluation یعنی فقط همون چیزی که نیاز داری رو تولید کن و حافظه رو با چیزای اضافی پر نکن.

استفاده از generator توی QuerySet

ـQuerySetهای جنگو به صورت پیش‌فرض lazy هستن. این یعنی تا وقتی که واقعاً نیاز نباشه، کوئری به دیتابیس نمی‌زنه. ولی می‌تونی این فرآیند رو با generatorها بهینه‌تر کنی.

مثال:
from django.db.models import QuerySet  

def get_large_data(queryset: QuerySet):
for obj in queryset.iterator():
yield process_object(obj)

def process_object(obj):
# پردازش رکورد
return obj

اینجا از متد iterator() استفاده کردیم که یه generator می‌سازه و باعث می‌شه کوئری به صورت chunk به chunk پردازش بشه.

🌊 ـStream کردن داده‌ها با generator
اگه بخوای یه فایل CSV بزرگ برای دانلود بسازی، generator یه ابزار طلاییه.
مثال:
import csv  
from django.http import StreamingHttpResponse

def stream_csv(queryset):
def generate():
yield ['Header1', 'Header2', 'Header3']
for obj in queryset.iterator():
yield [obj.field1, obj.field2, obj.field3]

response = StreamingHttpResponse(generate_csv(generate()), content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="data.csv"'
return response

def generate_csv(generator):
for row in generator():
yield ','.join(str(cell) for cell in row) + '\n'

اینجا به جای ساختن کل CSV توی حافظه، داده‌ها رو به صورت real-time تولید می‌کنیم.

🔸 نکات مهم

ـAvoid Overuse
اگه حجم داده‌ها خیلی کم باشه، استفاده از generator صرفاً پیچیدگی کد رو زیاد می‌کنه.


ـCombine with Chunking
اگه با دیتابیس‌های بزرگ کار می‌کنی، استفاده از generator به همراه متدهایی مثل iterator() یا chunked() توی QuerySet می‌تونه حسابی عملکرد رو بهینه کنه.
ـError Handling
حواست باشه که generatorها وقتی یه خطا پیش بیاد، از ادامه کار متوقف می‌شن. اگه نیاز داری عملیاتت ادامه پیدا کنه، باید exceptionها رو مدیریت کنی.
ـPipeline-like Processing
توی پروژه‌های پیچیده‌تر می‌تونی generatorها رو به هم chain کنی و مثل یه pipeline داده‌ها رو پردازش کنی.


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

امید وارم مفید بوده باشه :) ❤️

#django #برنامه_نویسی #پایتون


🔆 CHANNEL | GROUP
👍116
Forwarded from Sadra Codes
استکی که ابتدای راه انتخاب می‌کنید خیلی خیلی مهمه و باید حسابی با تحقیق و برنامه‌ریزی انتخابش کنید. آینده رو بسنجید. هدف خودتون رو بسنجید. صرف علاقه یا بدلیل سهولت یا محبوبیت، یک زبان رو انتخاب نکنید.

اینکه میگن یه زبان/فریم‌ورک/ابزار رو که انتخاب کردید، تمام تمرکز رو بذارید روش و حسابی توش دیپ شید کاملا اشتباهه بنظرم.

شاید دیپ شدن در اون استک خاص خوب و مفید باشه، ولی به هیچ وجه تمام تمرکز رو روی اون نذارید. دقیقا مثل همون قضیه تخم مرغ و سبده. همیشه توی ساید داستان، یکی دوتا ابزار یا فریم ورک دیگه که زیاد ارتباطی به استک اصلیتون ندارن رو هم کار کنید و گاها جدی دنبالش کنید. بک اند پایتون کار می‌کنید؟ هرازگاهی یه دوتا توتوریال از ریکت یا نکست ببینید.

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

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

گاها یهو دیدین که همین سیستم، خودش تونست تبدیل به یه ایده شه و روی ریپازیتوری پایتون (یا بلعکس) مرج شه حتی. اگه دقت کرده باشین خیلی از دولوپرهای پایتون اصلا استک اصلیشون پایتون نیس. مثلا طرف راست کد می‌زنه، میگه فلان چیزو اینجا داریم، شما هم اضافه کنید. (این سیستم واسه فیچر هایی که جدید رلیز میشن روی یه زبان خیلی جواب میده)
👍123
پست بعدی چی باشه؟
👀7
معرفی Kafka 🌀

اگه سیستم‌هایی با معماری پیچیده طراحی می‌کنی یا می‌خوای با حجم زیادی از داده کار کنی، احتمالش زیاده اسم Kafka رو شنیده باشی. Kafka یه Distributed Streaming Platform هست که توسط LinkedIn ساخته شد و بعدش به Apache منتقل شد. اما چرا Kafka این‌قدر مهمه و کجاها به کار میاد؟ بیایید دقیق بررسیش کنیم.

📜 ـKafka چرا ساخته شد؟
تو معماری سیستم‌های بزرگ، نیاز به ارتباط بین سرویس‌ها (Microservices) یا انتقال حجم زیادی از داده خیلی جدیه. قبل از Kafka، ابزارهایی مثل RabbitMQ یا ActiveMQ بودن، ولی این‌ها با رشد سریع داده و نیازهای مقیاس‌پذیری، کم میاوردن. Kafka اومد تا چند تا مشکل اساسی رو حل کنه:

حجم بالای داده:
ـKafka می‌تونه میلیون‌ها پیام در ثانیه رو مدیریت کنه.


سیستم‌های توزیع‌شده:
برای سیستم‌هایی که از چندین سرویس استفاده می‌کنن، یه ابزار مطمئن برای انتقال پیام لازمه.


ذخیره‌سازی پایدار:
برخلاف Kafka ، RabbitMQ پیام‌ها رو برای مدت مشخصی نگه می‌داره.


ری‌پلی دیتا:
اگه یه سرویس دچار مشکل بشه، می‌تونه دوباره پیام‌ها رو از Kafka بخونه.


🛠 ـKafka چطوری کار می‌کنه؟
ـKafka یه ساختار ساده ولی قوی داره:

ـProducers:
وظیفه تولید و ارسال پیام‌ها رو دارن. این پیام‌ها می‌تونن هر چیزی باشن، مثل داده‌های تراکنش، لاگ سیستم، یا حتی کلیک‌های کاربران تو سایت.


ـTopics:
پیام‌ها توی تاپیک‌ها ذخیره می‌شن. هر تاپیک می‌تونه مربوط به یه بخش از سیستم باشه (مثلاً تاپیک سفارشات، تاپیک کاربران).


ـConsumers:
وظیفه خوندن پیام‌ها از تاپیک‌ها رو دارن.


ـBrokers:
ـ Kafka روی چندین ماشین یا سرور (به نام Broker) اجرا می‌شه و وظیفه توزیع پیام‌ها بین این سرورها رو داره.


🔥 چرا باید Kafka استفاده کنیم؟
ـKafka فقط یه ابزار ساده برای انتقال پیام نیست. قابلیت‌های منحصربه‌فردش اونو به یه انتخاب عالی برای سیستم‌های بزرگ تبدیل کرده:

1⃣ مقیاس‌پذیری بالا
ـKafka می‌تونه به راحتی برای سیستم‌های بزرگ استفاده بشه. مثلاً اگه یه میلیارد تراکنش در روز داری، Kafka همچنان جواب می‌ده.

2⃣ ـFault Tolerance
به خاطر معماری توزیع‌شده، اگه یکی از سرورها (Broker) از کار بیفته، بقیه سرورها همچنان کار می‌کنن.

3⃣ـMessage Replay
مصرف‌کننده‌ها می‌تونن پیام‌ها رو هر وقت لازم شد دوباره بخونن. مثلاً اگه سیستمت یه مشکل داشت و نیاز به بازپردازش داده بود.

4⃣ پشتیبانی از استریمینگ
می‌تونی داده‌ها رو به صورت Real-time پردازش کنی. ابزار Kafka Streams دقیقاً برای این کار طراحی شده.

جمع بندی
ـKafka یه ابزار قدرتمنده که بیشتر تو سیستم‌های توزیع‌شده و پرحجم استفاده می‌شه. اگه قراره روی پروژه‌ای کار کنی که نیاز به پردازش Real-time یا انتقال حجم بالای داده داره، Kafka یکی از بهترین انتخاب‌هاست.

#programming #Kafka


🔆 CHANNEL | GROUP
👍34🔥10👏5
احتمال میدم تو اپدیت های بعدی انسان دود ششم اضافه شه
5👀5
ـArchitecture Design چیه؟ 🏗️

اگه  با برنامه‌نویسی آشنا باشی، احتمالش زیاده که اسم Design Patterns به گوشت خورده باشه. Design pattern  ها راه‌حل‌های هستن برای مشکلات تکراری که موقع کدنویسی باهاشون مواجه می‌شی. اما وقتی پروژه‌ها بزرگ‌تر می‌شن، علاوه بر Design Patterns ها به  Architecture Design هم نیاز پیدا میکنیم.

چرا Architecture Design مهمه؟ 🤔
وقتی نرم‌افزارها تو دهه‌های ۸۰ و ۹۰ بزرگ‌تر شدن، پیچیدگی سیستم‌ها هم بیشتر شد. اون موقع بیشتر برنامه‌ها Monolithic بودن؛ یعنی همه چیز تو یه کدبیس جمع شده بود. این نوع معماری برای پروژه هایی مناسبه که پیچیدگی زیادی ندارن و نیاز به سرویس های مختلف نیست، ولی وقتی پروژه بزرگ می‌شه، دردسرایی مثل سختی توسعه، نگهداری، و مقیاس‌پذیری رو به همراه داره.
اینجاست که Architecture Design بهت کمک می‌کنه تا یه طرح کلی برای سیستم داشته باشی که هم کارا باشه، هم بتونه چالشایی مثل رشد کاربرها، خطاها، و نیاز به تغییرات رو هندل کنه.

فرق Design Patterns و Architecture Design

ـDesign Patterns 🧩
ـDesign Patterns یعنی یه سری راه‌حل‌های آماده و تست‌شده که برای مشکلات تکراری توی برنامه‌نویسی ارائه شدن. این الگوها تو یه سری موقعیت خاص خیلی خوب جواب می‌دن و باعث می‌شن که کدی که می‌نویسی خواناتر، قابل‌نگهداری‌تر، و استانداردتر بشه. مثلا:

ـSingleton:
فقط یه نمونه از یه کلاس ساخته بشه.


ـFactory:
ساخت اشیا بدون اینکه کلاس دقیق‌شونو مشخص کنی.


و...

ـ Architecture Design 🏗
ـArchitecture Design در واقع به طراحی ساختار کلی سیستم اشاره داره. یعنی شما باید از دیدی وسیع‌تر به پروژه نگاه کنی و تصمیم بگیری که چه نوع معماری به درد پروژه می‌خوره. هدف اینه که سیستمت بتونه نیازهای آینده رو برآورده کنه و در برابر چالش‌هایی مثل مقیاس‌پذیری، نگهداری و توسعه مقاوم باشه.

برای معماری نرم‌افزار معماری های مختلفی وجود داره. مثلا:

ـEvent-Driven Architecture:
این نوع معماری از Eventها برای ارتباط بین اجزای مختلف سیستم استفاده می‌کنه. اینطوری سیستم‌های پیچیده و بزرگ می‌تونن به راحتی به هم متصل بشن و با کمترین تغییرات تو اجزا، همچنان عملکرد خوبی داشته باشن.

ـMicroservices:
در این معماری، سیستم به بخش‌های کوچکتر و مستقل تقسیم میشه که هر کدوم می‌تونن به طور جداگانه کار کنن. این باعث میشه که مقیاس‌پذیری و نگهداری سیستم خیلی راحت‌تر بشه.

یکسری ابزارهای واسه Architecture Design

ـUML Diagrams: واسه طراحی ساختار.
ـC4 Model: برای نمایش لایه‌های مختلف.
ـEvent Storming: برای فهمیدن ارتباطات بین اجزا.

جمع‌بندی
فهمیدیم Architecture Design دید کلی بهت می‌ده و کمک می‌کنه پروژه‌های بزرگ رو راحت‌تر مدیریت کنی. اینجوری هم از مشکلات و هزینه‌های اضافه جلوگیری می‌کنی، هم نرم‌افزارت بهتر جواب می‌ده.

#programming #design


🔆 CHANNEL | GROUP
🔥12👍32
https://t.iss.one/geek_engineers

یکی از کانال هایی که محتواش عالیه ولی اصلا حمایت نمیشه 😕
پیشنهاد میکنم حتما یه سری بزنید واقعا کانال خفنیه و خودم کلی چیز یاد گرفتم ازش
🔥5
لینکدین عالیه حتما نصب کنید

🔆 CHANNEL | GROUP
🤣17👍3
FastAPI.Modern.Python.Web.Development.pdf
24 MB
کتاب Fastapi واقعا یکی از بهترین منابع برای یادگیری Fastapi هست.
اگه دوست دارید fastapi یادبگیرید حتما بخونیدش

#کتاب


🔆 CHANNEL | GROUP
🔥63👍2
میخوام یه سوال ازتون بپرسم، بدون اینکه جوابشو سرچ کنید بگید چرا.

اگه برید یه حلقه for بزنید که ۱۰۰,۰۰۰ بار یه متن رو پرینت کنه (یه بار توی golang یه بارم توی python)
و تست سرعت بگیرید.
میبینید پایتون ۱۰ الا ۱۷ ثانیه اجراش میکنع
گولنگ ۵۰ ثانیه الا ۱ دقیقه

بنظرتون دلیلش چیه؟ چرا بااینکه go کامپایلریه و خیلی سریعه انقدر کند تره نسبت به پایتون توی این مورد؟ 🤔

#question


🔆 CHANNEL | GROUP
👍4😁3👎2
Ninja Learn | نینجا لرن
میخوام یه سوال ازتون بپرسم، بدون اینکه جوابشو سرچ کنید بگید چرا. اگه برید یه حلقه for بزنید که ۱۰۰,۰۰۰ بار یه متن رو پرینت کنه (یه بار توی golang یه بارم توی python) و تست سرعت بگیرید. میبینید پایتون ۱۰ الا ۱۷ ثانیه اجراش میکنع گولنگ ۵۰ ثانیه الا ۱ دقیقه…
چرا پایتون تو اینجا سریع‌تر از گولنگه؟ 🤔

1⃣ ماجرای سیستم کال و بافرینگ
وقتی یه متن رو چاپ می‌کنی، اون متن باید از برنامه به خروجی (مثل ترمینال) فرستاده بشه. این کار با چیزی به اسم System Call انجام می‌شه، که مثل زنگ زدن به سیستم‌عامله و می‌گی: "هی، این متن رو بگیر و به خروجی بفرست".

گولنگ:
هر بار که fmt.Println رو صدا می‌زنی، داده فوراً از برنامه به بافر stdout سیستم‌عامل فرستاده می‌شه. یعنی ۱۰۰,۰۰۰ بار fmt.Println یعنی ۱۰۰,۰۰۰ تا تماس جداگانه با سیستم‌عامل

پایتون:
قبل از اینکه داده‌ها رو به stdout بفرسته، خروجی‌ها رو تو یه بافر داخلی نگه می‌داره. بعد وقتی بافر پر شد یا چاپ به انتهای خط رسید (به کمک line buffering)، داده‌ها رو یه‌جا به stdout می‌فرسته. یعنی تعداد تماس‌ها با سیستم‌عامل خیلی کم‌تر می‌شه (مثلاً به جای ۱۰۰,۰۰۰ بار، فقط ۱۰ بار).

2⃣ ـstdout خودش بافرینگ داره، پس چرا مشکل داریم؟

درسته که stdout (که به سیستم‌عامل تعلق داره) خودش بافرینگ داره، ولی این بافر برای هر تماس جداگانه کار می‌کنه.
مشکل اصلی اینه که وقتی گولنگ مستقیم داده‌ها رو به stdout می‌فرسته، تعداد تماس‌ها (System Calls) خیلی زیاده و این تماس‌های متعدد باعث کاهش سرعت می‌شه.
پایتون با بافر داخلی خودش این مشکل رو حل می‌کنه و تماس‌ها رو کم می‌کنه.

3⃣ چطور گولنگ رو بهینه کنیم؟
اگه بخوای گولنگ هم مثل پایتون سریع بشه، باید بافرینگ رو دستی پیاده‌سازی کنی. مثلاً با bufio.Writer:
package main

import (
"bufio"
"os"
)

func main() {
writer := bufio.NewWriter(os.Stdout) // بافر کردن خروجی
for i := 0; i < 100000; i++ {
writer.WriteString("Hello, world!\n")
}
writer.Flush() // ارسال بافر به خروجی
}

اینجا bufio.Writer خروجی‌ها رو توی یه بافر داخلی نگه می‌داره و فقط وقتی که بافر پر شد یا خودت Flush کردی، داده‌ها رو به stdout سیستم‌عامل می‌فرسته.

4⃣ نتیجه

گولنگ:
هر بار با fmt.Println یه تماس به سیستم‌عامل می‌فرسته، که هزینه‌ی زیادی داره.


پایتون:
با بافر داخلی خودش، تماس‌ها رو کم می‌کنه و همین باعث می‌شه در چاپ‌های متوالی سریع‌تر باشه.


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

🔆 CHANNEL | GROUP
👍14🔥64
نظرتون چیه درمورد Golang هم پست بزاریم؟
👍50👎15👀2
Ninja Learn | نینجا لرن
نظرتون چیه درمورد Golang هم پست بزاریم؟
مثل اینکه از go خوشتون اومده😂
👍16👎74😁3🆒1
خب خب Go چیه و چرا؟

گو (Go)، یا همون Golang که لوگوش از حیوان gopher الهام گرفته شده، یه زبان برنامه‌نویسی مدرنه که گوگل سال 2009 معرفی کرد.

چرا Go ساخته شد؟ 🤔
تو پروژه‌های بزرگ، زبان‌هایی مثل C++ و Java، با وجود قدرت زیاد، به دلیل پیچیدگی زیاد و سرعت پایین توسعه، دردسرساز بودن. Go این مشکلات رو با ترکیب سادگی و سرعت حل کرد:

1⃣ سینتکس ساده:
کدها راحت‌تر نوشته و خونده می‌شن.


2⃣ عملکرد بالا:
ـ Go مثل C مستقیماً به کد ماشین کامپایل می‌شه، برای همین سریع اجرا می‌شه.


3⃣ مدیریت حافظه خودکار:
با استفاده از Garbage Collection، مدیریت حافظه ساده و بدون دخالت مستقیم برنامه‌نویس انجام می‌شه.


4⃣ ابزارهای مدرن:
مدیریت همزمانی، تست، و مدیریت حافظه به شکل مدرنی طراحی شده.


5⃣ مناسب برای پروژه‌هایی با مقیاس بالا:
ـGo در ابتدا برای تسهیل توسعه پروژه‌های بزرگ و زیرساختی گوگل طراحی شد.



ویژگی‌های مهم Go 🧩

1⃣ سادگی
ـGo از همون اول برای ساده بودن طراحی شد. توش خبری از ارثبری پیچیده یا کلی مفهوم سنگین نیست. این یعنی یادگیری و استفاده ازش راحت‌تره ( البته نه خیلی ساده 😅).

2⃣ مدیریت همزمانی به بهترین شکل
ـGo با Goroutines، اجرای همزمان رو خیلی سبک و سریع کرده. این Goroutines نسبت به Threadها خیلییی کم‌هزینه‌تر هستن و فقط چند کیلوبایت حافظه مصرف می‌کنن. مثلا می‌تونی صدها کار همزمان انجام بدی بدون اینکه سرور زیر بار بره.
3⃣ کتابخانه های قدرت مند
کتابخونه استاندارد Go بیشتر چیزایی که برای ساختن یه برنامه نیاز داری رو داره، از کار با شبکه گرفته تا رمزنگاری و فایل. این کتابخونه‌ها به شکل بهینه طراحی شدن تا بدون نیاز به ابزارهای خارجی، بسیاری از نیازهای شما رو برطرف کنن.
4⃣ ـCross-Platform بودن
کد Go رو یه بار کامپایل می‌کنی و روی سیستم‌عامل‌های مختلف می‌تونی اجراش کنی. این قابلیت به خاطر تولید فایل باینری مستقل فراهم شده که نیازی به runtime مثل JVM یا Python Interpreter نداره.
5⃣ سازگاری با معماری Microservices
ـGo به خاطر سبک و سریع بودنش، برای ساخت Microservices عالیه. سرویس‌های کوچیک و مستقلی که Go مدیریت‌شون رو خیلی راحت کرده.
6⃣ مدیریت Dependency‌ها با Go Modules
ـGo ابزار Go Modules رو داره که مدیریت وابستگی‌ها رو ساده و مدرن کرده. این ابزار امکان تعریف ورژن ها و مدیریت کتابخانه‌ها رو خیلی راحت‌تر از روش‌های سنتی میکنه.
کجاها از Go استفاده می‌شه؟
ـBackend
ـDevOps
ـCloud
ـDistribution systems
ـBloc
kchain
و...

نمونه کد Go 💻

یه مثال از ارسال درخواست HTTP همزمان با استفاده از Goroutines:
package main

import (
"fmt"
"net/http"
)

func fetch(url string) {
resp, err := http.Get(url)
if err != nil {
fmt.Println(url, "Error:", err)
return
}
defer resp.Body.Close()
fmt.Println(url, resp.Status)
}

func main() {
urls := []string{"https://example.com", "https://google.com", "https://golang.org"}

for _, url := range urls {
go fetch(url)
}

fmt.Scanln() // برای جلوگیری از بسته شدن برنامه



#go #برنامه_نویسی


🔆 CHANNEL | GROUP
👍84