نوشته‌های ترمینالی
2.74K subscribers
425 photos
12 videos
32 files
2.28K links
Download Telegram
It's FOSS
It's Hacktoberfest time! Here's everything you need to know! 🥇 https://itsfoss.com/hacktoberfest-guide/
دوستان اکتبر شروع شده و باز برنامه هکتوبرفست در جریانه.

قضیه از این قراره که اگه توی ماه اکتبر ۶ تا مرج ریکویست ارسال کنید که مرج بشه، بج هکتوبرفست می‌گیرید. قبلا تیشرت هم می‌دادن البته ولی با توجه به سواستفاده ها دیگه انگار خبری نیست. :)

https://hacktoberfest.com
🔥51
در مورد hookهای git:
گیت امکانات مختلفی داره و یکی از امکاناتش که دستمون رو خیلی باز می‌کنه برای انواع شخصی سازی ها، hook ها هستن. قضیه از این قرارها که توی پوشه .git/hooks میتونید یکسری اسکریپت قابل اجرا بگذارید با اسم های معلوم و خود گیت در زمان های مشخص اونا رو اجرا می‌کنه. معلوم ترینش precommit hook هست که گیت بعد از اومدن دستور کامیت و قبل از این که واقعا کامیت کنه اون اسکریپت رو اجرا می‌کنه. توی اون اسکریپت می‌تونید کد رو فرمت کنید یا تست ها رو اجرا کنید تا مطمین بشین که کامیت های atomic دارید. البته قابل دور زدن هم هست.

فقط دقت کنید که هوک ها جزو چیزاییه که خودتون اونجا می‌گذارید و توی خود گیت ورژن کنترل نمیشه.
1👍196
یه استفاده که من اخیرا از 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
1👍136
برای هر کامیت 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
❤‍🔥152
اگه به 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
18👍3
من معمولا اهل خبرنامه ایمیل نیستم، ولی یه خبرنامه رو عضو شدم و فعلا خوشحالم کرده برای همین تصمیم گرفتم معرفیش کنم.
به شکل مرتب (فکر کنم روزانه) اخبار رو میگه. به ترتیب اهمیت مرتب می‌کنه و معمولا اگه چیزی جالب باشه همون یکی دو تای اوله.

این شما و این هم rundown ai
https://www.therundown.ai/
👍8👎5🔥41😱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
7🍓3🔥1
این دوره یه آموزش فارسی و مرحله‌به‌مرحله درباره‌ی برنامه‌نویسی غیرهمزمان (asyncio) در پایتونه.
توش یاد می‌گیری async و await دقیقاً چطور کار می‌کنن، event loop چیه، چطور چند کار رو هم‌زمان اجرا کنی، با تسک‌ها و صف‌های async کار کنی، خطاها و زمان‌بندی رو مدیریت کنی و الگوهای هم‌زمانی پیشرفته مثل fan-in / fan-out رو بسازی.
هدف دوره اینه که async رو واقعاً بفهمی و بتونی توی پروژه‌های واقعی ازش استفاده کنی.

https://github.com/irvaniamirali/asyncio-course-fa

#ارسالی
🔥13👍31🍓1
خیلی‌هامون با هدرهای مختلف HTTP آشنا هستیم ولی یکسری هدرها برای افزایش امنیت وبسایتمونه. با کمک این‌ها در واقع به مرورگر می‌گیم چه اجازه‌هایی در مورد سایت ما داره.
چیزی که اکثرا باهاش مواجه شدیم HSTSئه که میگه سایت ما فقط با HTTPS اجازه داره باز بشه. اما این لیست به همینجا ختم نمیشه و چیزایی در رابطه با Iframe شدن سایت، content type ها و غیره هم وجود داره که میتونید اینجا کامل بخونید:
https://wackowiki.org/doc/Dev/Guidelines/SecurityHeaders

همچنین این وبسایت سایتتون رو اسکن می‌کنه و میگه از کدوم هدر ها پشتیبانی می‌کنه یا نمی‌کنه:
https://securityheaders.com/
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
11
Forwarded from Linux Experts (𝖕𝖝𝖊)
⚡️aria2 ابزار سبک ولی قدرتمند برای دانلود

‏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
1👍196
در مورد ساختمان داده 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
👍74🔥1