Forwarded from It's FOSS
It's Hacktoberfest time! Here's everything you need to know! 🥇
https://itsfoss.com/hacktoberfest-guide/
https://itsfoss.com/hacktoberfest-guide/
It's FOSS
How to Contribute to Open Source in Hacktoberfest
Hacktoberfest is the best place to give back to open-source projects. Here's everything you need to know about Hacktoberfest and how to participate in it..
🤩1
It's FOSS
It's Hacktoberfest time! Here's everything you need to know! 🥇 https://itsfoss.com/hacktoberfest-guide/
دوستان اکتبر شروع شده و باز برنامه هکتوبرفست در جریانه.
قضیه از این قراره که اگه توی ماه اکتبر ۶ تا مرج ریکویست ارسال کنید که مرج بشه، بج هکتوبرفست میگیرید. قبلا تیشرت هم میدادن البته ولی با توجه به سواستفاده ها دیگه انگار خبری نیست. :)
https://hacktoberfest.com
قضیه از این قراره که اگه توی ماه اکتبر ۶ تا مرج ریکویست ارسال کنید که مرج بشه، بج هکتوبرفست میگیرید. قبلا تیشرت هم میدادن البته ولی با توجه به سواستفاده ها دیگه انگار خبری نیست. :)
https://hacktoberfest.com
Hacktoberfest
Hacktoberfest 2025
Hacktoberfest: a month-long celebration of open-source projects, their maintainers, and the entire community of contributors.
🔥5❤1
در مورد hookهای git:
گیت امکانات مختلفی داره و یکی از امکاناتش که دستمون رو خیلی باز میکنه برای انواع شخصی سازی ها، hook ها هستن. قضیه از این قرارها که توی پوشه .git/hooks میتونید یکسری اسکریپت قابل اجرا بگذارید با اسم های معلوم و خود گیت در زمان های مشخص اونا رو اجرا میکنه. معلوم ترینش precommit hook هست که گیت بعد از اومدن دستور کامیت و قبل از این که واقعا کامیت کنه اون اسکریپت رو اجرا میکنه. توی اون اسکریپت میتونید کد رو فرمت کنید یا تست ها رو اجرا کنید تا مطمین بشین که کامیت های atomic دارید. البته قابل دور زدن هم هست.
فقط دقت کنید که هوک ها جزو چیزاییه که خودتون اونجا میگذارید و توی خود گیت ورژن کنترل نمیشه.
گیت امکانات مختلفی داره و یکی از امکاناتش که دستمون رو خیلی باز میکنه برای انواع شخصی سازی ها، hook ها هستن. قضیه از این قرارها که توی پوشه .git/hooks میتونید یکسری اسکریپت قابل اجرا بگذارید با اسم های معلوم و خود گیت در زمان های مشخص اونا رو اجرا میکنه. معلوم ترینش precommit hook هست که گیت بعد از اومدن دستور کامیت و قبل از این که واقعا کامیت کنه اون اسکریپت رو اجرا میکنه. توی اون اسکریپت میتونید کد رو فرمت کنید یا تست ها رو اجرا کنید تا مطمین بشین که کامیت های atomic دارید. البته قابل دور زدن هم هست.
فقط دقت کنید که هوک ها جزو چیزاییه که خودتون اونجا میگذارید و توی خود گیت ورژن کنترل نمیشه.
1👍19❤6
یه استفاده که من اخیرا از git hook کردم ابن بود که مطمین بشم کامیت مسیج های یه سری پروژه خاص، یه فرمت خاصی رو رعایت میکنن. برای این کار از هوک commit-msg استفاده کردم. این هوک هم میاد قبل از این که واقعا کامیت صورت بگیره اجرا میشه و کامیت مسیج رو دریافت میکنه. در نهایت با کمک exit code میتونید مشخص کنید که کامیت مورد تایید هست یا باید ریجکت بشه.
کدی که من نوشتم:
#!/bin/bash
commit_regex='some regex'
error_msg="Aborting commit."
if ! grep -E "$commit_regex" "$1"; then echo "$error_msg" >&2
exit 1
fi
این فایل باید به این اسم سیو بشه: commit-msg توی پوشه hooks اون ریپوزیتوری.
اما حالا برای این که این اسکریپت رو همه جا تکرار نکنم چیکار کردم؟ اومدم از core hooks استفاده کردم. به این شکل میتونم بگم پوشه هوک دیفالت برای همه پرورهها یکی باشه و نیاز نیست برم داخل هر پروژه تک تک چک کنم.
کامندی که استفاده کردم اینه:
git config core.hooksPath
و نهایتا کانفیگ گیت اینطوری میشه:
[core]
hooksPath = /path/to/hooks/dir
اما اینجا هنوز یه تیکه گمشده دیگه هست. با این تغییراتی که من دادم این فرمت برای همهی پروژه ها روی سیستمم اعمال شد ولی من اینو نمیخوام، بلکه میخوام فقط توی پروژه خاصی خاصی اعمال بشه. کاری که میکنم استفاده از conditional config توی گیته. قضیه اینطوریه که یه فایل کانفیگ ثانویه میسازم که این کانفیگ توش نوشته شده و توی کانفیگ اصلی میگم includeif: یعنی فقط وقتی این کانفیگ رو اعمال کن که پوشه گیت من داخل یکی از این پوشه ها بود یا داخل مسیری بود که این پترن رو داشت.
منابع:
https://git-scm.com/docs/githooks
و
https://dev.to/chaz8080/git-smart-streamlining-your-workflow-with-the-prepare-commit-msg-hook-432p
و
https://medium.com/@mrjink/using-includeif-to-manage-your-git-identities-bcc99447b04b
و اگه خواستید دقیقش رو توی dotfile م ببینید:
https://github.com/rsharifnasab/dotfiles/blob/2b3ba235c300e8a5dbec53a7a84dde350ca372af/configs/.config/git/config#L51
و
https://github.com/rsharifnasab/dotfiles/blob/37f0812046ef9eceb7c3e18ff0e9fb6b30843828/configs/.config/git/snapp#L9
کدی که من نوشتم:
#!/bin/bash
commit_regex='some regex'
error_msg="Aborting commit."
if ! grep -E "$commit_regex" "$1"; then echo "$error_msg" >&2
exit 1
fi
این فایل باید به این اسم سیو بشه: commit-msg توی پوشه hooks اون ریپوزیتوری.
اما حالا برای این که این اسکریپت رو همه جا تکرار نکنم چیکار کردم؟ اومدم از core hooks استفاده کردم. به این شکل میتونم بگم پوشه هوک دیفالت برای همه پرورهها یکی باشه و نیاز نیست برم داخل هر پروژه تک تک چک کنم.
کامندی که استفاده کردم اینه:
git config core.hooksPath
و نهایتا کانفیگ گیت اینطوری میشه:
[core]
hooksPath = /path/to/hooks/dir
اما اینجا هنوز یه تیکه گمشده دیگه هست. با این تغییراتی که من دادم این فرمت برای همهی پروژه ها روی سیستمم اعمال شد ولی من اینو نمیخوام، بلکه میخوام فقط توی پروژه خاصی خاصی اعمال بشه. کاری که میکنم استفاده از conditional config توی گیته. قضیه اینطوریه که یه فایل کانفیگ ثانویه میسازم که این کانفیگ توش نوشته شده و توی کانفیگ اصلی میگم includeif: یعنی فقط وقتی این کانفیگ رو اعمال کن که پوشه گیت من داخل یکی از این پوشه ها بود یا داخل مسیری بود که این پترن رو داشت.
منابع:
https://git-scm.com/docs/githooks
و
https://dev.to/chaz8080/git-smart-streamlining-your-workflow-with-the-prepare-commit-msg-hook-432p
و
https://medium.com/@mrjink/using-includeif-to-manage-your-git-identities-bcc99447b04b
و اگه خواستید دقیقش رو توی dotfile م ببینید:
https://github.com/rsharifnasab/dotfiles/blob/2b3ba235c300e8a5dbec53a7a84dde350ca372af/configs/.config/git/config#L51
و
https://github.com/rsharifnasab/dotfiles/blob/37f0812046ef9eceb7c3e18ff0e9fb6b30843828/configs/.config/git/snapp#L9
DEV Community
Git Smart: Streamlining Your Workflow with the prepare-commit-msg Hook
Overview If you want to learn how to improve and automate your commit messages, you're in...
1👍13❤6
برای هر کامیت git خوبه که یه مسیج خوب بنویسیم. معمولا git commit -m میزنیم و همونجا توی ترمینال یه مسیج یک خطی مینویسیم. اما اگه بخوایم حرفهای تر عمل کنیم چی؟
یه راهش استفاده از git commit template ئه. اگر از این آپشن استفاده کنیم زمانی که git commit رو بدون -m بزنیم ادیتور باز میشه و اون تمپلیت رو به عنوان متن اولیه ما نشون میده و میتونیم روی اون تغییرات رو اعمال کنیم.
این مطلب هم آموزش فوقالعادهای برای شروع کار با کامیت مسیج ها بود. من لینک قسمت commit template ش رو گذاشتم براتون، ولی اسکرول کنید و باقی قسمت ها رو هم ببینید.
https://axolo.co/blog/p/git-commit-messages-best-practices-examples#how-to-set-up-a-git-commit-message-template
یه راهش استفاده از git commit template ئه. اگر از این آپشن استفاده کنیم زمانی که git commit رو بدون -m بزنیم ادیتور باز میشه و اون تمپلیت رو به عنوان متن اولیه ما نشون میده و میتونیم روی اون تغییرات رو اعمال کنیم.
این مطلب هم آموزش فوقالعادهای برای شروع کار با کامیت مسیج ها بود. من لینک قسمت commit template ش رو گذاشتم براتون، ولی اسکرول کنید و باقی قسمت ها رو هم ببینید.
https://axolo.co/blog/p/git-commit-messages-best-practices-examples#how-to-set-up-a-git-commit-message-template
axolo.co
Ultimate Guide to Git Commit Message Templates: Best Practices and Examples | Axolo Blog
Dive into the ultimate guide to Git commit message templates. Discover best practices for crafting clear, informative, and consistent commit messages. Explore real-world examples and learn how to improve your Git workflow and collaboration.
❤🔥15❤2
اگه به git hook ها علاقه مند شدید، یکسری ابزار ساده هم هست که میتونید استفاده کنید تا کمی کارتون راحت تر باشه. من husky رو پیدا کردم که میاد با کمک core hooks براتون هوک ها رو مدیریت میکنه. سبک وزن و بامزهست ولی بدون اون هم کارتون راه میوفته.
https://typicode.github.io/husky/
یکسری امکانات. pre commit hook هم میتونید توی این پروژه پیدا کنید.
https://pre-commit.com/
و گیتهابشون:
https://github.com/pre-commit/pre-commit-hooks
https://typicode.github.io/husky/
یکسری امکانات. pre commit hook هم میتونید توی این پروژه پیدا کنید.
https://pre-commit.com/
و گیتهابشون:
https://github.com/pre-commit/pre-commit-hooks
typicode.github.io
Husky
Git hooks made easy
1❤8👍3
من معمولا اهل خبرنامه ایمیل نیستم، ولی یه خبرنامه رو عضو شدم و فعلا خوشحالم کرده برای همین تصمیم گرفتم معرفیش کنم.
به شکل مرتب (فکر کنم روزانه) اخبار رو میگه. به ترتیب اهمیت مرتب میکنه و معمولا اگه چیزی جالب باشه همون یکی دو تای اوله.
این شما و این هم rundown ai
https://www.therundown.ai/
به شکل مرتب (فکر کنم روزانه) اخبار رو میگه. به ترتیب اهمیت مرتب میکنه و معمولا اگه چیزی جالب باشه همون یکی دو تای اوله.
این شما و این هم rundown ai
https://www.therundown.ai/
The Rundown AI
Get the latest AI news, understand why it matters, and learn how to apply it in your work. Join 1,000,000+ readers from companies like Apple, OpenAI, NASA.
👍8👎5🔥4❤1😱1
Forwarded from Agora (Alireza)
Swiss Table
______________________________
روشهای مرسوم رفع تصادم (collision) توی hashmap رو تو درس ساختمان داده خوندیم:
1- open addressing
2- chaining
3- hybrid
خیلی خلاصه بخوام هرکدوم رو مرور کنم اینطور میشه:
در open addressing اینطور عمل میکنیم که وقتی تصادم رخ داد، اینقدر توی آرایهی wrap شده جلو میریم تا به اولین خونهی خالی برسیم و item رو اونجا بذاریم.
در روش chaining هر خونهی آرایهی ما یک عنصر نگه میداره و یک پوینتره به یک ساختماندادهی دیگه که میتونه یک linked list باشه یا یک درخت متوازن مثل red-black یا AVL. در صورتی که توی اون خونهی آرایه از قبل دادهای وجود داشته باشه، آیتم جدید رو push میکنیم توی اون ساختماندادهای که اون خونه بهش اشاره میکنه.
در روش سوم، یکی از روشهای اول و دوم رو با مکانیزم هشچندباره ترکیب میکنیم. به این صورت که چند الگوریتم هش متفاوت رو در نظر میگیریم. در صورتی که با هش آیتم مدنظرمون تصادم رخ داد، یک الگوریتم هش جدید رو انتخاب میکنیم. مکانیزم انتخاب الگوریتم هش هم میتونه هرچی باشه. ما ساده و round robin در نظر میگیریم. این کار رو تا زمانی ادامه میدیم که تمام الگوریتمهای هشمون رو تست کرده باشیم و همشون منجر به تصادم شده باشن. بعد با استفاده از یکی از روشهای ۱ یا ۲ اقدام به ذخیره کردن آیتم میکنیم.
تمام این قصهها چیزهایی هست که تا اینجا میدونیم و مرسومه. ولی واقعاً چقدر از این روشها استفاده میشه؟ آیا میشه پا رو فراتر گذاشت و عملکرد رو از این هم بهتر کرد؟
توی جاهایی مثل Cloudflare که عملکرد در حد میکروثانیه مهمه، گاهی باید پا رو فراتر گذاشت. گاهی سادهترین جزئیات میتونن تفاوت چندبرابری در سرعت ایجاد کنن. انگار یه نوع amplification رخ میده؛ بهینهسازی کوچیک که باعث میشه کل سیستم خیلی سریعتر بهنظر بیاد.
یکی از ایدههایی که دقیقاً با همین ذهنیت طراحی شده، ساختار Swiss Tableه. گوگل با در نظر گرفتن چالش کش سرورها دست به طراحی این ساختار زده. زبانهایی مثل Rust هم از همین ساختار برای پیادهسازی پیشفرض HashMap خودشون استفاده میکنن.
گوگل تو کنفرانس CppCon 2017 هم دربارهی طراحی و بهینهسازی این ساختار ارائهای داشت که دیدنش خالی از لطف نیست:
CppCon 2017: Matt Kulukundis – Designing a Fast, Efficient Hash Table
Swiss Table در اصل هنوز از ایدهی open addressing استفاده میکنه؛ یعنی دادهها مستقیماً در یک آرایه ذخیره میشن و وقتی تصادم رخ بده، دنبال خونهی بعدی میگردیم تا جایی برای درج پیدا کنیم. ولی تفاوت اصلیش اینه که چطور این آرایه
bucket
بندی میشه و چطور CPU ازش استفاده میکنه.
در Swiss Table، آرایهی اصلی به چند bucket تقسیم میشه. هر bucket معمولاً چند تا slot داره (مثلاً 8 تا)، یعنی هر bucket خودش میتونه تا 8 تا عنصر نگه داره.
در کنارش یه آرایهی کوچیکتر از metadata داریم که برای هر slot فقط یه بایت اطلاعات ذخیره میکنه. توی این بایت، یه تیکه از هش کلید (مثلاً 7 بیت از اون) نگه داشته میشه تا CPU بتونه سریعتر بفهمه کدوم slot احتمالاً مربوط به کلید مورد نظره.
وقتی میخوایم دنبال یه کلید بگردیم یا کلید جدیدی وارد کنیم، Swiss Table با استفاده از
SIMD (Single Instruction, Multiple Data)
چند بایت metadata رو با هم میخونه (مثلاً 16 تا در یک لحظه) و در عرض یک دستور CPU بررسی میکنه که آیا هش کوچیک ذخیرهشده توی اونها با هش کلید ما یکیه یا نه.
بعد اگه یکی از اونها match کرد، تازه میره سراغ دادهی واقعی و بررسی دقیقتر انجام میده.
Swiss Table تنها نمونهی چنین طراحیای نیست. بعد از گوگل، پروژههای بزرگ دیگه مثل
Facebook’s F14
ایدههای مشابه استفاده کردن.
زبانهایی مثل Rust و Go هم با الهام از همین طراحی، نسخههای خودشون رو ساختن.
در پیادهسازی Go، تیم توسعه با یه چالش جدی روبهرو شد که بهطور مفصل توی این پست توضیح داده شده:
The Go Blog – Swiss Table
مشکل از اینجا شروع شد که وقتی آرایهی اصلی هشمپ به حد آستانهی ظرفیتش میرسه، باید سایزش دو برابر بشه و کل دادههای قبلی داخل آرایهی جدید کپی بشن.
این فرایند در سیستمهای عادی چندان مشکلی ایجاد نمیکنه، ولی در سرورهای کش که چند ترابایت دیتا داخل مموری دارن، این resize میتونه به شدت زمانبر و کند باشه.
راهحلی که گولنگ برای این موضوع ارائه داد، استفاده از hashmapهای چندلایه (multi-level) بود. بهجای resize کامل، دادههای جدید در یک لایهی بالاتر ذخیره میشن و بهصورت تدریجی دادههای قدیمی جابهجا میشن. اینطوری عملیات resize به بخشهای کوچیک تقسیم میشه و فشار ناگهانی از روی سیستم برداشته میشه.
این پست رو هم از دست ندین:
A new fast hash table in response to Google’s new fast hash table
______________________________
روشهای مرسوم رفع تصادم (collision) توی hashmap رو تو درس ساختمان داده خوندیم:
1- open addressing
2- chaining
3- hybrid
خیلی خلاصه بخوام هرکدوم رو مرور کنم اینطور میشه:
در open addressing اینطور عمل میکنیم که وقتی تصادم رخ داد، اینقدر توی آرایهی wrap شده جلو میریم تا به اولین خونهی خالی برسیم و item رو اونجا بذاریم.
در روش chaining هر خونهی آرایهی ما یک عنصر نگه میداره و یک پوینتره به یک ساختماندادهی دیگه که میتونه یک linked list باشه یا یک درخت متوازن مثل red-black یا AVL. در صورتی که توی اون خونهی آرایه از قبل دادهای وجود داشته باشه، آیتم جدید رو push میکنیم توی اون ساختماندادهای که اون خونه بهش اشاره میکنه.
در روش سوم، یکی از روشهای اول و دوم رو با مکانیزم هشچندباره ترکیب میکنیم. به این صورت که چند الگوریتم هش متفاوت رو در نظر میگیریم. در صورتی که با هش آیتم مدنظرمون تصادم رخ داد، یک الگوریتم هش جدید رو انتخاب میکنیم. مکانیزم انتخاب الگوریتم هش هم میتونه هرچی باشه. ما ساده و round robin در نظر میگیریم. این کار رو تا زمانی ادامه میدیم که تمام الگوریتمهای هشمون رو تست کرده باشیم و همشون منجر به تصادم شده باشن. بعد با استفاده از یکی از روشهای ۱ یا ۲ اقدام به ذخیره کردن آیتم میکنیم.
تمام این قصهها چیزهایی هست که تا اینجا میدونیم و مرسومه. ولی واقعاً چقدر از این روشها استفاده میشه؟ آیا میشه پا رو فراتر گذاشت و عملکرد رو از این هم بهتر کرد؟
توی جاهایی مثل Cloudflare که عملکرد در حد میکروثانیه مهمه، گاهی باید پا رو فراتر گذاشت. گاهی سادهترین جزئیات میتونن تفاوت چندبرابری در سرعت ایجاد کنن. انگار یه نوع amplification رخ میده؛ بهینهسازی کوچیک که باعث میشه کل سیستم خیلی سریعتر بهنظر بیاد.
یکی از ایدههایی که دقیقاً با همین ذهنیت طراحی شده، ساختار Swiss Tableه. گوگل با در نظر گرفتن چالش کش سرورها دست به طراحی این ساختار زده. زبانهایی مثل Rust هم از همین ساختار برای پیادهسازی پیشفرض HashMap خودشون استفاده میکنن.
گوگل تو کنفرانس CppCon 2017 هم دربارهی طراحی و بهینهسازی این ساختار ارائهای داشت که دیدنش خالی از لطف نیست:
CppCon 2017: Matt Kulukundis – Designing a Fast, Efficient Hash Table
Swiss Table در اصل هنوز از ایدهی open addressing استفاده میکنه؛ یعنی دادهها مستقیماً در یک آرایه ذخیره میشن و وقتی تصادم رخ بده، دنبال خونهی بعدی میگردیم تا جایی برای درج پیدا کنیم. ولی تفاوت اصلیش اینه که چطور این آرایه
bucket
بندی میشه و چطور CPU ازش استفاده میکنه.
در Swiss Table، آرایهی اصلی به چند bucket تقسیم میشه. هر bucket معمولاً چند تا slot داره (مثلاً 8 تا)، یعنی هر bucket خودش میتونه تا 8 تا عنصر نگه داره.
در کنارش یه آرایهی کوچیکتر از metadata داریم که برای هر slot فقط یه بایت اطلاعات ذخیره میکنه. توی این بایت، یه تیکه از هش کلید (مثلاً 7 بیت از اون) نگه داشته میشه تا CPU بتونه سریعتر بفهمه کدوم slot احتمالاً مربوط به کلید مورد نظره.
وقتی میخوایم دنبال یه کلید بگردیم یا کلید جدیدی وارد کنیم، Swiss Table با استفاده از
SIMD (Single Instruction, Multiple Data)
چند بایت metadata رو با هم میخونه (مثلاً 16 تا در یک لحظه) و در عرض یک دستور CPU بررسی میکنه که آیا هش کوچیک ذخیرهشده توی اونها با هش کلید ما یکیه یا نه.
بعد اگه یکی از اونها match کرد، تازه میره سراغ دادهی واقعی و بررسی دقیقتر انجام میده.
Swiss Table تنها نمونهی چنین طراحیای نیست. بعد از گوگل، پروژههای بزرگ دیگه مثل
Facebook’s F14
ایدههای مشابه استفاده کردن.
زبانهایی مثل Rust و Go هم با الهام از همین طراحی، نسخههای خودشون رو ساختن.
در پیادهسازی Go، تیم توسعه با یه چالش جدی روبهرو شد که بهطور مفصل توی این پست توضیح داده شده:
The Go Blog – Swiss Table
مشکل از اینجا شروع شد که وقتی آرایهی اصلی هشمپ به حد آستانهی ظرفیتش میرسه، باید سایزش دو برابر بشه و کل دادههای قبلی داخل آرایهی جدید کپی بشن.
این فرایند در سیستمهای عادی چندان مشکلی ایجاد نمیکنه، ولی در سرورهای کش که چند ترابایت دیتا داخل مموری دارن، این resize میتونه به شدت زمانبر و کند باشه.
راهحلی که گولنگ برای این موضوع ارائه داد، استفاده از hashmapهای چندلایه (multi-level) بود. بهجای resize کامل، دادههای جدید در یک لایهی بالاتر ذخیره میشن و بهصورت تدریجی دادههای قدیمی جابهجا میشن. اینطوری عملیات resize به بخشهای کوچیک تقسیم میشه و فشار ناگهانی از روی سیستم برداشته میشه.
این پست رو هم از دست ندین:
A new fast hash table in response to Google’s new fast hash table
YouTube
CppCon 2017: Matt Kulukundis “Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step”
https://CppCon.org
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2017
—
Hash tables consume a large volume of both compute resources and memory across Google's production system. The…
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2017
—
Hash tables consume a large volume of both compute resources and memory across Google's production system. The…
❤7🍓3🔥1
توی Airbnb چطور key value store خودشون رو بازنویسی کردن تا با نیازهای جدیدشون همخوانی داشته باشه؟
https://medium.com/airbnb-engineering/building-a-next-generation-key-value-store-at-airbnb-0de8465ba354
https://medium.com/airbnb-engineering/building-a-next-generation-key-value-store-at-airbnb-0de8465ba354
Medium
Building a Next-Generation Key-Value Store at Airbnb
How we completely rearchitected Mussel, our storage engine for derived data, and lessons learned from the migration from Mussel V1 to V2.
👨💻7🍓2❤1
چطوری restful API خوب طراحی کنیم؟
https://youtu.be/_gQaygjm_hg?si=E8S6XOwA4K8hsq-e
https://youtu.be/_gQaygjm_hg?si=E8S6XOwA4K8hsq-e
YouTube
Good APIs Vs Bad APIs: 7 Tips for API Design
Get a Free System Design PDF with 158 pages by subscribing to our weekly newsletter: https://bit.ly/bytebytegoytTopic
This video is based on engineering blog post: https://blog.hotstar.com/capturing-a-...
Animation tools: Adobe Illustrator and After Effects.…
This video is based on engineering blog post: https://blog.hotstar.com/capturing-a-...
Animation tools: Adobe Illustrator and After Effects.…
1🍓12❤2
این دوره یه آموزش فارسی و مرحلهبهمرحله دربارهی برنامهنویسی غیرهمزمان (asyncio) در پایتونه.
توش یاد میگیری async و await دقیقاً چطور کار میکنن، event loop چیه، چطور چند کار رو همزمان اجرا کنی، با تسکها و صفهای async کار کنی، خطاها و زمانبندی رو مدیریت کنی و الگوهای همزمانی پیشرفته مثل fan-in / fan-out رو بسازی.
هدف دوره اینه که async رو واقعاً بفهمی و بتونی توی پروژههای واقعی ازش استفاده کنی.
https://github.com/irvaniamirali/asyncio-course-fa
#ارسالی
توش یاد میگیری async و await دقیقاً چطور کار میکنن، event loop چیه، چطور چند کار رو همزمان اجرا کنی، با تسکها و صفهای async کار کنی، خطاها و زمانبندی رو مدیریت کنی و الگوهای همزمانی پیشرفته مثل fan-in / fan-out رو بسازی.
هدف دوره اینه که async رو واقعاً بفهمی و بتونی توی پروژههای واقعی ازش استفاده کنی.
https://github.com/irvaniamirali/asyncio-course-fa
#ارسالی
GitHub
GitHub - irvaniamirali/asyncio-course-fa: یادگیری برنامهنویسی غیرهمزمان پایتون به فارسی — یک دورهٔ عملی و متنی با تمرکز روی مثالهای…
یادگیری برنامهنویسی غیرهمزمان پایتون به فارسی — یک دورهٔ عملی و متنی با تمرکز روی مثالهای واقعی - irvaniamirali/asyncio-course-fa
🔥13👍3❤1🍓1
خیلیهامون با هدرهای مختلف HTTP آشنا هستیم ولی یکسری هدرها برای افزایش امنیت وبسایتمونه. با کمک اینها در واقع به مرورگر میگیم چه اجازههایی در مورد سایت ما داره.
چیزی که اکثرا باهاش مواجه شدیم HSTSئه که میگه سایت ما فقط با HTTPS اجازه داره باز بشه. اما این لیست به همینجا ختم نمیشه و چیزایی در رابطه با Iframe شدن سایت، content type ها و غیره هم وجود داره که میتونید اینجا کامل بخونید:
https://wackowiki.org/doc/Dev/Guidelines/SecurityHeaders
همچنین این وبسایت سایتتون رو اسکن میکنه و میگه از کدوم هدر ها پشتیبانی میکنه یا نمیکنه:
https://securityheaders.com/
چیزی که اکثرا باهاش مواجه شدیم HSTSئه که میگه سایت ما فقط با HTTPS اجازه داره باز بشه. اما این لیست به همینجا ختم نمیشه و چیزایی در رابطه با Iframe شدن سایت، content type ها و غیره هم وجود داره که میتونید اینجا کامل بخونید:
https://wackowiki.org/doc/Dev/Guidelines/SecurityHeaders
همچنین این وبسایت سایتتون رو اسکن میکنه و میگه از کدوم هدر ها پشتیبانی میکنه یا نمیکنه:
https://securityheaders.com/
Securityheaders
Analyse your HTTP response headers
Quickly and easily assess the security of your HTTP response headers
❤9👍2
احتمالا ماجرای incident بزرگ aws رو شنیدید. دیتا سنتر us-east-1 به مشکل خورده بود و بخش زیادی از اینترنت از جمله خود امازون، زوم، اسلک و ... به درستی کار نمیکردن، اونم برای ساعت ها!
خود تیم فنی aws داک رسمی از post mortem تهیه کردن که اینجا میتونید بخونید:
https://aws.amazon.com/message/101925/
نسخه ساده تر و خلاصه هم میتونید اینجا بخونید:
https://newsletter.pragmaticengineer.com/p/what-caused-the-large-aws-outage?publication_id=458709&post_id=176935464
خود تیم فنی aws داک رسمی از post mortem تهیه کردن که اینجا میتونید بخونید:
https://aws.amazon.com/message/101925/
نسخه ساده تر و خلاصه هم میتونید اینجا بخونید:
https://newsletter.pragmaticengineer.com/p/what-caused-the-large-aws-outage?publication_id=458709&post_id=176935464
Pragmaticengineer
What caused the large AWS outage?
On Monday, a major AWS outage hit thousands of sites & apps, and even a Premier League soccer game. An overview of what caused this high-profile, global outage
❤11
چطور تکنولوژی دیتابیس رو عوض کنیم
و قبلش چه کارهایی بکنیم که از تصمیممون مطمئن بشیم؟
https://youtu.be/kkeFE6iRfMM?si=98aqM-mSDzDm_OMd
و قبلش چه کارهایی بکنیم که از تصمیممون مطمئن بشیم؟
https://youtu.be/kkeFE6iRfMM?si=98aqM-mSDzDm_OMd
YouTube
How To Choose The Right Database?
Weekly system design newsletter: https://bit.ly/3tfAlYD
Checkout our bestselling System Design Interview books:
Volume 1: https://amzn.to/3Ou7gkd
Volume 2: https://amzn.to/3HqGozy
Other things we made:
Digital version of System Design Interview books:…
Checkout our bestselling System Design Interview books:
Volume 1: https://amzn.to/3Ou7gkd
Volume 2: https://amzn.to/3HqGozy
Other things we made:
Digital version of System Design Interview books:…
👍6
Forwarded from Linux Experts (𝖕𝖝𝖊)
⚡️ aria2 ابزار سبک ولی قدرتمند برای دانلود
aria2 یه ابزار خط فرمانه که برای دانلود از پروتکلهای مختلف مثل HTTP،FTP،BitTorrent و Metalink طراحی شده.
مزیتش اینه که میتونه فایل رو به چند بخش تقسیم کنه و هر بخش رو همزمان از چند اتصال مختلف بگیره؛ همین باعث میشه دانلودها سریعتر و پایدارتر انجام بشن.
یک نمونۀ ساده:
اگه بخواید از تمام ظرفیت اینترنت استفاده کنید، میتونید تعداد اتصالها و بخشها رو زیاد کنید و در عین حال تلاش نامحدود برای ادامۀ دانلود در صورت قطع ارتباط فعال کنید:
برای وقتی که چند تا لینک دارید، کافیه همه رو خط به خط تو فایلی مثل
aria2 پشت صحنۀ خیلی از ابزارهای دانلودمثل uGet، Motrix، Persepolis (در نسخههای قدیمی)، و حتی بعضی مدیرهای دانلود گرافیکی سبک برای سرور یا NAS استفاده شده.
تو دنیای لینوکس هم معمولاً داخل اسکریپتهای خودکار یا نصب بستهها ازش استفاده میشه چون دقیق، قابلاسکریپتنویسی و کممصرفه.
🔘 @linux_exp | #linux #commandline #tools
aria2 یه ابزار خط فرمانه که برای دانلود از پروتکلهای مختلف مثل HTTP،FTP،BitTorrent و Metalink طراحی شده.
مزیتش اینه که میتونه فایل رو به چند بخش تقسیم کنه و هر بخش رو همزمان از چند اتصال مختلف بگیره؛ همین باعث میشه دانلودها سریعتر و پایدارتر انجام بشن.
یک نمونۀ ساده:
aria2c https://example.com/file.iso
اگه بخواید از تمام ظرفیت اینترنت استفاده کنید، میتونید تعداد اتصالها و بخشها رو زیاد کنید و در عین حال تلاش نامحدود برای ادامۀ دانلود در صورت قطع ارتباط فعال کنید:
aria2c \
--max-connection-per-server=16 \
--split=16 \
--max-tries=0 \
https://example.com/file.iso
🔹 --max-connection-per-server تعداد اتصالهای همزمان به سرور
🔹 --split تعداد بخشهایی که فایل به اون تقسیم میشه
🔹 --max-tries=0 یعنی در صورت خطا تا بینهایت بار تلاش مجدد انجام بشه
برای وقتی که چند تا لینک دارید، کافیه همه رو خط به خط تو فایلی مثل
links.txt بنویسید و اجرا کنید:aria2c --input-file=links.txt
aria2 پشت صحنۀ خیلی از ابزارهای دانلودمثل uGet، Motrix، Persepolis (در نسخههای قدیمی)، و حتی بعضی مدیرهای دانلود گرافیکی سبک برای سرور یا NAS استفاده شده.
تو دنیای لینوکس هم معمولاً داخل اسکریپتهای خودکار یا نصب بستهها ازش استفاده میشه چون دقیق، قابلاسکریپتنویسی و کممصرفه.
وقتی با aria2 دانلود میکنید، کنار هر فایل در حال دانلود یه فایل موقت با پسوند .aria2 ساخته میشه. این فایل شامل اطلاعات پیشرفت دانلود، بخشهای دریافتشده و وضعیت اتصالاته.
اگه دانلود به هر دلیلی قطع بشه (مثلاً اینترنت قطع شه یا سیستم ریستارت شه)، تا زمانی که فایل .aria2 حذف نشده باشه، میتونید همون دستور قبلی رو دوباره اجرا کنید تا دانلود از همونجا ادامه پیدا کنه.
🔘 @linux_exp | #linux #commandline #tools
❤🔥3👍2
شاید دیده باشید تو شبکه محلی وقتی DHCP درست کار نمیکنه، خود سیستم یه آیپی رندومی میگیره. این آیپی در بازه ۱۶۹.۲۵۴.۰.۰٫۱۶ قرار میگیره اما داستان پشتش چیه؟
داستان از این قراره که اساین کردن IP به کامپیوتر های شبکه راه های مختلفی داره از جمله static و DHCP ولی اگه سیستم با هیچ کدوم از اینا نتونه آیپی بگیره باید چیکار کنه؟ وصل نشه؟
به عنوان آخرین گزینه و فالبک، سیستم میان در یک بازه از پیش تعیین شده یه ایپی رندوم انتخاب میکنه که صرفا بتونه وصل بشه. به امید این که کامپیوتر دیگری اون رو انتخاب نکرده باشه، اما به همینجا بسنده نمیشه و یه درخواست arp به اون ایپی میفرسته تا ببینه کس دیگری اون ایپی رو داره یا نه و اگر کسی دیگری داشت باز آدرس رندوم جدید میسازه!
با این روش کامپیوترها بدون DHCP آیپی میگیرن و میتونن با هم صحبت کنن ولی مشکلی که هست اینه که default gateway رو کسی بهشون نگفته در نتیجه درخواست هاشون به بیرون route نمیشه (به بیانی اینترنت ندارن)
پس از این به بعد اگه دیدید اینترنت ندارید و آیپی سیستمتون با ۱۶۹.۲۵۴ شروع میشه بدونید مشکل DHCPئه.
اسم این روش APIPA یا automatic private IP addressingئه
https://www.cbtnuggets.com/blog/technology/networking/what-is-automatic-private-ip-addressing-apipa
داستان از این قراره که اساین کردن IP به کامپیوتر های شبکه راه های مختلفی داره از جمله static و DHCP ولی اگه سیستم با هیچ کدوم از اینا نتونه آیپی بگیره باید چیکار کنه؟ وصل نشه؟
به عنوان آخرین گزینه و فالبک، سیستم میان در یک بازه از پیش تعیین شده یه ایپی رندوم انتخاب میکنه که صرفا بتونه وصل بشه. به امید این که کامپیوتر دیگری اون رو انتخاب نکرده باشه، اما به همینجا بسنده نمیشه و یه درخواست arp به اون ایپی میفرسته تا ببینه کس دیگری اون ایپی رو داره یا نه و اگر کسی دیگری داشت باز آدرس رندوم جدید میسازه!
با این روش کامپیوترها بدون DHCP آیپی میگیرن و میتونن با هم صحبت کنن ولی مشکلی که هست اینه که default gateway رو کسی بهشون نگفته در نتیجه درخواست هاشون به بیرون route نمیشه (به بیانی اینترنت ندارن)
پس از این به بعد اگه دیدید اینترنت ندارید و آیپی سیستمتون با ۱۶۹.۲۵۴ شروع میشه بدونید مشکل DHCPئه.
اسم این روش APIPA یا automatic private IP addressingئه
https://www.cbtnuggets.com/blog/technology/networking/what-is-automatic-private-ip-addressing-apipa
CBT Nuggets
What is Automatic Private IP Addressing (APIPA)?
Automatic Private IP Addressing, referred to as APIPA, acts as a failover for DHCP when communication between a device and the DHCP server is not possible.
1👍19❤6
در مورد ساختمان داده LSM Tree یا همون log structured merge tree
این ساختمان داده بیشتر برای دیتابیس های NoSQL استفاده میشه و برای نوشتن زیاد بهینهست.
هم به خوبی از مموری استفاده میکنه تا نوشتن رو هندل کنه و هم به کمک bloom filter جایی که دیتا توی دیسک هست رو پیدا میکنه و سراغش میره برای بازیابی.
https://medium.com/@dwivedi.ankit21/lsm-trees-the-go-to-data-structure-for-databases-search-engines-and-more-c3a48fa469d2
اگه براتون جالب بود و بیشتر حوصله داشتید، این مطلب نحوه ساخت یک دیتابیس رو قدم به قدم شرح میده تا به همین LSM tree میرسه.
https://www.nan.fyi/database
این ساختمان داده بیشتر برای دیتابیس های NoSQL استفاده میشه و برای نوشتن زیاد بهینهست.
هم به خوبی از مموری استفاده میکنه تا نوشتن رو هندل کنه و هم به کمک bloom filter جایی که دیتا توی دیسک هست رو پیدا میکنه و سراغش میره برای بازیابی.
https://medium.com/@dwivedi.ankit21/lsm-trees-the-go-to-data-structure-for-databases-search-engines-and-more-c3a48fa469d2
اگه براتون جالب بود و بیشتر حوصله داشتید، این مطلب نحوه ساخت یک دیتابیس رو قدم به قدم شرح میده تا به همین LSM tree میرسه.
https://www.nan.fyi/database
Medium
LSM Trees: the Go-To Data Structure for Databases, Search Engines, and More
I dive into the fascinating world of LSM Trees and how they revolutionize the way large amounts of data are stored and retrieved.
👍7❤4🔥1
این چنل آرشیو کتابها، برگه تقلب، پادکست و وبینار برای دولپرهاست، بدردتون میخوره
t.iss.one/+M4QujCyYc9E1N2Rk
t.iss.one/+M4QujCyYc9E1N2Rk
Telegram
Archive Developers
رسالت ما – ارائه محتوای کاربردی شامل کتاب، برگه تقلب، وبینار و پادکست برای توسعهدهندگان و علاقهمندان به برنامهنویسی و فناوریهای مرتبط، همراه با ذکر منابع!
👨🏻💻 | @Afsh6n
👨🏻💻 | @Afsh6n
❤7👍2