[{"content":"این اولین پست از یک سری مقدماتی به اسم Go Fundamentals است. برنامه این است که اول مبانی زبان را مرور کنیم و بعد برویم سراغ یک سری دوم با تمرکز بر بک‌اند: سرویس‌های HTTP، دیتابیس و هم‌روندی در سیستم‌های واقعی. قبلاً در پستی درباره‌ی NATS JetStream از Go استفاده کرده بودم، ولی آن پست فرض می‌کرد که کد Go می‌خوانید. این سری از صفر شروع می‌شود.\nامروز Go را نصب می‌کنیم، یک ماژول می‌سازیم و چند دستوری را یاد می‌گیریم که هر روز تایپ خواهید کرد. همه‌چیز با Go 1.26.0 روی macOS (معماری arm64) اجرا شده است.\nچرا Go برای بک‌اند Go زبانی کامپایلی با تایپ ایستا و مشخصات کوچک است. چند دلیل که مردم برای بک‌اند انتخابش می‌کنند:\ngo build یک فایل باینری واحد می‌سازد، پس استقرار و ساخت ایمیج Docker ساده می‌شود. هم‌روندی (goroutine و channel) بخشی از خود زبان است. کتاب‌خانه‌ی استاندارد HTTP، JSON، تست و بسیاری چیزهای دیگر را پوشش می‌دهد. ابزارها (فرمت‌کننده، اجراکننده‌ی تست، مدیریت وابستگی) همراه زبان می‌آیند و تیم‌ها کمتر سر تنظیمات بحث می‌کنند. نصب راهنمای رسمی در go.dev/doc/install است. روی macOS اگر Homebrew دارید، brew install go هم یک گزینه است. بعد نصب را بررسی کنید:\ngo version go version go1.26.0 darwin/arm64 اولین ماژول کد Go داخل ماژول (module) قرار می‌گیرد. ماژول یعنی پوشه‌ای که فایل go.mod دارد. یکی بسازیم:\nmkdir hello \u0026amp;\u0026amp; cd hello go mod init example.com/hello مسیر ماژول (example.com/hello) همان نامی است که بقیه‌ی کدها برای import کردن شما استفاده می‌کنند. برای آزمایش محلی هر اسمی جواب می‌دهد؛ برای چیزی که منتشر می‌کنید معمولاً مسیر مخزن کد است. حالا main.go:\npackage main import \u0026#34;fmt\u0026#34; func main() { fmt.Println(\u0026#34;Hello, Go!\u0026#34;) } package main به‌همراه تابع main یعنی این یک برنامه‌ی اجرایی است. اجرا کنید:\ngo run . Hello, Go! go run برنامه را در یک مسیر موقت کامپایل و اجرا می‌کند. برای نگه‌داشتن باینری از go build استفاده کنید:\ngo build -o hello . ./hello Hello, Go! داخل go.mod چیست module example.com/hello go 1.25.0 مسیر ماژول و یک خط go با نسخه‌ی Go که ماژول انتظار دارد. وقتی وابستگی اضافه کنید، خط‌های require هم اینجا ظاهر می‌شوند. نکته‌ی جالب: ابزار من نسخه‌ی 1.26.0 است ولی go mod init عدد go 1.25.0 را نوشت؛ این فایل نسخه‌ی زبان را ثبت می‌کند و لزوماً نسخه‌ی دقیق ابزار نصب‌شده نیست.\nیک برنامه‌ی کمی بزرگ‌تر می‌خواهیم یک نام اختیاری را از خط فرمان بخوانیم و برایش مقدار پیش‌فرض بگذاریم:\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;os\u0026#34; ) // greeting builds the message for a given name. func greeting(name string) string { return fmt.Sprintf(\u0026#34;Hello, %s!\u0026#34;, name) } func main() { name := \u0026#34;world\u0026#34; if len(os.Args) \u0026gt; 1 { name = os.Args[1] } fmt.Println(greeting(name)) } os.Args[0] خود برنامه است، پس اولین آرگومان واقعی در ایندکس ۱ قرار دارد. متغیرها و if را در پست بعد درست‌وحسابی بررسی می‌کنیم.\ngo run . go run . Roham Hello, world! Hello, Roham! دستورهای روزمره go fmt ./... فایل‌ها را به قالب استاندارد درمی‌آورد و نام فایل‌های تغییرکرده را چاپ می‌کند. در Go کسی سر سبک کدنویسی بحث نمی‌کند؛ فرمت‌کننده تصمیم می‌گیرد. go vet ./... کدهای مشکوکی را گزارش می‌دهد که کامپایل می‌شوند. اگر مشکلی نباشد چیزی چاپ نمی‌کند. go test ./... تست‌ها را اجرا می‌کند. تست تابعی به شکل TestXxx(t *testing.T) در فایلی با پسوند _test.go است: package main import \u0026#34;testing\u0026#34; func TestGreeting(t *testing.T) { got := greeting(\u0026#34;Roham\u0026#34;) want := \u0026#34;Hello, Roham!\u0026#34; if got != want { t.Fatalf(\u0026#34;got %q, want %q\u0026#34;, got, want) } } $ go test ./... ok example.com/greet\t0.273s go mod tidy وابستگی‌های جاافتاده را اضافه و بی‌استفاده‌ها را از go.mod حذف می‌کند. وقتی وابستگی نداریم، مثل اینجا، چیزی عوض نمی‌شود. go fmt را هم با یک فایل بدفرمت امتحان کردم: نام bad.go را چاپ کرد و func x( ){ } را به func x() {} تبدیل کرد.\nGo چیزها را کجا نگه می‌دارد go env GOPATH GOMODCACHE /Users/hossein/go /Users/hossein/go/pkg/mod GOMODCACHE جایی است که وابستگی‌های دانلودشده ذخیره می‌شوند و بین همه‌ی پروژه‌ها مشترک است. به‌طور پیش‌فرض زیر GOPATH قرار دارد. لازم نیست کد خودتان را آنجا بگذارید.\nچند نکته go run main.go فقط همان یک فایل را کامپایل می‌کند. وقتی بیش از یک فایل دارید go run . را بزنید تا کل پکیج ساخته شود. دستورها را از داخل ماژول (کنار go.mod) اجرا کنید، وگرنه خطای نبودن go.mod می‌گیرید. import یا متغیر محلیِ بی‌استفاده خطای کامپایل است، نه هشدار. go build باینری را در پوشه‌ی جاری می‌نویسد؛ آن را commit نکنید. موفق بودن go vet یعنی کد از چند اشتباه رایج دور است، نه اینکه درست کار می‌کند. تمرین ۱. یک ماژول تازه بسازید و برنامه‌ی خوش‌آمدگویی را طوری تغییر دهید که دو آرگومان (نام و نام خانوادگی) بگیرد و Hello, First Last! چاپ کند. ۲. منطق نام پیش‌فرض world را در یک تابع جدا بگذارید و برایش تست دوم بنویسید. ۳. پیش از تمام‌شدن، go fmt، go vet و go test را اجرا کنید.\nقدم بعدی در پست بعد، go-types-control-flow، سراغ تایپ‌ها، متغیرها و کنترل جریان می‌رویم: بلوک‌های سازنده‌ای که برای نوشتن برنامه‌های واقعی لازم دارید.\n","permalink":"https://justroham.ir/fa/posts/go-getting-started/","summary":"\u003cp\u003eاین اولین پست از یک سری مقدماتی به اسم \u003cstrong\u003eGo Fundamentals\u003c/strong\u003e است. برنامه این است که اول مبانی زبان را مرور کنیم و بعد برویم سراغ یک سری دوم با تمرکز بر بک‌اند: سرویس‌های HTTP، دیتابیس و هم‌روندی در سیستم‌های واقعی. قبلاً در پستی درباره‌ی \u003ca href=\"/fa/posts/nats-jetstream-go/\"\u003eNATS JetStream\u003c/a\u003e از Go استفاده کرده بودم، ولی آن پست فرض می‌کرد که کد Go می‌خوانید. این سری از صفر شروع می‌شود.\u003c/p\u003e\n\u003cp\u003eامروز Go را نصب می‌کنیم، یک ماژول می‌سازیم و چند دستوری را یاد می‌گیریم که هر روز تایپ خواهید کرد. همه‌چیز با Go 1.26.0 روی macOS (معماری arm64) اجرا شده است.\u003c/p\u003e","title":"شروع کار با Go: نصب، ماژول و ابزارها"},{"content":"در ۱۹ و ۲۰ اکتبر ۲۰۲۶ تیم Go نسخه‌های Go 1.27.3 و 1.26.10 را منتشر کرد. این نسخه‌ها فقط یک اصلاح امنیتی دارند: CVE-2026-111943 (مسئله‌ی ۸۲۳۴۵ در Go). از این پس crypto/x509 زنجیره‌هایی را که شامل مجموعه‌ی کوچکی از گواهی‌های میانی CA به نام eMudhra (emSign) باشند رد می‌کند، چون کلید خصوصی آن‌ها لو رفته است. اعلامیه نمی‌گوید کدام گواهی‌ها، برای همین خودم سراغش رفتم.\nاگر باینری Go تحویل می‌دهید، آپدیت کردن Go روی سیستم خودتان کافی نیست. هر باینری باید با toolchain اصلاح‌شده دوباره build شود.\nخلاصه شناسه CVE-2026-111943 بخش crypto/x509 (تابع Certificate.Verify) نوع ضعف CWE-295، اعتبارسنجی نادرست گواهی نسخه‌های اصلاح‌شده Go 1.26.10 و 1.27.3 شدت منابع هم‌نظر نیستند: ۶٫۸ (متوسط) از Red Hat، ۸٫۱ (بالا) در ارزیابی اولیه‌ی Oracle چه اتفاقی افتاد؟ طبق گزارش‌هایی که پیدا کردم، یک پژوهشگر در ۱۷ اکتبر متوجه شد هشت گواهی میانی زیرمجموعه‌ی emSign شرکت eMudhra با فرایند تولید کلید معیوب ساخته شده‌اند. Mozilla بعداً نتیجه گرفت این نقص ساده قابل سوءاستفاده است. این گواهی‌ها CAهای DV، EV، OV (برای TLS) و OV برای امضای کد هستند، هر کدام در نسل‌های G3B و G3C.\nهر کس بتواند کلید خصوصی یکی از این‌ها را بازسازی کند، می‌تواند برای هر دامنه‌ای گواهی بسازد و کلاینتی که به این زنجیره اعتماد دارد آن را می‌پذیرد.\nاصلاح Go چه می‌کند؟ حالا Verify هر زنجیره‌ای را که شامل یکی از میانی‌های مسدودشده باشد حذف می‌کند و به فراخواننده برنمی‌گرداند. فیلتر یک فهرست ثابت از هشت هش SHA-256 است که روی SubjectPublicKeyInfo (SPKI) هر گواهی حساب می‌شود، نه روی کل گواهی.\nانتخاب درستی است. یک کلید ممکن است در چند گواهی بیاید، مثلاً یک میانی که از دو ریشه cross-sign شده. هش کل گواهی در هر کدام فرق دارد ولی هش SPKI یکی است، پس یک ورودی همه‌ی آن‌ها را پوشش می‌دهد.\nآیا فهرست کامل است؟ یک denylist سخت‌کد‌شده فقط به اندازه‌ی کامل بودنش به درد می‌خورد. برای همین در ۲۶ اکتبر ۲۰۲۶ آن را با بسته‌ی مدرک پژوهشگر (proof.zip) مقایسه کردم:\n۱. اول خود بسته را چک کردم. openssl dgst -sha384 -verify \u0026lt;name\u0026gt;.pub.pem -signature \u0026lt;name\u0026gt;.sig message.txt برای هر هشت مورد Verified OK داد و هر کلید عمومی با کلید داخل گواهی‌اش یکی بود. ۲. SHA-256 مربوط به DER بخش SubjectPublicKeyInfo هر .crt.pem را حساب کردم، یعنی همان ورودی‌ای که containsDistrustedSPKIHash استفاده می‌کند. ۳. distrustedSPKIHashes را از src/crypto/x509/verify.go در تگ go1.27.3 برداشتم.\nنتیجه تطابق دقیق است: هشت از هشت، و هیچ هش اضافه‌ای در فهرست Go نیست.\nگواهی SHA-256 مربوط به SPKI EM DV TLS CA - G3B ebed6475c2c2d80fcb199f3fe8dd6e6b3ce60b77eb15d4e42c3dec0c6f5b5105 EM DV TLS CA - G3C 49dd353dc2b919a3770645117d0e60c16115e7d1bc259eefe734b00ea434fe5f EM EV TLS CA - G3B e0254c7fcdc265e2f0f8a428dabb75ab4ae039b4872d62f5ee57f0877d5a8a41 EM EV TLS CA - G3C 5c0660a2b164910d8ff589c18e14552e9e0ec237dcefe2cb736d41a4811f81a0 EM OV TLS CA - G3B 43bffa19d6ef651451f6841e019931e96f6f2eaeff28ab4b6f1ce4576de2717b EM OV TLS CA - G3C 63ecefee431d49523bc1136c4e72d0206a477086caf606cd5cf025686c109cf8 EM OV CS CA - G3B ec4ffa1ad0ac88081314b7aaffef6a91f97cd57291bb5ba686c5415f5eb4f6b6 EM OV CS CA - G3C 92c063d67e8f14db71d288e11266ffdaf69cbf115f7bab14f3bc2f68d25e0e30 در سورس 1.27.3 فیلتر روی همه‌ی مسیرها اجرا می‌شود: verify.go برای verifier خالص Go و root_darwin.go و root_windows.go برای verifierهای پلتفرم. گواهی جعلی از هر یک از این هشت، به هر ریشه‌ای هم وصل شود رد می‌شود.\nاین تطابق نسبت به بسته‌ی پژوهشگر است که DV، EV، OV-TLS و OV-CS را در G3B و G3C پوشش می‌دهد. اگر فرایند معیوب یک میانی نهم هم ساخته باشد که کسی گزارش نکرده، این فهرست آن را نمی‌گیرد و فقط خود eMudhra یا برنامه‌های ریشه می‌توانند آن را رد کنند. یک زنجیره‌ی جعلی را هم روی باینری واقعی Go آزمایش نکردم.\nشکاف عملیاتی مرورگرها این مشکل را با ابطال از راه دور (CRLSet، OneCRL و CRLite) حل کردند. Go چنین کانالی ندارد، چون فهرست داخل سورس کتابخانه‌ی استاندارد است. پس:\nباینری‌ای که قبل از اصلاح build شده، برای همیشه به هر هشت میانی اعتماد می‌کند. هیچ داده‌ی ابطالی به آن نمی‌رسد. crypto/x509 در Go شفافیت گواهی (Certificate Transparency) را اعمال نمی‌کند، پس گواهی جعلی با CT هم لو نمی‌رود. نصب Go جدید روی باینری‌های موجود اثری ندارد. توزیع‌ها هم ممکن است اصلاح را با شماره‌ی نسخه‌ی خودشان backport کنند. چه کار کنیم؟ ۱. ببینید هر باینری با چه toolchain ای build شده:\ngo version -m ./your-binary | head -1 هر چه با Go قدیمی‌تر از 1.26.10 (در شاخه‌ی 1.26) یا 1.27.3 (در شاخه‌ی 1.27) ساخته شده باید دوباره build شود، و ایمیج‌های کانتینری ساخته‌شده از آن‌ها هم.\n۲. دوباره build و deploy کنید و نسخه‌ی Go را در CI ثابت کنید.\n۳. اعتبارسنجی گواهی را خاموش نکنید (InsecureSkipVerify) تا مشکلی مربوط به این تغییر را دور بزنید.\n۴. اگر می‌خواهید مطمئن شوید، فهرست را خودتان ببینید. در toolchain اصلاح‌شده:\ngrep -A12 distrustedSPKIHashes \u0026#34;$(go env GOROOT)/src/crypto/x509/verify.go\u0026#34; و برای هش گواهی‌ای که دارید:\nopenssl x509 -in cert.pem -noout -pubkey \\ | openssl pkey -pubin -outform DER \\ | openssl dgst -sha256 منابع اعلامیه‌ی انتشار Go در oss-security SOC Prime: CVE-2026-111943 پایگاه آسیب‌پذیری Wiz Penligent: راهنمای build دوباره ","permalink":"https://justroham.ir/fa/posts/go-x509-emudhra-distrusted-intermediates-cve-2026-111943/","summary":"\u003cp\u003eدر ۱۹ و ۲۰ اکتبر ۲۰۲۶ تیم Go نسخه‌های \u003cstrong\u003eGo 1.27.3 و 1.26.10\u003c/strong\u003e را منتشر کرد. این نسخه‌ها فقط یک اصلاح امنیتی دارند: \u003ca href=\"https://www.openwall.com/lists/oss-security/2026/10/20/29\"\u003eCVE-2026-111943\u003c/a\u003e (مسئله‌ی ۸۲۳۴۵ در Go). از این پس \u003ccode\u003ecrypto/x509\u003c/code\u003e زنجیره‌هایی را که شامل مجموعه‌ی کوچکی از گواهی‌های میانی CA به نام eMudhra (emSign) باشند رد می‌کند، چون کلید خصوصی آن‌ها لو رفته است. اعلامیه نمی‌گوید کدام گواهی‌ها، برای همین خودم سراغش رفتم.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eاگر باینری Go تحویل می‌دهید، آپدیت کردن Go روی سیستم خودتان کافی نیست. هر باینری باید با toolchain اصلاح‌شده \u003cstrong\u003eدوباره build\u003c/strong\u003e شود.\u003c/p\u003e","title":"Go هشت گواهی میانی eMudhra را مسدود کرد: CVE-2026-111943 و ضرورت build دوباره"},{"content":"آخر مقاله‌ی قبل دو موضوع را وعده داده بودم: اجرای بیش از یک Worker و زیر نظر گرفتن میزان عقب‌ماندگی. تا وقتی پیام‌ها کندتر از توان یک Worker می‌رسند همه‌چیز خوب است، اما بعدش دو سؤال پیش می‌آید: چطور Worker اضافه کنیم بدون اینکه چیزی دوبار پردازش شود، و از کجا بفهمیم صف دارد انباشته می‌شود؟\nهمه‌ی مثال‌های زیر را با یک nats-server تعبیه‌شده (با JetStream و یک پوشه‌ی موقت برای ذخیره‌سازی) و nats.go نسخه‌ی v1.54.0 روی Go 1.26 اجرا کرده‌ام و خروجی‌ها از همان اجراها هستند.\nچند Worker، یک Consumer پایدار نکته‌ی خاصی وجود ندارد. هر Worker به همان durable consumer وصل می‌شود و سرور هر پیام را فقط به یکی از آن‌ها می‌دهد:\nsub, err := js.PullSubscribe(\u0026#34;jobs.new\u0026#34;, \u0026#34;workers\u0026#34;, nats.Bind(\u0026#34;JOBS\u0026#34;, \u0026#34;workers\u0026#34;)) // ... msgs, err := sub.Fetch(1, nats.MaxWait(500*time.Millisecond)) // process msgs[0], then m.Ack() Consumer یک بار با AckExplicitPolicy ساخته شده بود. سه goroutine (w1، w2 و w3) راه انداختم که هرکدام Pull Subscription خودش را دارد و هر کار را در ۲۰۰ میلی‌ثانیه انجام می‌دهد، و ۳۰ پیام منتشر کردم. بخشی از لاگ:\n0.0s w3 got job-01 (stream seq 1, delivery #1) 0.0s w2 got job-02 (stream seq 2, delivery #1) 0.0s w1 got job-03 (stream seq 3, delivery #1) 0.2s w2 got job-06 (stream seq 6, delivery #1) 0.2s w3 got job-04 (stream seq 4, delivery #1) 0.2s w1 got job-05 (stream seq 5, delivery #1) ... deliveries=30 unique=30 pending=0 ackPending=0 redelivered=0 ۳۰ تحویل، ۳۰ کار یکتا و هیچ تحویل مجددی. کل کار حدود ۲ ثانیه طول کشید، در حالی‌که یک Worker تنها به ۶ ثانیه نیاز داشت. به ترتیب هم دقت کن: job-06 قبل از job-04 شروع شد.\nوسط کار یک Worker می‌میرد حالا بخش جالب. AckWait را ۲ ثانیه گذاشتم، ۱۰ کار منتشر کردم و کاری کردم که w2 روی پیام دومش «crash» کند، یعنی بدون ack متوقف شود:\n0.1s w2 got job-06 (stream seq 6, delivery #1) 0.1s w2 CRASHED while holding job-06 (no ack) ... 2.1s w1 got job-06 (stream seq 6, delivery #2) deliveries=11 unique=10 pending=0 ackPending=0 redelivered=0 سرور به اندازه‌ی AckWait صبر کرد و بعد job-06 را به Workerی که هنوز زنده بود (w1) داد. شبکه‌ی ایمنی همین است: ack نیامد یعنی پیام گم نمی‌شود. دو نتیجه دارد:\nتحویل at-least-once است. Workerِ مرده ممکن است نصف کار یا کل آن را انجام داده باشد، پس پردازش باید در برابر تکرار ایمن باشد. موضوع مقاله‌ی بعد همین است. ترتیب بین Workerها تضمین نمی‌شود. job-06 خیلی بعد از job-10 پردازش شد. اگر ترتیب سخت‌گیرانه لازم داری، باید طراحی دیگری (مثلاً یک Consumer با یک Worker، یا تقسیم کار بر اساس subject) انتخاب کنی. خواندن lag با ConsumerInfo برای دیدن صف انباشته‌شده از سرور درباره‌ی Consumer می‌پرسیم. مانیتور کوچک من فقط یک ticker است:\ni, err := js.ConsumerInfo(\u0026#34;JOBS\u0026#34;, \u0026#34;workers\u0026#34;) fmt.Printf(\u0026#34;pending=%d ackPending=%d redelivered=%d delivered=%d ackFloor=%d\\n\u0026#34;, i.NumPending, i.NumAckPending, i.NumRedelivered, i.Delivered.Consumer, i.AckFloor.Consumer) معنی هر عدد:\nNumPending: پیام‌هایی که در stream هستند و هنوز به Consumer تحویل داده نشده‌اند. برای «lag» روی همین عدد هشدار بگذار. NumAckPending: تحویل داده شده ولی هنوز ack نشده، یعنی همین الان در حال پردازش. با دو Worker مشغول، این عدد روی ۲ می‌ماند. NumRedelivered: پیام‌هایی که دارند دوباره تحویل داده می‌شوند. Delivered.Consumer: شماره‌ی ترتیبیِ آخرین تحویل در Consumer. تحویل‌های مجدد را هم می‌شمارد. AckFloor.Consumer: شماره‌ای که همه‌ی تحویل‌های زیر آن ack شده‌اند. برای این اجرا دو Worker کند (هر کار ۵۰۰ میلی‌ثانیه) گذاشتم، ۴۰ کار را در ثانیه‌ی ۱٫۵ منتشر کردم و w2 را روی پیام پنجمش crash دادم. AckWait برابر ۳ ثانیه بود.\n1.0s pending=0 ackPending=0 redelivered=0 delivered=0 ackFloor=0 1.5s publishing 40 jobs 2.0s pending=38 ackPending=2 redelivered=0 delivered=2 ackFloor=0 3.0s pending=34 ackPending=2 redelivered=0 delivered=6 ackFloor=4 3.5s w2 CRASHED while holding job-09 (no ack) 4.0s pending=30 ackPending=2 redelivered=0 delivered=10 ackFloor=8 5.0s pending=28 ackPending=2 redelivered=0 delivered=12 ackFloor=8 6.0s pending=26 ackPending=2 redelivered=0 delivered=14 ackFloor=8 7.0s pending=25 ackPending=1 redelivered=1 delivered=16 ackFloor=8 8.0s pending=23 ackPending=1 redelivered=0 delivered=18 ackFloor=17 ... 19.0s pending=1 ackPending=1 redelivered=0 delivered=40 ackFloor=39 20.0s pending=0 ackPending=0 redelivered=0 delivered=41 ackFloor=41 با رسیدن موج پیام‌ها pending به ۳۸ می‌پرد و با دو Worker حدود ۴ تا در ثانیه کم می‌شود. بعد از crash سرعت به حدود ۲ تا در ثانیه می‌رسد، چون فقط یک Worker مانده. خودِ crash در دو جا دیده می‌شود: AckFloor روی ۸ ثابت ماند تا پیام گیرکرده منتظر بماند، و NumRedelivered در ثانیه‌ی ۷٫۰، بعد از تمام شدن AckWait، عدد ۱ را نشان داد و وقتی پیام ack شد به ۰ برگشت و floor به ۱۷ پرید. در پایان delivered برابر ۴۱ است برای ۴۰ کار: یکی اضافه همان تحویل مجدد است.\nEndpoint مانیتورینگ HTTP اگر سرور با پورت مانیتورینگ HTTP اجرا شود، همین اعداد را بدون کلاینت هم می‌شود خواند. سرور تعبیه‌شده را با HTTPPort: 8222 بالا آوردم، ۵ پیام مصرف‌نشده در stream گذاشتم و curl 'localhost:8222/jsz?consumers=true' زدم. در JSON، Consumer مربوط به stream با نام JOBS این مقادیر را داشت: num_pending برابر ۵، و num_ack_pending و num_redelivered برابر ۰. برای scrape کردن با Prometheus یا یک چک سریع از شل مناسب است.\nچند نکته‌ی مهم روی رشد مداوم NumPending هشدار بگذار، نه روی یک مقدار بالا. موج ناگهانی عادی است، خطِ پیوسته صعودی مشکل است. اگر NumAckPending بالا برود و AckFloor ثابت بماند، Workerها گیر کرده‌اند یا crash می‌کنند، حتی اگر pending خوب به نظر برسد. AckWait باید از کندترین کار معمولی شما بیشتر باشد، وگرنه پیام Workerهای سالم به دیگری داده می‌شود. برای کارهای طولانی از m.InProgress() استفاده کن. Worker بیشتر فقط وقتی کمک می‌کند که گلوگاه خودِ پردازش باشد. مطمئن شو دیتابیس یا APIای که Workerها صدا می‌زنند همزمانی بیشتر را تحمل می‌کند. NumRedelivered در اجرای من فقط برای یک لحظه دیده شد، پس scrape هر چند دقیقه ممکن است آن را از دست بدهد. آن را نشانه بدان، نه شمارنده‌ی کل تلاش‌های مجدد. قدم بعدی تحویل مجدد یعنی ممکن است یک کار دوبار اجرا شود. مقاله‌ی بعد درباره‌ی idempotency و معنی واقعی «exactly-once» در JetStream است: Nats-Msg-Id، پنجره‌ی duplicate و Consumerهای idempotent.\n","permalink":"https://justroham.ir/fa/posts/nats-jetstream-scaling-lag/","summary":"\u003cp\u003eآخر \u003ca href=\"/fa/posts/nats-jetstream-retry-dlq/\"\u003eمقاله‌ی قبل\u003c/a\u003e دو موضوع را وعده داده بودم: اجرای بیش از یک Worker و زیر نظر گرفتن میزان عقب‌ماندگی. تا وقتی پیام‌ها کندتر از توان یک Worker می‌رسند همه‌چیز خوب است، اما بعدش دو سؤال پیش می‌آید: چطور Worker اضافه کنیم بدون اینکه چیزی دوبار پردازش شود، و از کجا بفهمیم صف دارد انباشته می‌شود؟\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eهمه‌ی مثال‌های زیر را با یک \u003ccode\u003enats-server\u003c/code\u003e تعبیه‌شده (با JetStream و یک پوشه‌ی موقت برای ذخیره‌سازی) و \u003ccode\u003enats.go\u003c/code\u003e نسخه‌ی v1.54.0 روی Go 1.26 اجرا کرده‌ام و خروجی‌ها از همان اجراها هستند.\u003c/p\u003e","title":"چند Worker روی یک Consumer و مانیتورینگ lag در JetStream"},{"content":"در ۲۱ اکتبر ۲۰۲۶ GitLab یک patch release بحرانی منتشر کرد که یکی از موارد آن CVE-2026-110264 است، با امتیاز CVSS 10.0 که بالاترین مقدار ممکن است. این ضعف در GitLab CE و EE وجود دارد و در شرایطی خاص به یک کاربر بدون احراز هویت اجازه می‌دهد روی سرور GitLab کد دلخواه اجرا کند. گزارش The Hacker News هم همین را پوشش داده است.\nاگر GitLab را خودتان نصب و نگهداری می‌کنید (self-managed)، اول آپدیت کنید و بعد این مقاله را بخوانید.\nخلاصه شناسه CVE-2026-110264 امتیاز ۱۰٫۰ (Critical) بردار CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H نوع ضعف Integer Overflow در کامپایلر عبارت منظم (regex) گزارش‌دهنده joaxcar، از طریق برنامه‌ی باگ‌بانتی GitLab در HackerOne بردار یعنی: از راه شبکه، با پیچیدگی کم، بدون لاگین و بدون تعامل کاربر قابل بهره‌برداری است و روی محرمانگی، یکپارچگی و در دسترس بودن اثر کامل دارد.\nماجرا چیست؟ طبق توضیح GitLab، ضعف از یک integer overflow هنگام کامپایل یک regex دست‌ساز می‌آید. بر اساس گزارش The Hacker News، این در موتور Onigmo اتفاق می‌افتد که موتور regex داخلی Ruby است و GitLab آن را همراه خودش ارائه و patch می‌کند.\nنکته‌ی نگران‌کننده این است که GitLab شرایط دقیق بهره‌برداری را اعلام نکرده. یعنی فعلاً نمی‌شود با یک تنظیم مشخص مطمئن شد که سرور شما در امان است. طبق گزارش، فعلاً نشانه‌ای از بهره‌برداری فعال نیست و تا ۲۲ اکتبر در فهرست KEV سازمان CISA هم نیامده، ولی این وضعیت می‌تواند سریع عوض شود.\nچه چیزهایی تحت تأثیرند؟ نسخه‌های آسیب‌پذیر، همه‌ی نسخه‌ها از ۷٫۰ تا پیش از این‌ها:\nشاخه آسیب‌پذیر پیش از نسخه‌ی رفع‌شده 19.5 19.5.1 19.5.1 19.4 19.4.3 19.4.3 19.3 19.3.6 19.3.6 19.2 19.2.9 19.2.9 19.1 19.1.9 19.1.9 19.0 19.0.10 19.0.10 7.0 تا 18.11 18.11.13 18.11.13 GitLab.com از قبل patch شده و تنها نصب‌های self-managed باید اقدام کنند. tenantهای GitLab Dedicated با نسخه‌ی 19.3.5-internal0 و 19.4.2-internal0 یا جدیدتر هم رفع‌شده‌اند.\nاگر بعد از ۱۲ اکتبر برای وصله‌ی CVE-2026-97229 (آن هم CVSS 10) آپدیت کرده‌اید، طبق گزارش The Hacker News آن نسخه‌ها (19.2.8، 19.3.5 و 19.4.2) این مورد جدید را ندارند و باید یک بار دیگر آپدیت کنید.\nچه کار کنیم؟ ۱. آپدیت. به نسخه‌ی رفع‌شده‌ی شاخه‌ی خودتان بروید. GitLab هیچ workaround موقتی معرفی نکرده و آپدیت تنها راه مطمئن است.\n۲. به migrationها توجه کنید. نسخه‌های 19.4.3 و 19.3.6 شامل migration دیتابیس‌اند. روی سرور تک‌نود، آپدیت downtime دارد چون migration باید قبل از بالا آمدن GitLab تمام شود. روی نصب چندنودی می‌توانید از روش zero-downtime استفاده کنید.\n۳. تا زمان آپدیت، دسترسی را محدود کنید. اگر نمونه‌ی GitLab شما از اینترنت در دسترس است و فوراً نمی‌توانید آپدیت کنید، دسترسی را موقتاً با فایروال، VPN یا allowlist بسته نگه دارید. این توصیه‌ی رسمی GitLab نیست و فقط یک اقدام احتیاطی عمومی است.\n۴. شناسایی نفوذ. GitLab دو قاعده‌ی تشخیص برای نمونه‌های self-managed منتشر کرده: «Onigmo native worker crash» و «Org mode render error burst». این‌ها را روی لاگ‌های برنامه اجرا کنید (راهنما: Detecting security incidents). اگر نمونه‌تان تا الان از اینترنت قابل دسترس بوده، فایل‌ها، توکن‌ها و runnerهای ناشناس را هم بررسی کنید.\n۵. توکن‌ها و runnerها. چون GitLab معمولاً به کد، secretها و CI دسترسی دارد، در صورت شک به نفوذ، توکن‌ها، متغیرهای CI و کلیدهای deploy را rotate کنید.\nمنابع GitLab Critical Patch Release: 19.5.1 و دیگر نسخه‌ها گزارش The Hacker News Detecting security incidents در GitLab ","permalink":"https://justroham.ir/fa/posts/gitlab-critical-rce-cve-2026-110264/","summary":"\u003cp\u003eدر ۲۱ اکتبر ۲۰۲۶ GitLab یک patch release بحرانی منتشر کرد که یکی از موارد آن \u003ca href=\"https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/\"\u003eCVE-2026-110264\u003c/a\u003e است، با امتیاز \u003cstrong\u003eCVSS 10.0\u003c/strong\u003e که بالاترین مقدار ممکن است. این ضعف در GitLab CE و EE وجود دارد و در شرایطی خاص به یک کاربر \u003cstrong\u003eبدون احراز هویت\u003c/strong\u003e اجازه می‌دهد روی سرور GitLab کد دلخواه اجرا کند. \u003ca href=\"https://thehackernews.com/2026/10/critical-gitlab-flaw-cvss-100-could.html\"\u003eگزارش The Hacker News\u003c/a\u003e هم همین را پوشش داده است.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eاگر GitLab را خودتان نصب و نگهداری می‌کنید (self-managed)، اول آپدیت کنید و بعد این مقاله را بخوانید.\u003c/p\u003e","title":"آسیب‌پذیری بحرانی GitLab با CVSS 10: اجرای کد از راه دور (CVE-2026-110264)"},{"content":"در ۲۱ اکتبر ۲۰۲۶ مرکز ملی امنیت سایبری بریتانیا (NCSC) هشداری با عنوان «Critical security issue affecting PHP» منتشر کرد. دو آسیب‌پذیری در خودِ PHP می‌تواند به مهاجم بدون احراز هویت اجازه‌ی اجرای کد از راه دور (RCE) روی وب‌سروری بدهد که PHP اجرا می‌کند. هر دو مورد در نسخه‌های جدید رفع شده‌اند.\nاگر روی سرورهایتان PHP دارید، اول نسخه را آپدیت کنید و بعد این مقاله را بخوانید.\nخلاصه CVE-2026-109618 CVE-2026-109619 عنوان RCE via OOM corruption RCE via stale global state امتیاز CVSS v4.0 ۹٫۲ (Critical) ۹٫۲ (Critical) بردار AV:N/AC:H/AT:P/PR:N/UI:N AV:N/AC:H/AT:P/PR:N/UI:N نوع ضعف use-after-free، مدیریت نادرست خطا use-after-free، وضعیت global باقی‌مانده هر دو آسیب‌پذیری از راه شبکه، بدون نیاز به لاگین و بدون تعامل کاربر قابل بهره‌برداری‌اند.\nماجرا چیست؟ CVE-2026-109618: PHP برای خطای کمبود حافظه (OOM) از longjmp() استفاده می‌کند. اگر تخصیص حافظه وسط مقداردهی اولیه‌ی داده‌های درخواست شکست بخورد، مرحله‌ی پاک‌سازی درخواست ممکن است داده‌ی نیمه‌ساخته را معتبر فرض کند. نتیجه خرابی حافظه است و در شرایطی RCE. محرک‌ها بیشتر به پردازش درخواست‌های multipart مربوط‌اند: درخواست بدون طول مشخص، تعداد نامحدود هدر در هر بخش، فیلدهای فایل خالی که در max_file_uploads حساب نمی‌شوند و نام فیلدهای تودرتو.\nCVE-2026-109619: در Workerهایی که بین درخواست‌ها زنده می‌مانند، بخشی از وضعیت global (خطا، session، آبجکت و extension) می‌تواند بعد از آزاد شدن حافظه‌ی درخواست هنوز به آن اشاره کند. درخواست بعدیِ همان Worker ممکن است قبل از مقداردهی اولیه‌ی عادی از این وضعیت کهنه استفاده کند و به use-after-free برسد. نمونه‌ی تأییدشده‌ی بهره‌برداری، PHP 8.5 با fatal_error_backtraces فعال و همچنین چرخه‌ی session upload progress است.\nچه چیزهایی تحت تأثیرند؟ نسخه‌های آسیب‌پذیر:\nPHP ۸٫۲ پایین‌تر از 8.2.35 PHP ۸٫۳ پایین‌تر از 8.3.36 PHP ۸٫۴ پایین‌تر از 8.4.27 PHP ۸٫۵ پایین‌تر از 8.5.12 نسخه‌های رفع‌شده: 8.2.35، 8.3.36، 8.4.27 و 8.5.12.\nNCSC تأکید می‌کند هر سازمانی که از PHP استفاده می‌کند در معرض خطر است، از جمله محصولات و appliance‌هایی که PHP را داخل خود دارند. نسخه‌های قدیمی‌تر از ۸٫۲ که پشتیبانی نمی‌شوند هم باید به نسخه‌ی پشتیبانی‌شده ارتقا پیدا کنند.\nاز نظر نحوه‌ی اجرا (طبق advisory رسمی PHP):\nApache mod_php: بهره‌برداری با تنظیمات پیش‌فرض و prefork معمولی روی HTTP تأیید شده است. PHP-FPM: بر اساس تحلیل سورس آسیب‌پذیر است، هرچند exploit کامل نمایش داده نشده. FrankenPHP و LSAPI: احتمالاً آسیب‌پذیرند ولی هنوز تأیید نشده. چه کار کنیم؟ ۱. آپدیت. تنها راه‌حل کامل، ارتقا به یکی از نسخه‌های رفع‌شده است.\n۲. همه‌ی نصب‌های PHP را پیدا کنید. اول سیستم‌های در دسترس از اینترنت، و فقط به نسخه‌های قدیمی بسنده نکنید. کانتینرها، imageهای Docker و محصولات بسته‌بندی‌شده (پنل‌ها، CMSها، appliance‌ها) را هم چک کنید. NCSC هلند فهرستی از نرم‌افزارهای وابسته به PHP منتشر کرده: NCSC-NL/php2shell.\n۳. اگر فوراً نمی‌توانید آپدیت کنید، این کاهش‌دهنده‌ها را اعمال کنید (کامل نیستند):\nmemory_limit=-1 را در سطح سرور تنظیم و همه‌ی Workerها را ری‌استارت کنید. از RLIMIT_AS و RLIMIT_DATA استفاده نکنید چون mmap() را شکست می‌دهند و مسیر آسیب‌پذیر را فعال می‌کنند. post_max_size را محافظه‌کارانه نگه دارید و اندازه‌ی بدنه‌ی درخواست را در فرانت‌اند (Nginx/لودبالانسر) محدود کنید. max_input_nesting_level را کم کنید و تعداد متغیرهای ورودی، بخش‌های multipart، هدرها و آپلودها را محدود کنید. اگر اپلیکیشن از multipart/form-data استفاده نمی‌کند، این درخواست‌ها را در فرانت‌اند ببندید. session.upload_progress.enabled=0 را تنظیم کنید و برای PHP 8.5 مقدار fatal_error_backtraces=0 بگذارید. سپس Workerها را ری‌استارت کنید. اگر عملکرد مهم نیست، pm.max_requests=1 در PHP-FPM وضعیت باقی‌مانده بین درخواست‌ها را از بین می‌برد. ۴. اگر نه آپدیت ممکن است و نه کاهش‌دهنده‌ها، NCSC پیشنهاد می‌کند سیستم را موقتاً آفلاین کنید.\n۵. نشانه‌های نفوذ را بررسی کنید. اگر سیستم تا الان در معرض اینترنت بوده، دنبال backdoor و فایل‌ها یا پردازش‌های ناشناس بگردید.\nمنابع هشدار NCSC GHSA-w8hw-w9fx-j79w (CVE-2026-109618) GHSA-6wmf-4rv5-p3rp (CVE-2026-109619) NCSC-NL/php2shell ","permalink":"https://justroham.ir/fa/posts/php-critical-rce-cve-2026-109618/","summary":"\u003cp\u003eدر ۲۱ اکتبر ۲۰۲۶ مرکز ملی امنیت سایبری بریتانیا (NCSC) هشداری با عنوان \u003ca href=\"https://www.ncsc.gov.uk/news/critical-security-issue-affecting-php\"\u003e«Critical security issue affecting PHP»\u003c/a\u003e منتشر کرد. دو آسیب‌پذیری در خودِ PHP می‌تواند به مهاجم \u003cstrong\u003eبدون احراز هویت\u003c/strong\u003e اجازه‌ی \u003cstrong\u003eاجرای کد از راه دور (RCE)\u003c/strong\u003e روی وب‌سروری بدهد که PHP اجرا می‌کند. هر دو مورد در نسخه‌های جدید رفع شده‌اند.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eاگر روی سرورهایتان PHP دارید، اول نسخه را آپدیت کنید و بعد این مقاله را بخوانید.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"خلاصه\"\u003eخلاصه\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth\u003eCVE-2026-109618\u003c/th\u003e\n          \u003cth\u003eCVE-2026-109619\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eعنوان\u003c/td\u003e\n          \u003ctd\u003eRCE via OOM corruption\u003c/td\u003e\n          \u003ctd\u003eRCE via stale global state\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eامتیاز CVSS v4.0\u003c/td\u003e\n          \u003ctd\u003e۹٫۲ (Critical)\u003c/td\u003e\n          \u003ctd\u003e۹٫۲ (Critical)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eبردار\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003eAV:N/AC:H/AT:P/PR:N/UI:N\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003eAV:N/AC:H/AT:P/PR:N/UI:N\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eنوع ضعف\u003c/td\u003e\n          \u003ctd\u003euse-after-free، مدیریت نادرست خطا\u003c/td\u003e\n          \u003ctd\u003euse-after-free، وضعیت global باقی‌مانده\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eهر دو آسیب‌پذیری از راه شبکه، بدون نیاز به لاگین و بدون تعامل کاربر قابل بهره‌برداری‌اند.\u003c/p\u003e","title":"آسیب‌پذیری بحرانی PHP: اجرای کد از راه دور (CVE-2026-109618)"},{"content":"در مقاله‌ی قبل یک Publisher و Worker ساده روی JetStream ساختیم. اما Workerِ آن مقاله فرض می‌کرد پردازش همیشه موفق است. در عمل پیام‌هایی هستند که هر بار fail می‌شوند. اگر کاری نکنیم، یا بی‌نهایت تکرار می‌شوند یا گم می‌شوند.\nدر این مقاله سه چیز را اضافه می‌کنیم:\nمحدود کردن تعداد تلاش‌ها با MaxDeliver فاصله‌ی بین تلاش‌ها با BackOff و NakWithDelay فرستادن پیام «سوخته» به یک صف dead-letter همه‌ی رفتارهای زیر را با یک سرور NATS تعبیه‌شده در Go (با JetStream) و کتابخانه‌ی nats.go آزمایش کرده‌ام و خروجی‌ها از همان آزمایش‌اند.\nساخت Consumer با تنظیمات صریح به‌جای اینکه PullSubscribe یک Consumer پیش‌فرض بسازد، خودمان آن را با تنظیمات دلخواه می‌سازیم:\n_, err = js.AddConsumer(\u0026#34;EVENTS\u0026#34;, \u0026amp;nats.ConsumerConfig{ Durable: \u0026#34;worker-consumer\u0026#34;, AckPolicy: nats.AckExplicitPolicy, AckWait: 30 * time.Second, MaxDeliver: 3, BackOff: []time.Duration{500 * time.Millisecond, time.Second}, FilterSubject: \u0026#34;events.created\u0026#34;, }) MaxDeliver: 3 یعنی هر پیام حداکثر ۳ بار تحویل داده می‌شود. AckWait مدت انتظار برای ack است. اگر Worker در این مدت ack نزند، پیام دوباره تحویل داده می‌شود. BackOff فاصله‌ی تحویل‌های مجدد را مشخص می‌کند. بعد Worker مثل قبل به همین Consumer وصل می‌شود:\nsub, _ := js.PullSubscribe(\u0026#34;events.created\u0026#34;, \u0026#34;worker-consumer\u0026#34;) Nak یعنی چه؟ وقتی پردازش fail شد، دو راه داریم: ack نزنیم و منتظر AckWait بمانیم، یا صریح بگوییم «این پیام را دوباره بده» با Nak. من هر دو را با یک پیام «poison» که همیشه fail می‌شود امتحان کردم:\nروش رفتار مشاهده‌شده m.Nak() بلافاصله دوباره تحویل می‌شود. BackOff اثری ندارد. هر ۳ تلاش در همان ثانیه‌ی صفر انجام شد. m.NakWithDelay(1 * time.Second) بعد از تأخیر داده‌شده دوباره می‌آید (تلاش‌های ۲ و ۳ حدود ثانیه‌ی ۱ و ۲٫۵). ack نزدن طبق BackOff دوباره تحویل می‌شود (در آزمایش من تلاش‌های ۲ و ۳ در ثانیه‌ی ۰٫۵ و ۱٫۵؛ AckWait را برای آزمایش ۲ ثانیه گذاشته بودم). نتیجه‌ی عملی: Nak() ساده برای خطای موقتی خطرناک است، چون یک Worker را در حلقه‌ی تلاش سریع گیر می‌اندازد. برای خطاهایی که احتمالاً با کمی صبر درست می‌شوند (مثلاً دیتابیس لحظه‌ای در دسترس نیست) از NakWithDelay استفاده کن.\nیک Worker کامل‌تر:\nfor _, m := range msgs { if err := process(m.Data); err != nil { log.Println(\u0026#34;process failed:\u0026#34;, err) m.NakWithDelay(time.Second) continue } m.Ack() } وقتی تلاش‌ها تمام شد: Advisory بعد از رسیدن به MaxDeliver، JetStream دیگر پیام را به این Consumer نمی‌دهد. پیام داخل Stream می‌ماند، ولی JetStream یک advisory روی این subject منتشر می‌کند:\n$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.\u0026lt;stream\u0026gt;.\u0026lt;consumer\u0026gt; داخل advisory (JSON) شماره‌ی پیام در Stream (stream_seq) و تعداد تحویل‌ها (deliveries) هست. با همین شماره می‌توانیم پیام اصلی را برداریم.\nساخت صف dead-letter یک Stream جدا برای پیام‌های ناموفق می‌سازیم و یک سرویس کوچک به advisory گوش می‌دهد:\njs.AddStream(\u0026amp;nats.StreamConfig{ Name: \u0026#34;DLQ\u0026#34;, Subjects: []string{\u0026#34;dlq.events\u0026#34;}, }) nc.Subscribe(\u0026#34;$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.EVENTS.worker-consumer\u0026#34;, func(m *nats.Msg) { var adv struct { Stream string `json:\u0026#34;stream\u0026#34;` StreamSeq uint64 `json:\u0026#34;stream_seq\u0026#34;` Deliveries int `json:\u0026#34;deliveries\u0026#34;` } json.Unmarshal(m.Data, \u0026amp;adv) raw, err := js.GetMsg(adv.Stream, adv.StreamSeq) if err != nil { log.Println(\u0026#34;getmsg:\u0026#34;, err) return } // MsgId جلوی ذخیره‌ی تکراری را می‌گیرد js.Publish(\u0026#34;dlq.events\u0026#34;, raw.Data, nats.MsgId(fmt.Sprintf(\u0026#34;dlq-%d\u0026#34;, adv.StreamSeq))) }) در آزمایش من، سه پیام فرستادم: good-1، poison و good-2. دو پیام سالم یک‌بار تحویل و ack شدند، پیام poison سه بار تحویل شد و بعد در Stream به نام DLQ دقیقاً یک پیام ثبت شد. Consumer هم در پایان هیچ پیام pending یا ack-pending نداشت.\nچند نکته‌ی مهم Advisoryها پیام‌های core NATS هستند، نه JetStream. اگر سرویس DLQ در لحظه‌ی انتشار advisory پایین باشد، آن را از دست می‌دهد. برای سیستم‌های حساس باید راه جبرانی داشته باشی، مثلاً بازبینی دوره‌ای Consumer با ConsumerInfo یا ذخیره‌ی advisoryها در یک Stream. پیام اصلی بعد از رسیدن به MaxDeliver از Stream حذف نمی‌شود. مدت نگهداری‌اش به سیاست retention همان Stream بستگی دارد. خطاهای دائمی (مثلاً payload خراب) فایده‌ای ندارد چند بار retry شوند. اگر خطا را تشخیص می‌دهی، همان لحظه می‌توانی m.Term() بزنی تا JetStream دیگر آن را تحویل ندهد. MsgId در مثال بالا از ذخیره‌ی تکراری در DLQ جلوگیری می‌کند، به شرطی که Stream در پنجره‌ی duplicate-detection خودش باشد. قدم بعدی دو موضوع می‌ماند که می‌خواهم در مقاله‌ی بعد بنویسم: اجرای چند Worker روی یک Consumer، و مانیتورینگ تأخیر پردازش. کد کامل نمونه‌ی پایه در go-nats-demo است.\n","permalink":"https://justroham.ir/fa/posts/nats-jetstream-retry-dlq/","summary":"\u003cp\u003eدر \u003ca href=\"/fa/posts/nats-jetstream-go/\"\u003eمقاله‌ی قبل\u003c/a\u003e یک Publisher و Worker ساده روی JetStream ساختیم. اما Workerِ آن مقاله فرض می‌کرد پردازش همیشه موفق است. در عمل پیام‌هایی هستند که هر بار fail می‌شوند. اگر کاری نکنیم، یا بی‌نهایت تکرار می‌شوند یا گم می‌شوند.\u003c/p\u003e\n\u003cp\u003eدر این مقاله سه چیز را اضافه می‌کنیم:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eمحدود کردن تعداد تلاش‌ها با \u003ccode\u003eMaxDeliver\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eفاصله‌ی بین تلاش‌ها با \u003ccode\u003eBackOff\u003c/code\u003e و \u003ccode\u003eNakWithDelay\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eفرستادن پیام «سوخته» به یک صف \u003cstrong\u003edead-letter\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eهمه‌ی رفتارهای زیر را با یک سرور NATS تعبیه‌شده در Go (با JetStream) و کتابخانه‌ی \u003ccode\u003enats.go\u003c/code\u003e آزمایش کرده‌ام و خروجی‌ها از همان آزمایش‌اند.\u003c/p\u003e","title":"Retry و Dead-Letter Queue در NATS JetStream با Go"},{"content":"وقتی می‌خواهم یک مفهوم را واقعاً بفهمم، کوچک‌ترین نمونه‌ی قابل‌اجرا از آن را می‌سازم. این‌بار نوبت NATS JetStream بود. نتیجه، پروژه‌ی go-nats-demo است: یک Publisher، یک Worker و خود NATS، همه با Docker Compose.\nچرا JetStream؟ NATS معمولی پیام‌ها را فقط به مشترک‌هایی می‌رساند که همان لحظه متصل‌اند. اگر Worker پایین باشد، پیام از دست می‌رود. JetStream لایه‌ی پایداری روی NATS است: پیام‌ها در یک Stream ذخیره می‌شوند و Consumerها می‌توانند بعداً و با ack دریافتشان کنند.\nساختار go-nats-demo/ ├── docker-compose.yml ├── publisher/ (Dockerfile + main.go) └── worker/ (Dockerfile + main.go) NATS با JetStream و داشبورد مدیریتی روی پورت 8222 Publisher هر ۲ ثانیه یک پیام روی events.created منتشر می‌کند Worker پیام‌ها را می‌خواند، لاگ می‌گیرد و ack می‌زند اتصال با retry در Docker Compose هیچ تضمینی نیست که NATS قبل از سرویس‌های ما بالا بیاید. پس هر دو سرویس تا ۱۰ بار، با فاصله‌ی ۲ ثانیه، اتصال را امتحان می‌کنند:\nfunc connectNATS(url string) *nats.Conn { for i := 0; i \u0026lt; 10; i++ { nc, err := nats.Connect(url) if err == nil { return nc } log.Println(\u0026#34;Waiting for NATS to be ready...\u0026#34;, err) time.Sleep(2 * time.Second) } log.Fatal(\u0026#34;Failed to connect to NATS after 10 attempts\u0026#34;) return nil } Publisher: ساخت Stream و انتشار پیام Publisher اگر Stream وجود نداشته باشد آن را می‌سازد و بعد در یک حلقه پیام منتشر می‌کند:\njs, _ := nc.JetStream() _, err := js.AddStream(\u0026amp;nats.StreamConfig{ Name: \u0026#34;EVENTS\u0026#34;, Subjects: []string{\u0026#34;events.created\u0026#34;}, }) if err != nil \u0026amp;\u0026amp; err != nats.ErrStreamNameAlreadyInUse { log.Fatal(err) } for { msg := []byte(time.Now().Format(time.RFC3339)) if _, err := js.Publish(\u0026#34;events.created\u0026#34;, msg); err != nil { log.Println(\u0026#34;publish error:\u0026#34;, err) } time.Sleep(2 * time.Second) } Worker: Pull Consumer با نام durable نکته‌ی اصلی این است که Worker یک نام durable (worker-consumer) دارد. یعنی JetStream وضعیت خواندن این Consumer را نگه می‌دارد. اگر Worker ری‌استارت شود، از همان‌جا که مانده ادامه می‌دهد و پیام‌های ازدست‌رفته را دریافت می‌کند:\nsub, err := js.PullSubscribe(\u0026#34;events.created\u0026#34;, \u0026#34;worker-consumer\u0026#34;) if err != nil { log.Fatal(err) } for { msgs, err := sub.Fetch(10, nats.MaxWait(5*time.Second)) if err != nil \u0026amp;\u0026amp; err != nats.ErrTimeout { log.Println(\u0026#34;fetch error:\u0026#34;, err) continue } for _, m := range msgs { log.Println(\u0026#34;Received:\u0026#34;, string(m.Data)) m.Ack() } } Fetch(10, ...) تا ۱۰ پیام را یک‌جا می‌گیرد و Ack() به JetStream می‌گوید پردازش تمام شد. پیامی که ack نشود، دوباره تحویل داده می‌شود.\nاجرا git clone git@github.com:h-agharezaei/go-nats-demo.git cd go-nats-demo docker compose up --build بعد داشبورد NATS را روی http://localhost:8222/ ببین. برای آزمایش durable بودن، فقط سرویس worker را متوقف و دوباره بالا بیاور و لاگ‌ها را نگاه کن.\nقدم بعدی این نمونه عمداً ساده است. چیزهایی که برای کار واقعی لازم می‌شوند و می‌خواهم سراغشان بروم: سیاست retry و MaxDeliver، dead-letter، چند Worker روی یک Consumer، و مانیتورینگ تأخیر پردازش.\n","permalink":"https://justroham.ir/fa/posts/nats-jetstream-go/","summary":"\u003cp\u003eوقتی می‌خواهم یک مفهوم را واقعاً بفهمم، کوچک‌ترین نمونه‌ی قابل‌اجرا از آن را می‌سازم. این‌بار نوبت \u003cstrong\u003eNATS JetStream\u003c/strong\u003e بود. نتیجه، پروژه‌ی \u003ca href=\"https://github.com/h-agharezaei/go-nats-demo\"\u003ego-nats-demo\u003c/a\u003e است: یک Publisher، یک Worker و خود NATS، همه با Docker Compose.\u003c/p\u003e\n\u003ch2 id=\"چرا-jetstream\"\u003eچرا JetStream؟\u003c/h2\u003e\n\u003cp\u003eNATS معمولی پیام‌ها را فقط به مشترک‌هایی می‌رساند که همان لحظه متصل‌اند. اگر Worker پایین باشد، پیام از دست می‌رود. \u003cstrong\u003eJetStream\u003c/strong\u003e لایه‌ی پایداری روی NATS است: پیام‌ها در یک Stream ذخیره می‌شوند و Consumerها می‌توانند بعداً و با ack دریافتشان کنند.\u003c/p\u003e","title":"یک Publisher و Worker ساده با NATS JetStream در Go"},{"content":"سلام! من روهام هستم، مهندس نرم‌افزار ارشد در تهران.\nبیشتر با Go و Node.js کار می‌کنم و به معماری تمیز، APIهای کارآمد و جزئیاتی که سیستم‌های بک‌اند را قابل‌اعتماد می‌کنند اهمیت می‌دهم.\nروی چه کارهایی کار می‌کنم طراحی و ساخت سرویس‌ها و APIهای بک‌اند سیستم‌های رویدادمحور با Kafka و NATS JetStream همروندی در Go: گوروتین‌ها، context، اتصال‌پذیری و تاب‌آوری ابزارهای داده‌ی بازار و تحلیل تکنیکال (کندل، اندیکاتور، سیگنال) در حال یادگیری Rust، از طریق یک موتور تحلیل بازار (quant-core) تحلیل کمی و ساختار بازار در چند تایم‌فریم مهارت‌ها زبان‌ها: Go، TypeScript / Node.js (NestJS)، Rust، Python پیام‌رسانی: Apache Kafka، NATS JetStream ابزارها: Docker، Docker Compose، Hugo، GitHub Actions تماس با من GitHub LinkedIn ","permalink":"https://justroham.ir/fa/about/","summary":"\u003cp\u003eسلام! من \u003cstrong\u003eروهام\u003c/strong\u003e هستم، مهندس نرم‌افزار ارشد در تهران.\u003c/p\u003e\n\u003cp\u003eبیشتر با \u003cstrong\u003eGo\u003c/strong\u003e و \u003cstrong\u003eNode.js\u003c/strong\u003e کار می‌کنم و به معماری تمیز، APIهای کارآمد و جزئیاتی که سیستم‌های بک‌اند را قابل‌اعتماد می‌کنند اهمیت می‌دهم.\u003c/p\u003e\n\u003ch2 id=\"روی-چه-کارهایی-کار-میکنم\"\u003eروی چه کارهایی کار می‌کنم\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eطراحی و ساخت سرویس‌ها و APIهای بک‌اند\u003c/li\u003e\n\u003cli\u003eسیستم‌های رویدادمحور با Kafka و NATS JetStream\u003c/li\u003e\n\u003cli\u003eهمروندی در Go: گوروتین‌ها، context، اتصال‌پذیری و تاب‌آوری\u003c/li\u003e\n\u003cli\u003eابزارهای داده‌ی بازار و تحلیل تکنیکال (کندل، اندیکاتور، سیگنال)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"در-حال-یادگیری\"\u003eدر حال یادگیری\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRust\u003c/strong\u003e، از طریق یک موتور تحلیل بازار (\u003ca href=\"https://github.com/h-agharezaei/quant-core\"\u003equant-core\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eتحلیل کمی و ساختار بازار در چند تایم‌فریم\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"مهارتها\"\u003eمهارت‌ها\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eزبان‌ها:\u003c/strong\u003e Go، TypeScript / Node.js (NestJS)، Rust، Python\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eپیام‌رسانی:\u003c/strong\u003e Apache Kafka، NATS JetStream\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eابزارها:\u003c/strong\u003e Docker، Docker Compose، Hugo، GitHub Actions\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"تماس-با-من\"\u003eتماس با من\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/h-agharezaei\"\u003eGitHub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.linkedin.com/in/hossein-agharezaei/\"\u003eLinkedIn\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"درباره من"},{"content":"خوش آمدید به وبلاگ من! این اولین مقاله‌ای است که در وبسایت شخصی خودم منتشر می‌کنم.\nچرا این سایت را ساختم؟ برای به اشتراک گذاشتن تجربیات و دانش خودم برای یادگیری بیشتر برای ارتباط با افراد علاقه‌مند به موضوعات مشابه ادامه دارد\u0026hellip; به زودی مقالات بیشتری منتشر خواهم کرد. منتظر باشید!\n","permalink":"https://justroham.ir/fa/posts/first-post/","summary":"\u003ch2 id=\"خوش-آمدید-به-وبلاگ-من\"\u003eخوش آمدید به وبلاگ من!\u003c/h2\u003e\n\u003cp\u003eاین اولین مقاله‌ای است که در وبسایت شخصی خودم منتشر می‌کنم.\u003c/p\u003e\n\u003ch2 id=\"چرا-این-سایت-را-ساختم\"\u003eچرا این سایت را ساختم؟\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eبرای به اشتراک گذاشتن تجربیات و دانش خودم\u003c/li\u003e\n\u003cli\u003eبرای یادگیری بیشتر\u003c/li\u003e\n\u003cli\u003eبرای ارتباط با افراد علاقه‌مند به موضوعات مشابه\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ادامه-دارد\"\u003eادامه دارد\u0026hellip;\u003c/h2\u003e\n\u003cp\u003eبه زودی مقالات بیشتری منتشر خواهم کرد. منتظر باشید!\u003c/p\u003e","title":"اولین مقاله من"},{"content":"گزینه‌ای در کلاس که نام attributeها را از پیش ثابت می‌کند تا نمونه‌ها بدون dict جداگانه آن‌ها را نگه دارند؛ حافظه کمتر مصرف می‌شود و attribute تازه نمی‌توان اضافه کرد.\n","permalink":"https://justroham.ir/fa/glossary/slots/","summary":"گزینه‌ای در کلاس که نام attributeها را از پیش ثابت می‌کند تا نمونه‌ها بدون \u003cstrong\u003edict\u003c/strong\u003e جداگانه آن‌ها را نگه دارند؛ حافظه کمتر مصرف می‌شود و attribute تازه نمی‌توان اضافه کرد.","title":"__slots__"},{"content":"ignore فقط روی فایل‌های untracked اثر دارد. فایلی که از قبل tracked است تا git rm --cached همچنان tracked می‌ماند. git check-ignore -v نشان می‌دهد کدام قانون مطابقت دارد.\n","permalink":"https://justroham.ir/fa/glossary/gitignore/","summary":"فایلی از الگوها که به گیت می‌گوید کدام فایل‌های untracked را نادیده بگیرد.","title":".gitignore"},{"content":"Dijkstra که با یک برآورد از هزینه‌ی باقی‌مانده هدایت می‌شود و گره‌های کمتری گسترش می‌دهد.\nheap بر اساس هزینه تا اینجا به‌علاوه‌ی برآورد مرتب می‌شود. اگر برآورد هیچ‌وقت بیشتر از واقعیت نباشد (admissible)، مسیر پیدا شده همچنان بهینه است.\n","permalink":"https://justroham.ir/fa/glossary/a-star/","summary":"Dijkstra که با یک برآورد از هزینه‌ی باقی‌مانده هدایت می‌شود و گره‌های کمتری گسترش می‌دهد.","title":"A*"},{"content":"دو تکه‌ی کامپایل‌شده فقط وقتی می‌توانند همدیگر را صدا بزنند که روی ABI توافق داشته باشند. Rust ABI پایدار خودش را ندارد، پس FFI از C ABI (extern \u0026quot;C\u0026quot;) می‌گذرد. CPython هم یک ABI محدود و پایدار (abi3) دارد که اجازه می‌دهد یک افزونه‌ی کامپایل‌شده روی چند نسخه‌ی Python کار کند.\n","permalink":"https://justroham.ir/fa/glossary/abi/","summary":"Application Binary Interface: قرارداد در سطح باینری (calling convention، چیدمان نوع‌ها، نام نمادها) بین کدهای کامپایل‌شده.","title":"ABI"},{"content":"controller.signal را به APIای که پشتیبانی می‌کند می‌دهید (timer، fetch، fs و\u0026hellip;). صدا زدن controller.abort() باعث می‌شود عملیات با AbortError reject شود. AbortSignal.timeout(ms) سیگنالی می‌سازد که خودش بعد از مدتی abort می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/abort-controller/","summary":"شیء استانداردی که از طریق AbortSignal لغو شدن را به عملیات async خبر می‌دهد.","title":"AbortController"},{"content":"Atomicity یعنی همه یا هیچ، consistency یعنی بعد از commit قیدها برقرارند، isolation یعنی تراکنش‌های هم‌زمان کار نیمه‌کاره‌ی هم را نمی‌بینند و durability یعنی تغییرِ commit شده از crash جان سالم به در می‌برد.\n","permalink":"https://justroham.ir/fa/glossary/acid/","summary":"چهار تضمین یک تراکنش: Atomicity، Consistency، Isolation و Durability.","title":"ACID"},{"content":"با ack صریح، سرور پیام را تا پاسخ consumer «در انتظار» نگه می‌دارد. ack یعنی کار تمام شد، nak درخواست ارسال دوباره است (اختیاراً با تأخیر) و term به سرور می‌گوید دیگر این پیام را نفرستد.\n","permalink":"https://justroham.ir/fa/glossary/acknowledgement/","summary":"پاسخ consumer به JetStream: ack (تمام شد)، nak (دوباره بفرست)، term (دیگر نفرست).","title":"Acknowledgement (ack)"},{"content":"اگر consumer در مدت AckWait چیزی ack، nak یا term نکند، سرور پیام را دوباره می‌فرستد، تا سقف max_deliver. فهرست backoff می‌تواند این یک مقدار را با تأخیرهای افزایشی جایگزین کند.\n","permalink":"https://justroham.ir/fa/glossary/ack-wait/","summary":"مدتی که JetStream منتظر ack می‌ماند، قبل از اینکه پیام را دوباره بفرستد.","title":"AckWait"},{"content":"در ACME سرور ثابت می‌کند دامنه را کنترل می‌کند (مثلاً با جواب دادن به یک challenge) و CA گواهی کوتاه‌عمر صادر می‌کند. Let\u0026rsquo;s Encrypt از آن استفاده می‌کند. خودکارسازی است که عمر کوتاه گواهی را عملی می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/acme/","summary":"پروتکلی که به نرم‌افزار اجازه می‌دهد گواهی را خودکار از یک CA بگیرد و تمدید کند.","title":"ACME"},{"content":"با -fsanitize=address کامپایل کنید؛ برنامه در اولین دسترسی بد متوقف می‌شود و گزارشی با نوع خطا و شماره‌ی خط می‌دهد. برنامه را کند می‌کند و برای تست و CI است، نه production. فازینگ معمولاً با آن اجرا می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/addresssanitizer/","summary":"بررسی‌گر زمان اجرا که کامپایلر اضافه می‌کند و دسترسی خارج از محدوده، use-after-free و double free را گزارش می‌دهد.","title":"AddressSanitizer"},{"content":"نمایشی از گراف که برای هر vertex فهرست همسایه‌هایش را نگه می‌دارد. حافظه‌اش متناسب با V + E است و برای گراف‌های خلوت مناسب است.\n","permalink":"https://justroham.ir/fa/glossary/adjacency-list/","summary":"نمایشی از گراف که برای هر vertex فهرست همسایه‌هایش را نگه می‌دارد. حافظه‌اش متناسب با V + E است و برای گراف‌های خلوت مناسب است.","title":"Adjacency list"},{"content":"ADR کنار کد در repo زندگی می‌کند. زمینه، تصمیم و پیامدها را دارد و بعد از پذیرش ویرایش نمی‌شود: تغییر نظر یک ADR تازه است که قبلی را کنار می‌گذارد.\n","permalink":"https://justroham.ir/fa/glossary/adr/","summary":"Architecture Decision Record: یادداشت کوتاه و شماره‌دار که می‌گوید چه تصمیمی گرفته شد، چرا و با چه بده‌بستانی.","title":"ADR"},{"content":"pg_advisory_lock(42) و pg_try_advisory_lock(42) یک کلید دلخواه را قفل می‌کنند، نه ردیف یا جدول. همه باید از یک کلید استفاده کنند. برای «فقط یک نمونه این کار را اجرا کند» مناسب است.\n","permalink":"https://justroham.ir/fa/glossary/advisory-lock/","summary":"قفلی که برنامه روی یک عدد تعریف می‌کند؛ دیتابیس آن را اعمال می‌کند اما معنایی برایش ندارد.","title":"Advisory lock"},{"content":"AES-GCM و ChaCha20-Poly1305 ساختارهای AEAD هستند. باز کردن متن رمزشده‌ی دستکاری‌شده خطا می‌دهد و خروجی خراب برنمی‌گرداند.\n","permalink":"https://justroham.ir/fa/glossary/aead/","summary":"رمزنگاری احرازشده با داده‌ی همراه: یک عملیات که هم محرمانگی می‌دهد هم تشخیص دستکاری.","title":"AEAD"},{"content":"Go آن را با cipher.NewGCM می‌دهد. برای هر پیام نانس یکتا می‌خواهد و می‌تواند داده‌ی اضافه (AAD) مثل شناسه‌ی رکورد را به متن رمزشده ببندد.\n","permalink":"https://justroham.ir/fa/glossary/aes-gcm/","summary":"حالت رمزنگاری احراز‌شده: داده را پنهان می‌کند و هر تغییرش را تشخیص می‌دهد.","title":"AES-GCM"},{"content":"کد بیرونی فقط با ریشه‌ی aggregate حرف می‌زند. aggregateهای دیگر با ID ارجاع داده می‌شوند و هر تراکنش یک aggregate را تغییر می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/aggregate/","summary":"مجموعه‌ای از اشیاء که یکجا تغییر می‌کنند و ریشه‌ای دارد که قواعدشان را اجرا می‌کند.","title":"Aggregate"},{"content":"یک آرایه‌ی errors دارد. Promise.any وقتی همه‌ی promiseها reject شوند با آن reject می‌کند. promise را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/aggregate-error/","summary":"خطایی که چند خطا را در خود جمع می‌کند، مثلاً rejectِ Promise.any.","title":"AggregateError"},{"content":"هر هشدار باید قابل اقدام باشد. تنظیم آستانه‌ها بین تشخیص‌های از دست رفته و نویز معامله می‌کند و نقطه‌ی درست به هزینه‌ی هر کدام بستگی دارد.\n","permalink":"https://justroham.ir/fa/glossary/alert-fatigue/","summary":"وقتی هشدارهای کاذب زیاد باعث می‌شود آدم‌ها هشدارهای واقعی را هم نادیده بگیرند.","title":"Alert fatigue"},{"content":"امن‌تر از block-list است که می‌خواهد همه‌ی مقدارهای بد را نام ببرد و همیشه یکی را جا می‌اندازد. نمونه‌های رایج: schemeها، portها و hostهای مقصد مجاز.\n","permalink":"https://justroham.ir/fa/glossary/allow-list/","summary":"فهرستی از تنها مقدارهای پذیرفته‌شده؛ هر چیز دیگر به‌طور پیش‌فرض رد می‌شود.","title":"Allow-list"},{"content":"در handshake کلاینت فهرستی از پروتکل‌ها (h2 و http/1.1) می‌فرستد و سرور یکی را انتخاب می‌کند. HTTPS همین‌طور بدون رفت‌وبرگشت اضافه بین HTTP/2 و HTTP/1.1 تصمیم می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/alpn/","summary":"ALPN: مذاکره‌ی پروتکل برنامه (مثل h2 یا http/1.1) داخل TLS.","title":"ALPN"},{"content":"هزینه‌ی هر عملیات که روی کل دنباله‌ی عملیات‌ها میانگین گرفته می‌شود. append که گاهی همه‌چیز را کپی می‌کند، اگر کپی‌های گران به‌اندازه‌ی کافی نادر باشند، همچنان O(1) سرشکن‌شده است.\n","permalink":"https://justroham.ir/fa/glossary/amortized-analysis/","summary":"هزینه‌ی هر عملیات که روی کل دنباله‌ی عملیات‌ها میانگین گرفته می‌شود. append که گاهی همه‌چیز را کپی می‌کند، اگر کپی‌های گران به‌اندازه‌ی کافی نادر باشند، همچنان O(1) سرشکن‌شده است.","title":"Amortized analysis"},{"content":"tag سبک فقط یک ref به یک commit است. annotated tag (git tag -a) یک object جداست که به commit اشاره می‌کند؛ برای همین git cat-file -t به‌جای commit عبارت tag را چاپ می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/annotated-tag/","summary":"tagی که خودش یک object با پیام، نویسنده و تاریخ است.","title":"Annotated tag"},{"content":"نام‌های قدیمی مثل cust_nm در همین لایه می‌ایستند و کد داخلی نام‌های خودش را دارد.\n","permalink":"https://justroham.ir/fa/glossary/anti-corruption-layer/","summary":"لایه‌ی ترجمه‌ای که نمی‌گذارد مدل سیستم دیگر به مدل شما نشت کند.","title":"Anti-corruption layer"},{"content":"معمولاً روی Merkle tree ساخته می‌شود تا مقایسه‌ی دو replica بزرگ که تقریباً برابرند ارزان باشد.\n","permalink":"https://justroham.ir/fa/glossary/anti-entropy/","summary":"فرایندی پس‌زمینه که replicaها را مقایسه می‌کند و تفاوت‌ها را کپی می‌کند، چه کسی داده را بخواند چه نخواند.","title":"Anti-entropy"},{"content":"اگر قرارداد فقط در ذهن آدم‌ها باشد، عوض شدن یک نام می‌تواند client را بشکند و کسی نفهمد. نوشتنش به شکل قابل‌خواندن برای ماشین اجازه می‌دهد تست‌ها آن را بررسی کنند.\n","permalink":"https://justroham.ir/fa/glossary/api-contract/","summary":"توافق مکتوب درباره‌ی آنچه یک API می‌پذیرد و برمی‌گرداند و هم client و هم server باید رعایتش کنند.","title":"API contract"},{"content":"نوع عدد صحیحی که اندازه‌اش در صورت نیاز بزرگ می‌شود و سرریز نمی‌کند. int در Python این‌طور است.\n","permalink":"https://justroham.ir/fa/glossary/arbitrary-precision/","summary":"نوع عدد صحیحی که اندازه‌اش در صورت نیاز بزرگ می‌شود و سرریز نمی‌کند. int در Python این‌طور است.","title":"Arbitrary precision"},{"content":"چون برای هر حدس حافظه‌ی زیادی می‌خواهد، حمله با GPU سخت‌تر است. هش‌ها معمولاً با قالب PHC و پارامترها درون رشته ذخیره می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/argon2/","summary":"تابع هش پسورد مدرن که هزینه‌اش با زمان، حافظه و موازی‌سازی تعیین می‌شود؛ argon2id متداول‌ترین نوع است.","title":"argon2"},{"content":"argparse مقدار sys.argv را به مقدارهای تایپ‌دار تبدیل می‌کند. زیردستور، choices و گروه‌های دوبه‌دو ناسازگار دارد، متن --help را خودش می‌سازد و در خطای استفاده پیام را در stderr چاپ می‌کند و با کد ۲ خارج می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/argparse/","summary":"ماژول کتابخانه‌ی استاندارد برای تجزیه‌ی آرگومان‌های خط فرمان؛ \u0026ndash;help می‌سازد و در خطای استفاده با کد ۲ خارج می‌شود.","title":"argparse"},{"content":"تابع async همیشه یک promise برمی‌گرداند. await فقط همان تابع را متوقف می‌کند تا promise تمام شود؛ thread برای event loop آزاد می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/async-await/","summary":"سینتکسی که کار با promiseها را شبیه کد ترتیبی می‌کند.","title":"async/await"},{"content":"وقتی پیام ack نشده دوباره تحویل می‌شود همین رفتار را می‌گیرید. پس consumerها باید idempotent باشند.\n","permalink":"https://justroham.ir/fa/glossary/at-least-once-delivery/","summary":"broker هر پیام را یک بار یا بیشتر تحویل می‌دهد و هرگز صفر بار، پس تکرار ممکن است.","title":"At-least-once delivery"},{"content":"commit اتمیک یک تغییر منطقی کامل را شامل می‌شود و بس. هر قدم کوچک، قابل build و آسان برای review یا revert می‌ماند و git bisect را دقیق می‌کند: اولین commit خراب یک diff کوچک است، نه کار یک هفته.\n","permalink":"https://justroham.ir/fa/glossary/atomic-commit/","summary":"commitی که فقط یک تغییر منطقی و کامل را شامل می‌شود.","title":"Atomic commit"},{"content":"روش معمول این است که در همان پوشه فایل موقت بنویسیم و بعد آن را روی مقصد rename کنیم. در سیستم‌فایل‌های POSIX، rename داخل یک سیستم‌فایل نام را در یک گام جایگزین می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/atomic-write/","summary":"نوشتن فایل به شکلی که خواننده یا محتوای قدیمی را می‌بیند یا جدید را، هرگز نیمه‌نوشته را.","title":"Atomic write"},{"content":"audit log به پرسش‌های حقوقی و تحقیقی جواب می‌دهد، نه پرسش‌های اشکال‌زدایی. هر رکورد یک کنشگر، عمل، منبع، نتیجه، شناسه‌ی درخواست، نشانی مبدأ و زمان UTC دارد. فقط افزودنی است و بهتر است بیرون از ماشینی که می‌نویسد نگه داشته شود.\n","permalink":"https://justroham.ir/fa/glossary/audit-log/","summary":"یک رکورد مقاوم در برابر دست‌کاری از اینکه چه کسی، چه کاری، روی چه چیزی، کی، از کجا و با چه نتیجه‌ای انجام داد.","title":"Audit log"},{"content":"authoritative server مرجع اصلی یک zone است. جای دیگری نمی‌گردد؛ از داده‌ی خودش جواب می‌دهد یا می‌گوید نام وجود ندارد و پرچم AA را می‌گذارد.\n","permalink":"https://justroham.ir/fa/glossary/authoritative-server/","summary":"سرور DNS که رکوردهای واقعی یک zone را دارد و با پرچم AA جواب می‌دهد.","title":"Authoritative server"},{"content":"احراز هویت می‌گوید شما کی هستید؛ مجوزدهی می‌گوید چه کاری مجازید. باید در سرور برای هر تابع و هر شیء بررسی شود، نه فقط هنگام login.\n","permalink":"https://justroham.ir/fa/glossary/authorization/","summary":"تصمیم‌گیری درباره‌ی اینکه فراخواننده‌ی شناخته‌شده چه کاری مجاز است.","title":"Authorization"},{"content":"توکن‌ها هرگز از URL رد نمی‌شوند. راهنمای فعلی آن را همراه PKCE برای همه‌ی کلاینت‌ها توصیه می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/authorization-code-flow/","summary":"جریان OAuth2 که در آن مرورگر فقط یک code کوتاه‌عمر حمل می‌کند و کلاینت آن را در کانال پشتی با توکن عوض می‌کند.","title":"Authorization Code flow"},{"content":"هر خط یک کلید است، با گزینه‌های اختیاری مثل restrict، from= و command=. این فایل تعیین می‌کند چه کسی وارد شود، نه اینکه سرور اصلی است یا نه (نگاه کنید به known_hosts).\n","permalink":"https://justroham.ir/fa/glossary/authorized-keys/","summary":"فایل سمت سرور که کلیدهای عمومی مجاز را فهرست می‌کند، با محدودیت اختیاری برای هر کلید.","title":"authorized_keys"},{"content":"آستانه‌هایش تنظیماتی مثل autovacuum_vacuum_threshold و autovacuum_vacuum_scale_factor هستند؛ قبل از تغییر، مستندات را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/autovacuum/","summary":"پروسه‌ی پس‌زمینه‌ی PostgreSQL که وقتی در جدول به اندازه‌ی کافی تغییر جمع شود، خودکار VACUUM و ANALYZE اجرا می‌کند.","title":"Autovacuum"},{"content":"قاعده‌ی تعادل ارتفاع را حدود 1.44 log2(n+2) محدود می‌کند، پس حتی با ورودی مرتب هر عملیات O(log n) است. بعد از هر درج یا حذف، عدم‌تعادل با rotation اصلاح می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/avl-tree/","summary":"درخت جست‌وجوی دودویی که با rotation اختلاف ارتفاع دو زیردرخت هر node را حداکثر ۱ نگه می‌دارد.","title":"AVL tree"},{"content":"جست‌وجو از page ریشه شروع می‌شود، در هر سطح یک اشاره‌گر را دنبال می‌کند و به page برگی می‌رسد که کلید در آن است. چون درخت پهن و کم‌عمق است، حتی میلیون‌ها ردیف فقط چند page خواندن لازم دارند؛ نزولی شبیه جست‌وجوی دودویی با زمان O(log n).\n","permalink":"https://justroham.ir/fa/glossary/b-tree/","summary":"درخت متوازنی از page‌های هم‌اندازه با کلیدهای مرتب، نوع پیش‌فرض ایندکس در PostgreSQL.","title":"B-tree"},{"content":"یک UPDATE غول‌آسا همه‌ی قفل‌های ردیف را یک‌جا نگه می‌دارد و یک‌باره ردیف مرده می‌سازد. حلقه‌ای که در هر دسته یک بازه‌ی id را به‌روز می‌کند تراکنش‌ها را کوچک نگه می‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/backfill/","summary":"پر کردن ستون جدید برای ردیف‌های موجود، در دسته‌های کوچک تا قفل‌ها و تراکنش‌ها کوتاه بمانند.","title":"Backfill"},{"content":"بلوک حافظه‌ای که slice به آن اشاره می‌کند. چند slice می‌توانند یک backing array را به‌اشتراک بگیرند و نوشتن از یکی از آن‌ها از دیگری دیده می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/backing-array/","summary":"بلوک حافظه‌ای که slice به آن اشاره می‌کند. چند slice می‌توانند یک backing array را به‌اشتراک بگیرند و نوشتن از یکی از آن‌ها از دیگری دیده می‌شود.","title":"Backing array"},{"content":"وقتی stream نمی‌تواند داده را به سرعت ورودی بپذیرد، write() مقدار false برمی‌گرداند. تولیدکننده باید تا رویداد 'drain' صبر کند. نادیده گرفتن این سیگنال باعث می‌شود حافظه با اندازه‌ی صف انباشته بزرگ شود.\n","permalink":"https://justroham.ir/fa/glossary/backpressure/","summary":"سیگنالی از مصرف‌کننده‌ی کند به تولیدکننده‌ی سریع که بایستد تا بافرها بی‌حد بزرگ نشوند.","title":"Backpressure"},{"content":"backtracking یک جست‌وجوی depth-first روی انتخاب‌هاست: انتخاب کن، ادامه بده، انتخاب را برگردان. رها کردن جواب نیمه‌کاره به محض شکستن یک قاعده pruning نام دارد و جست‌وجو را ممکن می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/backtracking/","summary":"ساختن جواب گام‌به‌گام و برگرداندن گام وقتی به جواب نمی‌رسد.","title":"Backtracking"},{"content":"خروجی شبیه $2a$10$... است: نسخه، cost (توانی از ۲ برای تعداد دور) و salt و هش در یک رشته.\n","permalink":"https://justroham.ir/fa/glossary/bcrypt/","summary":"تابع هش پسورد با پارامتر cost و salt داخلی؛ فقط ۷۲ بایت اول پسورد را به‌کار می‌برد.","title":"bcrypt"},{"content":"چون داشتنش کافی است، فقط روی TLS بفرستید، از URL و لاگ دورش نگه دارید و عمرش را کوتاه نگه دارید.\n","permalink":"https://justroham.ir/fa/glossary/bearer-token/","summary":"توکنی که به هر کس که آن را دارد دسترسی می‌دهد و به شکل \u003ccode\u003eAuthorization: Bearer \u0026lt;token\u0026gt;\u003c/code\u003e فرستاده می‌شود.","title":"Bearer token"},{"content":"کوتاه‌ترین مسیر با اجازه‌ی وزن منفی، با relax کردن همه‌ی یال‌ها تا V بار، با هزینه O(V·E).\nاگر دور V‌ام هم فاصله‌ای را بهتر کند، یک دور منفی از مبدأ در دسترس است.\n","permalink":"https://justroham.ir/fa/glossary/bellman-ford/","summary":"کوتاه‌ترین مسیر با اجازه‌ی وزن منفی، با relax کردن همه‌ی یال‌ها تا V بار، با هزینه O(V·E).","title":"Bellman-Ford"},{"content":"Big-O رشد را توصیف می‌کند، نه سرعت را: O(n) یعنی برای nهای بزرگ هزینه حداکثر متناسب با n رشد می‌کند. ضریب‌های ثابت و جمله‌های کوچک‌تر حذف می‌شوند، برای همین دو الگوریتم O(n) می‌توانند در زمان واقعی خیلی با هم فرق داشته باشند. نگاه کنید به جست‌وجوی دودویی (O(log n)) و تحلیل سرشکن‌شده.\n","permalink":"https://justroham.ir/fa/glossary/big-o/","summary":"یک کران بالا برای رشد هزینه‌ی الگوریتم با بزرگ‌شدن ورودی n، بدون در نظر گرفتن ضریب‌های ثابت و جمله‌های کوچک‌تر.","title":"Big-O"},{"content":"در min-heap که در slice ذخیره شده، فرزندان اندیس i برابر 2i+1 و 2i+2 هستند و والد برابر (i-1)/2 است. Push در انتها اضافه می‌کند و بالا می‌برد (sift up)؛ Pop آخرین عنصر را به ریشه می‌آورد و پایین می‌برد (sift down). هر دو O(log n) هستند و Peek برابر O(1) است. فرزندان هم‌سطح مرتب نیستند، پس heap لیست مرتب نیست.\n","permalink":"https://justroham.ir/fa/glossary/binary-heap/","summary":"یک درخت دودویی کامل که در slice ذخیره می‌شود و هر والد از فرزندانش بزرگ‌تر نیست؛ کمینه همیشه در اندیس ۰ است.","title":"Binary heap"},{"content":"عنصر وسط را نگاه کنید، تصمیم بگیرید جواب در کدام نیمه می‌تواند باشد و تکرار کنید. ۱۰۰۰ آیتم حداکثر حدود ۱۰ قدم لازم دارد. git bisect همین را روی تاریخچه‌ی commitها اجرا می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/binary-search/","summary":"جست‌وجویی که در هر قدم نیمی از بازه را کنار می‌گذارد، در زمان O(log n).","title":"Binary search"},{"content":"جست‌وجو، درج و حذف یک مسیر از ریشه را می‌روند و هزینه‌شان O(ارتفاع) است. بدون متعادل‌سازی ارتفاع می‌تواند تا n بزرگ شود. درخت AVL را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/binary-search-tree/","summary":"درختی که در آن هر node در زیردرخت چپش کلید کوچک‌تر و در زیردرخت راستش کلید بزرگ‌تر دارد.","title":"Binary search tree"},{"content":"گرافی که vertexهایش را می‌شود به دو گروه تقسیم کرد به طوری که هر یال دو گروه متفاوت را وصل کند. معادل نداشتن دور با طول فرد است.\n","permalink":"https://justroham.ir/fa/glossary/bipartite-graph/","summary":"گرافی که vertexهایش را می‌شود به دو گروه تقسیم کرد به طوری که هر یال دو گروه متفاوت را وصل کند. معادل نداشتن دور با طول فرد است.","title":"Bipartite graph"},{"content":"با چند ایندکس، bitmapها را می‌شود با BitmapAnd یا BitmapOr ترکیب کرد.\n","permalink":"https://justroham.ir/fa/glossary/bitmap-scan/","summary":"planی که مکان ردیف‌های منطبق را از یک یا چند ایندکس در یک bitmap جمع می‌کند و بعد صفحه‌های جدول را به ترتیب می‌خواند.","title":"Bitmap scan"},{"content":"blast radius بخشی از سیستم یا ترافیک است که وقتی تغییری خراب شود آسیب می‌بیند. canary، cell و feature flag بیشتر برای کوچک کردن آن وجود دارند. می‌شود آن را تعداد درخواست‌هایی که نسخه‌ی بد جواب داده اندازه گرفت.\n","permalink":"https://justroham.ir/fa/glossary/blast-radius/","summary":"اینکه یک تغییر بد به چند کاربر یا درخواست آسیب می‌زند.","title":"Blast radius"},{"content":"blob با hash محتوایش آدرس‌دهی می‌شود. دو فایل با محتوای یکسان یک blob مشترک دارند؛ نام و mode در شیءهای tree و در index نگه‌داری می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/blob/","summary":"شیء گیت که محتوای یک فایل را بدون نام نگه می‌دارد.","title":"Blob"},{"content":"Bloom filter برای هر کلید درج‌شده k بیت را روشن می‌کند و در جست‌وجو همان k بیت را می‌خواند. اگر یکی صفر باشد کلید حتماً اضافه نشده؛ اگر همه یک باشند ممکن است مثبت اشتباه باشد. حافظه‌ی خیلی کمتری از set می‌خواهد ولی حذف ندارد (نوع counting دارد). نگاه کنید به جدول هش.\n","permalink":"https://justroham.ir/fa/glossary/bloom-filter/","summary":"ساختاری با آرایه‌ی بیت که یا می‌گوید «حتماً نیست» یا «شاید هست»؛ منفی‌ی اشتباه ندارد.","title":"Bloom filter"},{"content":"\u0026amp;T یک reference اشتراکی و \u0026amp;mut T یک reference انحصاری است. در هر لحظه یا چند \u0026amp;T دارید یا دقیقاً یک \u0026amp;mut T، هرگز هر دو. borrow checker این را در زمان کامپایل اعمال می‌کند و جلوی data race و باطل شدن iterator را می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/borrowing/","summary":"استفاده از یک مقدار از راه reference بدون گرفتن مالکیت آن.","title":"Borrowing"},{"content":"«Customer» ممکن است در Sales دارنده‌ی اعتبار باشد و در Shipping گیرنده‌ی بسته. هر context نوع خودش را دارد و با ترجمه با هم حرف می‌زنند.\n","permalink":"https://justroham.ir/fa/glossary/bounded-context/","summary":"مرزی که درونش یک مدل و یک زبان به‌طور یکدست اعمال می‌شود.","title":"Bounded context"},{"content":"branch فقط یک فایل زیر .git/refs/heads/ است که شناسه‌ی ۴۰ کاراکتری یک commit را نگه می‌دارد. با هر commit روی branch فعلی، این فایل به commit جدید اشاره می‌کند. ساختن یک branch فقط ۴۱ بایت هزینه دارد.\n","permalink":"https://justroham.ir/fa/glossary/git-branch/","summary":"اشاره‌گری قابل جابه‌جایی: فایلی که شناسه‌ی یک commit را نگه می‌دارد.","title":"Branch"},{"content":"در branch by abstraction جلوی پیاده‌سازی قدیمی یک interface می‌گذارید، پیاده‌سازی تازه را کنارش اضافه می‌کنید و بینشان سوییچ می‌کنید (اغلب با feature flag). بازنویسی در گام‌های کوچک به شاخه‌ی اصلی می‌رسد، نه روی شاخه‌ای بلندمدت.\n","permalink":"https://justroham.ir/fa/glossary/branch-by-abstraction/","summary":"جایگزینی تدریجی کد با پنهان کردن قدیم و جدید پشت یک interface.","title":"Branch by abstraction"},{"content":"قاعده‌های رایج: بدون push مستقیم، تأیید اجباری، گذشتن اجباری CI، بدون force-push. گزینه‌های دقیق به پلتفرم و پلن بستگی دارد.\n","permalink":"https://justroham.ir/fa/glossary/branch-protection/","summary":"قاعده‌های پلتفرم میزبان که تعیین می‌کنند یک branch مثل main چطور تغییر کند.","title":"Branch protection"},{"content":"پیمایش درخت یا گراف سطح‌به‌سطح و از نزدیک‌ترین گره‌ها با استفاده از queue. کوتاه‌ترین مسیر را در گراف بدون وزن پیدا می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/bfs/","summary":"پیمایش درخت یا گراف سطح‌به‌سطح و از نزدیک‌ترین گره‌ها با استفاده از queue. کوتاه‌ترین مسیر را در گراف بدون وزن پیدا می‌کند.","title":"Breadth-first search"},{"content":"مثال: حذف یک فیلد، اجباری کردن فیلد اختیاری درخواست، تغییر نوع. افزودن فیلد اختیاری به پاسخ معمولاً امن است.\n","permalink":"https://justroham.ir/fa/glossary/breaking-change/","summary":"تغییری در API که باعث می‌شود یک client که درست نوشته شده کار نکند.","title":"Breaking change"},{"content":"از کتاب The Mythical Man-Month نوشته‌ی Fred Brooks. تازه‌واردها زمان آشنایی می‌خواهند و کانال‌های ارتباطی با n(n-1)/2 رشد می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/brooks-law/","summary":"افزودن آدم به پروژه‌ی نرم‌افزاری دیرکرده معمولاً آن را دیرتر می‌کند.","title":"Brooks's law"},{"content":"در C آرایه‌ی char buf[8] بررسی طول ندارد: memset(buf, 'A', 10) بی‌اعتراض دو بایت بعد از انتها می‌نویسد. روی stack اسمش stack-buffer-overflow است. راه‌حل: اندازه‌ی واقعی را پاس بدهید، از نوع‌های bounds-checked استفاده کنید و تست‌ها را با AddressSanitizer اجرا کنید.\n","permalink":"https://justroham.ir/fa/glossary/buffer-overflow/","summary":"نوشتن (یا خواندن) بعد از انتهای یک بافر با اندازه‌ی ثابت که حافظه‌ی همسایه را خراب می‌کند.","title":"Buffer overflow"},{"content":"خط //go:build linux بالای یک فایل Go باعث می‌شود آن فایل فقط روی Linux کامپایل شود. با //go:build !linux فایل مکمل را می‌نویسید. اسم فایل مثل x_linux.go هم همین اثر را دارد.\n","permalink":"https://justroham.ir/fa/glossary/build-tag/","summary":"خط \u003ccode\u003e//go:build\u003c/code\u003e بالای فایل Go که تعیین می‌کند فایل برای کدام سیستم‌عامل یا شرایط کامپایل شود.","title":"Build tag"},{"content":"مسیرها، زمان و وضعیت VCS می‌توانند وارد باینری شوند و این ویژگی را بشکنند. برای فهمیدن، hash دو build را مقایسه کنید.\n","permalink":"https://justroham.ir/fa/glossary/reproducible-build/","summary":"ساخت دوباره‌ی همان سورس خروجی دقیقاً یکسان (بایت به بایت) می‌دهد، پس checksum می‌تواند ثابت کند چه چیزی ساخته شده.","title":"build تکرارپذیر"},{"content":"نامش از محفظه‌های کشتی می‌آید. در کد معمولاً یک worker pool یا semaphore جدا برای هر وابستگی است تا خرابی یک بخش فقط محفظه‌ی خودش را پر کند.\n","permalink":"https://justroham.ir/fa/glossary/bulkhead/","summary":"سقف منبع جداگانه برای هر وابستگی تا یک وابستگی کند نتواند همه‌چیز را مصرف کند.","title":"Bulkhead"},{"content":"burn rate برابر ۱۴٫۴ بودجه‌ی ۳۰ روزه را در حدود ۵۰ ساعت تمام می‌کند. هشدار با دو پنجره‌ی هم‌زمان روی حادثه‌ی واقعی سریع page می‌دهد و blipهای کوتاه را نادیده می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/burn-rate/","summary":"نرخ خطای مشاهده‌شده تقسیم بر نرخ خطای مجاز SLO؛ مقدار ۱ دقیقاً کل بودجه را مصرف می‌کند.","title":"Burn rate"},{"content":"BOM چند بایت در ابتدای فایل است. UTF-8 به آن نیاز ندارد، ولی Excel برای تشخیص encoding آن را می‌نویسد یا انتظار دارد. اگر چنین فایلی را با utf-8 ساده بخوانید، BOM به شکل کاراکتر \\ufeff به اول نام ستون اول می‌چسبد؛ utf-8-sig آن را حذف می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/byte-order-mark/","summary":"چند بایت نامرئی در ابتدای فایل متنی؛ در UTF-8 همان EF BB BF است و فایل را UTF-8 معرفی می‌کند.","title":"Byte order mark"},{"content":"داده‌ای که با هم استفاده می‌شود و در حافظه کنار هم است ارزان‌تر خوانده می‌شود، چون CPU حافظه را در بلوک‌های کوچک (cache line) می‌آورد و معمولاً دسترسی ترتیبی را پیش‌واکشی می‌کند. آرایه locality خوب دارد؛ ساختارهایی که اشاره‌گر دنبال می‌کنند مثل لیست پیوندی ممکن است بد باشند.\n","permalink":"https://justroham.ir/fa/glossary/cache-locality/","summary":"داده‌ای که با هم استفاده می‌شود و در حافظه کنار هم است ارزان‌تر خوانده می‌شود، چون CPU حافظه را در بلوک‌های کوچک (cache line) می‌آورد و دسترسی ترتیبی را پیش‌واکشی می‌کند.","title":"Cache locality"},{"content":"در انتشار canary نسخه یا مسیر تازه به درصد کمی از کاربران سرویس می‌دهد و شما خطاها و معیارها را می‌بینید. اگر سالم بود سهمش بزرگ می‌شود و اگر نه متوقف می‌کنید و برمی‌گردید. درصدی کردن با feature flag یکی از راه‌های آن است.\n","permalink":"https://justroham.ir/fa/glossary/canary-release/","summary":"نشان دادن تغییر به بخش کوچکی از ترافیک، پیش از بقیه.","title":"Canary release"},{"content":"گیلبرت و لینچ آن را صوری کردند. درباره‌ی latency یا زمانی که partition نیست چیزی نمی‌گوید؛ PACELC و linearizability را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/cap-theorem/","summary":"هنگام network partition سیستم باید یا linearizability را رها کند یا availability را، برای عملیاتی که نمی‌تواند کامل کند.","title":"CAP theorem"},{"content":"ترکیبی است از مدل برآورد سرانگشتی (ترافیک، ذخیره‌سازی، حافظه، سرور)، اندازه‌گیری سیستم واقعی، load test و headroom مثل N+1.\n","permalink":"https://justroham.ir/fa/glossary/capacity-planning/","summary":"برآورد و بررسی میزان سخت‌افزار لازم برای بار پیش‌بینی‌شده، و تکرار آن با رشد بار.","title":"Capacity planning"},{"content":"زنجیره‌ی معمول: وابستگی کند می‌شود، درخواست‌ها منتظرش جمع می‌شوند، thread یا حافظه تمام می‌شود و سرویس برای همه کند می‌شود. timeout، circuit breaker، bulkhead و load shedding ترمزهای استاندارد هستند.\n","permalink":"https://justroham.ir/fa/glossary/cascading-failure/","summary":"خرابی‌ای که پخش می‌شود: یک جزء کند یا خراب callerهایش را فرسوده می‌کند و آن‌ها callerهای خودشان را.","title":"Cascading failure"},{"content":"پاسخ روی هر node بعد از پرسشی دیده می‌شود که به آن جواب می‌دهد. writeهای هم‌زمان و نامرتبط ممکن است روی nodeهای مختلف با ترتیب متفاوت دیده شوند.\n","permalink":"https://justroham.ir/fa/glossary/causal-consistency/","summary":"اگر یک عملیات می‌توانسته روی دیگری اثر بگذارد، همه آن‌ها را به همان ترتیب می‌بینند؛ عملیات نامرتبط ممکن است فرق کند.","title":"Causal consistency"},{"content":"CA امضاکننده‌ی گواهی‌هاست. کلاینت وقتی به یک گواهی اعتماد می‌کند که زنجیره‌ی امضاها به CA‌ای در trust store اش (یا فایل -CAfile) برسد. CA خصوصی برای دمو یا شبکه‌ی داخلی همین‌طور کار می‌کند، فقط ماشین‌های شما به آن اعتماد دارند.\n","permalink":"https://justroham.ir/fa/glossary/certificate-authority/","summary":"CA: مرجعی که کلاینت به امضایش روی گواهی‌ها اعتماد می‌کند.","title":"Certificate authority (CA)"},{"content":"گواهی سرور معمولاً با یک CA میانی (intermediate) امضا می‌شود و آن CA را rootای امضا کرده که کلاینت به آن اعتماد دارد. سرور باید leaf و intermediateها را بفرستد؛ root از trust store کلاینت می‌آید. نبودن intermediate باعث شکست اعتبارسنجی می‌شود.\nنگاه کنید به certificate authority.\n","permalink":"https://justroham.ir/fa/glossary/certificate-chain/","summary":"فهرست leaf، intermediate و root که گواهی سرور را به یک root مورد اعتماد وصل می‌کند.","title":"Certificate chain"},{"content":"کلاینت hash‌ی SHA-256 کلید عمومی سرور (SPKI) را نگه می‌دارد و هر کلید دیگری را رد می‌کند، حتی اگر CA مورد اعتماد امضایش کرده باشد. اثر یک گواهی اشتباه را محدود می‌کند، اما چرخش کلید را سخت‌تر می‌کند؛ پس با دقت و با یک pin پشتیبان استفاده کنید.\n","permalink":"https://justroham.ir/fa/glossary/certificate-pinning/","summary":"فقط سروری را قبول می‌کنیم که گواهی یا کلید عمومی‌اش با یک hash از قبل شناخته‌شده بخواند.","title":"Certificate pinning"},{"content":"هر cgroup یک پوشه در یک درخت است که در نسخه‌ی ۲ معمولاً زیر /sys/fs/cgroup قرار دارد. با نوشتن PID در cgroup.procs پروسه را داخلش می‌گذارید و فایل‌هایی مثل memory.max و pids.max سقف تعیین می‌کنند؛ این‌ها طبق مستندات کرنل است.\n","permalink":"https://justroham.ir/fa/glossary/cgroup/","summary":"گروه‌بندی پروسه‌ها در کرنل Linux برای محدود کردن و شمارش مصرف CPU، حافظه و تعداد پروسه.","title":"cgroup"},{"content":"channel با make(chan T) ساخته می‌شود. channel بدون بافر فرستنده را تا آماده شدن گیرنده بلاک می‌کند؛ channel بافردار (make(chan T, n)) فقط وقتی پر شود بلاک می‌کند. بستن channel یعنی دیگر مقداری فرستاده نمی‌شود و for v := range ch با بسته شدن آن تمام می‌شود.\nch := make(chan int, 1) ch \u0026lt;- 42 fmt.Println(\u0026lt;-ch) ","permalink":"https://justroham.ir/fa/glossary/channel/","summary":"مجرایی با نوع مشخص که goroutineها برای ارسال و دریافت امن مقدار از آن استفاده می‌کنند.","title":"Channel"},{"content":"رشته‌ای از آزمایش‌های کوچک و کنترل‌شده: یک steady state قابل اندازه‌گیری تعریف کن، فرض کن در برابر خرابی می‌ماند، خرابی را تزریق کن و مقایسه کن. «Principles of Chaos Engineering» همین چرخه را شرح می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/chaos-engineering/","summary":"آزمایش روی یک سیستم با تزریق خرابی، برای اطمینان از اینکه در برابر آن‌ها تاب می‌آورد.","title":"Chaos engineering"},{"content":"تست characterization (یا golden-master و snapshot) کد را روی ورودی‌های زیاد اجرا می‌کند، خروجی‌ها را در فایل ذخیره می‌کند و اگر بعداً خروجی‌ای فرق کند شکست می‌خورد. ادعا نمی‌کند رفتار درست است، فقط می‌گوید عوض نشده است.\n","permalink":"https://justroham.ir/fa/glossary/characterization-test/","summary":"تستی که رفتار فعلی کد را با همه‌ی باگ‌هایش ثبت می‌کند تا بتوان با اطمینان آن را تغییر داد.","title":"Characterization test"},{"content":"دستوری که آن را نقض کند با خطا رد می‌شود و داخل یک تراکنش همین خطا کل تراکنش را abort می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/check-constraint/","summary":"قاعده‌ای روی جدول، مثل balance_cents \u0026gt;= 0، که هر ردیفِ نوشته‌شده باید رعایت کند.","title":"CHECK constraint"},{"content":"چک‌سام header در IPv4 مکمل یک مجموع مکمل‌یک کلمه‌های ۱۶ بیتی header است. اگر مجموع را روی کل header با خود چک‌سام دوباره حساب کنیم و سالم باشد، 0xFFFF می‌شود. این فقط خطای تصادفی را پیدا می‌کند، نه مهاجم را.\n","permalink":"https://justroham.ir/fa/glossary/checksum/","summary":"عددی کوچک که از روی داده محاسبه می‌شود تا خراب‌شدن تصادفی را تشخیص دهد.","title":"Checksum"},{"content":"اولین بار که ماژولی اضافه می‌کنید، Go hash آن را با این پایگاه مقایسه و در go.sum ثبت می‌کند. دانلودهای بعدی باید با go.sum بخوانند.\n","permalink":"https://justroham.ir/fa/glossary/checksum-database/","summary":"یک لاگ عمومی و فقط‌افزودنی از hash ماژول‌ها (Go از sum.golang.org استفاده می‌کند) که تغییر ماژول بین کاربران را تشخیص می‌دهد.","title":"checksum database"},{"content":"git cherry-pick -x \u0026lt;hash\u0026gt; hash اصلی را در پیام ثبت می‌کند. کپی همان patch-id را دارد ولی hash متفاوت. ببینید git revert.\n","permalink":"https://justroham.ir/fa/glossary/cherry-pick/","summary":"patch یک commit را به‌صورت commit جدید با hash جدید روی branch فعلی کپی می‌کند.","title":"cherry-pick"},{"content":"جریان فقط به صورت مجموع subscribeها وجود دارد؛ coupling کم ولی خواندنش سخت است. نقطه‌ی مقابل orchestration است.\n","permalink":"https://justroham.ir/fa/glossary/choreography/","summary":"سرویس‌ها به رویدادهای هم واکنش نشان می‌دهند و هیچ هماهنگ‌کننده‌ی مرکزی جریان را تعیین نمی‌کند.","title":"Choreography"},{"content":"با Transfer-Encoding: chunked هر تکه یک اندازه‌ی hex، CRLF، داده و CRLF است. تکه‌ای با اندازه‌ی ۰ پایان body را نشان می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/chunked-encoding/","summary":"روشی در HTTP/1.1 برای فرستادن body تکه‌تکه بدون دانستن طول کل.","title":"Chunked encoding"},{"content":"برخلاف hookهای محلی، CI جایی اجرا می‌شود که نویسنده نمی‌تواند آن را رد کند؛ پس قاعده‌هایی که واقعاً به آن‌ها تکیه دارید باید آنجا اعمال شوند.\n","permalink":"https://justroham.ir/fa/glossary/ci/","summary":"ادغام پیوسته: سرور روی هر push یا pull request بررسی‌ها (build، تست، lint) را اجرا می‌کند.","title":"CI"},{"content":"CIDR یعنی نوشتن شبکه به‌صورت آدرس به‌علاوه‌ی تعداد بیت‌های ابتدایی که شبکه را مشخص می‌کنند، مثل 192.0.2.0/24. این روش جای کلاس‌های ثابت آدرس را گرفت و prefix با هر طولی را می‌شود تقسیم یا ادغام کرد.\n","permalink":"https://justroham.ir/fa/glossary/cidr/","summary":"CIDR نوشتن شبکه به شکل آدرس/طول prefix است، مثل 192.0.2.0/24.","title":"CIDR"},{"content":"یک state machine کوچک است: closed (درخواست‌ها رد می‌شوند و می‌رسند)، open (درخواست‌ها فوراً رد می‌شوند) و half-open (چند درخواست آزمایشی تصمیم می‌گیرند دوباره بسته شود یا نه). منابع caller را حفظ می‌کند و به وابستگی فرصت بهبود می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/circuit-breaker/","summary":"wrapper‌ای که چند وقت صدا زدن وابستگی خراب را متوقف می‌کند و به‌جایش سریع شکست می‌دهد.","title":"Circuit breaker"},{"content":"حتی با همگام‌سازی زمان، ساعت ماشین‌ها کمی و گاهی خیلی با هم فرق دارد. هر قاعده‌ای که رویدادها را با مقایسه‌ی timestamp ماشین‌های مختلف مرتب کند، این خطا را به ارث می‌برد.\n","permalink":"https://justroham.ir/fa/glossary/clock-skew/","summary":"اختلاف ساعت دو ماشین در یک لحظه‌ی واقعی.","title":"Clock skew"},{"content":"تابعی که متغیرهای محدوده‌ای را که در آن تعریف شده با خود نگه می‌دارد، حتی بعد از پایان آن محدوده.\n","permalink":"https://justroham.ir/fa/glossary/closure/","summary":"تابعی که به متغیرهای محدوده‌ی بیرونی خودش دسترسی دارد","title":"Closure"},{"content":"churn شمارش تغییرهاست، مثلاً تعداد commitهایی که به هر فایل دست زده‌اند. فایلی که هم زیاد عوض می‌شود و هم پیچیده است یک hotspot است. churn به‌تنهایی فقط می‌گوید آدم‌ها کجا کار می‌کنند، نه اینکه کد بد است.\n","permalink":"https://justroham.ir/fa/glossary/code-churn/","summary":"تعداد دفعات تغییر یک فایل یا تابع در طول زمان؛ نشانه‌ی ارزان از جایی که کار و باگ جمع می‌شود.","title":"Code churn"},{"content":"نشان می‌دهد کدام بخش‌ها حین تست اجرا شدند. پوشش بالا یعنی کد اجرا شده، نه اینکه درست assert شده است.\n","permalink":"https://justroham.ir/fa/glossary/code-coverage/","summary":"درصدی از خط‌ها، شاخه‌ها و توابع که هنگام اجرای تست‌ها اجرا شدند.","title":"Code coverage"},{"content":"reviewer diff را می‌خواند، سؤال می‌پرسد و تغییر پیشنهاد می‌دهد؛ نویسنده جواب می‌دهد و تغییر را به‌روز می‌کند. مشکل‌های طراحی و خوانایی را پیدا می‌کند که ابزارها نمی‌بینند و وقتی بهتر کار می‌کند که بررسی‌های مکانیکی (تحلیل ایستا، تست، قالب‌بندی) پیش‌تر گذشته باشند.\n","permalink":"https://justroham.ir/fa/glossary/code-review/","summary":"خوانده شدن یک تغییر توسط فرد دیگر پیش از merge، برای پیدا کردن مشکل و انتقال دانش.","title":"Code review"},{"content":"در پلتفرم‌هایی که پشتیبانی می‌کنند (GitHub و GitLab) تغییری که به مسیر فهرست‌شده دست بزند خودکار از صاحبان آن review می‌خواهد. همراه با branch protection می‌شود review را اجباری کرد.\n","permalink":"https://justroham.ir/fa/glossary/codeowners/","summary":"فایلی در repository که مسیرها را به افراد یا تیم‌هایی نگاشت می‌کند که باید تغییرهای آن مسیر را review کنند.","title":"CODEOWNERS"},{"content":"وقتی پیش می‌آید که برنامه یک رشته بسازد و به sh -c بدهد. راه‌حل اجرای مستقیم برنامه با لیست آرگومان و بدون shell است تا ورودی فقط یک آرگومان بماند.\n","permalink":"https://justroham.ir/fa/glossary/command-injection/","summary":"باگی که در آن ورودی کاربر بخشی از خط فرمان shell می‌شود و آنچه اجرا می‌شود را عوض می‌کند.","title":"Command injection"},{"content":"چون commit هش parentهایش را در خودش دارد، تغییر یک commit قدیمی هش همه‌ی commitهای بعدی را عوض می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/commit/","summary":"object گیت که یک tree را به parentها، author، committer و پیام وصل می‌کند.","title":"commit"},{"content":"سیستم ماژول اصلی Node.js: require() فایل را همگام بارگذاری می‌کند و module.exports همان چیزی است که برمی‌گرداند. هر ماژول CommonJS فقط یک بار اجرا می‌شود و در require.cache ذخیره می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/commonjs/","summary":"سیستم ماژول اصلی Node.js: \u003ccode\u003erequire()\u003c/code\u003e فایل را همگام بارگذاری می‌کند و \u003ccode\u003emodule.exports\u003c/code\u003e همان چیزی است که برمی‌گرداند.","title":"CommonJS"},{"content":"این کار rollback نیست: قدم اصلی واقعاً انجام شده و در تاریخچه می‌ماند. جبران باید idempotent و قابل تکرار باشد، چون ممکن است دو بار برسد یا شکست بخورد و دوباره اجرا شود.\n","permalink":"https://justroham.ir/fa/glossary/compensating-transaction/","summary":"کاری جدید که اثر یک قدم قبلاً commit‌شده را از نظر معنایی خنثی می‌کند، مثل refund برای یک charge.","title":"Compensating transaction"},{"content":"ترتیب مهم است: (a, b) فیلتر روی a یا روی a و b را خوب جواب می‌دهد، ولی فیلتر فقط روی b را نه. ستون‌های equality را اول و ستون range را آخر بگذارید.\n","permalink":"https://justroham.ir/fa/glossary/composite-index/","summary":"یک ایندکس روی چند ستون که اول بر اساس ستون اول، بعد دوم و \u0026hellip; مرتب است.","title":"Composite index"},{"content":"تنها جایی (معمولاً main) که قطعه‌های واقعی ساخته و به هم وصل می‌شوند. بقیه‌ی کد وابستگی‌هایش را به‌صورت آرگومان می‌گیرد، پس تست‌ها می‌توانند نسخه‌ی ساختگی بدهند. به فریم‌ورک DI نیازی نیست.\n","permalink":"https://justroham.ir/fa/glossary/composition-root/","summary":"تنها جایی (معمولاً \u003ccode\u003emain\u003c/code\u003e) که قطعه‌های واقعی ساخته و به هم وصل می‌شوند.","title":"Composition root"},{"content":"فیلد exports در package.json که مسیرهای import را به فایل نگاشت می‌کند و می‌تواند برای import و require فایل متفاوتی انتخاب کند. مسیری که در exports نیامده باشد از بیرون پکیج قابل import نیست.\n","permalink":"https://justroham.ir/fa/glossary/conditional-exports/","summary":"فیلد \u003ccode\u003eexports\u003c/code\u003e در \u003ccode\u003epackage.json\u003c/code\u003e که مسیرهای import را به فایل نگاشت می‌کند و می‌تواند برای \u003ccode\u003eimport\u003c/code\u003e و \u003ccode\u003erequire\u003c/code\u003e فایل متفاوتی انتخاب کند.","title":"Conditional exports"},{"content":"بزرگ‌ترین گروه از vertexها در گراف بدون جهت که هر کدام به بقیه می‌رسند. BFS یا DFS از یک vertex دقیقاً مؤلفه‌ی آن را پیدا می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/connected-component/","summary":"بزرگ‌ترین گروه از vertexها در گراف بدون جهت که هر کدام به بقیه می‌رسند. BFS یا DFS از یک vertex دقیقاً مؤلفه‌ی آن را پیدا می‌کند.","title":"Connected component"},{"content":"باز کردن اتصال به دیتابیس کند است و سرور تعداد اتصال‌ها را محدود می‌کند. pool چند اتصال باز نگه می‌دارد، برای هر query یا تراکنش یکی را قرض می‌دهد و بعد از release پس می‌گیرد. وقتی همه مشغول باشند، درخواست‌ها منتظر می‌مانند.\n","permalink":"https://justroham.ir/fa/glossary/connection-pool/","summary":"مجموعه‌ای از اتصال‌های باز به دیتابیس که قرض داده و دوباره استفاده می‌شوند.","title":"Connection pool"},{"content":"حالت‌هایی مانند new، established و related را به قوانین می‌دهد و NAT به آن وابسته است.\n","permalink":"https://justroham.ir/fa/glossary/connection-tracking/","summary":"جدول جریان‌ها در کرنل که قوانین فایروال را بر اساس حالت اتصال ممکن می‌کند.","title":"Connection tracking"},{"content":"Raft و Paxos الگوریتم‌های consensus هستند. به زنده بودن اکثریت node‌ها نیاز دارند و برای همین خوشه‌ی 2f+1 تایی f خرابی را تحمل می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/consensus/","summary":"رسیدن گروهی از node‌ها به توافق روی یک مقدار (یا یک log مرتب) با وجود crash برخی node‌ها یا گم شدن پیام‌ها.","title":"Consensus"},{"content":"nodeها (معمولاً با چند نقطه برای هرکدام) روی یک حلقه‌ی hash قرار می‌گیرند و هر کلید به نقطه‌ی بعدی در جهت ساعت می‌رود. برخلاف hash % N، با حذف یک node فقط کلیدهای همان node دوباره نگاشت می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/consistent-hashing/","summary":"نگاشت کلید به node که با حذف یک node فقط کلیدهای همان جابه‌جا می‌شوند.","title":"Consistent hashing"},{"content":"== معمولی ممکن است در اولین بایت متفاوت متوقف شود و از راه زمان اطلاعات نشت کند. در Go از subtle.ConstantTimeCompare استفاده کنید.\n","permalink":"https://justroham.ir/fa/glossary/constant-time-comparison/","summary":"مقایسه‌ی رازها به‌شکلی که زمان اجرا به محل اولین تفاوت وابسته نباشد.","title":"Constant-time comparison"},{"content":"این کار به تیم server نشان می‌دهد کدام تغییر به کدام client آسیب می‌زند. Pact ابزار شناخته‌شده‌ای برای این سبک است؛ اینجا فقط اسمش را می‌آورم.\n","permalink":"https://justroham.ir/fa/glossary/consumer-driven-contract/","summary":"قراردادی که client‌ها می‌نویسند و می‌گویند کدام بخش‌های API را واقعاً استفاده می‌کنند و server آن را راستی‌آزمایی می‌کند.","title":"Consumer-driven contract"},{"content":"در کرنل چیزی به اسم container وجود ندارد. runtime ترکیبی از namespace، cgroup و یک root filesystem می‌سازد و معمولاً از مشخصات OCI runtime پیروی می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/container/","summary":"یک پروسه‌ی معمولی Linux که با namespace و محدودیت cgroup اختصاصی و معمولاً از یک image اجرا می‌شود.","title":"Container"},{"content":"مثلاً script-src 'self' اسکریپت inline را می‌بندد. دامنه‌ی خسارت یک باگ XSS را کم می‌کند، ولی جای escape را نمی‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/content-security-policy/","summary":"هدر پاسخی که به مرورگر می‌گوید صفحه از چه منبع‌هایی اجازه‌ی اسکریپت و محتوای دیگر دارد.","title":"Content Security Policy"},{"content":"context.Context به‌عنوان اولین آرگومان توابعی که ممکن است بلاک شوند یا طول بکشند پاس داده می‌شود. با فراخوانی cancel یا رسیدن به timeout، کانال ctx.Done() بسته می‌شود و هر goroutineای که به آن گوش می‌دهد می‌تواند متوقف شود و منابعش را آزاد کند.\nctx, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() ","permalink":"https://justroham.ir/fa/glossary/context/","summary":"مقداری که لغو، مهلت زمانی و داده‌های مربوط به یک درخواست را بین لایه‌ها منتقل می‌کند.","title":"Context"},{"content":"شیئی که با دستور with استفاده می‌شود و متدهای enter و exit آن آماده‌سازی و پاک‌سازی تضمین‌شده را دور یک بلوک اجرا می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/context-manager/","summary":"شیئی که با دستور with استفاده می‌شود و متدهای \u003cstrong\u003eenter\u003c/strong\u003e و \u003cstrong\u003eexit\u003c/strong\u003e آن آماده‌سازی و پاک‌سازی تضمین‌شده را دور یک بلوک اجرا می‌کنند.","title":"Context manager"},{"content":"تست handler را صدا می‌زند و پاسخ را با schema موجود در spec اعتبارسنجی می‌کند. وقتی کد و spec از هم دور شوند، تست شکست می‌خورد.\n","permalink":"https://justroham.ir/fa/glossary/contract-test/","summary":"تستی که درخواست یا پاسخ واقعی را با قرارداد API می‌سنجد، نه با انتظارهای دستی.","title":"Contract test"},{"content":"حادثه‌ها معمولاً یک علت ندارند. عامل‌های مؤثر مثل نبود validation، نبود alert و کندی وابستگی باید کنار هم قرار بگیرند. فهرست کردنشان به اصلاحات در خود سیستم اشاره می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/contributing-factor/","summary":"یکی از چند شرطی که با هم اجازه‌ی وقوع حادثه را داده‌اند.","title":"Contributing factor"},{"content":"نوع‌هایی مثل feat، fix، docs و chore تاریخچه را قابل‌پیمایش می‌کنند و ابزارها می‌توانند از آن changelog بسازند. مثال: fix(api): handle empty body. این فقط یک قرارداد است و تنها وقتی اعمال می‌شود که hook از نوع commit-msg یا یک بررسی در CI اضافه کنید.\n","permalink":"https://justroham.ir/fa/glossary/conventional-commits/","summary":"قرارداد نوشتن subject کامیت به شکل type(scope): summary.","title":"Conventional Commits"},{"content":"ملوین کانوی در ۱۹۶۸ دید که سازمان‌ها سیستم‌هایی طراحی می‌کنند که ساختار ارتباطی خودشان را کپی می‌کند. سه تیم معمولاً سه ماژول می‌سازند. اگر عمدی به کار رود، یعنی تیم‌ها و مرز سرویس‌ها را با هم شکل بدهید.\n","permalink":"https://justroham.ir/fa/glossary/conways-law/","summary":"طراحی یک سیستم تمایل دارد ساختار ارتباطی سازمان سازنده‌اش را منعکس کند.","title":"Conway's law"},{"content":"برای برنامه‌هایی مناسب است که نمی‌توانند فایل لاگ را دوباره باز کنند، ولی طبق man page خطوطی که بین کپی و خالی‌کردن نوشته شوند ممکن است از دست بروند.\n","permalink":"https://justroham.ir/fa/glossary/copytruncate/","summary":"گزینه‌ای در logrotate که لاگ را کپی می‌کند و فایل اصلی را به‌جای تغییر نام، همان‌جا خالی می‌کند.","title":"copytruncate"},{"content":"تابعی که با async def تعریف می‌شود؛ صدا زدنش یک شیء coroutine برمی‌گرداند که تا await یا تبدیل به task نشود کاری نمی‌کند. coroutine می‌تواند در هر await متوقف شود و event loop کار دیگری اجرا کند، سپس از همان نقطه ادامه دهد. صدا زدن f() فقط شیء را می‌سازد و چیزی اجرا نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/coroutine/","summary":"تابعی که با async def تعریف می‌شود؛ صدا زدنش یک شیء coroutine برمی‌گرداند که تا await یا تبدیل به task نشود کاری نمی‌کند.","title":"Coroutine"},{"content":"SELECT c.id, (SELECT count(*) FROM orders o WHERE o.customer_id = c.id) FROM customers c پرس‌وجوی داخلی را برای هر مشتری اجرا می‌کند. با ایندکس و ردیف کم مشکلی ندارد، وگرنه بسیار پرهزینه است. یک JOIN با GROUP BY معمولاً اجازه می‌دهد planner کار را در یک گذر انجام دهد.\n","permalink":"https://justroham.ir/fa/glossary/correlated-subquery/","summary":"زیرپرس‌وجویی که به ردیف بیرونی ارجاع می‌دهد و برای هر ردیف بیرونی یک بار اجرا می‌شود.","title":"Correlated subquery"},{"content":"مرورگر آن را اعمال می‌کند، نه سرور: درخواست باز هم به سرور می‌رسد. کنترل خواندن است، پس دفاع CSRF نیست.\n","permalink":"https://justroham.ir/fa/glossary/cors/","summary":"مکانیزمی که با هدرها به مرورگر می‌گوید صفحه‌ای از origin دیگر مجاز به خواندن پاسخ هست یا نه.","title":"CORS"},{"content":"fuzzer برنامه را ابزارگذاری می‌کند و ورودی‌ای که شاخه‌ای تازه را اجرا کند «جالب» شمرده و بیشتر جهش داده می‌شود. به این ترتیب جست‌وجو به‌جای حدس کور، به عمق parser می‌رسد.\n","permalink":"https://justroham.ir/fa/glossary/coverage-guided-fuzzing/","summary":"fuzzing هدایت‌شده با پوشش ورودی‌هایی را نگه می‌دارد و جهش می‌دهد که به بخش تازه‌ای از کد برسند.","title":"Coverage-guided fuzzing"},{"content":"در PostgreSQL ستون‌های اضافه را با INCLUDE می‌آورید؛ در ایندکس ذخیره می‌شوند ولی در مرتب‌سازی نقشی ندارند. این کار Index Only Scan را ممکن می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/covering-index/","summary":"ایندکسی که همه‌ی ستون‌های موردنیاز کوئری را دارد و نیازی به خواندن جدول نیست.","title":"Covering index"},{"content":"خواندن از حافظه‌ی اصلی کند است، پس CPU داده‌های اخیر را در کش‌های کوچک نگه می‌دارد و حافظه را در واحدهای cache line بارگذاری می‌کند. پیمایش ترتیبی آرایه با کش سازگار است و پرش‌های تصادفی نیست. Big-O این را نادیده می‌گیرد، زمان واقعی نه.\n","permalink":"https://justroham.ir/fa/glossary/cpu-cache/","summary":"حافظه‌ی کوچک و سریع کنار CPU که داده‌های اخیر را نگه می‌دارد؛ دسترسی ترتیبی خیلی بیشتر از دسترسی تصادفی از آن بهره می‌برد.","title":"CPU cache"},{"content":"Node.js با node --cpu-prof یک فایل JSON با پسوند .cpuprofile می‌نویسد. هر نمونه به یک call stack اشاره می‌کند و شمردن نمونه‌هایی که بالاترین فریمشان یک تابع است، زمان خودِ آن تابع را نشان می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/cpu-profile/","summary":"نمونه‌برداری از اینکه CPU در هر لحظه کدام تابع را اجرا می‌کرد؛ برای پیدا کردن جای رفتن زمان.","title":"CPU profile"},{"content":"کار وابسته به CPU تمام مدت یک هسته را مشغول نگه می‌دارد. روی event loop تک‌رشته‌ای همه‌ی درخواست‌های دیگر را متوقف می‌کند؛ راه‌حل معمول، هسته یا thread بیشتر است.\n","permalink":"https://justroham.ir/fa/glossary/cpu-bound/","summary":"کاری که سرعتش را پردازنده تعیین می‌کند، مثل محاسبه‌ی اعداد اول، نه انتظار برای I/O.","title":"CPU-bound"},{"content":"سمت خواندن معمولاً projection سمت نوشتن است، پس ممکن است عقب بماند و eventual consistent است.\n","permalink":"https://justroham.ir/fa/glossary/cqrs/","summary":"مدلی که نوشتن را انجام می‌دهد از مدلی که خواندن را سرو می‌کند جداست.","title":"CQRS"},{"content":"مثال: مجموعه‌ی فقط‌افزایشی با union، یا G-counter (یک خانه برای هر گره، merge با بیشینه‌ی هر خانه، مقدار برابر جمع).\n","permalink":"https://justroham.ir/fa/glossary/crdt/","summary":"نوع داده‌ی replicate شده‌ی بدون تعارض: replicaها مستقل تغییر می‌کنند و یک تابع merge جابه‌جایی‌پذیر، شرکت‌پذیر و idempotent آن‌ها را همگرا می‌کند.","title":"CRDT"},{"content":"داخل بلوک تراکنش اجرا نمی‌شود. اگر شکست بخورد، ایندکس نیمه‌کاره با indisvalid = false می‌ماند و باید حذف شود.\n","permalink":"https://justroham.ir/fa/glossary/create-index-concurrently/","summary":"ساخت ایندکس بدون بلوکه کردن نوشتن، به قیمت چند گذر بیشتر و احتمال یک ایندکس INVALID در صورت شکست.","title":"CREATE INDEX CONCURRENTLY"},{"content":"در لاگ به شکل ورودهای ناموفق زیاد برای کاربران مختلف از یک نشانی در زمان کوتاه دیده می‌شود. محدودیت نرخ و بررسی گذرواژه‌های لو رفته آن را کم می‌کنند؛ قاعده‌های تشخیص می‌گویند در جریان است.\n","permalink":"https://justroham.ir/fa/glossary/credential-stuffing/","summary":"امتحان جفت‌های نام کاربری و گذرواژه‌ی لو رفته از جای دیگر روی ورود شما، با کاربران زیاد از یک مبدأ.","title":"Credential stuffing"},{"content":"کارهای بیرون از مسیر بحرانی می‌توانند موازی با آن اجرا شوند، ولی هیچ چیز زودتر از زنجیره‌ای که باید پشت‌سرهم بیاید تمام نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/critical-path/","summary":"طولانی‌ترین زنجیره‌ی کارهای وابسته؛ حتی با کارگر نامحدود حداقل زمان را همین تعیین می‌کند.","title":"Critical path"},{"content":"هر خط crontab دقیقه، ساعت، روز ماه، ماه و روز هفته را می‌گیرد و بعد فرمان را. ساده است و همه‌جا هست، اما مدیریت وابستگی ندارد و اجرای از دست‌رفته‌ی زمان خاموشی را جبران نمی‌کند.\n","permalink":"https://justroham.ir/fa/glossary/cron/","summary":"زمان‌بند کلاسیک Unix که فرمان‌ها را در زمان‌های نوشته‌شده در جدول پنج‌ستونی اجرا می‌کند.","title":"cron"},{"content":"رویدادها می‌مانند ولی فیلدهای شخصی ناخواناند. در مقاله فقط توصیفش کرده‌ام و پیاده‌سازی نکرده‌ام.\n","permalink":"https://justroham.ir/fa/glossary/crypto-shredding/","summary":"حذف داده از یک log تغییرناپذیر با رمز کردن فیلدهای شخصی با کلید مخصوص هر فرد و از بین بردن کلید.","title":"Crypto-shredding"},{"content":"چون مرورگر کوکی را خودکار می‌فرستد ممکن است. دفاع: کوکی SameSite و توکنی مخصوص هر نشست که باید در header یا فیلد فرم بیاید.\n","permalink":"https://justroham.ir/fa/glossary/csrf/","summary":"جعل درخواست بین‌سایتی: سایت دیگری مرورگر را وادار می‌کند درخواستی با کوکی شما بفرستد که نخواسته‌اید.","title":"CSRF"},{"content":"Common Table Expression (یعنی WITH name AS (\u0026hellip;)) اجازه می‌دهد query را در گام‌های خوانا بنویسید. بیشتر برای وضوح است و نتیجه را عوض نمی‌کند.\n","permalink":"https://justroham.ir/fa/glossary/cte/","summary":"یک subquery نام‌دار که با WITH تعریف می‌شود و در query اصلی استفاده می‌شود.","title":"CTE"},{"content":"هر مورد شکل CVE-سال-شماره دارد و به توضیح، نسخه‌های آسیب‌دیده و منابع لینک می‌دهد. شدت معمولاً با CVSS از ۰ تا ۱۰ نمره‌دهی می‌شود و ۹٫۰ به بالا critical است. CVE فقط می‌گوید ضعفی وجود دارد، نه اینکه شما واقعاً آسیب‌پذیرید؛ نسخه و پیکربندی خودتان را بررسی کنید.\n","permalink":"https://justroham.ir/fa/glossary/cve/","summary":"Common Vulnerabilities and Exposures: شناسه‌ی عمومی برای یک آسیب‌پذیری امنیتیِ شناخته‌شده.","title":"CVE"},{"content":"ابزارهایی مثل gocyclo یک را با هر if، for، case غیر default و عملگرهای \u0026amp;\u0026amp; و || جمع می‌زنند. عدد بالا یعنی مسیرهای زیاد برای تست و فهمیدن. نشانه‌ای برای پیدا کردن جای مشکل است، نه نمره‌ی کیفیت.\n","permalink":"https://justroham.ir/fa/glossary/cyclomatic-complexity/","summary":"شمارش مسیرهای تصمیم مستقل در یک تابع.","title":"Cyclomatic complexity"},{"content":"در Python، Thread(daemon=True) هنگام خروج interpreter ناگهان متوقف می‌شود و finally و cleanup آن ممکن است هرگز اجرا نشود. برای توقف مؤدبانه از Event استفاده کنید.\n","permalink":"https://justroham.ir/fa/glossary/daemon-thread/","summary":"threadی که برنامه را زنده نگه نمی‌دارد: وقتی فقط thread‌های daemon مانده باشند process تمام می‌شود.","title":"Daemon thread"},{"content":"branchها گراف را دو شاخه می‌کنند و commitهای merge دوباره به هم وصلشان می‌کنند، اما دنبال کردن parentها هرگز به عقب برنمی‌گردد.\n","permalink":"https://justroham.ir/fa/glossary/dag/","summary":"گراف جهت‌دار بدون دور: شکل تاریخچه‌ی گیت که commitها به parentهایشان اشاره می‌کنند.","title":"DAG"},{"content":"ایندکس مقدارهای یک یا چند ستون را همراه اشاره‌گر به ردیف‌های جدول نگه می‌دارد. خواندنی که با آن جور باشد سریع‌تر می‌شود، ولی هر insert، update و delete باید ایندکس را هم به‌روز کند. رایج‌ترین نوع آن B-tree است.\n","permalink":"https://justroham.ir/fa/glossary/database-index/","summary":"ساختار مرتب و جداگانه‌ای که دیتابیس را بدون خواندن کل جدول به ردیف‌ها می‌رساند.","title":"Database index"},{"content":"کلاسی با دکوراتور @dataclass: Python از فیلدهای annotate شده init، repr و eq را می‌سازد، با گزینه‌هایی مثل frozen، order و slots.\n","permalink":"https://justroham.ir/fa/glossary/dataclass/","summary":"کلاسی با دکوراتور @dataclass: Python از فیلدهای annotate شده \u003cstrong\u003einit\u003c/strong\u003e، \u003cstrong\u003erepr\u003c/strong\u003e و \u003cstrong\u003eeq\u003c/strong\u003e را می‌سازد، با گزینه‌هایی مثل frozen، order و slots.","title":"Dataclass"},{"content":"داده‌گرام بسته‌ای مستقل است که بدون اتصال فرستاده می‌شود؛ یا کامل می‌رسد یا اصلاً نمی‌رسد. UDP به ازای هر فراخوانی ارسال یک datagram می‌فرستد و گیرنده آن را با همان مرزها می‌گیرد. جریان TCP برعکس مرزی ندارد.\n","permalink":"https://justroham.ir/fa/glossary/datagram/","summary":"داده‌گرام بسته‌ای مستقل است که بدون اتصال فرستاده می‌شود؛ یا کامل می‌رسد یا اصلاً نمی‌رسد.","title":"Datagram"},{"content":"کار زمان‌بندی‌شده بعد از هر اجرای موفق به یک مانیتور ping می‌زند و اگر در بازه‌ی انتظار ping نرسد، مانیتور هشدار می‌دهد. این روش کارهایی را که بی‌صدا هرگز شروع نشده‌اند پیدا می‌کند، کاری که هشدار مبتنی بر لاگ نمی‌تواند.\n","permalink":"https://justroham.ir/fa/glossary/dead-mans-switch/","summary":"هشداری که وقتی سیگنال مورد انتظار نمی‌رسد فعال می‌شود.","title":"Dead man's switch"},{"content":"update و delete نسخه‌ی مرده تولید می‌کنند. تا وقتی یک تراکنش قدیمی هنوز بتواند نسخه‌ای را ببیند، آن نسخه «مرده ولی هنوز قابل حذف نیست».\n","permalink":"https://justroham.ir/fa/glossary/dead-tuple/","summary":"نسخه‌ای از ردیف که هیچ تراکنش فعلی یا آینده‌ای دیگر نمی‌بیند، اما تا وقتی VACUUM پاکش نکرده جا اشغال می‌کند.","title":"Dead tuple"},{"content":"بعد از تعداد محدودی تلاش مجدد (معمولاً با backoff)، پیام مشکل‌دار همراه با اطلاعات خطا به یک stream مخصوص DLQ منتقل می‌شود. بعداً می‌شود آن را بررسی و دوباره پخش کرد، بدون از دست دادن داده و بدون متوقف کردن پیام‌های سالم.\n","permalink":"https://justroham.ir/fa/glossary/dlq/","summary":"جایی که پیام‌هایی که مدام شکست می‌خورند به آن منتقل می‌شوند تا جریان اصلی را بلاک نکنند.","title":"Dead-letter queue"},{"content":"در Go، SetReadDeadline یک زمان (نه مدت) روی اتصال می‌گذارد؛ Read که هنوز بلاک است بعد از آن با خطای i/o timeout برمی‌گردد. برای idle timeout باید پیش از هر خواندن دوباره آن را تنظیم کنید. برای لغو به‌طور کلی به context نگاه کنید.\n","permalink":"https://justroham.ir/fa/glossary/deadline/","summary":"زمانی مطلق که بعد از آن خواندن یا نوشتن روی شبکه با خطای timeout شکست می‌خورد.","title":"Deadline"},{"content":"session A ردیف ۱ را دارد و ردیف ۲ را می‌خواهد، session B ردیف ۲ را دارد و ردیف ۱ را می‌خواهد. PostgreSQL بعد از deadlock_timeout این چرخه را می‌بیند و یک تراکنش را با SQLSTATE 40P01 لغو می‌کند. راه‌حل معمول گرفتن قفلها در همه‌جا با یک ترتیب ثابت است.\n","permalink":"https://justroham.ir/fa/glossary/deadlock/","summary":"دو یا چند session هرکدام منتظر قفلی هستند که دیگری نگه داشته، پس هیچ‌کدام ادامه نمی‌دهد؛ دیتابیس یکی را قطع می‌کند.","title":"Deadlock"},{"content":"تابعی که یک تابع را می‌گیرد و نسخه‌ی پوشش‌داده‌شده‌اش را برمی‌گرداند؛ با @name اعمال می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/decorator/","summary":"تابعی که تابع دیگر را می‌گیرد و نسخه‌ی تغییریافته‌اش را برمی‌گرداند","title":"Decorator"},{"content":"پارتیشنی که ردیف‌های بی‌پارتیشن را می‌گیرد، یعنی ردیف‌هایی که با هیچ پارتیشن دیگری جور نیستند. از خطای insert جلوگیری می‌کند، اما ساخت پارتیشن جدید باید پارتیشن پیش‌فرض را اسکن کند تا ثابت شود ردیفی متعلق به بازه‌ی جدید نیست. پارتیشن‌بندی را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/default-partition/","summary":"پارتیشنی که ردیف‌های بی‌پارتیشن را می‌گیرد، یعنی ردیف‌هایی که با هیچ پارتیشن دیگری جور نیستند.","title":"Default partition"},{"content":"به‌جای ذخیره‌ی نسخه‌ی کامل، Git می‌تواند یک object را به‌صورت دستورهایی (delta) روی یک object پایه‌ی مشابه ذخیره کند. deltaها می‌توانند زنجیره بسازند و git verify-pack -v عمق زنجیره را نشان می‌دهد. دلیل اصلی کوچک‌تر بودن packfile نسبت به objectهای loose همین است.\n","permalink":"https://justroham.ir/fa/glossary/delta-compression/","summary":"ذخیره‌ی object به‌صورت تفاوت کوچک با یک object پایه.","title":"Delta compression"},{"content":"دفاع‌های معمول محدودیت (اندازه‌ی بدنه، نرخ، همزمانی) و timeout هستند تا هیچ کلاینتی منبعی را رایگان نگه ندارد.\n","permalink":"https://justroham.ir/fa/glossary/denial-of-service/","summary":"حمله یا اتفاقی که با تمام‌کردن یک منبع مثل حافظه، اتصال یا CPU سرویس را در دسترس نمی‌گذارد.","title":"Denial of service"},{"content":"دنرمال‌سازی یعنی عمداً یک داده را در بیش از یک جا نگه داریم، مثلاً جمع کل سفارش را ذخیره کنیم، تا join یا aggregate سنگین لازم نشود. هزینه‌اش این است که باید نسخه‌ها را هماهنگ نگه داریم. این تصمیم بعد از نرمال‌سازی می‌آید، نه به‌جای آن.\n","permalink":"https://justroham.ir/fa/glossary/denormalization/","summary":"ذخیره‌ی عمدی یک واقعیت در چند جا برای ارزان‌تر شدن خواندن.","title":"Denormalization"},{"content":"به جای اینکه یادمان باشد هر route تازه را محافظت کنیم، هر route احراز هویت و مجوز می‌خواهد مگر اینکه صریحاً عمومی اعلام شود. فراموشی آن‌وقت به بسته‌ماندن ختم می‌شود، نه باز‌ماندن.\n","permalink":"https://justroham.ir/fa/glossary/deny-by-default/","summary":"هر route یا عملی تا وقتی قاعده‌ای صریحاً اجازه ندهد ممنوع است.","title":"Deny by default"},{"content":"به‌جای اینکه تابع خودش Date.now() یا اتصال دیتابیس را بسازد، آن را پارامتر می‌گیرد. در تست یک نسخه‌ی ساختگی می‌دهید و نتیجه قطعی می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/dependency-injection/","summary":"دادن وابستگی‌ها (مثل زمان یا دیتابیس) از بیرون به‌جای ساختنشان داخل تابع.","title":"Dependency injection"},{"content":"پیمایش گراف با رفتن تا جای ممکن در یک مسیر و بعد برگشتن به عقب، با بازگشت یا stack.\n","permalink":"https://justroham.ir/fa/glossary/dfs/","summary":"پیمایش گراف با رفتن تا جای ممکن در یک مسیر و بعد برگشتن به عقب، با بازگشت یا stack.","title":"Depth-first search"},{"content":"صف دوطرفه: push و pop از هر دو سر، همگی در O(1) سرشکن. ring buffer با قابلیت رشد آن را خوب پیاده می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/deque/","summary":"صف دوطرفه: push و pop از هر دو سر، همگی در O(1) سرشکن. ring buffer با قابلیت رشد آن را خوب پیاده می‌کند.","title":"Deque"},{"content":"commitهای جدید در این حالت روی هیچ branchی نیستند و با رفتن به جای دیگر راحت گم می‌شوند. checkout یک submodule در ابتدا همیشه detached است.\n","permalink":"https://justroham.ir/fa/glossary/detached-head/","summary":"حالتی که HEAD مستقیم به یک commit اشاره می‌کند، نه به نام یک branch.","title":"Detached HEAD"},{"content":"زمان، شبکه و خطاها همه از یک منبع تصادفی با seed می‌آیند، پس seed یکسان اجرای یکسان می‌دهد. یک شکست flaky به seedی تبدیل می‌شود که دوباره اجرا می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/deterministic-simulation/","summary":"اجرای سیستم در یک دنیای شبیه‌سازی‌شده که با seed هدایت می‌شود تا هر خرابی دقیقاً بازپخش شود.","title":"Deterministic simulation"},{"content":"در کنار fuzzer نیازی به خروجی مورد انتظار نیست: اگر parser شما و یک parser قابل‌اعتماد روی ورودی‌ای اختلاف داشته باشند، یکی از آن‌ها باگ دارد.\n","permalink":"https://justroham.ir/fa/glossary/differential-testing/","summary":"اجرای دو پیاده‌سازی روی یک ورودی و گزارش هر تفاوت.","title":"Differential testing"},{"content":"امضای Ed25519 ۶۴ بایت است. تغییر یک بایت پیام راستی‌آزمایی را ناموفق می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/digital-signature/","summary":"مقداری که با کلید خصوصی ساخته می‌شود و هر کس با کلید عمومی می‌تواند راستی‌آزمایی کند؛ منشأ و یکپارچگی را ثابت می‌کند.","title":"Digital signature"},{"content":"کوتاه‌ترین مسیر از یک مبدأ در گراف با وزن نامنفی، با گسترش همیشگی نزدیک‌ترین رأس تمام‌نشده.\nیک فاصله‌ی موقت برای هر رأس و یک priority queue نگه می‌دارد. رأسی که pop شد فاصله‌اش نهایی است؛ برای همین وزن منفی آن را خراب می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/dijkstra/","summary":"کوتاه‌ترین مسیر از یک مبدأ در گراف با وزن نامنفی، با گسترش همیشگی نزدیک‌ترین رأس تمام‌نشده.","title":"Dijkstra's algorithm"},{"content":"distributed monolith هزینه‌های microservice را دارد بدون سودهایش. نشانه‌های رایج: استقرار قفل‌شده با هم، دیتابیس مشترک، و فراخوانی‌های پرحرف که یک درخواست را به چندین فراخوانی باز می‌کنند. معمولاً یعنی مرزها پیش از فهمیده‌شدن کشیده شده‌اند.\n","permalink":"https://justroham.ir/fa/glossary/distributed-monolith/","summary":"سرویس‌هایی که از راه شبکه جدا شده‌اند ولی هنوز باید با هم تغییر کنند، مستقر شوند و خراب شوند.","title":"Distributed monolith"},{"content":"DNS یک پایگاه داده‌ی توزیع‌شده و سلسله‌مراتبی است: root به دامنه‌های سطح بالا و آن‌ها به name serverهای هر دامنه واگذار می‌کنند. کلاینت‌ها رکوردها (A، AAAA، MX، TXT و \u0026hellip;) را با نام از آن می‌پرسند.\n","permalink":"https://justroham.ir/fa/glossary/dns/","summary":"سیستمی که نام‌ها را به رکوردهایی مثل آدرس IP نگاشت می‌کند.","title":"DNS"},{"content":"اگر کد جواب یک lookup را بررسی کند و بعد با نام وصل شود، lookup دوم می‌تواند آدرس دیگری بدهد. دفاع این است که یک بار resolve کنید و به همان IP بررسی‌شده وصل شوید. نگاه کنید به TOCTOU.\n","permalink":"https://justroham.ir/fa/glossary/dns-rebinding/","summary":"نامی که برای بررسی به آدرسی بی‌خطر و برای اتصال به آدرسی داخلی resolve می‌شود.","title":"DNS rebinding"},{"content":"aggregate هنگام تغییر رویدادها را جمع می‌کند و application service فقط بعد از موفقیت ذخیره آن‌ها را منتشر می‌کند (برای انجام مطمئن آن به الگوی outbox نگاه کنید).\n","permalink":"https://justroham.ir/fa/glossary/domain-event/","summary":"واقعیتی که در دامنه رخ داده، با فعل گذشته نام‌گذاری می‌شود، مثل OrderPlaced.","title":"Domain event"},{"content":"DDD یک بخش راهبردی دارد (bounded context و زبان مشترک) و یک بخش تاکتیکی (value object، aggregate، event). کتاب «Domain-Driven Design» نوشته‌ی Eric Evans این نام را باب کرد.\n","permalink":"https://justroham.ir/fa/glossary/domain-driven-design/","summary":"رویکردی که کد را بر پایه‌ی دامنه‌ی کسب‌وکار، زبان، مرزها و قواعد آن شکل می‌دهد.","title":"Domain-driven design"},{"content":"در طول migration کد جدید هم ستون قدیمی و هم ستون جدید را می‌نویسد تا نسخه‌ی قدیم و جدید هر دو ردیف‌ها را بخوانند. نوشتن دوگانه در دو سیستم جدا چیز دیگر و پرخطرتر است، چون تراکنش مشترکی وجود ندارد.\n","permalink":"https://justroham.ir/fa/glossary/dual-write/","summary":"نوشتن هم‌زمان شکل قدیم و جدید داده.","title":"Dual write"},{"content":"استفاده از یک شیء به‌خاطر متدهایی که صدا می‌زنید، نه کلاسی که اعلام کرده؛ اگر speak() دارد، می‌توانید speak() را صدا بزنید.\n","permalink":"https://justroham.ir/fa/glossary/duck-typing/","summary":"استفاده از یک شیء به‌خاطر متدهایی که صدا می‌زنید، نه کلاسی که اعلام کرده؛ اگر speak() دارد، می‌توانید speak() را صدا بزنید.","title":"Duck typing"},{"content":"متدی ویژه با دو underscore دور نامش، مثل repr یا eq، که Python هنگام استفاده از print()، == یا len() خودش صدا می‌زند.\n","permalink":"https://justroham.ir/fa/glossary/dunder-method/","summary":"متدی ویژه با دو underscore دور نامش، مثل \u003cstrong\u003erepr\u003c/strong\u003e یا \u003cstrong\u003eeq\u003c/strong\u003e، که Python هنگام استفاده از print()، == یا len() خودش صدا می‌زند.","title":"Dunder method"},{"content":"چون سرور به خاطر دارد کدام پیام‌ها ack شده‌اند، durable consumer دقیقاً از جایی که ایستاده ادامه می‌دهد. چند instance می‌توانند یک نام durable مشترک داشته باشند و کار را بینشان تقسیم کنند؛ راه مقیاس‌پذیری افقی همین است.\n","permalink":"https://justroham.ir/fa/glossary/durable-consumer/","summary":"یک consumer نام‌دار در JetStream که جایگاهش بعد از restart و اتصال مجدد حفظ می‌شود.","title":"Durable consumer"},{"content":"آرایه‌ای قابل‌رشد که عنصرها را در یک بلوک پیوسته نگه می‌دارد؛ وقتی پر شد بلوک بزرگ‌تری می‌گیرد و همه‌چیز را کپی می‌کند. slice در Go و Vec در Rust این‌طور کار می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/dynamic-array/","summary":"آرایه‌ای قابل‌رشد که عنصرها را در یک بلوک پیوسته نگه می‌دارد؛ وقتی پر شد بلوک بزرگ‌تری می‌گیرد و همه‌چیز را کپی می‌کند. slice در Go و Vec در Rust این‌طور کار می‌کنند.","title":"Dynamic array"},{"content":"حل مسئله با ترکیب جواب زیرمسئله‌های کوچک‌تر که هر کدام یک بار حل و ذخیره می‌شود.\nمسئله وقتی مناسب است که زیرساخت بهینه و زیرمسئله‌های تکراری داشته باشد. یک state، یک transition، حالت‌های پایه و یک ترتیب تعریف می‌کنید و جدول را پر می‌کنید یا بازگشت را memoize می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/dynamic-programming/","summary":"حل مسئله با ترکیب جواب زیرمسئله‌های کوچک‌تر که هر کدام یک بار حل و ذخیره می‌شود.","title":"Dynamic programming"},{"content":"ECB (دفترچه‌ی کد الکترونیکی) ساختار داده را لو می‌دهد: ۶۴ بایت A چهار بلوک یکسان داد. از آن استفاده نکنید و حالت AEAD بگیرید.\n","permalink":"https://justroham.ir/fa/glossary/ecb-mode/","summary":"حالتی از رمز بلوکی که هر بلوک را مستقل رمز می‌کند، پس بلوک‌های برابر متن، بلوک‌های برابر رمز می‌دهند.","title":"ECB mode"},{"content":"kitten به sitting با ۳ ویرایش می‌رسد. با برنامه‌ریزی پویا روی پیشوندها حساب می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/edit-distance/","summary":"کمترین تعداد درج، حذف و جایگزینی برای تبدیل یک دنباله به دیگری (Levenshtein).","title":"Edit distance"},{"content":"با uv pip install -e . (یا pip install -e .) انجام می‌شود. ماژول‌های import‌شده به فایل‌های داخل پوشه‌ی src/ شما اشاره می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/editable-install/","summary":"نصب یک پروژه به‌گونه‌ای که محیط به نسخه‌ی کاری شما اشاره کند، نه یک کپی ثابت؛ پس تغییرها فوراً اعمال می‌شوند.","title":"editable install"},{"content":"درخواست HTTP می‌شود payload یک segment در TCP، آن هم payload یک بسته‌ی IP و آن هم payload یک frame در لایه‌ی link. گیرنده header‌ها را به ترتیب برعکس برمی‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/encapsulation/","summary":"قرار دادن داده‌ی یک لایه داخل header لایه‌ی پایین‌تر.","title":"Encapsulation"},{"content":"[project.scripts] با greeter = \u0026quot;greeter:main\u0026quot; باعث می‌شود نصب‌کننده دستور greeter را بسازد که greeter.main() را صدا می‌زند.\n","permalink":"https://justroham.ir/fa/glossary/entry-point/","summary":"یک اتصال نام‌دار در metadata بسته؛ entry point های console_scripts هنگام نصب به دستور در PATH تبدیل می‌شوند.","title":"entry point"},{"content":"هر رکورد کلید داده‌ی خودش (DEK) را دارد که با یک کلید رمزکننده‌ی کلید (KEK) و شناسه‌ی آن ذخیره می‌شود. چرخاندن KEK فقط DEKهای کوچک را دوباره بسته‌بندی می‌کند، نه داده را.\n","permalink":"https://justroham.ir/fa/glossary/envelope-encryption/","summary":"رمز کردن داده با کلید تصادفی هر رکورد که خودش با یک کلید اصلی رمز می‌شود.","title":"Envelope encryption"},{"content":"رشته‌ای با نام که پروسه از والد خود می‌گیرد و برای انتقال تنظیماتی مثل پورت و کلید به کار می‌رود. در Node.js در process.env هستند. همه‌ی مقدارها رشته‌اند، پس عدد و boolean را باید parse و اعتبارسنجی کرد.\n","permalink":"https://justroham.ir/fa/glossary/environment-variable/","summary":"رشته‌ای با نام که پروسه از والد خود می‌گیرد و برای انتقال تنظیماتی مثل پورت و کلید به کار می‌رود.","title":"Environment variable"},{"content":"طبق epoll(7) یک نمونه‌ی epoll می‌سازید، fileها را با epoll_ctl ثبت می‌کنید و با epoll_wait منتظر می‌مانید که فقط descriptorهای آماده را برمی‌گرداند. فقط روی Linux هست؛ macOS و BSDها kqueue دارند.\n","permalink":"https://justroham.ir/fa/glossary/epoll/","summary":"فراخوان‌های سیستمی Linux که به یک thread اجازه می‌دهند به‌طور کارا منتظر آماده شدن هزاران file descriptor بماند.","title":"epoll"},{"content":"errgroup.WithContext یک group و یک context مشتق‌شده برمی‌گرداند. g.Go(fn) یک goroutine شروع می‌کند؛ g.Wait() تا پایان همه بلاک می‌کند و اولین خطای غیر nil را برمی‌گرداند. g.SetLimit(n) هم هم‌زمانی را محدود می‌کند، بدون اینکه worker pool دستی بنویسید.\n","permalink":"https://justroham.ir/fa/glossary/errgroup/","summary":"ابزاری از \u003ccode\u003egolang.org/x/sync\u003c/code\u003e که چند goroutine را با هم اجرا می‌کند و با اولین خطا بقیه را لغو می‌کند.","title":"errgroup"},{"content":"errno شماره‌ی خطایی است که فراخوان سیستمی ناموفق به جا می‌گذارد؛ strace نماد آن را چاپ می‌کند، مثلاً -1 ENOENT (No such file or directory). خواندن همین نماد معمولاً می‌گوید بعد چه را بررسی کنی.\n","permalink":"https://justroham.ir/fa/glossary/errno/","summary":"کد خطایی که فراخوان سیستمی ناموفق گزارش می‌کند، مثل ENOENT یا EACCES.","title":"errno"},{"content":"با SLO برابر ۹۹٫۵٪، در آن بازه ۰٫۵٪ درخواست‌ها اجازه‌ی شکست دارند. هر حادثه بخشی از بودجه را می‌سوزاند و تمام شدنش علامت کند کردن تغییرهای پرریسک است.\n","permalink":"https://justroham.ir/fa/glossary/error-budget/","summary":"مقدار شکستی که SLO در یک بازه اجازه می‌دهد.","title":"Error budget"},{"content":"سیستم ماژول استاندارد JavaScript (import و export) که ناهمگام بارگذاری می‌شود و پیش از اجرای کد، به‌صورت ایستا تحلیل می‌شود. در Node.js فایلی ESM حساب می‌شود که پسوندش .mjs باشد، یا .js باشد و نزدیک‌ترین package.json مقدار \u0026quot;type\u0026quot;: \u0026quot;module\u0026quot; داشته باشد.\n","permalink":"https://justroham.ir/fa/glossary/esm/","summary":"سیستم ماژول استاندارد JavaScript (\u003ccode\u003eimport\u003c/code\u003e و \u003ccode\u003eexport\u003c/code\u003e) که ناهمگام بارگذاری می‌شود و پیش از اجرای کد، به‌صورت ایستا تحلیل می‌شود.","title":"ESM"},{"content":"CloudEvents یک مشخصه‌ی منتشرشده برای چنین envelope ای است. consumer فقط با خواندن envelope می‌تواند رویداد را مسیردهی، deduplicate و ردیابی کند.\n","permalink":"https://justroham.ir/fa/glossary/event-envelope/","summary":"یک پوشش ثابت دور هر رویداد با metadata (شناسه، نوع، زمان، منبع، نسخه‌ی schema، correlation id) جدا از payload.","title":"Event envelope"},{"content":"event loop مدام از فازها (timers، poll، check، close) می‌گذرد و callbackهای آماده را اجرا می‌کند. JavaScript شما روی یک thread اجرا می‌شود، پس یک کار همگام طولانی همه‌چیز را عقب می‌اندازد.\n","permalink":"https://justroham.ir/fa/glossary/event-loop/","summary":"حلقه‌ای که به JavaScript تک‌threaded اجازه می‌دهد با اجرای callback در لحظه‌ی آماده شدن، چند عملیات منتظر را مدیریت کند.","title":"Event loop"},{"content":"حساب یک سطر با موجودی نیست، بلکه رویدادهای Opened و Deposited و Withdrawn است. command قواعد را روی وضعیت fold‌شده بررسی و رویداد جدید صادر می‌کند؛ چیزی درجا ویرایش نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/event-sourcing/","summary":"وضعیت ذخیره نمی‌شود؛ فهرست append-only رویدادهایی که به آن رسیده‌اند ذخیره می‌شود و وضعیت فعلی fold آن‌هاست.","title":"Event sourcing"},{"content":"بیشتر اشیای I/O در Node.js (سرور، stream) EventEmitter هستند. event با نام ویژه‌ی error فرق دارد: اگر listener نداشته باشد، خطا throw می‌شود و می‌تواند process را از کار بیندازد.\n","permalink":"https://justroham.ir/fa/glossary/event-emitter/","summary":"شیء publish/subscribe داخلی Node: event با نام emit می‌شود و listenerها واکنش نشان می‌دهند.","title":"EventEmitter"},{"content":"ضعیف‌ترین وعده‌ی مفید. نمی‌گوید همگرایی چقدر طول می‌کشد و در این فاصله read چه برمی‌گرداند.\n","permalink":"https://justroham.ir/fa/glossary/eventual-consistency/","summary":"اگر writeها متوقف شوند، همه‌ی replicaها به یک مقدار می‌رسند؛ قبل از آن readها ممکن است کهنه یا نامرتب باشند.","title":"Eventual consistency"},{"content":"وصل کردن exception جدید به exception در حال مدیریت: raise \u0026hellip; from e مقدار cause و raise داخل except مقدار context را پر می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/exception-chaining/","summary":"وصل کردن exception جدید به exception در حال مدیریت: raise \u0026hellip; from e مقدار \u003cstrong\u003ecause\u003c/strong\u003e و raise داخل except مقدار \u003cstrong\u003econtext\u003c/strong\u003e را پر می‌کند.","title":"Exception chaining"},{"content":"exceptionی که چند exception را با هم حمل می‌کند؛ except* هر نوع را روی بخش مربوط به خودش مدیریت می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/exception-group/","summary":"exceptionی که چند exception را با هم حمل می‌کند؛ except* هر نوع را روی بخش مربوط به خودش مدیریت می‌کند.","title":"ExceptionGroup"},{"content":"عددی که دستور پایان کار برمی‌گرداند؛ 0 یعنی موفق و غیر از آن یعنی شکست. پوسته آن را با $? نشان می‌دهد و در \u0026amp;\u0026amp; و || و if به کار می‌برد.\n","permalink":"https://justroham.ir/fa/glossary/exit-status/","summary":"عددی که دستور پایان کار برمی‌گرداند؛ 0 یعنی موفق و غیر از آن یعنی شکست. پوسته آن را با \u003ccode\u003e$?\u003c/code\u003e نشان می‌دهد و در \u003ccode\u003e\u0026amp;\u0026amp;\u003c/code\u003e و \u003ccode\u003e||\u003c/code\u003e و \u003ccode\u003eif\u003c/code\u003e به کار می‌برد.","title":"Exit status"},{"content":"هر گام با کدی که همان لحظه اجراست سازگار است، پس هیچ گامی downtime نمی‌خواهد و تا قبل از آخرین گام (حذف) برگشت‌پذیر است.\n","permalink":"https://justroham.ir/fa/glossary/expand-contract/","summary":"دستور پخت مایگریشن در گام‌های کوچک و امن: ساختار جدید را اضافه کن، داده را کپی کن، برنامه را عوض کن، ساختار قدیمی را حذف کن.","title":"Expand/contract"},{"content":"بعد از تلاش n‌ام، کلاینت تقریباً min(cap, base * 2^n) صبر می‌کند. این به سرور تحت فشار فرصت بهبود می‌دهد، ولی کلاینت‌هایی که با هم شکست خورده‌اند با هم هم تلاش می‌کنند، مگر jitter اضافه شود.\n","permalink":"https://justroham.ir/fa/glossary/exponential-backoff/","summary":"افزایش فاصله‌ی بین تلاش‌ها پس از هر شکست، با دو برابر شدن تا سقف مشخص.","title":"Exponential backoff"},{"content":"کوئری باید همان عبارت را بنویسد تا استفاده شود. شرط‌های non-sargable را بدون تغییر داده درست می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/expression-index/","summary":"ایندکسی که روی نتیجه‌ی یک عبارت مثل lower(email) ساخته می‌شود، نه یک ستون ساده.","title":"Expression index"},{"content":"به‌طور پیش‌فرض planner ستون‌ها را مستقل فرض می‌کند. آمار گسترده مثل dependencies به آن یاد می‌دهد که مثلاً کشور منطقه را مشخص می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/extended-statistics/","summary":"آمار چندستونه که با \u003ccode\u003eCREATE STATISTICS\u003c/code\u003e ساخته می‌شود.","title":"Extended statistics"},{"content":"حالت مقابل fail closed است که رد می‌کند. برای هر endpoint جدا انتخاب کنید: برای خواندن‌های ارزان معمولاً دسترس‌پذیری و برای login یا کار گران امنیت.\n","permalink":"https://justroham.ir/fa/glossary/fail-open/","summary":"عبور دادن درخواست‌ها وقتی جزء محافظ، مثل store مربوط به limiter، در دسترس نیست.","title":"Fail open"},{"content":"خود PostgreSQL فقط دستور promote را می‌دهد؛ تشخیص خرابی، انتخاب standby و از مدار خارج‌کردن primary قدیمی کار ابزارهای بیرونی مثل Patroni یا repmgr است.\n","permalink":"https://justroham.ir/fa/glossary/failover/","summary":"جابه‌جایی به یک standby به‌عنوان primary جدید وقتی قدیمی از کار می‌افتد.","title":"Failover"},{"content":"در شبکه‌ی ناهمگام دقیق نمی‌شود. timeout کوتاه خرابی واقعی را زود می‌فهمد ولی گره‌های سالم را هم مشکوک می‌کند؛ timeout بلند برعکس.\n","permalink":"https://justroham.ir/fa/glossary/failure-detector/","summary":"مؤلفه‌ای که حدس می‌زند یک گره‌ی دور از کار افتاده یا نه، معمولاً از نرسیدن heartbeat در مهلت مشخص.","title":"Failure detector"},{"content":"ارتفاع درختی با n کلید حدود لگاریتم n در مبنای fan-out است. هر صفحه‌ی B-tree صدها کلید دارد، پس میلیون‌ها ردیف فقط چند سطح لازم دارند.\n","permalink":"https://justroham.ir/fa/glossary/fan-out/","summary":"تعداد فرزندهایی که یک node درخت می‌تواند داشته باشد؛ fan-out بزرگ‌تر درخت را کم‌عمق‌تر می‌کند.","title":"Fan-out"},{"content":"اگر branch مقصد از زمان جدا شدن commit تازه‌ای نداشته باشد، گیت فقط اشاره‌گر آن را جلو می‌برد و چیز جدیدی نمی‌سازد. --ff-only هر حالت دیگر را رد می‌کند و --no-ff حتی وقتی fast-forward ممکن است یک merge commit می‌سازد.\n","permalink":"https://justroham.ir/fa/glossary/fast-forward/","summary":"جلو بردن اشاره‌گر branch روی یک خط مستقیم از commitها، بدون ساختن commit جدید.","title":"fast-forward"},{"content":"خطاها را می‌شود با proxy بین کلاینت و سرور، با wrapper دور HTTP client در unit test یا با kill کردن process تزریق کرد. هدف پیدا کردن timeout گم‌شده، retry ناایمن و فرض‌های غلط است، پیش از آنکه production پیدایشان کند.\n","permalink":"https://justroham.ir/fa/glossary/fault-injection/","summary":"ایجاد عمدی تأخیر، خطا یا crash در یک وابستگی برای دیدن واکنش سیستم.","title":"Fault injection"},{"content":"feature flag (یا toggle) شرطی در کد است که مقدارش از پیکربندی می‌آید، نه از build. با آن می‌شود کار نیمه‌تمام را merge کرد، کم‌کم منتشر کرد و ویژگی را سریع خاموش کرد. هزینه‌اش مسیرهای بیشتر برای تست و پرچم‌هایی است که باید بعداً حذف شوند.\n","permalink":"https://justroham.ir/fa/glossary/feature-flag/","summary":"کلیدی در زمان اجرا که مسیرهای کد را بدون deploy روشن یا خاموش می‌کند.","title":"Feature flag"},{"content":"Go از راه cgo و یک مرز سازگار با C به Rust می‌رسد؛ Rust توابع extern \u0026quot;C\u0026quot; را با #[no_mangle] منتشر می‌کند. عبور از این مرز هزینه دارد و مدیریت حافظه باید دقیق باشد: هر که بافر را اختصاص داده باید آزادش کند.\n","permalink":"https://justroham.ir/fa/glossary/ffi/","summary":"Foreign Function Interface: فراخوانی کدی که به زبان دیگری نوشته شده، معمولاً از راه C ABI.","title":"FFI"},{"content":"عدد کوچکی که پروسه با آن به فایل، pipe یا سوکت باز اشاره می‌کند. ۰ و ۱ و ۲ همان stdin، stdout و stderr هستند و redirectهای پوسته آن‌ها را جابه‌جا می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/file-descriptor/","summary":"عدد کوچکی که پروسه با آن به فایل، pipe یا سوکت باز اشاره می‌کند. ۰ و ۱ و ۲ همان stdin، stdout و stderr هستند و redirectهای پوسته آن‌ها را جابه‌جا می‌کنند.","title":"File descriptor"},{"content":"نُه بیت (خواندن، نوشتن و اجرا برای user و group و other) که در inode ذخیره می‌شوند. حالت‌های octal مثل 755 یا 640 آن‌ها را فشرده می‌نویسند.\n","permalink":"https://justroham.ir/fa/glossary/file-permissions/","summary":"نُه بیت (خواندن، نوشتن و اجرا برای user و group و other) که در inode ذخیره می‌شوند. حالت‌های octal مثل 755 یا 640 آن‌ها را فشرده می‌نویسند.","title":"File permissions"},{"content":"آزمون دقیق Fisher با توزیع hypergeometric احتمال دقیق دیدن چنین تقسیم نامتوازنی از خطاها بین دو گروه را حساب می‌کند. برخلاف z-test وقتی شمارش‌ها بسیار کوچک‌اند هم معتبر می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/fisher-exact-test/","summary":"آزمون معناداری دقیق برای جدول ۲×۲ از شمارش‌ها.","title":"Fisher exact test"},{"content":"هر جواب «چرا» سؤال بعدی می‌شود. ساده است، ولی فقط یک زنجیره را دنبال می‌کند، به پاسخ‌دهنده بستگی دارد و اغلب روی یک آدم یا علت مبهم می‌ایستد.\n","permalink":"https://justroham.ir/fa/glossary/five-whys/","summary":"روشی که با پرسیدن پیاپی «چرا» دنبال علت می‌گردد؛ فقط یک زنجیره را می‌رود.","title":"Five whys"},{"content":"fixture در pytest تابعی است که با @pytest.fixture علامت خورده. تست با نوشتن نامش در پارامترها آن را می‌خواهد و pytest اول آن را اجرا و نتیجه را پاس می‌دهد. با yield، کد بعد از آن به‌عنوان teardown اجرا می‌شود. scope (function، module، session) تعیین می‌کند هر چند وقت یک‌بار ساخته شود.\n","permalink":"https://justroham.ir/fa/glossary/fixture/","summary":"تابعی که چیزهای موردنیاز تست را آماده و پس از آن پاک‌سازی می‌کند","title":"Fixture"},{"content":"علت‌های رایج: زمان واقعی، تصادف، state مشترک و زمان‌بندی بین goroutineها. تست flaky آدم‌ها را به نادیده گرفتن build قرمز عادت می‌دهد؛ پس بهتر است زود درستش کنید، مثلاً با تزریق ساعت.\n","permalink":"https://justroham.ir/fa/glossary/flaky-test/","summary":"تستی که بدون تغییر کد گاهی می‌گذرد و گاهی رد می‌شود.","title":"Flaky test"},{"content":"فلیم‌گراف stackهای نمونه‌برداری‌شده را روی هم می‌چیند: محور افقی زمان نیست و جعبه‌ی پهن یعنی آن تابع (با فراخوانی‌هایش) در نمونه‌های زیادی بوده. اسکریپت‌های FlameGraph از Brendan Gregg آن را از خروجی perf می‌کشند.\n","permalink":"https://justroham.ir/fa/glossary/flame-graph/","summary":"تصویری از stackهای نمونه‌برداری‌شده که عرض هر جعبه نشان می‌دهد تابع چند بار روی stack بوده.","title":"Flame graph"},{"content":"git push --force اشاره‌گر branch ریموت را به جای branch شما می‌برد. بعد از rebase لازم می‌شود، اما می‌تواند commitهای هم‌تیمی‌ها را دور بریزد. --force-with-lease اگر ریموت از آخرین fetch شما تغییر کرده باشد رد می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/force-push/","summary":"branch ریموت را با نسخه‌ی محلی بازنویسی می‌کند، حتی اگر commitهایی حذف شوند؛ \u0026ndash;force-with-lease ترجیح دارد.","title":"force push"},{"content":"کلید خارجی باعث می‌شود دیتابیس سطری را که به چیز ناموجود اشاره می‌کند رد کند و حذف سطری را که هنوز به آن ارجاع هست هم رد کند (SQLSTATE 23503).\n","permalink":"https://justroham.ir/fa/glossary/foreign-key/","summary":"ستونی که باید با یک مقدار کلید اصلی در جدولی دیگر یکی باشد.","title":"Foreign key"},{"content":"در ساخت free-threaded (python3.14t) thread‌های Python می‌توانند هم‌زمان روی چند هسته اجرا شوند. کدی که به GIL تکیه می‌کرد تا race را پنهان کند، مثل counter += 1، ممکن است update از دست بدهد. GIL را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/free-threading/","summary":"ساختی از CPython که از 3.13 به‌صورت گزینه در دسترس است و بدون GIL اجرا می‌شود.","title":"Free-threaded Python"},{"content":"fuzzer از چند ورودی اولیه شروع می‌کند، آن‌ها را جهش می‌دهد و ورودی‌هایی را نگه می‌دارد که به کد تازه می‌رسند. Go آن را داخلی دارد: go test -fuzz FuzzName -fuzztime 5s. به تست خاصیت‌محور نزدیک است ولی تا توقف دستی ادامه می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/fuzzing/","summary":"دادن ورودی‌های جهش‌یافته‌ی خودکار به برنامه، با هدایت coverage، برای پیدا کردن crash و باگ.","title":"Fuzzing"},{"content":"به runbook، نقش‌های مشخص، شرایط توقف و برنامه‌ی ارتباطی توافق‌شده از قبل نیاز دارد.\n","permalink":"https://justroham.ir/fa/glossary/game-day/","summary":"جلسه‌ی برنامه‌ریزی‌شده‌ای که تیم در آن خرابی تزریق می‌کند و تشخیص و رفع آن را تمرین می‌کند.","title":"Game day"},{"content":"V8 برای objectهای جوان scavenge کوتاه و برای نسل قدیمی mark-compact کندتر اجرا می‌کند؛ --trace-gc هرکدام را چاپ می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/garbage-collector/","summary":"بخشی از runtime که objectهایی را که دیگر به آن‌ها دسترسی نیست آزاد می‌کند.","title":"Garbage collector"},{"content":"در PostgreSQL، GENERATED ALWAYS AS (expr) STORED مقدار را در هر insert و update دوباره حساب می‌کند و نمی‌شود مستقیم رویش نوشت. کاربرد رایج: یک tsvector از پیش محاسبه‌شده که می‌شود ایندکسش کرد.\n","permalink":"https://justroham.ir/fa/glossary/generated-column/","summary":"ستونی که مقدارش با یک عبارت از ستون‌های دیگر همان ردیف محاسبه و خودکار ذخیره می‌شود.","title":"Generated column"},{"content":"تابعی که با yield مقدارها را یکی‌یکی تولید می‌کند و بین هر دو مقدار متوقف می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/generator/","summary":"تابعی با yield که مقدارها را یکی‌یکی و در صورت نیاز تولید می‌کند","title":"Generator"},{"content":"کدی که یک بار برای هر نوعی نوشته می‌شود و نوع به‌عنوان پارامتر می‌آید، مثل def first[T](xs: list[T]) -\u0026gt; T. checker پیگیری می‌کند در هر فراخوانی T چیست.\n","permalink":"https://justroham.ir/fa/glossary/generics/","summary":"کدی که یک بار برای هر نوعی نوشته می‌شود و نوع به‌عنوان پارامتر می‌آید، مثل def first[T](xs: list[T]) -\u0026gt; T. checker پیگیری می‌کند در هر فراخوانی T چیست.","title":"Generics"},{"content":"Global Interpreter Lock از وضعیت داخلی interpreter محافظت می‌کند. thread‌ها هنگام انتظار I/O هنوز مفیدند چون قفل در زمان بلاک‌شدن آزاد می‌شود، ولی کد CPU-bound در thread‌ها موازی اجرا نمی‌شود. free-threading را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/gil/","summary":"قفلی در CPython استاندارد که اجازه می‌دهد در هر لحظه فقط یک thread بایت‌کد Python اجرا کند.","title":"GIL"},{"content":"GIN (Generalized Inverted Index) برای مقدارهایی مناسب است که چند جزء دارند: سند JSONB، آرایه و بردار جست‌وجوی متنی. جست‌وجو برای هر جزء ردیف‌ها را پیدا و ترکیب می‌کند؛ نوشتن گران‌تر از B-tree است.\n","permalink":"https://justroham.ir/fa/glossary/gin-index/","summary":"ایندکس وارونه در PostgreSQL که هر عنصر داخل یک مقدار (کلید JSON، کلمه) را به ردیف‌هایی که آن را دارند نگاشت می‌کند.","title":"GIN index"},{"content":"git bisect یک commit سالم و یک commit خراب را می‌گیرد و commit وسط را checkout می‌کند و از شما (یا یک اسکریپت) می‌پرسد سالم است یا خراب. هر جواب بازه را نصف می‌کند، پس حدود log2(N) تست برای پیدا کردن مقصر کافی است. binary search و regression را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/git-bisect/","summary":"ابزار Git که با جست‌وجوی دودویی در تاریخچه، اولین commit خراب‌کننده را پیدا می‌کند.","title":"git bisect"},{"content":"هر چیزی که گیت ذخیره می‌کند یک object است که با هش محتوایش نام‌گذاری می‌شود و به‌صورت فایل loose فشرده با zlib نگهداری می‌شود. objectها هرگز تغییر نمی‌کنند، فقط اضافه می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/git-object/","summary":"یکی از blob، tree، commit یا tag که با هشش در .git/objects ذخیره می‌شود.","title":"Git object"},{"content":"--soft هم index و هم فایل‌ها را نگه می‌دارد، --mixed (پیش‌فرض) index را ریست می‌کند ولی فایل‌ها را نگه می‌دارد و --hard هر دو را ریست می‌کند، پس تغییرات commit‌نشده از بین می‌روند. برای پیدا کردن جای قبلی از reflog استفاده کنید.\n","permalink":"https://justroham.ir/fa/glossary/git-reset/","summary":"branch فعلی را به commit دیگری می‌برد؛ mode تعیین می‌کند index و working tree چه شوند.","title":"git reset"},{"content":"روی branchهای مشترک امن است چون تاریخچه را بازنویسی نمی‌کند. revert کردن merge commit به -m 1 برای انتخاب parent اصلی نیاز دارد. با reflog و reset مقایسه کنید.\n","permalink":"https://justroham.ir/fa/glossary/git-revert/","summary":"یک commit را با افزودن commit جدیدی با patch معکوس برمی‌گرداند و تاریخچه را دست نمی‌زند.","title":"git revert"},{"content":"git ls-tree HEAD آن را به شکل 160000 commit \u0026lt;sha\u0026gt; \u0026lt;path\u0026gt; نشان می‌دهد. submodule این‌گونه داخل repository والد ذخیره می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/gitlink/","summary":"یک ورودی در tree (با mode برابر 160000) که id یک commit از repository دیگر را ثبت می‌کند.","title":"Gitlink"},{"content":"فایل go.work با use چند پوشه را فهرست می‌کند. تا وقتی فعال است، دستور go ماژول‌های فهرست‌شده را با هم می‌سازد و نسخه‌ی محلی را به نسخه‌ی رجیستری ترجیح می‌دهد. برای توسعه‌ی محلی میان ماژول‌ها است، مثلاً در یک monorepo.\n","permalink":"https://justroham.ir/fa/glossary/go-workspace/","summary":"فایل go.work که چند ماژول محلی Go را بدون نسخه‌ی منتشرشده به هم وصل می‌کند.","title":"Go workspace (go.work)"},{"content":"فریم GOAWAY شماره‌ی آخرین streamی را دارد که فرستنده پردازش می‌کند. streamهای تا آن شماره می‌توانند تمام شوند و بقیه باید روی اتصال دیگری دوباره امتحان شوند. سرور HTTP/2 یا gRPC با آن اتصال را پیش از بستن تخلیه می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/goaway/","summary":"فریمی در HTTP/2 که به طرف مقابل می‌گوید روی این اتصال stream تازه باز نکند.","title":"GOAWAY"},{"content":"goroutine با کلیدواژه‌ی go شروع می‌شود. stack اولیه‌اش فقط چند کیلوبایت است و در صورت نیاز بزرگ می‌شود، برای همین می‌شود صدها هزار تا از آن‌ها داشت. scheduler زبان Go آن‌ها را روی تعداد کمتری thread سیستم‌عامل پخش می‌کند.\ngo func() { fmt.Println(\u0026#34;runs concurrently\u0026#34;) }() goroutine مقدار برنمی‌گرداند؛ برای ارتباط از channel یا حافظه‌ی مشترکِ محافظت‌شده با mutex استفاده کنید.\n","permalink":"https://justroham.ir/fa/glossary/goroutine/","summary":"اجرای سبکی از یک تابع که runtime زبان Go مدیریت می‌کند، نه سیستم‌عامل.","title":"Goroutine"},{"content":"با رسیدن سیگنال توقف مثل SIGTERM، فرایند اتصال تازه نمی‌پذیرد، اتصال‌های بی‌کار را می‌بندد، منتظر درخواست‌های در حال اجرا می‌ماند و بعد با کد ۰ خارج می‌شود. معمولاً یک timer هم اگر چیزی تمام نشد خروج را اجباری می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/graceful-shutdown/","summary":"متوقف کردن سرور بدون پذیرش کار تازه، به‌طوری که درخواست‌های در حال اجرا تمام شوند.","title":"Graceful shutdown"},{"content":"مجموعه‌ای از vertex (گره) که با edge (یال) به هم وصل شده‌اند. یال‌ها می‌توانند جهت‌دار یا بدون جهت باشند. شبکه، نقشه، وابستگی‌ها و دوستی‌ها همه گراف‌اند.\n","permalink":"https://justroham.ir/fa/glossary/graph/","summary":"مجموعه‌ای از vertex (گره) که با edge (یال) به هم وصل شده‌اند. یال‌ها می‌توانند جهت‌دار یا بدون جهت باشند. شبکه، نقشه، وابستگی‌ها و دوستی‌ها همه گراف‌اند.","title":"Graph"},{"content":"health checkها و heartbeatها ممکن است موفق باشند در حالی که درخواست‌های واقعی timeout می‌خورند. طبق تجربه‌ی من مدیریتش از یک crash تمیز سخت‌تر است.\n","permalink":"https://justroham.ir/fa/glossary/gray-failure/","summary":"گره‌ای که نمرده ولی آن‌قدر کند یا ناپایدار است که به سیستم آسیب می‌زند، در حالی که زنده به نظر می‌رسد.","title":"Gray failure"},{"content":"الگوریتم greedy پاسخ را با انتخاب چیزی می‌سازد که همین الان بهترین به نظر می‌رسد. سریع است ولی فقط وقتی درست است که ساختار مسئله مناسب باشد؛ معمولاً با exchange argument ثابت می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/greedy-algorithm/","summary":"در هر گام بهترین انتخاب محلی را می‌کند و هرگز به آن برنمی‌گردد.","title":"Greedy algorithm"},{"content":"سرویس‌ها و پیام‌ها در فایل‌های .proto تعریف می‌شوند و از روی آن‌ها کد client و server برای زبان‌های مختلف تولید می‌شود، برای همین برای ارتباط Go↔Rust مناسب است. هم call ساده و هم streaming یک‌طرفه و دوطرفه را پشتیبانی می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/grpc/","summary":"چارچوب RPC باینری که روی HTTP/2 و Protocol Buffers ساخته شده است.","title":"gRPC"},{"content":"اتصال TCP دو جهت مستقل دارد. half-close (در Go: CloseWrite) به طرف مقابل می‌گوید «ارسال من تمام شد» (او EOF می‌بیند) ولی خودتان هنوز می‌توانید پاسخش را بخوانید.\n","permalink":"https://justroham.ir/fa/glossary/half-close/","summary":"بستن فقط جهت ارسال یک اتصال TCP در حالی که هنوز می‌توان خواند.","title":"Half-close"},{"content":"اگر a پیش از b رخ دهد، a می‌توانسته روی b اثر بگذارد. اگر هیچ‌کدام پیش از دیگری نباشد، رویدادها هم‌زمان‌اند و هیچ ساعتی نمی‌تواند ترتیب درستی بین آن‌ها بگذارد.\n","permalink":"https://justroham.ir/fa/glossary/happens-before/","summary":"رابطه‌ی علّیت به صورت ترتیب جزئی: ترتیب برنامه، send قبل از receive و تعدی؛ رویدادهای بدون چنین مسیری هم‌زمان‌اند.","title":"Happens-before"},{"content":"نام دوم برای همان inode. هر دو نام هم‌ارزند، شمارنده‌ی لینک بالا می‌رود و داده فقط وقتی آزاد می‌شود که آخرین نام حذف شود.\n","permalink":"https://justroham.ir/fa/glossary/hard-link/","summary":"نام دوم برای همان inode. هر دو نام هم‌ارزند، شمارنده‌ی لینک بالا می‌رود و داده فقط وقتی آزاد می‌شود که آخرین نام حذف شود.","title":"Hard link"},{"content":"hash chain لاگ را «دست‌کاری‌نمایان» می‌کند، نه «دست‌کاری‌ناپذیر»: کسی که کل فایل را بازنویسی کند زنجیره را دوباره حساب می‌کند. checkpointهای امضاشده در جای دیگر این شکاف را می‌بندند.\n","permalink":"https://justroham.ir/fa/glossary/hash-chain/","summary":"هر رکورد hash رکورد قبلی را نگه می‌دارد، پس ویرایش، حذف یا جابه‌جایی همه‌ی پیوندهای بعدی را می‌شکند.","title":"Hash chain"},{"content":"برخورد اجتناب‌ناپذیر است، پس هر جدول هش یک راهبرد لازم دارد: chaining برای هر خانه یک لیست نگه می‌دارد، open addressing خانه‌ی دیگری می‌جوید.\n","permalink":"https://justroham.ir/fa/glossary/hash-collision/","summary":"دو کلید متفاوت که به یک خانه از جدول هش می‌رسند.","title":"Hash collision"},{"content":"کلید با slot = hash(key) mod S به یک slot می‌رسد (S ثابت است) و یک جدول slotها را به node‌ها نگاشت می‌کند. افزودن node چند slot را جابه‌جا می‌کند و نگاشت کلید به slot هرگز عوض نمی‌شود. طبق مستندات، Redis Cluster از ۱۶۳۸۴ slot استفاده می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/hash-slot/","summary":"یکی از تعداد ثابتی سطل منطقی که کلیدها در آن hash می‌شوند؛ کل slot به node داده یا بین node‌ها جابه‌جا می‌شود، نه تک‌تک کلیدها.","title":"Hash slot"},{"content":"کلید hash می‌شود تا یک bucket انتخاب شود، پس جست‌وجو همه‌ی عنصرها را نمی‌گردد. هزینه‌اش یک مرحله‌ی ثابت hash در هر دسترسی است و برای همین یک slice خیلی کوچک می‌تواند از map سریع‌تر باشد. نگاه کنید به Big-O.\n","permalink":"https://justroham.ir/fa/glossary/hash-table/","summary":"ساختاری که کلید را با محاسبه‌ی hash پیدا می‌کند و جست‌وجو را به‌طور میانگین O(1) می‌کند. map در Go یکی از آن‌هاست.","title":"Hash table"},{"content":"HEAD ناحیه‌ی سوم از سه ناحیه‌ی گیت است: آخرین commit. git diff HEAD درخت کاری را با آن مقایسه می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/head/","summary":"اشاره‌گر به commitی که checkout فعلی شما بر پایه‌ی آن است.","title":"HEAD"},{"content":"در HTTP/1.1 هر اتصال هر بار یک پاسخ را جواب می‌دهد، پس پاسخ کند، بعدی‌ها را معطل می‌کند. HTTP/2 این را در سطح HTTP حل می‌کند، اما TCP بایت‌ها را به ترتیب تحویل می‌دهد و یک بسته‌ی گم‌شده می‌تواند همه‌ی stream‌های آن اتصال را متوقف کند.\n","permalink":"https://justroham.ir/fa/glossary/head-of-line-blocking/","summary":"یک مورد کند در ابتدای صف، همه‌ی موارد پشت سرش را معطل می‌کند.","title":"Head-of-line blocking"},{"content":"بررسی فعال با یک تایمر probe می‌فرستد (مثلاً GET /healthz)؛ بررسی غیرفعال خطاهای ترافیک واقعی را می‌پاید. بعد از چند شکست، backend از چرخه خارج می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/health-check/","summary":"بررسی‌ای که به load balancer می‌گوید backend می‌تواند ترافیک بگیرد یا نه.","title":"Health check"},{"content":"در Node.js با v8.writeHeapSnapshot() نوشته می‌شود. فایل JSON است و می‌تواند به بزرگی خود heap باشد، پس بعد از استفاده پاکش کنید.\n","permalink":"https://justroham.ir/fa/glossary/heap-snapshot/","summary":"ثبت همه‌ی objectهای زنده‌ی heap همراه با اندازه و ارجاع‌ها، برای پیدا کردن اینکه چه چیزی حافظه را نگه داشته.","title":"Heap snapshot"},{"content":"Heap sort با heapify slice را به max-heap تبدیل می‌کند، بعد بزرگ‌ترین عنصر (ریشه) را به انتهای heap در حال کوچک‌شدن می‌برد و heap را ترمیم می‌کند. کران O(n log n) تضمین‌شده دارد و بافر نمی‌خواهد، اما در حافظه می‌پرد و معمولاً مقایسه‌ی بیشتری از quicksort یا merge sort دارد.\n","permalink":"https://justroham.ir/fa/glossary/heap-sort/","summary":"ساخت max-heap در جا، و بعد جابه‌جایی مکرر ریشه به انتها و sift down؛ O(n log n)، بدون حافظه‌ی اضافه و ناپایدار.","title":"Heap sort"},{"content":"Heapify از اندیس n/2-1 شروع می‌کند و هر گره را پایین می‌برد. بیشتر گره‌ها نزدیک برگ‌ها هستند و کم جابه‌جا می‌شوند، پس مجموع کار O(n) است؛ در بدترین حالت ارزان‌تر از n بار push (که O(n log n) است). نگاه کنید به Binary heap.\n","permalink":"https://justroham.ir/fa/glossary/heapify/","summary":"تبدیل یک slice نامرتب به heap در جا و در O(n)، با پایین‌بردن گره‌ها از آخرین والد تا ریشه.","title":"Heapify"},{"content":"یک اتصال TCP نیمه‌مرده می‌تواند مدت‌ها باز به نظر برسد. اگر ping تا پیش از deadline pong نگیرد، طرف مقابل رفته حساب می‌شود و اتصال بسته می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/heartbeat/","summary":"پیام کوچک و دوره‌ای (مثل ping) برای فهمیدن اینکه طرف مقابل هنوز زنده است.","title":"Heartbeat"},{"content":"کلاینت زمان کوتاهی (نزدیک تأخیر معمول) صبر می‌کند و همان درخواست را جای دیگری می‌فرستد. موارد کند را کم می‌کند، به قیمت کمی بار اضافه، و عملیات باید اجرای دوباره را تحمل کند (idempotency).\n","permalink":"https://justroham.ir/fa/glossary/hedged-request/","summary":"ارسال نسخه‌ی دوم یک درخواست کند به replica دیگر و استفاده از اولین پاسخ.","title":"Hedged request"},{"content":"سینتکس پوسته (\u0026lt;\u0026lt;EOT) که خط‌های بعدی را به stdin دستور می‌دهد. marker داخل quote (\u0026lt;\u0026lt;'EOT') باز شدن متغیرها را خاموش می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/here-document/","summary":"سینتکس پوسته (\u003ccode\u003e\u0026lt;\u0026lt;EOT\u003c/code\u003e) که خط‌های بعدی را به stdin دستور می‌دهد. marker داخل quote (\u003ccode\u003e\u0026lt;\u0026lt;’EOT’\u003c/code\u003e) باز شدن متغیرها را خاموش می‌کند.","title":"Here-document"},{"content":"هر stream یک highWaterMark دارد. وقتی مقدار بافرشده به آن برسد، write() مقدار false برمی‌گرداند و backpressure شروع می‌شود. این یک آستانه است، نه سقف سخت.\n","permalink":"https://justroham.ir/fa/glossary/high-water-mark/","summary":"اندازه‌ی بافری که از آن به بعد stream از تولیدکننده می‌خواهد آهسته‌تر شود (برای Writable پیش‌فرض 16 KiB).","title":"highWaterMark"},{"content":"نوشتن‌ها را در قطعی کوتاه موفق نگه می‌دارد. node دارای hint یکی از replicaهای واقعی کلید نیست، پس به آن sloppy quorum می‌گویند و تضمین هم‌پوشانی quorum را ضعیف می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/hinted-handoff/","summary":"وقتی یک replica از کار افتاده، node دیگری نوشتن‌های آن را با یک hint نگه می‌دارد و بعد از برگشتنش تحویل می‌دهد.","title":"Hinted handoff"},{"content":"در Go: hmac.New(sha256.New, key)، نوشتن پیام و Sum(nil). برچسب‌ها را با hmac.Equal مقایسه کنید.\n","permalink":"https://justroham.ir/fa/glossary/hmac/","summary":"کد احراز پیام ساخته‌شده از هش و کلید مخفی؛ برخلاف sha256(secret||msg) در برابر length extension مقاوم است.","title":"HMAC"},{"content":"عوض کردن hash کمکی نمی‌کند چون همان کلید همیشه به همان shard می‌رود. راه رایج، شکستن کلید با یک پسوند (salt) است که نوشتن را پخش می‌کند ولی خواندن باید همه‌ی پسوندها را بخواند.\n","permalink":"https://justroham.ir/fa/glossary/hot-key/","summary":"کلیدی که آن‌قدر ترافیک می‌گیرد که shard صاحبش حتی با پخش یکنواخت بقیه‌ی کلیدها زیر بار می‌ماند.","title":"Hot key"},{"content":"به جای خالی در همان صفحه نیاز دارد. n_tup_hot_upd در pg_stat_user_tables تعدادشان را می‌شمارد.\n","permalink":"https://justroham.ir/fa/glossary/hot-update/","summary":"Heap-Only Tuple: نسخه‌ی جدید در همان صفحه ذخیره می‌شود و ورودی جدیدی در ایندکس نمی‌گیرد؛ وقتی ممکن است که ستون ایندکس‌شده تغییر نکند.","title":"HOT update"},{"content":"کلاینت و سرور جدولی از header‌هایی که روی اتصال فرستاده شده نگه می‌دارند. header تکراری مثل یک cookie بلند به‌جای متن کامل، با یک اندیس کوچک از جدول فرستاده می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/hpack/","summary":"روش فشرده‌سازی header در HTTP/2.","title":"HPACK"},{"content":"طبق مشخصاتش روی HTTP ساده نادیده گرفته می‌شود، پس فقط در پاسخ‌های HTTPS اهمیت دارد.\n","permalink":"https://justroham.ir/fa/glossary/hsts/","summary":"هدری که به مرورگر می‌گوید تا مدتی فقط با HTTPS به این سایت وصل شود.","title":"HSTS"},{"content":"HTTP/1.1 یک پروتکل متنی است: خط درخواست، چند خط header، یک خط خالی و در صورت لزوم body که همه با CRLF جدا می‌شوند. سرور با خط وضعیت، header، خط خالی و body جواب می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/http/","summary":"پروتکل متنی درخواست و پاسخ که معمولاً روی TCP حمل می‌شود.","title":"HTTP"},{"content":"ریدایرکت پاسخی مثل 301 یا 302 با هدر Location است. کلاینت باید درخواست تازه‌ای به آن URL بفرستد؛ curl این کار را فقط با -L می‌کند. نگاه کنید به HTTP.\n","permalink":"https://justroham.ir/fa/glossary/http-redirect/","summary":"ریدایرکت پاسخ 3xx با هدر Location است که به کلاینت می‌گوید URL دیگری را بخواهد.","title":"HTTP redirect"},{"content":"تریلرها بلوک دوم هدرها هستند که بعد از body می‌آید. HTTP/2 اجازه‌ی آن را روی هر پاسخ می‌دهد. gRPC از آن برای grpc-status و grpc-message استفاده می‌کند، چون نتیجه‌ی یک فراخوانی بعد از فرستادن آخرین پیام معلوم می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/http-trailers/","summary":"فیلدهای هدری که بعد از body فرستاده می‌شوند، وقتی نتیجه‌ی نهایی معلوم شده است.","title":"HTTP trailers"},{"content":"کلاینت Upgrade: websocket و Connection: Upgrade می‌فرستد. اگر سرور موافق باشد 101 Switching Protocols برمی‌گرداند و از آن لحظه بایت‌های آن اتصال دیگر HTTP نیستند.\n","permalink":"https://justroham.ir/fa/glossary/http-upgrade/","summary":"درخواستی که از سرور می‌خواهد اتصال را به پروتکل دیگری ببرد (پاسخ 101 Switching Protocols).","title":"HTTP Upgrade"},{"content":"مرورگر کوکی را همچنان با درخواست‌ها می‌فرستد، ولی document.cookie نمی‌تواند آن را بخواند؛ پس یک باگ XSS به‌سادگی کوکی نشست را نمی‌دزدد.\n","permalink":"https://justroham.ir/fa/glossary/httponly/","summary":"ویژگی کوکی که آن را از JavaScriptِ داخل صفحه پنهان می‌کند.","title":"HttpOnly"},{"content":"کدگذاری Huffman با یک priority queue مدام دو نماد کم‌تکرارتر را ادغام می‌کند و درختی می‌سازد که مسیرهایش همان کدهاست. هیچ کدی پیشوند کد دیگر نیست، پس رشته‌بیت بدون ابهام رمزگشایی می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/huffman-coding/","summary":"کد پیشوندی greedy که نمادهای پرتکرار را با رشته‌بیت کوتاه‌تر می‌نویسد.","title":"Huffman coding"},{"content":"diff یک فایل می‌تواند چند hunk داشته باشد که هرکدام با خطی شروع می‌شود که @@ دارد. git add -p اجازه می‌دهد آن‌ها را یکی‌یکی stage کنید.\n","permalink":"https://justroham.ir/fa/glossary/hunk/","summary":"یک بلوک پیوسته از تغییرها داخل diff.","title":"Hunk"},{"content":"سازشی عملی است که بعضی دیتابیس‌ها به کار می‌برند؛ این وبلاگ فقط نامش را می‌آورد و اجرایش نکرده است.\n","permalink":"https://justroham.ir/fa/glossary/hybrid-logical-clock/","summary":"timestampی که زمان فیزیکی را با یک شمارنده‌ی منطقی ترکیب می‌کند؛ نزدیک به زمان واقعی و سازگار با علّیت.","title":"Hybrid logical clock"},{"content":"هزینه‌اش واکنش کندتر است: بیرون‌انداختن instance واقعاً مرده به‌اندازه‌ی آستانه probe می‌برد.\n","permalink":"https://justroham.ir/fa/glossary/hysteresis/","summary":"لازم‌کردن چند probe پشت‌سرهم قبل از تغییر حالت، تا instance ناپایدار مدام وارد و خارج چرخش نشود.","title":"Hysteresis"},{"content":"کار وابسته به I/O بیشتر منتظر است، مثلاً منتظر پاسخ یک سرویس بالادستی. event loop یا تعداد زیادی goroutine می‌توانند هزاران انتظار را ارزان هم‌پوشانی کنند.\n","permalink":"https://justroham.ir/fa/glossary/io-bound/","summary":"کاری که بیشتر زمانش صرف انتظار برای شبکه یا دیسک می‌شود، نه محاسبه.","title":"I/O-bound"},{"content":"ICMP پروتکل پیام‌های کنترلی IP است و برای خطاهایی مثل port unreachable به کار می‌رود. وقتی datagram به میزبانی می‌رسد که روی آن port یو‌دی‌پی کسی گوش نمی‌دهد، میزبان ممکن است با پیام ICMP port-unreachable جواب بدهد.\n","permalink":"https://justroham.ir/fa/glossary/icmp/","summary":"ICMP پروتکل پیام‌های کنترلی IP است و برای خطاهایی مثل port unreachable به کار می‌رود.","title":"ICMP"},{"content":"سیستم‌های پیام با تحویل at-least-once ممکن است پیام را دوباره تحویل بدهند، پس handlerها باید تکرار را تحمل کنند. روش‌های رایج: کلید idempotency در دیتابیس، unique constraint، یا deduplication با Nats-Msg-Id در JetStream سمت ناشر.\n","permalink":"https://justroham.ir/fa/glossary/idempotency/","summary":"پردازش چندباره‌ی یک عملیات همان اثر پردازش یک‌باره را دارد.","title":"Idempotency"},{"content":"سرور کلید را همراه نتیجه‌ی اجرای اول نگه می‌دارد. درخواستی که دوباره با همان کلید برسد (retry بعد از timeout، دوبار کلیک) همان جواب ذخیره‌شده را می‌گیرد و چیزی تغییر نمی‌کند. ببینید idempotency.\n","permalink":"https://justroham.ir/fa/glossary/idempotency-key/","summary":"شناسه‌ی یکتایی که کلاینت همراه درخواست می‌فرستد تا سرور تکرار را تشخیص بدهد و به‌جای اجرای دوباره، نتیجه‌ی اول را برگرداند.","title":"Idempotency key"},{"content":"در pg_stat_activity به شکل state = 'idle in transaction' دیده می‌شود: BEGIN فرستاده شده و برنامه دیگر statement نمی‌فرستد. این connection قابل استفاده‌ی دوباره نیست و قفل‌ها و snapshot نگه داشته می‌شوند. idle_in_transaction_session_timeout چنین جلسه‌هایی را می‌بندد. ← transaction.\n","permalink":"https://justroham.ir/fa/glossary/idle-in-transaction/","summary":"جلسه‌ای که transaction باز کرده و کاری نمی‌کند، ولی هنوز connection و قفل‌هایش را نگه داشته.","title":"Idle in transaction"},{"content":"مثال: GET /orders/2 سفارش باب را به آلیس می‌دهد. راه‌حل بررسی مالکیت در سرور برای هر خواندن است.\n","permalink":"https://justroham.ir/fa/glossary/idor/","summary":"IDOR (ارجاع مستقیم ناامن به شیء): endpoint شیء را با شناسه‌اش برمی‌گرداند بی‌آنکه بررسی کند فراخواننده اجازه‌ی دیدنش را دارد.","title":"IDOR"},{"content":"الگوریتم Kahn برای هر رأس یک شمارنده‌ی in-degree نگه می‌دارد. رأس با in-degree برابر ۰ پیش‌نیاز تمام‌نشده ندارد و آماده است.\n","permalink":"https://justroham.ir/fa/glossary/in-degree/","summary":"تعداد یال‌هایی که به یک رأس وارد می‌شوند؛ در گراف وابستگی یعنی چند پیش‌نیاز هنوز مانده است.","title":"In-degree"},{"content":"NIST SP 800-61 چرخه را این‌طور شرح می‌دهد: آمادگی، شناسایی و تحلیل، مهار، ریشه‌کنی و بازیابی، و فعالیت پس از حادثه. آمادگی تنها بخشی است که فقط پیش از حادثه شدنی است.\n","permalink":"https://justroham.ir/fa/glossary/incident-response/","summary":"فرایند سازمان‌یافته‌ی شناسایی، مهار، حذف و یادگیری از یک حادثه‌ی امنیتی.","title":"Incident response"},{"content":"هنوز visibility map را چک می‌کند؛ برای صفحه‌هایی که all-visible نیستند ردیف جدول را می‌خواند (در خروجی Heap Fetches).\n","permalink":"https://justroham.ir/fa/glossary/index-only-scan/","summary":"یک node در plan که کوئری را فقط از ایندکس جواب می‌دهد، بی‌آنکه سراغ جدول برود.","title":"Index Only Scan"},{"content":"بلوک کامنت # /// script شامل TOML است، مثلاً dependencies = [...]. ابزارهایی مثل uv run script.py آن را می‌خوانند، یک محیط کش‌شده می‌سازند و اسکریپت را اجرا می‌کنند؛ پس یک فایل می‌تواند نیازمندی‌هایش را با خودش حمل کند.\n","permalink":"https://justroham.ir/fa/glossary/inline-script-metadata/","summary":"PEP 723: بلوک کامنت بالای یک اسکریپت تک‌فایلی که وابستگی‌ها و نسخه‌ی Python را فهرست می‌کند.","title":"inline script metadata"},{"content":"رکوردی در سیستم فایل که فراداده‌ی فایل (مالک، مجوز، اندازه، تعداد لینک) و محل داده‌اش را نگه می‌دارد. نام فایل در پوشه فقط به شماره‌ی inode اشاره می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/inode/","summary":"رکوردی در سیستم فایل که فراداده‌ی فایل (مالک، مجوز، اندازه، تعداد لینک) و محل داده‌اش را نگه می‌دارد. نام فایل در پوشه فقط به شماره‌ی inode اشاره می‌کند.","title":"Inode"},{"content":"وقتی نتیجه‌ی محاسبه در نوع عدد صحیح جا نمی‌شود. در Go عددهای علامت‌دار بی‌صدا دور می‌زنند، پس جمع دو عدد مثبت بزرگ می‌تواند منفی شود.\n","permalink":"https://justroham.ir/fa/glossary/integer-overflow/","summary":"نتیجه‌ای که در نوع عدد صحیح جا نمی‌شود؛ در Go بی‌صدا دور می‌زند.","title":"Integer overflow"},{"content":"بررسی می‌کند که بخش‌ها درست به هم وصل می‌شوند. از تست واحد کندتر است و وقتی شکست می‌خورد کمتر دقیق می‌گوید مشکل کجاست، اما اشتباه‌های اتصال را می‌گیرد. می‌تواند به‌جای دیتابیس واقعی از fake استفاده کند.\n","permalink":"https://justroham.ir/fa/glossary/integration-test/","summary":"تستی که چند بخش را با هم اجرا می‌کند، مثل یک service همراه repository.","title":"Integration test"},{"content":"شرطی که قبل و بعد از هر دور حلقه درست است. آن را می‌نویسید، نشان می‌دهید در شروع برقرار است، هر قدم آن را حفظ می‌کند و وقتی حلقه تمام شد نتیجه از آن درمی‌آید.\n","permalink":"https://justroham.ir/fa/glossary/invariant/","summary":"شرطی که قبل و بعد از هر دور حلقه برقرار است و برای اثبات درستی الگوریتم به کار می‌رود.","title":"Invariant"},{"content":"شامل ip (آدرس، لینک، مسیر، همسایه، namespace) و ss (سوکت‌ها) است.\n","permalink":"https://justroham.ir/fa/glossary/iproute2/","summary":"مجموعه‌ی ابزار شبکه‌ی Linux که با دستور ip کار می‌کند.","title":"iproute2"},{"content":"آدرس IPv6 ۱۲۸ بیت است و به‌صورت گروه‌های hex نوشته می‌شود؛ یک دنباله از گروه‌های صفر را می‌شود با :: فشرده کرد. زیرشبکه‌ی LAN معمولاً /64 است و multicast جای broadcast را می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/ipv6/","summary":"IPv6 جانشین ۱۲۸ بیتی IPv4 است، با نمایش hex، زیرشبکه‌های /64 و بدون broadcast.","title":"IPv6"},{"content":"استاندارد SQL چهار سطح READ UNCOMMITTED، READ COMMITTED، REPEATABLE READ و SERIALIZABLE را نام می‌برد. سطح قوی‌تر ناهنجاری‌های بیشتری را ممنوع می‌کند، اما تراکنش‌های بیشتری ممکن است abort شوند. پیش‌فرض PostgreSQL برابر READ COMMITTED است.\n","permalink":"https://justroham.ir/fa/glossary/isolation-level/","summary":"تنظیمی که تعیین می‌کند یک تراکنش چقدر از کارِ تراکنش‌های هم‌زمان را ببیند.","title":"Isolation level"},{"content":"شیئی که متد next دارد؛ هر بار مقدار بعدی را برمی‌گرداند و در پایان StopIteration می‌اندازد.\n","permalink":"https://justroham.ir/fa/glossary/iterator/","summary":"شیئی که با \u003cstrong\u003enext\u003c/strong\u003e مقدار بعدی را می‌دهد و در پایان StopIteration می‌اندازد","title":"Iterator"},{"content":"NATS هسته‌ای fire-and-forget است. JetStream ذخیره‌سازی ماندگار، acknowledgement، replay و تضمین تحویل اضافه می‌کند. یک stream subjectها را ضبط می‌کند و یک durable consumer پیشرفت خواندن را نگه می‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/jetstream/","summary":"لایه‌ی ماندگاری NATS: streamهایی که پیام را ذخیره می‌کنند و consumerهایی که آن‌ها را می‌خوانند.","title":"JetStream"},{"content":"در full jitter فاصله به‌صورت یکنواخت در [0, backoff] انتخاب می‌شود؛ در equal jitter نیمی از backoff ثابت و بقیه تصادفی است. هر دو retry‌های کلاینت‌های زیاد را در زمان پخش می‌کنند. بک‌آف نمایی را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/jitter/","summary":"تصادف اضافه‌شده به فاصله‌ی retry تا کلاینت‌ها هم‌زمان تلاش نکنند.","title":"Jitter"},{"content":"INNER JOIN فقط سطرهای منطبق در هر دو طرف را نگه می‌دارد. LEFT JOIN همه‌ی سطرهای سمت چپ را نگه می‌دارد و اگر چیزی منطبق نباشد سمت راست را NULL می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/sql-join/","summary":"ترکیب سطرهای دو جدول بر اساس یک شرط تطابق.","title":"JOIN"},{"content":"ژورنال را با journalctl می‌خوانید، مثلاً journalctl -u myservice برای یک واحد. سرویس فقط کافی است در stdout یا stderr بنویسد و ژورنال آن را ثبت می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/journald/","summary":"سرویس systemd که لاگ سرویس‌ها و کرنل را در یک ژورنال ساختاریافته جمع می‌کند.","title":"journald"},{"content":"یک schema می‌گوید مثلاً «این یک object است، qty عدد صحیح و دست‌کم ۱ است و item اجباری است». Fastify آن را یک بار کامپایل می‌کند و برای رد ورودی بد و ساخت خروجی از آن استفاده می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/json-schema/","summary":"توصیفی استاندارد از شکل یک سند JSON که کتابخانه با آن به‌طور خودکار اعتبارسنجی می‌کند.","title":"JSON Schema"},{"content":"برخلاف json ساده، jsonb ترتیب کلیدها و کلید تکراری را نگه نمی‌دارد، ولی عملگرهایی مثل @\u0026gt; (شامل بودن) و ? (وجود کلید) و ایندکس GIN را پشتیبانی می‌کند. تا قید (constraint) نگذارید، JSONB نه schema دارد نه بررسی نوع. ایندکس GIN را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/jsonb/","summary":"نوع ستونی در PostgreSQL که JSON را به شکل باینری پارس‌شده نگه می‌دارد و می‌شود رویش ایندکس ساخت و کوئری زد.","title":"JSONB"},{"content":"هر کلید یک kid دارد که هدر توکن آن را نام می‌برد؛ همین چرخش کلید را بدون تغییر کلاینت‌ها ممکن می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/jwks/","summary":"سند JSON، معمولاً در /jwks.json، که کلیدهای عمومی لازم برای راستی‌آزمایی توکن‌های امضاشده‌ی یک issuer را منتشر می‌کند.","title":"JWKS"},{"content":"هر کسی payload را می‌خواند؛ فقط امضا جلوی تغییر را می‌گیرد. تا exp معتبر می‌ماند مگر سرور وضعیت اضافه نگه دارد.\n","permalink":"https://justroham.ir/fa/glossary/jwt/","summary":"توکن امضاشده (header.payload.signature) که claimها را حمل می‌کند؛ امضا شده، رمزنگاری نشده.","title":"JWT"},{"content":"در keep-alive بعد از پاسخ، اتصال باز می‌ماند تا درخواست بعدی از همان استفاده کند. سرور بعد از مدتی بی‌کاری آن را می‌بندد (در Node.js با keepAliveTimeout).\n","permalink":"https://justroham.ir/fa/glossary/keep-alive/","summary":"استفاده‌ی مجدد از یک اتصال TCP برای چند درخواست HTTP، به‌جای باز کردن اتصال تازه برای هرکدام.","title":"Keep-alive"},{"content":"نوع کند (scrypt، Argon2id) برای رمز عبور است و نوع سریع (HKDF) برای رازهای از قبل قوی. رمز عبور خودش هرگز کلید نیست.\n","permalink":"https://justroham.ir/fa/glossary/key-derivation-function/","summary":"تابعی که رمز عبور یا راز اصلی را به کلیدهای تصادفی یکنواخت با طول لازم تبدیل می‌کند.","title":"Key derivation function"},{"content":"کنار هر متن رمزشده یک شناسه‌ی کلید نگه دارید تا چند کلید هم‌زمان کار کنند. پس از لو رفتن، اول بچرخانید (کلید قدیمی دیگر امن نیست) و بعد پاکسازی کنید.\n","permalink":"https://justroham.ir/fa/glossary/key-rotation/","summary":"جایگزین کردن کلید با کلید جدید به‌صورت دوره‌ای یا پس از لو رفتن، بدون از دست رفتن داده‌ی قدیمی.","title":"Key rotation"},{"content":"کلاینت کلید مرتب‌سازی آخرین ردیفی را که دیده می‌فرستد (معمولاً داخل یک cursor مبهم) و سرور ردیف‌های بعد از آن را برمی‌گرداند. درج و حذف قبل از آن نقطه صفحه‌ی بعد را جابه‌جا نمی‌کند، و با index روی کلید مرتب‌سازی ردیف‌های ردشده اسکن نمی‌شوند. pagination را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/keyset-pagination/","summary":"صفحه‌بندی با «ردیف‌های بعد از این کلید» به‌جای «N ردیف را رد کن».","title":"Keyset pagination"},{"content":"کلید اضطراری پرچمی است که بر همه‌ی قاعده‌های دیگر غالب می‌شود و ویژگی را برای همه خاموش می‌کند. چون deploy نمی‌خواهد، وقتی مسیر تازه در production خراب می‌کند سریع‌ترین واکنش اول است.\n","permalink":"https://justroham.ir/fa/glossary/kill-switch/","summary":"پرچمی که فقط برای خاموش کردن فوری یک ویژگی است.","title":"Kill switch"},{"content":"KMP (Knuth–Morris–Pratt) متن را با O(n + m) مقایسه جست‌وجو می‌کند. پس از ناهم‌خوانی، از ساختار پیشوندیِ خودِ الگو تصمیم می‌گیرد چه مقدار از تطابق را نگه دارد.\n","permalink":"https://justroham.ir/fa/glossary/kmp-algorithm/","summary":"جست‌وجوی رشته با یک تابع شکست از پیش محاسبه‌شده، به‌طوری که اشاره‌گر متن هرگز عقب نمی‌رود.","title":"KMP algorithm"},{"content":"در نسخه‌ی 0/1 هر قلم حداکثر یک بار استفاده می‌شود و در نسخه‌ی نامحدود هر تعداد بار.\n","permalink":"https://justroham.ir/fa/glossary/knapsack/","summary":"انتخاب اقلام با وزن و ارزش برای بیشینه کردن ارزش در ظرفیت وزنی مشخص.","title":"Knapsack problem"},{"content":"اتصال اول «اعتماد در اولین استفاده» است: اثرانگشت را می‌پذیرید و ذخیره می‌شود. اگر بعداً فرق کند، ssh درباره‌ی تغییر هویت میزبان هشدار می‌دهد. نام میزبان‌ها را می‌شود با ssh-keygen -H هش کرد.\n","permalink":"https://justroham.ir/fa/glossary/known-hosts/","summary":"فایل سمت کلاینت از کلیدهای میزبان مورد اعتماد، برای تشخیص سرور تغییرکرده یا جعلی.","title":"known_hosts"},{"content":"kqueue() یک صف می‌سازد و kevent() هم علاقه‌مندی را ثبت می‌کند و هم رویدادهای آماده را می‌گیرد. runtime در Go روی macOS و BSDها از آن برای poll شبکه استفاده می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/kqueue/","summary":"رابط اعلان رویداد در BSD و macOS، هم‌خانواده‌ی epoll در Linux.","title":"kqueue"},{"content":"عکسش درست نیست: timestamp کوچک‌تر یعنی happens-before نیست، پس ساعت Lamport هم‌زمانی را تشخیص نمی‌دهد. برای ترتیب کلی معمولاً تساوی با شناسه‌ی process شکسته می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/lamport-clock/","summary":"یک شمارنده برای هر process که با هر رویداد زیاد می‌شود و هنگام receive با max ادغام می‌شود، تا «a پیش از b» یعنی timestamp کوچک‌تر.","title":"Lamport clock"},{"content":"ساده است، ولی با ساعت‌های ناهمگام ممکن است نوشتنی که واقعاً تازه‌تر است timestamp کوچک‌تری داشته باشد و بی‌صدا از بین برود.\n","permalink":"https://justroham.ir/fa/glossary/last-write-wins/","summary":"قاعده‌ای برای حل تعارض که مقدار با بزرگ‌ترین timestamp را نگه می‌دارد و بقیه را دور می‌ریزد.","title":"Last write wins"},{"content":"closure نام متغیر را موقع اجرا پیدا می‌کند، پس آخرین مقدار متغیر را می‌بیند.\n","permalink":"https://justroham.ir/fa/glossary/late-binding/","summary":"نام متغیر در لحظه‌ی اجرا حل می‌شود، نه موقع ساختن closure","title":"Late binding"},{"content":"حذف یا ویرایش نکردن عنصر قدیمی؛ عنصر تازه را می‌گذاریم و هنگام pop عنصر کهنه را رد می‌کنیم.\nدر heap برای Dijkstra رایج است: از decrease-key ساده‌تر است، به قیمت عنصرهای اضافه.\n","permalink":"https://justroham.ir/fa/glossary/lazy-deletion/","summary":"حذف یا ویرایش نکردن عنصر قدیمی؛ عنصر تازه را می‌گذاریم و هنگام pop عنصر کهنه را رد می‌کنیم.","title":"Lazy deletion"},{"content":"محاسبه‌ی مقدار فقط وقتی که واقعاً لازم است، نه از قبل.\n","permalink":"https://justroham.ir/fa/glossary/lazy-evaluation/","summary":"محاسبه‌ی مقدار فقط وقتی واقعاً لازم شود","title":"Lazy evaluation"},{"content":"مثال: ABCBDAB و BDCABA دنباله‌ی مشترک BCBA دارند. با جدول دوبعدی در O(n*m) حل می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/longest-common-subsequence/","summary":"بلندترین دنباله‌ای که در هر دو ورودی با همان ترتیب می‌آید، نه لزوماً پیوسته.","title":"LCS"},{"content":"followerهایی که heartbeat نمی‌شنوند در لحظه‌های تصادفی timeout می‌شوند، پس معمولاً یک candidate زودتر شروع می‌کند و برنده می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/leader-election/","summary":"انتخاب یک node برای هماهنگی در یک بازه؛ در Raft یک candidate در یک term تازه به رأی اکثریت نیاز دارد.","title":"Leader election"},{"content":"در rate limit یک replica تعداد B توکن از store مشترک اجاره می‌کند و محلی خرج می‌کند؛ تماس کمتر با store در برابر پذیرش بیش از حدِ محدود.\n","permalink":"https://justroham.ir/fa/glossary/lease/","summary":"واگذاری یک منبع یا سهمیه به یک نگهدارنده برای سهم یا زمان محدود.","title":"Lease"},{"content":"به پروسه یا آدم فقط دسترسی لازم برای کار را بده و بیشتر نه، تا اشتباه یا نفوذ دامنه‌ی کوچکی داشته باشد.\n","permalink":"https://justroham.ir/fa/glossary/least-privilege/","summary":"به پروسه یا آدم فقط دسترسی لازم برای کار را بده و بیشتر نه، تا اشتباه یا نفوذ دامنه‌ی کوچکی داشته باشد.","title":"Least privilege"},{"content":"در این معنا (که کتاب مایکل فدرز درباره‌ی این موضوع رایجش کرد) سن کد مهم نیست: کدی که هفته‌ی پیش بدون تست نوشته شده همین حالا legacy است. اولین کار گذاشتن آن زیر تست است، نه قشنگ کردنش.\n","permalink":"https://justroham.ir/fa/glossary/legacy-code/","summary":"تعریف رایج و کاربردی: کدی که تست ندارد و بنابراین نمی‌توان با اطمینان تغییرش داد.","title":"Legacy code"},{"content":"از نحوه‌ی نگه‌داشتن حالت داخلی در هش‌های Merkle-Damgard می‌آید. HMAC راه‌حل استاندارد است.\n","permalink":"https://justroham.ir/fa/glossary/length-extension-attack/","summary":"حمله‌ای به هش‌هایی مثل SHA-256 که با دانستن H(secret||msg) می‌توان بدون راز، H(secret||msg||extra) را ساخت.","title":"Length extension attack"},{"content":"level-triggered تا وقتی داده‌ی نخوانده مانده در هر انتظار descriptor را آماده گزارش می‌کند. edge-triggered فقط یک بار به ازای هر تغییر گزارش می‌دهد، پس باید تا EAGAIN بخوانید وگرنه گیر می‌کنید. در kqueue رفتار شبه‌edge از EV_CLEAR می‌آید.\n","permalink":"https://justroham.ir/fa/glossary/edge-level-triggered/","summary":"دو روش گزارش آمادگی: تا وقتی داده منتظر است (level) یا فقط هنگام رسیدن داده‌ی تازه (edge).","title":"Level-triggered and edge-triggered"},{"content":"Node.js با libuv بدون بلاک کردن thread جاوااسکریپت با سیستم‌عامل کار می‌کند. libuv بعضی کارها (فایل، crypto، DNS lookup) را هم در thread pool خودش اجرا می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/libuv/","summary":"کتابخانه‌ی C زیر Node.js که event loop، I/O ناهمگام و thread pool را فراهم می‌کند.","title":"libuv"},{"content":"در Fastify مرحله‌ها با ترتیب ثابت اجرا می‌شوند: onRequest، preValidation، preHandler، handler و بعد onSend. hookها جای کارهای مشترک مثل request ID یا هدرها هستند.\n","permalink":"https://justroham.ir/fa/glossary/lifecycle-hook/","summary":"تابعی که فریم‌ورک در مرحله‌ای ثابت از عمر یک درخواست صدا می‌زند، مثلاً پیش از اجرای handler.","title":"Lifecycle hook"},{"content":"lifetimeهایی مثل 'a هیچ‌وقت طول عمر داده را تغییر نمی‌دهند؛ فقط به کامپایلر اجازه می‌دهند بررسی کند reference از چیزی که به آن اشاره می‌کند بیشتر زنده نمی‌ماند. بیشترشان خودکار استنتاج می‌شوند (elision) و وقتی تابع referenceای برمی‌گرداند که به یکی از چند ورودی وابسته است، باید صریح بنویسید.\nfn longest\u0026lt;\u0026#39;a\u0026gt;(x: \u0026amp;\u0026#39;a str, y: \u0026amp;\u0026#39;a str) -\u0026gt; \u0026amp;\u0026#39;a str { if x.len() \u0026gt; y.len() { x } else { y } } ","permalink":"https://justroham.ir/fa/glossary/lifetime/","summary":"یک annotation زمان کامپایل که مشخص می‌کند یک reference تا کی معتبر است.","title":"Lifetime"},{"content":"چون خانه‌های همسایه کنار هم در حافظه‌اند cache-friendly است، اما کلیدهای هم‌برخورد خوشه می‌سازند و جست‌وجوهای بعدی را طولانی‌تر می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/linear-probing/","summary":"راهبردی در open addressing: اگر خانه پُر است خانه‌ی بعدی و بعدی را امتحان کن تا خانه‌ی خالی یا کلید پیدا شود.","title":"Linear probing"},{"content":"C در CAP همین است. خواندنی که بعد از تمام شدن یک نوشتن شروع شود باید آن نوشتن را ببیند. قضیه‌ی CAP را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/linearizability/","summary":"هر عملیات انگار در یک لحظه بین شروع و پایانش اثر می‌گذارد، گویی فقط یک نسخه از داده وجود دارد.","title":"Linearizability"},{"content":"دنباله‌ای از node های جدا از هم که هرکدام یک مقدار و یک اشاره‌گر به node بعدی دارند (در لیست دوپیوندی اشاره‌گر به قبلی هم هست). درج یا حذف کنار node ای که در دست داریم O(1) است، ولی رسیدن به عنصر i‌ام یعنی دنبال کردن i اشاره‌گر. مقایسه کنید با آرایه‌ی پویا.\n","permalink":"https://justroham.ir/fa/glossary/linked-list/","summary":"دنباله‌ای از node های جدا از هم که هرکدام یک مقدار و یک اشاره‌گر به node بعدی (و گاهی قبلی) دارند. برش و اتصال ارزان، دسترسی با اندیس کند.","title":"Linked list"},{"content":"کرنل قدرت‌های root را به واحدهای جدا مثل CAP_NET_BIND_SERVICE یا CAP_CHOWN تقسیم می‌کند تا یک پروسه فقط همان‌هایی را داشته باشد که لازم دارد.\n","permalink":"https://justroham.ir/fa/glossary/linux-capabilities/","summary":"کرنل قدرت‌های root را به واحدهای جدا مثل CAP_NET_BIND_SERVICE یا CAP_CHOWN تقسیم می‌کند تا یک پروسه فقط همان‌هایی را داشته باشد که لازم دارد.","title":"Linux capabilities"},{"content":"عبارتی در Python که از یک iterable در یک خط لیست می‌سازد، مثل [x * x for x in data if x % 2 == 0].\n","permalink":"https://justroham.ir/fa/glossary/list-comprehension/","summary":"عبارتی در Python که از یک iterable در یک خط لیست می‌سازد، مثل [x * x for x in data if x % 2 == 0].","title":"List comprehension"},{"content":"listen(fd, n) به کرنل یک صف می‌دهد برای اتصال‌هایی که handshake را کامل کرده‌اند ولی هنوز با accept() برداشته نشده‌اند. اینکه با پُرشدن صف چه می‌شود (SYN دور ریخته می‌شود، reset یا refuse) به سیستم‌عامل بستگی دارد.\n","permalink":"https://justroham.ir/fa/glossary/listen-backlog/","summary":"اندازه‌ی صف کرنل برای اتصال‌های منتظر accept().","title":"Listen backlog"},{"content":"اگر تیمی روزی ۰٫۶ آیتم تمام کند و هر کدام ۵ روز طول بکشد، حدود ۳ آیتم در جریان است. برای کم کردن cycle time بدون افت throughput، کار در جریان را کم کنید.\n","permalink":"https://justroham.ir/fa/glossary/littles-law/","summary":"در سیستم پایدار، میانگین WIP برابر throughput ضرب در میانگین cycle time است.","title":"Little's law"},{"content":"importی در ES module که به خودِ متغیرِ ماژول صادرکننده اشاره می‌کند، نه به یک کپی از مقدارش. اگر ماژول صادرکننده export let count را تغییر دهد، همه‌ی importکننده‌ها مقدار جدید را می‌بینند. importکننده نمی‌تواند به آن مقدار بدهد.\n","permalink":"https://justroham.ir/fa/glossary/live-binding/","summary":"importی در ES module که به خودِ متغیرِ ماژول صادرکننده اشاره می‌کند، نه به یک کپی از مقدارش.","title":"Live binding"},{"content":"عددی که uptime سه بار نشان می‌دهد: میانگین تعداد کارهای آماده‌ی اجرا در ۱، ۵ و ۱۵ دقیقه. باید آن را با تعداد هسته‌ها مقایسه کرد؛ تعریف دقیقش در Linux و macOS یکی نیست.\n","permalink":"https://justroham.ir/fa/glossary/load-average/","summary":"میانگین تعداد پروسه‌های آماده‌ی اجرا (و در Linux منتظر دیسک) در ۱، ۵ و ۱۵ دقیقه‌ی اخیر.","title":"Load average"},{"content":"load balancer جلوی چند backend یکسان می‌نشیند و برای هر اتصال (لایه‌ی ۴) یا هر درخواست (لایه‌ی ۷) یکی را انتخاب می‌کند. backendهای خراب را هم از چرخه بیرون می‌برد.\n","permalink":"https://justroham.ir/fa/glossary/load-balancer/","summary":"پخش‌کننده‌ی ترافیک ورودی بین چند سرور backend.","title":"Load balancer"},{"content":"جدولی با ۷۵ عنصر در ۱۰۰ خانه ضریب بار ۰٫۷۵ دارد. در open addressing با نزدیک شدن به ۱ طول متوسط probe به‌شدت بالا می‌رود، برای همین پیاده‌سازی‌ها خیلی زودتر جدول را بزرگ می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/load-factor/","summary":"نسبت پُر بودن جدول هش: تعداد عنصرها تقسیم بر تعداد خانه‌ها. از یک آستانه بیشتر که شود جدول در جدول بزرگ‌تری دوباره hash می‌شود.","title":"Load factor"},{"content":"صف یا pool محدود وقتی پر شد به‌جای رشد بی‌پایان صف، 503 یا 429 برمی‌گرداند. برای کلاینت، یک رد سریع و صادقانه معمولاً بهتر از پاسخ کندی است که بعد از timeout می‌رسد.\n","permalink":"https://justroham.ir/fa/glossary/load-shedding/","summary":"رد کردن زودهنگام بعضی درخواست‌ها تا بقیه به‌موقع سرویس بگیرند.","title":"Load shedding"},{"content":"بعضی عملیات نباید هم‌زمان اجرا شوند. قفل باعث می‌شود session دوم صبر کند (یا زود خطا بگیرد) تا اولی commit یا rollback کند. در PostgreSQL قفل‌ها تا پایان تراکنش نگه داشته می‌شوند و چرخه‌ای از انتظارها به deadlock می‌رسد.\n","permalink":"https://justroham.ir/fa/glossary/lock/","summary":"سازوکاری که یک session را وادار می‌کند پیش از دست زدن به داده‌ای که session دیگری استفاده می‌کند صبر کند؛ PostgreSQL قفل سطح جدول و سطح ردیف دارد.","title":"Lock"},{"content":"روی هر DDL در پروداکشن بگذارید و دوباره تلاش کنید تا یک ALTER TABLE منتظر، بقیه‌ی کوئری‌ها را پشت خودش صف نکند.\n","permalink":"https://justroham.ir/fa/glossary/lock-timeout/","summary":"تنظیمی که اگر دستوری برای گرفتن قفل بیش از حد صبر کند، آن را با خطا رها می‌کند.","title":"lock_timeout"},{"content":"در npm همان package-lock.json است. با commit کردنش همه‌ی ماشین‌ها و CI یک درخت وابستگی یکسان نصب می‌کنند و npm ci اگر با package.json هم‌خوان نباشد اجرا نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/lockfile/","summary":"فایلی که نسخه‌ی دقیق، آدرس دانلود و hash همه‌ی وابستگی‌های نصب‌شده را ثبت می‌کند.","title":"lockfile"},{"content":"لاگ ساختاریافته با quote و escape هر رویداد را در یک خط نگه می‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/log-injection/","summary":"تزریق در لاگ (log injection): ورودی کاربر که شامل newline یا کاراکتر کنترلی است و خط لاگ جعلی می‌سازد.","title":"Log injection"},{"content":"در Linux ابزار logrotate این کار را از روی فایل پیکربندی انجام می‌دهد: هر چند وقت یا در چه اندازه‌ای بچرخد و چند فایل قدیمی بماند (rotate N). برنامه‌ای که هنوز فایل قدیمی را باز نگه داشته به سیگنال یا copytruncate نیاز دارد.\n","permalink":"https://justroham.ir/fa/glossary/log-rotation/","summary":"تغییر نام، فشرده‌سازی و حذف فایل‌های لاگ قدیمی تا لاگ بی‌نهایت بزرگ نشود.","title":"Log rotation"},{"content":"بین نسخه‌ها قابل حمل است و می‌تواند یک جدول را برگرداند، ولی فقط یک لحظه را ثبت می‌کند و موقع restore ایندکس‌ها را از نو می‌سازد. بک‌آپ فیزیکی فایل‌های داده را کپی می‌کند و با WAL برای PITR ترکیب می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/logical-backup/","summary":"بک‌آپی از SQL یا داده‌ی ردیف‌ها (pg_dump، COPY) به‌جای کپی فایل‌های داده.","title":"Logical backup"},{"content":"آدرس‌های loopback (127.0.0.1 و ::1) هرگز از میزبان بیرون نمی‌روند. جای امنی برای آزمایش شبکه و سرورهای محلی‌اند.\n","permalink":"https://justroham.ir/fa/glossary/loopback/","summary":"loopback رابط مجازی‌ای است که ترافیک را به همان ماشین برمی‌گرداند: 127.0.0.0/8 و ::1.","title":"Loopback"},{"content":"علت رایج: read-modify-write در کد اپلیکیشن. راه‌حل: محاسبه را در SQL انجام دهید (SET balance = balance - 10)، ردیف را با SELECT ... FOR UPDATE قفل کنید یا سطح ایزولاسیون بالاتر و retry به کار ببرید.\n","permalink":"https://justroham.ir/fa/glossary/lost-update/","summary":"دو تراکنش یک مقدار را می‌خوانند، هر دو نتیجه‌ای محاسبه‌شده از آن را می‌نویسند و یکی بی‌صدا روی دیگری می‌نویسد.","title":"Lost update"},{"content":"در آرایه‌ی مرتب، اولین اندیسی که عنصرش کوچک‌تر از هدف نیست، یا طول آرایه اگر چنین اندیسی نباشد. upper bound اولین اندیسی است که عنصرش از هدف بزرگ‌تر است؛ تفاوت این دو تعداد تکرار هدف است.\n","permalink":"https://justroham.ir/fa/glossary/lower-bound/","summary":"اولین اندیس در آرایه‌ی مرتب که عنصرش کوچک‌تر از هدف نیست.","title":"Lower bound (search)"},{"content":"کشی با اندازه‌ی ثابت که وقتی پر شد ورودیِ کمتر استفاده‌شده در زمان اخیر را حذف می‌کند. ساخت رایج: یک map از کلید به node و یک لیست پیوندی دوطرفه که بر اساس تازگی مرتب است؛ بنابراین جست‌وجو، انتقال به ابتدا و حذف همگی O(1) هستند.\n","permalink":"https://justroham.ir/fa/glossary/lru-cache/","summary":"کشی با اندازه‌ی ثابت که وقتی پر شد کم‌استفاده‌ترین (least recently used) ورودی را بیرون می‌اندازد. معمولاً map به‌علاوه‌ی لیست دوپیوندی.","title":"LRU cache"},{"content":"کم‌کردن دو LSN با pg_wal_lsn_diff فاصله را به بایت می‌دهد؛ lag در replication همین‌طور اندازه گرفته می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/lsn/","summary":"شماره‌ی توالی لاگ: یک موقعیت در WAL مثل 0/1830840.","title":"LSN"},{"content":"راه‌حل یک نوع ورودی allow-list است که فقط فیلدهای مجاز را دارد و بقیه را سرور حساب یا مقداردهی می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/mass-assignment/","summary":"باگی که در آن سرور همه‌ی فیلدهای درخواست کلاینت را در یک شیء داخلی کپی می‌کند و کلاینت فیلدهایی را تعیین می‌کند که نباید (قیمت، وضعیت، نقش).","title":"Mass assignment"},{"content":"ذخیره‌ی نتیجه‌ی تابع به‌ازای هر ورودی تا فراخوانی‌های تکراری دوباره محاسبه نشوند.\n","permalink":"https://justroham.ir/fa/glossary/memoization/","summary":"ذخیره‌ی نتیجه‌ی تابع برای ورودی‌های تکراری","title":"Memoization"},{"content":"نمونه‌ی کلاسیک یک Map یا آرایه در سطح module است که با هر درخواست بزرگ‌تر می‌شود و هیچ‌وقت کوچک نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/memory-leak/","summary":"حافظه‌ای که دیگر لازم نیست اما هنوز قابل دسترسی است و garbage collector نمی‌تواند آزادش کند.","title":"Memory leak"},{"content":"کد memory-safe نمی‌تواند از انتهای آرایه بیرون برود، از حافظه‌ی آزادشده استفاده کند یا آن را دوبار آزاد کند. Rust در کد safe این را در زمان کامپایل تضمین می‌کند، Go و بیشتر زبان‌های مدیریت‌شده با بررسی زمان اجرا و garbage collector. C این کار را به برنامه‌نویس می‌سپارد. سرریز بافر و use-after-free را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/memory-safety/","summary":"تضمین زبان یا ابزار که برنامه نمی‌تواند حافظه‌ای را بخواند یا بنویسد که مال آن نیست.","title":"Memory safety"},{"content":"merge کار یک branch دیگر را وارد branch فعلی می‌کند. اگر هر دو طرف commit تازه داشته باشند، گیت یک merge commit ثبت می‌کند و هر دو تاریخچه را همان‌طور که اتفاق افتاده نگه می‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/merge/","summary":"دو خط تاریخچه را به هم وصل می‌کند؛ اگر از هم جدا شده باشند، گیت یک merge commit با دو والد می‌سازد.","title":"merge"},{"content":"merge commit از یک merge غیر fast-forward ساخته می‌شود. دو والد دارد و در git log --graph شاخه‌شدن و اتصال را به شکل لوزی نشان می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/merge-commit/","summary":"commitی با دو والد که اتصال دو تاریخچه را ثبت می‌کند.","title":"merge commit"},{"content":"conflict خط‌های \u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;، ======= و \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; را در فایل می‌گذارد. آن را ویرایش می‌کنید، git add می‌زنید و با git commit (یا --continue در rebase) تمام می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/merge-conflict/","summary":"Git نتوانست دو تغییر روی یک خط‌ها را خودکار ترکیب کند و از شما می‌خواهد انتخاب کنید.","title":"Merge conflict"},{"content":"Merge sort slice را نصف می‌کند، هر نیمه را بازگشتی مرتب می‌کند و با برداشتن مکرر کوچک‌ترین عنصر ابتدای دو نیمه آن‌ها را ادغام می‌کند. وقتی دو عنصر برابرند اول سمت چپ را برمی‌دارد و همین آن را پایدار می‌کند. هزینه‌اش یک بافر موقت هم‌اندازه‌ی ورودی است.\n","permalink":"https://justroham.ir/fa/glossary/merge-sort/","summary":"نصف‌کردن، مرتب‌کردن هر نیمه و ادغام دو نیمه‌ی مرتب؛ همیشه O(n log n)، پایدار، ولی با O(n) حافظه‌ی اضافه.","title":"Merge sort"},{"content":"برای یافتن تفاوت، rootها را مقایسه می‌کنید و فقط در زیردرخت‌هایی که hash‌شان فرق دارد پایین می‌روید. اگر تفاوت کم باشد چند گره را مقایسه می‌کنید نه همه‌ی کلیدها را.\n","permalink":"https://justroham.ir/fa/glossary/merkle-tree/","summary":"درختی از hashها که هر والد hash فرزندانش است؛ پس root برابر یعنی داده برابر.","title":"Merkle tree"},{"content":"TCP فقط بایت بدون مرز می‌دهد، پس خود پروتکل باید بگوید پیام کجا تمام می‌شود. دو روش رایج: جداکننده مثل newline، یا length prefix (یک عدد با اندازه‌ی ثابت پیش از payload). به stream نگاه کنید.\n","permalink":"https://justroham.ir/fa/glossary/message-framing/","summary":"قاعده‌هایی که در یک جریان بایتی مثل TCP مشخص می‌کنند هر پیام کجا تمام می‌شود.","title":"Message framing"},{"content":"در معماری microservice سیستم از سرویس‌های کوچک زیادی ساخته می‌شود که هرکدام جدا مستقر می‌شوند و داده‌ی خودشان را دارند. سود: استقرار و مقیاس و ایزوله‌سازی خرابی مستقل. هزینه: هر فراخوانی حالا فراخوانی شبکه است که می‌تواند کند، گم یا تکراری شود.\n","permalink":"https://justroham.ir/fa/glossary/microservices/","summary":"سرویس‌هایی که مستقل مستقر می‌شوند، داده‌ی خودشان را دارند و از راه شبکه حرف می‌زنند.","title":"Microservices"},{"content":"صف microtask بعد از هر callback کامل خالی می‌شود. زنجیره‌ای از microtaskها که مدام microtask تازه اضافه می‌کند می‌تواند timer و I/O را گرسنه نگه دارد.\n","permalink":"https://justroham.ir/fa/glossary/microtask/","summary":"کار کوچکی (callback ی promise یا queueMicrotask) که درست بعد از کد جاری و پیش از ادامه‌ی event loop اجرا می‌شود.","title":"Microtask"},{"content":"نمونه‌اش اضافه کردن ستون یا ایندکس است. خطر خود SQL نیست، قفلهایی است که روی جدولِ در حال استفاده می‌گیرد. ابزارهایی مثل goose یا Flyway فقط فایل‌ها را به ترتیب اجرا می‌کنند و یک دستور خطرناک را امن نمی‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/migration/","summary":"یک تغییر نسخه‌دار در schema دیتابیس که با اسکریپت یا ابزار و به ترتیب اجرا می‌شود.","title":"Migration"},{"content":"درخت پوشای کمینه (MST) در گراف وزن‌دار و همبند با n گره، n-1 یال دارد، همه‌ی گره‌ها را وصل می‌کند، دور ندارد و کمترین وزن کل را دارد. الگوریتم Kruskal یال‌ها را مرتب می‌کند و هر یالی که دور نسازد اضافه می‌کند؛ این بررسی را union-find انجام می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/minimum-spanning-tree/","summary":"ارزان‌ترین مجموعه‌ی یال که همه‌ی گره‌های یک گراف وزن‌دار را بدون ایجاد دور وصل می‌کند.","title":"Minimum spanning tree"},{"content":"یک modular monolith مثل یک برنامه‌ی واحد استقرار می‌شود، ولی به ماژول‌هایی با مرز روشن تقسیم شده است. هر ماژول یک interface کوچک نشان می‌دهد و بقیه را پنهان می‌کند؛ ماژول‌های دیگر فقط از همان interface استفاده می‌کنند. یک process و یک transaction دارید و امکان جداکردن بعدی یک ماژول هم می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/modular-monolith/","summary":"یک واحد استقرار که ماژول‌هایش فقط با interfaceهای باریک حرف می‌زنند.","title":"Modular monolith"},{"content":"monkeypatch یک fixture در pytest است که مواردی مثل متغیر محیطی، attribute یا کلید دیکشنری را فقط در طول یک تست عوض می‌کند و بعد همه‌چیز را برمی‌گرداند. این کار جلوی نشت state بین تست‌ها را می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/monkeypatch/","summary":"جایگزینی موقت یک attribute، متغیر محیطی یا کلید دیکشنری در طول تست","title":"monkeypatch"},{"content":"در monorepo چند پروژه در یک مخزن نگه‌داری می‌شوند. تغییری که چند پروژه را لمس می‌کند می‌تواند در یک commit بنشیند. هزینه‌اش مخزن بزرگ‌تر و کنترل دسترسی درشت‌تر است. نگاه کنید به polyrepo.\n","permalink":"https://justroham.ir/fa/glossary/monorepo/","summary":"مخزنی واحد که کد چند سرویس یا کتابخانه را کنار هم نگه می‌دارد و با هم ساخته و نسخه‌بندی می‌شوند.","title":"Monorepo"},{"content":"ساعت دیواری هنگام تصحیح می‌تواند بپرد و تفریق دو زمان دیواری حتی منفی شود. در Go مقدار time.Now() یک قرائت یکنوا هم دارد و Sub در صورت وجود آن را به کار می‌برد.\n","permalink":"https://justroham.ir/fa/glossary/monotonic-clock/","summary":"ساعتی که فقط جلو می‌رود و برای اندازه‌گیری مدت‌زمان است، نه گفتن تاریخ.","title":"Monotonic clock"},{"content":"وقتی readهای متوالی به replicaهایی با lag متفاوت بخورند می‌تواند نقض شود. وصل‌کردن client به یک replica یا session token جلوی آن را می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/monotonic-reads/","summary":"readهای پشت‌سرهم یک client هرگز به مقدار قدیمی‌تر برنمی‌گردند.","title":"Monotonic reads"},{"content":"به‌جای یک پاسخ، توزیع می‌گیرید: مدل را با ورودی تصادفی ۱۰۰٬۰۰۰ بار اجرا می‌کنید و مثلاً صدک ۵۰ و ۸۰ را گزارش می‌دهید.\n","permalink":"https://justroham.ir/fa/glossary/monte-carlo-simulation/","summary":"برآورد نتیجه با اجرای بسیار یک مدل تصادفی و خواندن صدک‌ها.","title":"Monte Carlo simulation"},{"content":"ترتیبی که Python یک کلاس و والدهایش را برای پیدا کردن یک attribute می‌گردد؛ super() همین ترتیب را دنبال می‌کند و با Class.mro چاپ می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/mro/","summary":"ترتیبی که Python یک کلاس و والدهایش را برای پیدا کردن یک attribute می‌گردد؛ super() همین ترتیب را دنبال می‌کند و با Class.\u003cstrong\u003emro\u003c/strong\u003e چاپ می‌شود.","title":"MRO (method resolution order)"},{"content":"تقریباً برابر MTU منهای header‌های IP و TCP است (۲۰ + ۲۰ بایت بدون option)، یعنی ۱۴۶۰ روی MTU برابر ۱۵۰۰. هر طرف هنگام باز شدن اتصال MSS خود را اعلام می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/mss/","summary":"بیشترین تعداد بایت payload در هر segment از TCP.","title":"MSS"},{"content":"طبق مستندات، Ethernet معمولی MTU برابر ۱۵۰۰ بایت دارد. بسته‌ی IP بزرگ‌تر باید تکه‌تکه (fragment) یا رد شود.\n","permalink":"https://justroham.ir/fa/glossary/mtu/","summary":"بزرگ‌ترین بسته‌ای که یک لینک در یک frame حمل می‌کند.","title":"MTU"},{"content":"در HTTP/2 هر درخواست یک stream شماره‌دار است و frameهای stream‌های مختلف روی یک اتصال TCP در هم می‌آیند. برای هر درخواست در حال انجام لازم نیست اتصال جدا باز شود.\n","permalink":"https://justroham.ir/fa/glossary/multiplexing/","summary":"فرستادن هم‌زمان چند درخواست و پاسخ مستقل روی یک اتصال.","title":"Multiplexing"},{"content":"ابزار تغییرهای کوچک زیادی (mutant) می‌سازد، مثلاً \u0026gt;= را به \u0026gt; تبدیل می‌کند، و تست‌ها را روی هرکدام اجرا می‌کند. mutantای که هیچ تستی نگیرد حفره‌ای را نشان می‌دهد که coverage خطی نشان نمی‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/mutation-testing/","summary":"سنجش مجموعه‌ی تست با این که وقتی کد عمداً خراب شود شکست بخورد یا نه.","title":"Mutation testing"},{"content":"sync.Mutex یک بخش بحرانی را با Lock() و Unlock() محافظت می‌کند. این دو را همیشه جفت کنید، معمولاً با defer. sync.RWMutex اجازه می‌دهد چند خواننده هم‌زمان باشند یا فقط یک نویسنده. فراموش کردن قفل به race condition می‌انجامد.\nmu.Lock() defer mu.Unlock() count++ ","permalink":"https://justroham.ir/fa/glossary/mutex/","summary":"قفلی که در هر لحظه فقط به یک goroutine اجازه‌ی دسترسی به یک حافظه‌ی مشترک را می‌دهد.","title":"Mutex"},{"content":"در TLS معمولی فقط سرور هویتش را ثابت می‌کند. در mutual TLS سرور گواهی کلاینت را هم می‌خواهد و اگر نباشد یا CA مورد اعتماد امضایش نکرده باشد اتصال را رد می‌کند. بین سرویس‌های داخلی رایج است.\n","permalink":"https://justroham.ir/fa/glossary/mutual-tls/","summary":"mTLS: کلاینت هم گواهی می‌دهد و سرور آن را بررسی می‌کند.","title":"Mutual TLS (mTLS)"},{"content":"در PostgreSQL دستور UPDATE ردیف را بازنویسی نمی‌کند؛ نسخه‌ی جدیدی می‌نویسد و نسخه‌ی قبلی را تمام‌شده علامت می‌زند. هر کوئری با یک snapshot تعیین می‌کند کدام نسخه‌ها را می‌تواند ببیند. هزینه‌اش نسخه‌های مرده‌ای است که VACUUM باید بعداً پاک کند.\n","permalink":"https://justroham.ir/fa/glossary/mvcc/","summary":"کنترل هم‌زمانی چندنسخه‌ای: دیتابیس چند نسخه از یک ردیف نگه می‌دارد تا خواننده و نویسنده جلوی هم را نگیرند.","title":"MVCC"},{"content":"برنامه ۱۰۰ سفارش را با یک query می‌گیرد و بعد ۱۰۰ query دیگر برای گرفتن مشتری هر سفارش اجرا می‌کند. هر query تنهایی سریع است و هیچ پلنی بد به نظر نمی‌رسد؛ هزینه در رفت‌وبرگشت‌هاست. راه‌حل یک query با join یا WHERE id = ANY(...) است.\n","permalink":"https://justroham.ir/fa/glossary/n-plus-one/","summary":"یک query برای گرفتن لیست و بعد یک query جدا برای هر آیتم لیست.","title":"N+1 queries"},{"content":"طبق namespaces(7) چند نوع وجود دارد (mount، PID، network، UTS، IPC، user، cgroup، time). پروسه با clone(2) یا unshare(2) یا setns(2) به آن‌ها می‌پیوندد و لینک‌های /proc/\u0026lt;pid\u0026gt;/ns/ هویتشان را نشان می‌دهند.\n","permalink":"https://justroham.ir/fa/glossary/namespace/","summary":"قابلیت کرنل که دید جداگانه‌ای از یک منبع مثل PID، mount، شبکه یا hostname به پروسه می‌دهد.","title":"Namespace"},{"content":"دوری که مجموع وزن یال‌هایش کمتر از صفر است؛ هر بار چرخیدن در آن هزینه را کمتر می‌کند.\nوقتی یکی در دسترس باشد، کوتاه‌ترین مسیر وجود ندارد. Bellman-Ford آن را تشخیص می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/negative-cycle/","summary":"دوری که مجموع وزن یال‌هایش کمتر از صفر است؛ هر بار چرخیدن در آن هزینه را کمتر می‌کند.","title":"Negative cycle"},{"content":"hookها prerouting، input، forward، output و postrouting‌اند. nftables و iptables هر دو روی آن‌ها بنا شده‌اند.\n","permalink":"https://justroham.ir/fa/glossary/netfilter/","summary":"نقطه‌های hook در پشته‌ی شبکه‌ی کرنل که بسته‌ها را فیلتر یا تغییر می‌دهند.","title":"netfilter"},{"content":"netmask همان طول prefix است که به شکل آدرس نوشته شده: /24 برابر 255.255.255.0 است. AND آدرس با mask، آدرس شبکه را می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/netmask/","summary":"netmask یک mask ۳۲ بیتی است که یک‌های ابتدایی‌اش بخش شبکه‌ی آدرس IPv4 را نشان می‌دهند.","title":"Netmask"},{"content":"هر سمت ممکن است فکر کند سمت دیگر مرده است و split brain از همین‌جا شروع می‌شود. با crash فرق دارد: هر دو سمت به کار ادامه می‌دهند.\n","permalink":"https://justroham.ir/fa/glossary/network-partition/","summary":"خرابی‌ای که در آن گره‌ها زنده‌اند ولی گروه‌هایی از آن‌ها به هم دسترسی ندارند.","title":"Network partition"},{"content":"قوانین در chainهای داخل جدول‌ها هستند و base chainها به hookهای netfilter وصل می‌شوند. جانشین iptables است.\n","permalink":"https://justroham.ir/fa/glossary/nftables/","summary":"چارچوب فیلتر بسته در Linux که با nft تنظیم می‌شود.","title":"nftables"},{"content":"پرچمی برای هر thread که با prctl تنظیم می‌شود و جلوی گرفتن امتیاز بیشتر از راه بیت setuid یا file capability در execve را می‌گیرد. پس از تنظیم برداشته نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/no-new-privs/","summary":"پرچمی برای هر thread که با prctl تنظیم می‌شود و جلوی گرفتن امتیاز بیشتر از راه بیت setuid یا file capability در execve را می‌گیرد. پس از تنظیم برداشته نمی‌شود.","title":"no_new_privs"},{"content":"ماژول cluster به process اصلی اجازه می‌دهد workerهایی fork کند که همه روی یک port اتصال می‌پذیرند. حافظه مشترک ندارند. primary تصمیم می‌گیرد اتصال‌ها چطور پخش شوند و با مرگ یک worker چه شود.\n","permalink":"https://justroham.ir/fa/glossary/node-cluster/","summary":"ماژول \u003ccode\u003ecluster\u003c/code\u003e: چند process از Node که یک port را به اشتراک می‌گذارند.","title":"Node cluster"},{"content":"descriptor با پرچم O_NONBLOCK (fcntl(2)) به این حالت می‌رود. معمولاً با API آمادگی مثل epoll یا kqueue ترکیب می‌شود که می‌گوید کِی تلاش دوباره موفق است.\n","permalink":"https://justroham.ir/fa/glossary/non-blocking-io/","summary":"حالتی که read و write و accept به‌جای منتظر نگه داشتن thread، فوراً با خطایی مثل EAGAIN برمی‌گردند.","title":"Non-blocking I/O"},{"content":"وقتی رخ می‌دهد که تراکنش دیگری بین دو خواندن شما تغییری commit کند. PostgreSQL آن را در READ COMMITTED اجازه می‌دهد و در REPEATABLE READ نمی‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/non-repeatable-read/","summary":"خواندن یک ردیف دو بار در یک تراکنش و گرفتن دو مقدار متفاوت.","title":"Non-repeatable read"},{"content":"در AES-GCM یک نانس ۱۲ بایتی کنار متن رمزشده ذخیره می‌شود. تکرار آن با همان کلید هم محرمانگی و هم اصالت را از بین می‌برد. آن را با crypto/rand بسازید.\n","permalink":"https://justroham.ir/fa/glossary/nonce/","summary":"مقداری که برای هر کلید فقط یک بار باید استفاده شود، مثل ورودی هر پیام در AES-GCM.","title":"Nonce"},{"content":"نرمال‌سازی یعنی شکستن یک جدول به جدول‌های کوچک‌تر تا هر واقعیت (مثلاً ایمیل یک مشتری یا قیمت یک محصول) فقط در یک جا ذخیره شود. این کار anomalyهای update، insert و delete را از بین می‌برد. مراحل معمول آن 1NF، 2NF و 3NF نام دارند. برای سمت مقابل ماجرا denormalization را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/normalization/","summary":"هر واقعیت فقط یک‌بار ذخیره شود؛ جدول‌ها را برای این هدف می‌شکنیم.","title":"Normalization"},{"content":"npm پکیج‌های فهرست‌شده در package.json را در node_modules نصب می‌کند، scripts را اجرا می‌کند و پکیج‌ها را در رجیستری منتشر می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/npm/","summary":"مدیر پکیج همراه Node.js و رجیستری عمومی پیش‌فرض پکیج‌های JavaScript.","title":"npm"},{"content":"NULL یک مقدار نیست، یک «نامعلوم» است؛ پس NULL = NULL درست نیست (خودش NULL است). از IS NULL استفاده کنید و یادتان باشد مقایسه با NULL باعث می‌شود WHERE آن سطر را کنار بگذارد.\n","permalink":"https://justroham.ir/fa/glossary/sql-null/","summary":"نشانه‌ی SQL برای مقدار نامعلوم یا غایب.","title":"NULL"},{"content":"NXDOMAIN همان RCODE شماره‌ی ۳ است. با NOERROR و پاسخ خالی فرق دارد؛ آن یعنی نام هست ولی رکوردی از نوع پرسیده‌شده ندارد. resolverها پاسخ منفی را هم cache می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/nxdomain/","summary":"کد پاسخ DNS به معنی «این نام وجود ندارد».","title":"NXDOMAIN"},{"content":"درباره‌ی مجوزدهی (authorization) است: توکن چه کاری می‌تواند بکند. نقش‌های اصلی کاربر، برنامه‌ی کلاینت، authorization server و resource server (همان API) هستند.\n","permalink":"https://justroham.ir/fa/glossary/oauth2/","summary":"چارچوبی که به یک برنامه اجازه می‌دهد به‌نیابت از کاربر و با توکن، به‌صورت محدود به یک API دسترسی بگیرد، بی‌آنکه پسورد کاربر را ببیند.","title":"OAuth 2.0"},{"content":"در object mode یک stream مقدارهای کامل (شیء، عدد) را به‌عنوان chunk جابه‌جا می‌کند. Readable.from(iterable) به‌طور پیش‌فرض یک Readable در این حالت می‌سازد و highWaterMark در آن تعداد شیء را می‌شمارد، نه بایت.\n","permalink":"https://justroham.ir/fa/glossary/object-mode/","summary":"گزینه‌ای در stream که هر chunk می‌تواند هر مقدار جاوااسکریپتی باشد، نه فقط بایت یا رشته.","title":"Object mode"},{"content":"به‌جای دانلود کل فهرست ابطال، کلاینت (یا خود سرور با stapling) درباره‌ی یک شماره‌ی سریال از CA می‌پرسد. این را اجرا نکردم؛ تا جایی که می‌دانم کلاینت استاندارد TLS در Go به‌تنهایی ابطال را بررسی نمی‌کند.\n","permalink":"https://justroham.ir/fa/glossary/ocsp/","summary":"راهی برای پرسیدن از CA که آیا یک گواهی مشخص ابطال شده است.","title":"OCSP"},{"content":"طبق مستندات cgroup v2 وقتی مصرف به memory.max برسد و کم نشود، OOM killer در همان cgroup فعال می‌شود و memory.events آن را در oom_kill می‌شمارد.\n","permalink":"https://justroham.ir/fa/glossary/oom-killer/","summary":"سازوکار کرنل که وقتی حافظه تمام شود، چه در کل سیستم و چه در cgroupی که به memory.max رسیده، یک پروسه را می‌کشد.","title":"OOM killer"},{"content":"یک سند OpenAPI همه‌ی مسیرها و عملیات را با شکل ورودی و خروجی‌شان فهرست می‌کند. ابزارها آن را برای lint، تولید مستندات، ساخت stub و client یا تست سرور می‌خوانند.\n","permalink":"https://justroham.ir/fa/glossary/openapi/","summary":"یک قالب استاندارد YAML/JSON برای توصیف یک API روی HTTP: مسیرها، پارامترها و schemaی درخواست و پاسخ.","title":"OpenAPI"},{"content":"OAuth2 تنها می‌گوید توکن چه کاری مجاز است؛ OIDC احراز هویت را اضافه می‌کند. کلاینت باید ID token را اعتبارسنجی کند: امضا، iss، aud، exp و nonce.\n","permalink":"https://justroham.ir/fa/glossary/oidc/","summary":"لایه‌ی هویتی نازک روی OAuth 2.0 که ID token و userinfo اضافه می‌کند تا کلاینت بداند چه کسی وارد شده.","title":"OpenID Connect (OIDC)"},{"content":"خطاهای عملیاتی handle می‌شوند و به یک پاسخ نگاشت می‌شوند. خطای برنامه‌نویس (مثلاً TypeError ناشی از باگ) یعنی وضعیت process مشکوک است و واکنش امن، لاگ و restart است.\n","permalink":"https://justroham.ir/fa/glossary/operational-error/","summary":"شکست مورد انتظار در زمان اجرا (ورودی بد، رکورد ناموجود، timeout)، در مقابل باگ.","title":"Operational error"},{"content":"جواب بهینه‌ی کل مسئله از جواب‌های بهینه‌ی زیرمسئله‌هایش ساخته می‌شود.\nارزان‌ترین مسیر تا یک خانه‌ی شبکه، ادامه‌ی ارزان‌تر از دو مسیر همسایه‌هایش است. بدون این ویژگی، ذخیره‌ی جواب زیرمسئله‌ها نتیجه‌ی درست نمی‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/optimal-substructure/","summary":"جواب بهینه‌ی کل مسئله از جواب‌های بهینه‌ی زیرمسئله‌هایش ساخته می‌شود.","title":"Optimal substructure"},{"content":"در event store کلید اصلی روی (stream_id, version) این کار را می‌کند: نویسنده‌ی دوم نسخه‌ی ۳ خطای unique violation می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/optimistic-concurrency/","summary":"قفل نمی‌گیرید؛ با نسخه‌ای که خوانده‌اید می‌نویسید و اگر دیگری زودتر نوشته باشد شکست می‌خورید، سپس دوباره می‌خوانید و تلاش می‌کنید.","title":"Optimistic concurrency"},{"content":"جریان در یک جا خوانا است، به قیمت یک مؤلفه‌ی مرکزی که همه‌ی شرکت‌کننده‌ها را می‌شناسد. نقطه‌ی مقابل choreography است.\n","permalink":"https://justroham.ir/fa/glossary/orchestration/","summary":"یک هماهنگ‌کننده به ترتیب به سرویس‌ها command می‌فرستد و درباره‌ی هر پاسخ یا شکست تصمیم می‌گیرد.","title":"Orchestration"},{"content":"ORM اجازه می‌دهد با شیءهای زبان کار کنید و خودش SQL را می‌سازد. کد تکراری را کم می‌کند، اما می‌تواند تعداد query‌ها را پنهان کند؛ پس باید SQL تولیدشده را بخوانید.\n","permalink":"https://justroham.ir/fa/glossary/orm/","summary":"یک کتابخانه که جدول‌ها را به کلاس و ردیف‌ها را به شیء نگاشت می‌کند.","title":"ORM"},{"content":"این الگو مشکل dual-write را حذف می‌کند: هیچ‌وقت نمی‌شود ردیف commit شود ولی رویداد گم شود یا برعکس. یک relay جدول outbox را می‌خواند و به broker منتشر می‌کند؛ پس تحویل at-least-once است و consumerها باید idempotent باشند.\n","permalink":"https://justroham.ir/fa/glossary/outbox-pattern/","summary":"نوشتن رویداد در یک جدول دیتابیس و در همان تراکنش تغییر داده، و انتشار آن در مرحله‌ی بعد.","title":"Outbox pattern"},{"content":"هر زمینه کاراکترهای خطرناک خودش را دارد، پس یک تابع escape کافی نیست. html/template در Go بر اساس جای قرارگیری در قالب، تابع درست را خودکار انتخاب می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/output-encoding/","summary":"escape کردن داده برای همان زمینه‌ای که در آن نوشته می‌شود (بدنه‌ی HTML، attribute، JavaScript، URL).","title":"Output encoding"},{"content":"طبق مستندات کرنل vm.overcommit_memory برابر ۰ (روش تخمینی، پیش‌فرض)، ۱ (همیشه اجازه بده) یا ۲ (هرگز overcommit نکن) است. با overcommit شکست دیرتر و به شکل OOM kill ظاهر می‌شود، نه خطای malloc.\n","permalink":"https://justroham.ir/fa/glossary/overcommit/","summary":"اجازه دادن به پروسه‌ها که بیش از مجموع RAM و swap حافظه‌ی مجازی رزرو کنند، چون بیشترش هیچ‌وقت استفاده نمی‌شود.","title":"Overcommit"},{"content":"یک زیرمسئله‌ی کوچک‌تر بارها و از شاخه‌های مختلف بازگشت لازم می‌شود.\nدر Fibonacci ساده، fib(30) هم برای fib(32) و هم برای fib(31) حساب می‌شود. ذخیره‌ی نتیجه کار تکراری را حذف می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/overlapping-subproblems/","summary":"یک زیرمسئله‌ی کوچک‌تر بارها و از شاخه‌های مختلف بازگشت لازم می‌شود.","title":"Overlapping subproblems"},{"content":"خواندن از لایه‌های پایین انجام می‌شود و نوشتن در لایه‌ی بالا. runtimeها معمولاً از آن استفاده می‌کنند تا چند کانتینر یک image را به اشتراک بگذارند.\n","permalink":"https://justroham.ir/fa/glossary/overlayfs/","summary":"فایل‌سیستم Linux که یک لایه‌ی قابل‌نوشتن را روی لایه‌های فقط‌خواندنی می‌گذارد؛ لایه‌های image کانتینر از آن استفاده می‌کنند.","title":"overlayfs"},{"content":"این فهرست برای آگاهی است، نه چک‌لیستی که امنیت سیستم را ثابت کند. دسته‌ها بین نسخه‌ها عوض می‌شوند؛ نسخه‌ای را که ارجاع می‌دهید بررسی کنید.\n","permalink":"https://justroham.ir/fa/glossary/owasp-top-10/","summary":"فهرستی که به‌صورت دوره‌ای به‌روز می‌شود و ده دسته‌ی مهم‌ترین ریسک‌های امنیتی برنامه‌های وب را نام می‌برد (منتشرشده توسط OWASP).","title":"OWASP Top 10"},{"content":"انتساب یا پاس دادن مقداری که Copy نیست آن را move می‌کند و متغیر قبلی دیگر قابل استفاده نیست. به این ترتیب Rust بدون garbage collector حافظه را قطعی آزاد می‌کند و double free در زمان کامپایل رد می‌شود. برای استفاده بدون گرفتن مالکیت، از borrowing استفاده کنید.\nlet a = String::from(\u0026#34;hi\u0026#34;); let b = a; // a is moved // println!(\u0026#34;{a}\u0026#34;); // compile error ","permalink":"https://justroham.ir/fa/glossary/ownership/","summary":"قاعده‌ی Rust که هر مقدار دقیقاً یک مالک دارد و با خارج شدن مالک از scope آزاد می‌شود.","title":"Ownership"},{"content":"توسعه‌ای از CAP که حالت عادی را هم پوشش می‌دهد: منتظر replica ماندن latency دارد و منتظر نماندن تازگی داده را قربانی می‌کند. قضیه‌ی CAP را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/pacelc/","summary":"اگر Partition باشد بین Availability و Consistency انتخاب کن، وگرنه بین Latency و Consistency.","title":"PACELC"},{"content":"packfile (.git/objects/pack/*.pack) چند object گیت را در یک فایل نگه می‌دارد و یک فایل .idx برای جست‌وجو دارد. git gc و git repack آن را می‌سازند و fetch و push آن را منتقل می‌کنند. delta compression را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/packfile/","summary":"فایل فشرده‌ی گیت که چند object را با هم نگه می‌دارد.","title":"Packfile"},{"content":"طبق proc_meminfo(5) فیلد Cached کش حافظه‌ای فایل‌های خوانده‌شده از دیسک است (همان page cache). چون قابل پس‌گرفتن است در MemAvailable حساب می‌شود؛ پس buff/cache بزرگ عادی است و نشت حافظه نیست.\n","permalink":"https://justroham.ir/fa/glossary/page-cache/","summary":"کش حافظه‌ی کرنل برای محتوای فایل‌ها که خواندن دوباره‌ی یک فایل را از دیسک بی‌نیاز می‌کند و در صورت نیاز به حافظه پس گرفته می‌شود.","title":"Page cache"},{"content":"API ای که ردیف‌های زیادی فهرست می‌کند، آن‌ها را صفحه‌به‌صفحه برمی‌گرداند. دو سبک رایج: offset (page/per_page) و مبتنی بر کلید یا cursor؛ keyset pagination را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/pagination/","summary":"برگرداندن یک فهرست بزرگ صفحه‌به‌صفحه به‌جای یک‌جا.","title":"Pagination"},{"content":"دیتابیس اول دستور را parse می‌کند و مقدارها را بعداً جا می‌دهد، پس مقدار هرگز ساختار query را عوض نمی‌کند. نام جدول و ستون نمی‌تواند پارامتر باشد.\n","permalink":"https://justroham.ir/fa/glossary/parameterized-query/","summary":"دستور SQL با جای‌نگهدار (\u003ccode\u003e$1\u003c/code\u003e) که مقدارها جدا از متن SQL فرستاده می‌شوند.","title":"Parameterized query"},{"content":"تست پارامتری یک تابع تست را برای هر ردیف از ورودی و خروجی مورد انتظار یک‌بار اجرا می‌کند و هر ردیف را تست جدا گزارش می‌دهد. در pytest با @pytest.mark.parametrize انجام می‌شود و معادل table-driven test در Go است.\n","permalink":"https://justroham.ir/fa/glossary/parametrized-test/","summary":"یک بدنه‌ی تست که روی چند ردیف ورودی اجرا می‌شود","title":"Parametrized test"},{"content":"با --filter=blob:none تاریخچه‌ی کامل commitها می‌ماند ولی محتوای فایل‌ها فقط در صورت نیاز از یک promisor remote که filter را اجازه می‌دهد گرفته می‌شود. آفلاین، نبودنِ blob خطاست. معمولاً با sparse checkout ترکیب می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/partial-clone/","summary":"clone بدون بعضی objectها که در صورت نیاز گرفته می‌شوند.","title":"Partial clone"},{"content":"در سیستم توزیع‌شده یک فراخوانی ممکن است در درخواست، در سرور یا در پاسخ شکست بخورد. timeout در هر سه حالت یکسان دیده می‌شود، پس فراخواننده نمی‌داند عملیات اعمال شده یا نه.\n","permalink":"https://justroham.ir/fa/glossary/partial-failure/","summary":"وقتی یک بخش سیستم خراب می‌شود و بقیه کار می‌کنند، فراخواننده نمی‌داند چه شده.","title":"Partial failure"},{"content":"ایندکس جزئی با یک WHERE ساخته می‌شود و فقط ردیف‌های منطبق را دارد. همراه با UNIQUE قاعده‌هایی مثل «هر مشتری حداکثر یک سفارش باز» را اعمال می‌کند، در حالی که ردیف‌های با وضعیت‌های دیگر هر تعداد می‌توانند باشند.\n","permalink":"https://justroham.ir/fa/glossary/partial-index/","summary":"ایندکسی که فقط ردیف‌هایی را پوشش می‌دهد که شرط WHERE را دارند.","title":"Partial index"},{"content":"planner پارتیشن‌هایی را که به‌خاطر فیلتر روی کلید پارتیشن نمی‌توانند ردیف مطابق داشته باشند کنار می‌گذارد. بدون شرط روی کلید پارتیشن باید همه‌ی پارتیشن‌ها اسکن شوند. این کار با تنظیم enable_partition_pruning کنترل می‌شود. پارتیشن‌بندی را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/partition-pruning/","summary":"planner پارتیشن‌هایی را که به‌خاطر فیلتر روی کلید پارتیشن نمی‌توانند ردیف مطابق داشته باشند کنار می‌گذارد.","title":"Partition pruning"},{"content":"برخلاف هش سریعی مثل SHA-256، هش پسورد طوری تنظیم می‌شود که هر حدس زمان (و حافظه) واقعی هزینه داشته باشد. از bcrypt یا argon2id استفاده کنید، نه هش سریع ساده.\n","permalink":"https://justroham.ir/fa/glossary/password-hashing/","summary":"تابع یک‌طرفه‌ی عمداً کند و دارای salt برای ذخیره‌ی پسورد، تا نشت پایگاه داده پسوردها را فاش نکند.","title":"Password hashing"},{"content":"وقتی Find(x) ریشه را پیدا کرد، path compression والد هر گرهٔ مسیر را برابر همان ریشه می‌کند. هزینه یک بار پرداخت می‌شود و Findهای بعدی روی همان گره‌ها یک گام می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/path-compression/","summary":"در Find هر گره‌ی روی مسیر را مستقیم به ریشه وصل کن تا Findهای بعدی کوتاه‌تر شوند.","title":"Path compression"},{"content":"چسباندن ورودی کاربر به یک پوشه‌ی پایه کافی نیست، چون مسیر ترکیبی پاک‌سازی می‌شود و می‌تواند از پوشه بالا برود. نتیجه را با پایه مقایسه کنید یا بهتر است از os.OpenRoot استفاده کنید که symlinkهای به بیرون را هم می‌بندد.\n","permalink":"https://justroham.ir/fa/glossary/path-traversal/","summary":"باگی که در آن \u003ccode\u003e../\u003c/code\u003e در ورودی کاربر باعث می‌شود handler فایلی بیرون از پوشه‌ی مجاز را بخواند.","title":"Path traversal"},{"content":"برخلاف salt، pepper محرمانه است و بین همه‌ی کاربران مشترک. مدیریت کلید اضافه می‌کند، پس لایه‌ی اضافه است و جایگزین هش کند نیست.\n","permalink":"https://justroham.ir/fa/glossary/pepper/","summary":"مقدار محرمانه‌ای بیرون از پایگاه داده که در هش پسورد وارد می‌شود، تا فقط دزدیدن پایگاه داده کافی نباشد.","title":"Pepper"},{"content":"صدک‌ها دُمی را نشان می‌دهند که میانگین پنهان می‌کند. از bucketهای histogram فقط تخمین‌اند و خطا به عرض bucketها بستگی دارد.\n","permalink":"https://justroham.ir/fa/glossary/percentile/","summary":"مقداری که سهم مشخصی از مشاهده‌ها زیر آن است؛ p99 تأخیری است که ۹۹٪ درخواست‌ها از آن سریع‌ترند.","title":"Percentile"},{"content":"perf دستور perf stat را برای شمارش رویدادها (cycles، instructions، context switch) و perf record با perf report را برای نمونه‌برداری از stackها در طول زمان دارد. نمونه‌برداری از ردیابی تک‌تک فراخوان‌ها ارزان‌تر است و نمونه‌ها را می‌شود به شکل flame-graph کشید.\n","permalink":"https://justroham.ir/fa/glossary/perf/","summary":"ابزار کارایی Linux که رویدادهای سخت‌افزاری را می‌شمارد و نمونه‌برداری می‌کند که زمان CPU کجا می‌رود.","title":"perf"},{"content":"تعداد زیادی connection کلاینت چند connection سرور را share می‌کنند. در حالت session هر کلاینت در کل جلسه یک connection سرور دارد؛ در حالت transaction فقط در طول یک transaction آن را قرض می‌گیرد، پس وضعیت session بین transactionها منتقل نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/pgbouncer/","summary":"یک connection pooler جدا که بین برنامه‌ها و PostgreSQL قرار می‌گیرد.","title":"PgBouncer"},{"content":"ردیفی که با WHERE شما جور است را کس دیگری در این فاصله اضافه (یا حذف) و commit کرده است. ردیف‌هایی که قبلاً خواندید عوض نشده‌اند؛ ردیف تازه پیدا شده است.\n","permalink":"https://justroham.ir/fa/glossary/phantom-read/","summary":"اجرای یک کوئری دو بار در یک تراکنش و گرفتن مجموعه‌ی متفاوتی از ردیف‌ها.","title":"Phantom read"},{"content":"pickle یک شیء Python را به بایت و دوباره به شیء تبدیل می‌کند. multiprocessing هر آرگومان و نتیجه‌ای را که به پروسهی دیگر می‌فرستد pickle می‌کند؛ پس باید قابل pickle باشد (lambda نیست) و داده‌ی بزرگ هم زمان و بایت خرج می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/pickle/","summary":"تبدیل شیء Python به بایت و برعکس؛ multiprocessing با آن داده را بین پروسه‌ها می‌فرستد.","title":"pickle"},{"content":"pip install requests پکیج و وابستگی‌هایش را در محیط فعال نصب می‌کند و pip freeze نسخه‌های دقیق را فهرست می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/pip/","summary":"نصب‌کننده‌ی استاندارد پکیج در Python که از PyPI دانلود می‌کند.","title":"pip"},{"content":"خروجی (stdout) یک دستور را به ورودی (stdin) دستور بعدی وصل می‌کند (a | b) تا ابزارهای کوچک به هم زنجیر شوند.\n","permalink":"https://justroham.ir/fa/glossary/pipe/","summary":"خروجی (stdout) یک دستور را به ورودی (stdin) دستور بعدی وصل می‌کند (\u003ccode\u003ea | b\u003c/code\u003e) تا ابزارهای کوچک به هم زنجیر شوند.","title":"Pipe"},{"content":"یک base backup و همه‌ی segmentهای WAL بعد از آن لازم است. target می‌تواند زمان، یک restore point نام‌دار (با pg_create_restore_point)، یک LSN یا شناسه‌ی تراکنش باشد. این ابزار برای برگرداندن یک DELETE اشتباه است، کاری که replica نمی‌تواند.\n","permalink":"https://justroham.ir/fa/glossary/pitr/","summary":"بازیابی به لحظه‌ی دلخواه: یک base backup را restore می‌کنید و WAL آرشیوشده را تا لحظه‌ی مورد نظر replay می‌کنید.","title":"PITR"},{"content":"کلاینت یک verifier تصادفی می‌سازد، هش SHA-256 آن (challenge) را در درخواست مجوز و خود verifier را در درخواست توکن می‌فرستد. code دزدیده‌شده بدون verifier به‌درد نمی‌خورد.\n","permalink":"https://justroham.ir/fa/glossary/pkce/","summary":"Proof Key for Code Exchange: کلاینت در درخواست توکن ثابت می‌کند همان است که درخواست مجوز را شروع کرده.","title":"PKCE"},{"content":"شامل تعداد مقدار متمایز، مقدارهای پرتکرار، histogram و correlation است و در pg_stats دیده می‌شود. آمار کهنه یا ناموجود تخمین غلط و plan بد می‌سازد.\n","permalink":"https://justroham.ir/fa/glossary/planner-statistics/","summary":"خلاصه‌ی هر ستون که \u003ccode\u003eANALYZE\u003c/code\u003e برای planner ذخیره می‌کند.","title":"Planner statistics"},{"content":"دستورهای روزمره مثل add و commit را porcelain می‌نامند. دستورهای plumbing یک کار کوچک انجام می‌دهند و برای فهمیدن درون گیت مفیدند.\n","permalink":"https://justroham.ir/fa/glossary/plumbing/","summary":"دستورهای سطح پایین گیت (hash-object، write-tree، commit-tree و \u0026hellip;) که دستورهای porcelain روی آن‌ها ساخته شده‌اند.","title":"plumbing"},{"content":"بدون محدودیت تعداد تحویل برای همیشه گیر می‌کند یا حلقه می‌زند؛ راه‌حل معمول max-deliver و مقصد dead-letter است.\n","permalink":"https://justroham.ir/fa/glossary/poison-message/","summary":"پیامی که هر بار consumer را به شکست می‌کشد، پس redelivery هرگز موفق نمی‌شود.","title":"Poison message"},{"content":"در چیدمان polyrepo هر پروژه مخزن، تاریخچه، CI و قواعد دسترسی خودش را دارد. کد مشترک به‌صورت وابستگی نسخه‌دار مصرف می‌شود، پس یک تغییر چندبخشی به یک pull request در هر مخزن نیاز دارد. نگاه کنید به monorepo.\n","permalink":"https://justroham.ir/fa/glossary/polyrepo/","summary":"هر سرویس یا کتابخانه مخزن خودش را دارد و جدا منتشر و نسخه‌بندی می‌شود.","title":"Polyrepo"},{"content":"postmortem بعد از یک حادثه از روی شواهد (لاگ، metric، گفت‌وگو) نوشته می‌شود: چه شد، چه اثری داشت، چرا، و چه چیزی باید عوض شود. هدفش یادگرفتن و کارهای مشخص است، نه سرزنش.\n","permalink":"https://justroham.ir/fa/glossary/postmortem/","summary":"یک بررسی نوشته‌شده‌ی پس از حادثه: چه شد، چه اثری داشت، چرا و چه باید عوض شود.","title":"Postmortem"},{"content":"برای هر درخواست فقط دو عدد بار لازم دارد، ولی در شبیه‌سازی (در مقاله) به انتخاب همیشگی کم‌بارترین instance نزدیک می‌ماند و از random خیلی بهتر است.\n","permalink":"https://justroham.ir/fa/glossary/power-of-two-choices/","summary":"قاعده‌ی load balancing: دو instance تصادفی انتخاب کن و درخواست را به آنی بده که صف کوتاه‌تری دارد.","title":"Power of two choices"},{"content":"این endpointها جزئیات داخلی را نشان می‌دهند، پس جایشان listener مدیریتی یا loopback است نه mux عمومی.\n","permalink":"https://justroham.ir/fa/glossary/pprof/","summary":"ابزار پروفایلینگ Go و handlerهای \u003ccode\u003enet/http/pprof\u003c/code\u003e که پروفایل‌ها را روی HTTP در دسترس می‌گذارند.","title":"pprof"},{"content":"سرور با هدرهای Access-Control-Allow-* جواب می‌دهد و Access-Control-Max-Age اجازه می‌دهد مرورگر جواب را نگه دارد.\n","permalink":"https://justroham.ir/fa/glossary/preflight/","summary":"درخواست OPTIONS که مرورگر پیش از درخواست بین‌origin با متد یا هدر سفارشی می‌فرستد تا بپرسد مجاز است یا نه.","title":"Preflight request"},{"content":"از restart جان سالم به در می‌برد و تا وقتی کسی تمامش نکند lockهایش را نگه می‌دارد. این بلوک سازنده‌ی two-phase commit با یک transaction manager بیرونی است.\n","permalink":"https://justroham.ir/fa/glossary/prepared-transaction/","summary":"در PostgreSQL تراکنشی که با PREPARE TRANSACTION از session جدا و روی دیسک ذخیره می‌شود و بعداً با COMMIT PREPARED یا ROLLBACK PREPARED تمام می‌شود.","title":"Prepared transaction"},{"content":"کلید اصلی یکتاست و هرگز NULL نیست، پس هر مقدار دقیقاً به یک سطر اشاره می‌کند. می‌تواند چند ستونی باشد، مثل (order_id, product_id) در order_items.\n","permalink":"https://justroham.ir/fa/glossary/primary-key/","summary":"ستون (یا ستون‌هایی) که هر سطر را یکتا مشخص می‌کنند.","title":"Primary key"},{"content":"پیام‌ها به subjectهایی مثل notify.high.sms و notify.low.sms می‌روند و worker اول از consumer اولویت بالا می‌پرسد. خطر آن گرسنگی لاین پایین است؛ بخشی از ظرفیت را برایش نگه دارید.\n","permalink":"https://justroham.ir/fa/glossary/priority-lane/","summary":"یک صف یا consumer جدا برای هر اولویت که به ترتیب سخت‌گیرانه سرویس می‌گیرد تا پیام فوری پشت یک backlog نماند.","title":"Priority lane"},{"content":"صف اولویت دو عمل Push و Pop دارد و Pop فوری‌ترین آیتم (کوچک‌ترین یا بزرگ‌ترین کلید) را برمی‌گرداند. این یک interface است، نه یک ساختار حافظه؛ پیاده‌سازی معمول آن binary heap است. اولویت‌های برابر ترتیب مشخصی ندارند، مگر اینکه tie-break مثل شماره‌ی ترتیب اضافه کنید.\n","permalink":"https://justroham.ir/fa/glossary/priority-queue/","summary":"ظرفی انتزاعی که همیشه آیتم با بالاترین اولویت را بیرون می‌دهد، نه قدیمی‌ترین را.","title":"Priority queue"},{"content":"نمونه‌ی در حال اجرای یک برنامه، با pid، حافظه و پروسه‌ی والد خودش. هر پروسه را والدش می‌سازد و با یک کد خروج تمام می‌شود که والد با wait می‌خواند.\n","permalink":"https://justroham.ir/fa/glossary/process/","summary":"نمونه‌ی در حال اجرای یک برنامه، با pid، حافظه و پروسه‌ی والد خودش.","title":"Process"},{"content":"مجموعه‌ای از پروسه‌های مرتبط (مثلاً یک pipeline) که می‌توانند با هم سیگنال بگیرند. با kill -- -PGID به کل گروه سیگنال می‌رسد. یک session تازه (setsid) گروه تازه می‌سازد.\n","permalink":"https://justroham.ir/fa/glossary/process-group/","summary":"مجموعه‌ای از پروسه‌های مرتبط (مثلاً یک pipeline) که می‌توانند با هم سیگنال بگیرند.","title":"Process group"},{"content":"قابلیتی در bash و zsh، یعنی \u0026lt;(cmd)، که خروجی یک دستور را مثل نام فایل نشان می‌دهد تا ابزارهایی که فایل می‌خواهند بتوانند آن را بخوانند (diff \u0026lt;(a) \u0026lt;(b)). در POSIX نیست.\n","permalink":"https://justroham.ir/fa/glossary/process-substitution/","summary":"قابلیتی در bash و zsh، یعنی \u003ccode\u003e\u0026lt;(cmd)\u003c/code\u003e، که خروجی یک دستور را مثل نام فایل نشان می‌دهد تا ابزارهایی که فایل می‌خواهند بتوانند آن را بخوانند (\u003ccode\u003ediff \u0026lt;(a) \u0026lt;(b)\u003c/code\u003e). در POSIX نیست.","title":"Process substitution"},{"content":"فایل‌سیستم مجازی /proc در Linux است. فایل‌هایش روی دیسک وجود ندارند و کرنل هنگام خواندن می‌سازدشان؛ مثلاً /proc/self/status وضعیت پروسه‌ی خودتان است.\n","permalink":"https://justroham.ir/fa/glossary/procfs/","summary":"فایل‌سیستم مجازی /proc در Linux که کرنل با آن وضعیت پروسه‌ها و سیستم را مثل فایل نشان می‌دهد.","title":"procfs"},{"content":"checkpoint آخرین موقعیت رویداد پردازش‌شده را نگه می‌دارد تا بعد از restart از همان‌جا ادامه دهد.\n","permalink":"https://justroham.ir/fa/glossary/projection/","summary":"یک read model که با مصرف رویدادها ساخته می‌شود و جدولی مناسب query نگه می‌دارد؛ با replay می‌توان آن را حذف و دوباره ساخت.","title":"Projection"},{"content":"یک promise فقط یک بار به یک مقدار یا یک خطا تبدیل می‌شود. کار بعدی را با .then و .catch به آن وصل می‌کنید یا با async/await منتظرش می‌مانید؛ callbackها به شکل microtask اجرا می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/promise/","summary":"مقداری که نماینده‌ی نتیجه‌ای است که هنوز آماده نیست: اول pending، بعد fulfilled یا rejected.","title":"Promise"},{"content":"به‌جای مثال‌های ثابت، یک خاصیت می‌نویسید (مثلاً دوبار معکوس کردن همان اصل را می‌دهد) و ابزار ورودی‌های تصادفی زیادی می‌سازد تا مثال نقض پیدا کند. Go ابزار testing/quick و کتابخانه‌ی rapid را دارد.\n","permalink":"https://justroham.ir/fa/glossary/property-based-testing/","summary":"قاعده‌ای را که باید برای همه‌ی ورودی‌ها برقرار باشد با ورودی‌های خودکار می‌آزماید.","title":"Property-based testing"},{"content":"protobuf هر پیام را به‌صورت جفت‌های «شماره‌ی فیلد و مقدار» کدگذاری می‌کند، نه نام فیلد؛ پس پیام‌ها کوچکند و اضافه شدن فیلد جدید مشکلی ایجاد نمی‌کند. gRPC آن را به‌عنوان قالب پیش‌فرض پیام استفاده می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/protobuf/","summary":"قالب باینری فشرده برای پیام‌های ساختاریافته که در فایل .proto تعریف می‌شود.","title":"Protocol Buffers"},{"content":"معمولاً از کد merge یا کپی بازگشتی می‌آید که به کلیدهای JSON اعتماد می‌کند. اعتبارسنجی ورودی به یک شیء تازه با شکل مشخص، کلیدهایی را که اعلام نکرده‌اید حذف می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/prototype-pollution/","summary":"باگی در جاوااسکریپت که در آن کلیدهای زیر کنترل مهاجم مثل \u003cstrong\u003eproto\u003c/strong\u003e prototype شیءها را عوض می‌کنند و شیءهای نامرتبط ناگهان ویژگی اضافه پیدا می‌کنند.","title":"Prototype pollution"},{"content":"ptrace فراخوان Linux است که یک tracer با آن پروسه‌ی tracee را متوقف می‌کند، رجیسترها و حافظه‌اش را می‌خواند و ادامه می‌دهد. طبق man page برای وصل شدن مجوز لازم است، مثلاً CAP_SYS_PTRACE برای پروسه‌های کاربران دیگر.\n","permalink":"https://justroham.ir/fa/glossary/ptrace/","summary":"فراخوانی که اجازه می‌دهد یک پروسه پروسه‌ی دیگر را ببیند و کنترل کند؛ strace و دیباگرها از آن استفاده می‌کنند.","title":"ptrace"},{"content":"کلاینت یک دسته (یا یک پیام) درخواست می‌کند و با سرعت خودش پردازش می‌کند؛ پس طبیعتاً زیر فشار نمی‌رود. برای workerها روش پیشنهادی است.\n","permalink":"https://justroham.ir/fa/glossary/pull-consumer/","summary":"consumer‌ای در JetStream که کلاینت پیام را می‌خواهد و سرور آن را push نمی‌کند.","title":"Pull consumer"},{"content":"Pydantic از کلاس‌های دارای annotation مدل می‌سازد. Model.model_validate(data) داده را بررسی و تبدیل می‌کند (حالت lax رشته‌ی \u0026quot;5\u0026quot; را به 5 تبدیل می‌کند) و در صورت خطا ValidationError با فهرست خطاها می‌دهد. FastAPI آن را برای body ‌ی درخواست و پاسخ استفاده می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/pydantic/","summary":"کتابخانه‌ای در Python که داده را با type hint اعتبارسنجی و تبدیل می‌کند.","title":"Pydantic"},{"content":"با PyO3 توابع و structهای Rust را با #[pyfunction]، #[pyclass] و #[pymodule] علامت می‌زنید و ابزار build مثل maturin کرِیت را به یک ماژول قابل import در Python تبدیل می‌کند. تبدیل آرگومان‌ها و نگاشت خطا به exception خودکار تولید می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/pyo3/","summary":"یک کتابخانه‌ی Rust برای نوشتن ماژول‌های توسعه‌ی Python (و صدا زدن Python از Rust).","title":"PyO3"},{"content":"نقشی شبیه registry مربوط به npm در Node.js دارد.\n","permalink":"https://justroham.ir/fa/glossary/pypi/","summary":"مخزن عمومی پیش‌فرض پکیج‌های Python که pip و uv از آن دانلود می‌کنند.","title":"PyPI"},{"content":"تقریباً معادل package.json در Node.js یا go.mod در Go است. uv با uv add آن را به‌روز نگه می‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/pyproject-toml/","summary":"فایل استاندارد پروژه‌ی Python با متادیتا، نسخه‌ی لازم Python و وابستگی‌های مستقیم.","title":"pyproject.toml"},{"content":"planner برای هر راه ممکن اجرای query (اسکن جدول، استفاده از ایندکس، ترتیب join) یک هزینه تخمین می‌زند و ارزان‌ترین را برمی‌گزیند. EXPLAIN پلن را نشان می‌دهد و EXPLAIN ANALYZE query را اجرا هم می‌کند و تعداد ردیف‌های واقعی را اضافه می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/query-plan/","summary":"درخت قدم‌هایی که دیتابیس برای اجرای یک query انتخاب می‌کند و EXPLAIN نشان می‌دهد.","title":"Query plan"},{"content":"با تکیه بر آمار، هزینه‌ی planهای ممکن را تخمین می‌زند و ارزان‌ترین را برمی‌دارد. EXPLAIN plan انتخاب‌شده را نشان می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/query-planner/","summary":"بخشی از دیتابیس که تصمیم می‌گیرد کوئری چطور اجرا شود.","title":"Query planner"},{"content":"مجموعه‌ای اولین‌ورودی-اولین‌خروجی (FIFO): از انتها اضافه و از ابتدا حذف می‌شود. معمولاً روی ring buffer ساخته می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/queue/","summary":"مجموعه‌ای اولین‌ورودی-اولین‌خروجی (FIFO): از انتها اضافه و از ابتدا حذف می‌شود. معمولاً روی ring buffer ساخته می‌شود.","title":"Queue"},{"content":"در NATS core سرور برای هر پیام یک عضو انتخاب می‌کند؛ subscriberهای بیرون گروه همچنان نسخه‌ی خودشان را می‌گیرند.\n","permalink":"https://justroham.ir/fa/glossary/queue-group/","summary":"subscriberهایی که یک نام مشترک دارند تا هر پیام فقط به یک عضو گروه برسد.","title":"Queue group"},{"content":"Quicksort یک pivot انتخاب می‌کند، کوچک‌ترها را سمت چپ و بزرگ‌ترها را سمت راست آن می‌برد و هر طرف را جداگانه مرتب می‌کند. آرایه‌ی اضافه نمی‌خواهد، ولی pivot بد (مثلاً همیشه عنصر اول روی ورودی مرتب) آن را به O(n^2) می‌رساند. pivot میانه‌ی سه‌تایی و cutoff به insertion sort برای بازه‌های کوچک راه‌حل‌های رایج‌اند. پایدار (stable) نیست.\n","permalink":"https://justroham.ir/fa/glossary/quicksort/","summary":"Quicksort در جا، با انتخاب pivot و افراز slice به دو طرف آن، و مرتب‌کردن بازگشتی هر طرف؛ به‌طور میانگین O(n log n).","title":"Quicksort"},{"content":"با ۳ replica، quorum برابر ۲ است. همین همپوشانی باعث می‌شود سمت اقلیت partition تنها نتواند پیش برود. network partition را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/quorum/","summary":"گروهی از replicaها که موافقتشان لازم است، معمولاً اکثریت قطعی، تا هر دو quorum همپوشانی داشته باشند.","title":"Quorum"},{"content":"Rabin–Karp یک پنجره را روی متن می‌لغزاند و هش غلتان را در O(1) به‌روز می‌کند. برابری هش ممکن است برخورد باشد، پس باید تأیید شود. به‌راحتی به چند الگوی هم‌طول تعمیم می‌یابد.\n","permalink":"https://justroham.ir/fa/glossary/rabin-karp/","summary":"جست‌وجوی رشته که اول هش پنجره‌ها را مقایسه می‌کند و فقط وقتی هش‌ها برابرند متن واقعی را بررسی می‌کند.","title":"Rabin–Karp"},{"content":"data race وقتی رخ می‌دهد که دو goroutine هم‌زمان به یک متغیر دسترسی داشته باشند و دست‌کم یکی بنویسد. نتیجه تعریف‌نشده است و اغلب فقط زیر بار دیده می‌شود. Go یک detector دارد: تست یا برنامه را با go test -race یا go run -race اجرا کنید.\n","permalink":"https://justroham.ir/fa/glossary/race-condition/","summary":"باگی که نتیجه‌اش به زمان‌بندیِ همگام‌نشده‌ی دسترسی‌های هم‌زمان بستگی دارد.","title":"Race condition"},{"content":"Raft را Ongaro و Ousterhout توصیف کرده‌اند. زمان به termها تقسیم می‌شود؛ هر term حداکثر یک leader دارد و فقط leader به log اضافه می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/raft/","summary":"یک الگوریتم consensus از leader election، تکثیر log و قوانین safety که برای فهم آسان‌تر از Paxos طراحی شده است.","title":"Raft"},{"content":"محدودسازی نرخ سرویس را از بار زیاد و از یک کلاینت پرسروصدا حفظ می‌کند. برای هر کلید، مثل کلاینت یا tenant، جواب می‌دهد پذیرش یا رد (اغلب HTTP 429).\n","permalink":"https://justroham.ir/fa/glossary/rate-limiting/","summary":"سقف‌گذاری روی تعداد درخواست‌های یک کلاینت در بازه‌ی زمانی.","title":"Rate limiting"},{"content":"در RBAC هر کاربر یک نقش (viewer، editor، admin) دارد و هر نقش به مجموعه‌ای از مجوزها مثل doc:delete نگاشت می‌شود. کد مجوز را بررسی می‌کند، نه نام نقش را، پس نقش‌ها بدون دست زدن به handlerها عوض می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/rbac/","summary":"کنترل دسترسی نقش‌محور: کاربر نقش می‌گیرد و هر نقش به مجموعه‌ای از مجوزها نگاشت می‌شود.","title":"RBAC"},{"content":"RCE از شدیدترین دسته‌های آسیب‌پذیری است چون اغلب به تسخیر کامل می‌انجامد. علل رایج: deserialization ناامن، تزریق دستور یا template و آپلود فایل بدون بررسی. راه مقابله: وصله‌ی سریع، اجرا با کمترین سطح دسترسی و محدود کردن دسترسی شبکه.\n","permalink":"https://justroham.ir/fa/glossary/rce/","summary":"Remote Code Execution: مهاجم کد خودش را روی سرور شما اجرا می‌کند.","title":"RCE"},{"content":"در CQRS و event sourcing، مدل خواندن یک projection از لاگ رویدادهاست. اگر پاک شود با fold کردن دوباره‌ی لاگ ساخته می‌شود؛ پس بعد از رسیدن همه‌ی رویدادها، مدل درست همیشه با fold لاگ برابر است.\n","permalink":"https://justroham.ir/fa/glossary/read-model/","summary":"نسخه‌ای از داده که برای کوئری آماده شده و با اعمال رویدادهای سمت نوشتن ساخته می‌شود؛ ممکن است عقب باشد ولی باید همگرا شود.","title":"Read model"},{"content":"روشی ارزان برای ترمیم replicaها با ترافیکی که از قبل هست. کلیدهایی که هرگز خوانده نشوند قدیمی می‌مانند، پس کنار آن به anti-entropy نیاز است.\n","permalink":"https://justroham.ir/fa/glossary/read-repair/","summary":"هنگامی که خواندن متوجه replicaی با نسخه‌ی قدیمی می‌شود، نسخه‌ی جدید را همان لحظه روی آن می‌نویسد.","title":"Read repair"},{"content":"یک تضمین در سطح session. راه‌حل رایج یک session token است که نسخه‌ی آخرین write را نگه می‌دارد؛ replicaی که عقب‌تر است کنار گذاشته می‌شود و read به leader می‌رود.\n","permalink":"https://justroham.ir/fa/glossary/read-your-writes/","summary":"بعد از این‌که client مقداری می‌نویسد، readهای بعدی خودش همان مقدار یا جدیدتر را می‌بینند.","title":"Read-your-writes"},{"content":"rebase commitهای branch شما را یکی‌یکی روی commit دیگری دوباره اعمال می‌کند. نتیجه یک خط مستقیم است، ولی هر commit بازپخش‌شده یک شیء جدید است و hash آن عوض می‌شود. برای همین rebase کردن commitهایی که دیگران دارند خطرناک است.\n","permalink":"https://justroham.ir/fa/glossary/rebase/","summary":"commitهای شما را روی یک پایه‌ی دیگر دوباره اجرا می‌کند و commitهای جدید با hash جدید می‌سازد.","title":"rebase"},{"content":"برنامه‌ی شما از یک recursive resolver می‌پرسد (مثلاً یک resolver عمومی یا مال ISP). او از root به TLD و سپس به authoritative server می‌رود، جواب نهایی را برمی‌گرداند و در مسیر cache می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/recursive-resolver/","summary":"سرور DNS که کل جست‌وجو را برای کلاینت انجام می‌دهد و نتیجه را cache می‌کند.","title":"Recursive resolver"},{"content":"ref فایلی زیر .git/refs/ است (branch، tag، remote-tracking branch) که محتوایش شناسه‌ی یک object است. git for-each-ref همه را فهرست می‌کند و git update-ref آن‌ها را می‌نویسد. symbolic ref به‌جای شناسه، به ref دیگری اشاره می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/git-ref/","summary":"نامی خوانا که به یک object گیت اشاره می‌کند.","title":"Ref"},{"content":"refactoring یعنی بازنویسی درون کد (نام‌ها، تابع‌ها، تو در تویی) در حالی که هر ورودی همان خروجی قبلی را بدهد. اگر رفتار عمداً عوض شود، آن تغییر دیگری است و باید در commit جدا برود. بدون تستی که رفتار را ثابت کند نمی‌دانید کدام‌یک را انجام داده‌اید.\n","permalink":"https://justroham.ir/fa/glossary/refactoring/","summary":"تغییر ساختار کد بدون تغییر رفتار قابل مشاهده‌ی آن.","title":"Refactoring"},{"content":"ضد خوش‌بینی است: به‌جای اینکه بپرسید برنامه‌ی ما چقدر طول می‌کشد، بپرسید پروژه‌هایی مثل این معمولاً چقدر طول کشیده‌اند.\n","permalink":"https://justroham.ir/fa/glossary/reference-class-forecasting/","summary":"پیش‌بینی از روی نتیجه‌ی پروژه‌های مشابه گذشته، نه جزئیات این پروژه.","title":"Reference-class forecasting"},{"content":"git reflog ورودی‌هایی مثل HEAD@{1} را نشان می‌دهد. فقط روی همین clone است، push نمی‌شود و ورودی‌های قدیمی منقضی می‌شوند (طبق مستندات ۹۰ روز اگر reachable باشند و ۳۰ روز اگر نباشند). فقط کار commit‌شده را به یاد دارد. ببینید git reset.\n","permalink":"https://justroham.ir/fa/glossary/reflog/","summary":"گزارش محلی از جاهایی که HEAD و سر branchها به آن اشاره کرده‌اند؛ برای بازیابی commit بعد از reset یا حذف branch.","title":"reflog"},{"content":"با rotation هر استفاده یک refresh token تازه می‌دهد و قبلی را باطل می‌کند. اگر قبلی دوباره ظاهر شود، سرور می‌تواند آن را دزدی بداند و کل خانواده را باطل کند.\n","permalink":"https://justroham.ir/fa/glossary/refresh-token/","summary":"اعتبارنامه‌ای بلندمدت که کلاینت آن را با access token کوتاه‌مدت جدید عوض می‌کند.","title":"Refresh token"},{"content":"رگرسیون یعنی یک نسخه‌ی سالم قبلی و یک نسخه‌ی خراب بعدی وجود دارد، دقیقاً همان بازه‌ای که git bisect در آن جست‌وجو می‌کند. تستی که قبلاً پاس می‌شد و حالا فیل می‌شود نشانه‌ی کلاسیک آن است.\n","permalink":"https://justroham.ir/fa/glossary/regression/","summary":"باگی که چیزی را که قبلاً درست کار می‌کرد خراب می‌کند.","title":"Regression"},{"content":"مدل رابطه‌ای داده را به شکل سطرهای یک جدول نگه می‌دارد. هر جدول ستون‌های نوع‌دار دارد و جدول‌ها با مقدار (کلید) به هم وصل می‌شوند، نه با اشاره‌گر. SQL زبان پرس‌وجو در این مدل است.\n","permalink":"https://justroham.ir/fa/glossary/relational-model/","summary":"مدلی که داده در جدول‌هایی از سطر و ستون نگهداری می‌شود و با کلید به هم وصل‌اند.","title":"Relational model"},{"content":"به‌روزرسانی فاصله‌ی یک رأس وقتی مسیر از یک یال کوتاه‌تر از بهترین مسیر شناخته‌شده است.\nبرای یال u به v با وزن w: اگر dist[u] + w کمتر از dist[v] بود، آن را در dist[v] می‌گذاریم. Dijkstra و Bellman-Ford هر دو روی همین گام ساخته شده‌اند.\n","permalink":"https://justroham.ir/fa/glossary/relaxation/","summary":"به‌روزرسانی فاصله‌ی یک رأس وقتی مسیر از یک یال کوتاه‌تر از بهترین مسیر شناخته‌شده است.","title":"Relaxation"},{"content":"remote-tracking branchها زیر .git/refs/remotes/\u0026lt;remote\u0026gt;/ هستند و فقط با git fetch یا git push به‌روز می‌شوند. آن‌ها وضعیت remote در آخرین ارتباط شما را نشان می‌دهند، نه وضعیت فعلی را.\n","permalink":"https://justroham.ir/fa/glossary/remote-tracking-branch/","summary":"ثبت محلی و فقط‌خواندنی از یک branch روی remote، مثل origin/main.","title":"Remote-tracking branch"},{"content":"برای هر کلید همه‌ی node ها را با hash ِ جفت امتیاز می‌دهید و بالاترین را برمی‌دارید. حذف یک node فقط کلیدهای خودش را جابه‌جا می‌کند. حلقه لازم نیست ولی هر جست‌وجو O(تعداد node ها) است. مقایسه کنید با Consistent hashing.\n","permalink":"https://justroham.ir/fa/glossary/rendezvous-hashing/","summary":"هر کلید به node ای می‌رود که بیشترین امتیاز hash(node, key) را دارد (به آن HRW هم می‌گویند).","title":"Rendezvous hashing"},{"content":"یک entry وقتی committed است که اکثریت آن را ذخیره کرده باشند (و در Raft قوانین term خود leader رعایت شده باشد). فقط entryهای committed اعمال می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/replicated-log/","summary":"فهرست مرتبی از فرمان‌ها که روی چند node کپی می‌شود؛ اگر همه log یکسان را به همان ترتیب اعمال کنند، state machineها یکسان می‌شوند.","title":"Replicated log"},{"content":"در streaming replication پستگرس، primary جریان WAL را به standbyها می‌فرستد و آن‌ها replay می‌کنند. standbyها فقط خواندن را جواب می‌دهند و قابل promote هستند. بک‌آپ نیست: نوشتن اشتباه هم replicate می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/replication/","summary":"نگه‌داشتن یک نسخه‌ی دوم که دائم به‌روز می‌شود از دیتابیس روی سرور دیگر.","title":"Replication"},{"content":"با request ID می‌شود همه‌ی لاگ‌های یک درخواست را از میان لاگ شلوغ بیرون کشید. معمولاً از یک هدر ورودی (مثل x-request-id) گرفته و به کلاینت برگردانده می‌شود تا دو طرف بتوانند به آن ارجاع بدهند.\n","permalink":"https://justroham.ir/fa/glossary/request-id/","summary":"شناسه‌ی یکتایی که به یک درخواست و همه‌ی لاگ‌هایش چسبانده می‌شود.","title":"Request ID"},{"content":"وقتی ممکن می‌شود که مثلاً یک proxy و backend درباره‌ی اینکه Content-Length طول body را تعیین می‌کند یا Transfer-Encoding اختلاف داشته باشند. اینجا فقط مفهوم است؛ سری امنیت به دفاع می‌پردازد.\n","permalink":"https://justroham.ir/fa/glossary/request-smuggling/","summary":"حمله‌ای که از اختلاف دو parser HTTP درباره‌ی پایان درخواست سوءاستفاده می‌کند.","title":"Request smuggling"},{"content":"با rerere.enabled فعال می‌شود. Git conflict و حل شما را در .git/rr-cache ذخیره می‌کند و دفعه‌ی بعد همان conflict را پر می‌کند. فایل را stage نمی‌کند.\n","permalink":"https://justroham.ir/fa/glossary/rerere/","summary":"قابلیتی در Git (reuse recorded resolution) که حل قبلی یک conflict را دوباره اعمال می‌کند.","title":"rerere"},{"content":"هر درخواست کسری از یک توکن (مثلاً ۰٫۱) اضافه می‌کند و هر retry یک توکن خرج می‌کند؛ پس retry‌ها حدود ۱۰٪ ترافیک می‌مانند. وقتی بودجه تمام شود کلاینت به‌جای فشار آوردن به سرور در حال دست‌وپا زدن، سریع شکست می‌خورد.\n","permalink":"https://justroham.ir/fa/glossary/retry-budget/","summary":"سقفی برای retry‌ها به‌صورت کسری از درخواست‌های عادی، معمولاً با token bucket.","title":"Retry budget"},{"content":"یک قطعی کوتاه باعث شکست درخواست‌های زیادی می‌شود؛ retry آن‌ها همراه ترافیک تازه می‌رسد و می‌تواند سرور را حتی بعد از رفع خطای اصلی تحت فشار نگه دارد. backoff با jitter و retry budget آن را محدود می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/retry-storm/","summary":"فشار اضافه‌ای که از retry هم‌زمان کلاینت‌ها روی سرور از پیش آسیب‌دیده ایجاد می‌شود.","title":"Retry storm"},{"content":"reverse proxy اتصال HTTP کلاینت را تمام می‌کند، درخواست را می‌خواند و درخواست تازه‌ای به backend می‌فرستد. چون HTTP را می‌فهمد می‌تواند بر اساس path مسیریابی کند، هدر اضافه کند و دوباره تلاش کند.\n","permalink":"https://justroham.ir/fa/glossary/reverse-proxy/","summary":"سروری که درخواست کلاینت را می‌گیرد و به‌جای او به backend می‌رساند.","title":"Reverse proxy"},{"content":"در یک تیم، RFC معمولاً پیشنهادی بلندتر است که آدم‌ها آن را مرور و درباره‌اش بحث می‌کنند. وقتی تصمیم گرفته شد، یک ADR کوتاه می‌تواند نتیجه را ثبت کند.\n","permalink":"https://justroham.ir/fa/glossary/rfc/","summary":"Request for Comments: سند پیشنهادی که پیش از تصمیم برای بحث و نظرخواهی پخش می‌شود.","title":"RFC"},{"content":"آرایه‌ی ثابت با اندیس head و یک شمارنده که موقعیت‌ها با باقی‌مانده دور می‌زنند؛ پس حذف از ابتدا هیچ عنصری را جابه‌جا نمی‌کند. وقتی پر شد می‌تواند دو برابر شود (یک بار کپی) تا push سرشکن O(1) بماند.\n","permalink":"https://justroham.ir/fa/glossary/ring-buffer/","summary":"آرایه‌ی ثابت با اندیس head و یک شمارنده که موقعیت‌ها با باقی‌مانده دور می‌زنند؛ پس حذف از ابتدا هیچ عنصری را جابه‌جا نمی‌کند. وقتی پر شد می‌تواند دو برابر شود (یک بار کپی) تا push سرشکن O(1) بماند.","title":"Ring buffer"},{"content":"roll-forward یعنی اصلاح را به‌صورت نسخه‌ی تازه بفرستیم، نه اینکه به نسخه‌ی قبل برگردیم. وقتی rollback امن نیست، مثلاً بعد از نوشته شدن داده با قالب جدید، معمولاً همین راه است.\n","permalink":"https://justroham.ir/fa/glossary/roll-forward/","summary":"اصلاح یک انتشار بد با انتشار تازه، نه برگشت.","title":"Roll forward"},{"content":"برای کد آسان است و برای داده سخت: migration مخرب با deploy دوباره‌ی کد قدیمی برگردانده نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/rollback/","summary":"برگرداندن production به نسخه‌ی سالم قبلی، در مقابل roll forward یعنی ارائه‌ی یک اصلاح تازه.","title":"rollback"},{"content":"با پایه‌ی b و پیمانه‌ی q به‌روزرسانی چنین است: h = ((h - old * b^(m-1)) * b + new) mod q. پنجره‌های برابر همیشه هش برابر دارند؛ پنجره‌های متفاوت هم ممکن است (برخورد).\n","permalink":"https://justroham.ir/fa/glossary/rolling-hash/","summary":"هشِ یک پنجره‌ی لغزان که با حذف نویسه‌ی قدیمی و افزودن نویسه‌ی جدید در O(1) به‌روز می‌شود.","title":"Rolling hash"},{"content":"در rolling update نسخه‌ی قدیمی instance به instance عوض می‌شود و معمولاً پیش از ادامه منتظر readiness check می‌ماند. در طول اجرا نسخه‌ی قدیم و جدید هم‌زمان ترافیک می‌گیرند.\n","permalink":"https://justroham.ir/fa/glossary/rolling-update/","summary":"استقراری که instanceها را یکی‌یکی عوض می‌کند.","title":"Rolling update"},{"content":"RSS مقدار حافظه‌ای از پروسه است که واقعاً در RAM قرار دارد. با اندازه‌ی مجازی (VSZ) فرق دارد و معمولاً عدد مهم‌تر برای دیدن مصرف حافظه است.\n","permalink":"https://justroham.ir/fa/glossary/rss/","summary":"Resident set size: مقدار حافظه‌ی فیزیکی که پروسه همین حالا در RAM دارد، نه کل حافظه‌ی مجازی‌اش.","title":"RSS"},{"content":"FIN یعنی «من فرستادن را تمام کردم» و به‌ترتیب تحویل می‌شود؛ RST یعنی «این اتصال مرده است». طرف مقابل خطای ECONNRESET می‌گیرد و connect به port بسته روی loopback هم با RST جواب داده می‌شود (connection refused).\n","permalink":"https://justroham.ir/fa/glossary/tcp-rst/","summary":"یک segment در TCP که اتصال را فوراً و بدون تبادل مرتب FIN قطع می‌کند.","title":"RST"},{"content":"runbook به پرسش «الان چه کنم؟» در زمان حادثه جواب می‌دهد: کدام دستور را بزنم، چه چیزی را ببینم، با چه کسی تماس بگیرم. با هر تغییر در عملیات عوض می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/runbook/","summary":"راهنمای گام‌به‌گام برای اداره‌ی یک سیستم و برخورد با یک خرابی شناخته‌شده.","title":"Runbook"},{"content":"هر حرف فارسی در UTF-8 دو بایت است، پس اندیس‌گذاری بر اساس بایت حرف را می‌شکند.\n","permalink":"https://justroham.ir/fa/glossary/rune/","summary":"در Go یک int32 که یک نقطه‌ی کد Unicode را نگه می‌دارد؛ رشته بایت است و یک نویسه می‌تواند چند بایت باشد.","title":"Rune"},{"content":"saga ایزولاسیون را کنار می‌گذارد: دیگران می‌توانند حالت‌های میانی را ببینند. اجرای آن یا با یک orchestrator است که state machine را ذخیره می‌کند، یا با واکنش سرویس‌ها به eventهای هم (choreography).\n","permalink":"https://justroham.ir/fa/glossary/saga/","summary":"یک تراکنش طولانی کسب‌وکاری که به چند تراکنش محلی شکسته می‌شود و هر کدام یک کار جبرانی دارد که اگر قدم بعدی شکست خورد آن را خنثی می‌کند.","title":"Saga"},{"content":"salt محرمانه نیست. جلوی جدول‌های از پیش محاسبه‌شده را می‌گیرد و مهاجم را مجبور می‌کند هر حساب را جدا حمله کند.\n","permalink":"https://justroham.ir/fa/glossary/salt/","summary":"مقدار تصادفی که کنار هش پسورد ذخیره می‌شود تا پسوردهای یکسان هش‌های متفاوت بدهند.","title":"Salt"},{"content":"Lax کوکی را در POST و زیردرخواست‌های بین‌سایتی نمی‌فرستد ولی در ناوبری معمولی می‌فرستد؛ Strict سخت‌گیرانه‌تر است؛ None به Secure نیاز دارد.\n","permalink":"https://justroham.ir/fa/glossary/samesite/","summary":"ویژگی کوکی که تعیین می‌کند مرورگر در درخواست‌های بین‌سایتی کوکی را کِی بفرستد.","title":"SameSite"},{"content":"email = 'a' sargable است؛ lower(email) = 'a' نیست مگر ایندکسی روی lower(email) باشد. cast روی ستون یا % ابتدایی هم آن را خراب می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/sargable/","summary":"شرطی که طوری نوشته شده که ایندکس بتواند برایش به کار برود.","title":"Sargable"},{"content":"SAVEPOINT s1 نقطه را علامت می‌زند و ROLLBACK TO s1 هرچه بعد از آن بوده را برمی‌گرداند؛ تراکنش باز و قابل استفاده می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/savepoint/","summary":"نقطه‌ای نام‌دار داخل یک تراکنش که می‌شود بدون رها کردن کل تراکنش به آن برگشت.","title":"Savepoint"},{"content":"فرمت‌هایی مثل CycloneDX و SPDX نام، نسخه و hash را توصیف می‌کنند. وقتی ضعف تازه‌ای اعلام می‌شود، SBOM اجازه می‌دهد در آنچه تحویل داده‌اید جست‌وجو کنید، نه حدس بزنید.\n","permalink":"https://justroham.ir/fa/glossary/sbom/","summary":"Software Bill of Materials: فهرست قابل‌خواندن برای ماشین از اجزای داخل یک build.","title":"SBOM"},{"content":"هزینه با تعداد shardها بالا می‌رود: هر کوئری به ازای هر shard یک درخواست می‌سازد و کندترین shard تأخیر را تعیین می‌کند. کوئری‌ای که shard key دارد فقط به یک shard می‌رود.\n","permalink":"https://justroham.ir/fa/glossary/scatter-gather/","summary":"فرستادن کوئری به همه‌ی shardها و ادغام پاسخ‌های جزئی، وقتی کوئری شامل shard key نیست.","title":"Scatter-gather"},{"content":"schema توصیف می‌کند ورودی معتبر چه شکلی است؛ parse یا داده‌ی تمیز برمی‌گرداند یا فهرستی از issueها. کتابخانه‌هایی مثل Zod این کار را به‌جای فایل schema جدا، در خود کد انجام می‌دهند.\n","permalink":"https://justroham.ir/fa/glossary/schema-validation/","summary":"بررسی داده‌ی غیرقابل‌اعتماد با یک شکل تعریف‌شده (نوع، بازه، فیلدهای الزامی) در مرز برنامه، پیش از آنکه بقیه‌ی کد از آن استفاده کند.","title":"Schema validation"},{"content":"uv build یک sdist با پسوند .tar.gz و یک wheel کنار هم می‌سازد. ابزار نصب wheel مناسب را ترجیح می‌دهد و در غیر این صورت به sdist برمی‌گردد.\n","permalink":"https://justroham.ir/fa/glossary/sdist/","summary":"توزیع سورس یک بسته‌ی Python: آرشیو سورس به‌همراه metadata که در صورت نیاز هنگام نصب به wheel ساخته می‌شود.","title":"sdist"},{"content":"در Go یک seam معمولاً یک متغیر تابعی (var now = time.Now)، یک interface کوچک یا یک پارامتر است. تست چیزی را که پشت seam است، مثل ساعت یا دیتابیس، عوض می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/seam/","summary":"جایی که می‌توان رفتار را بدون ویرایش کدِ اطرافش عوض کرد.","title":"Seam"},{"content":"اسکنر قالب‌های شناخته‌شده (مثل پیشوند کلیدهای ابری) را با regex پیدا می‌کند و رشته‌های تصادفی‌نما را با آنتروپی شانون علامت می‌زند. این کار مقداری هشدار اشتباه می‌دهد تا پوشش بیشتری بگیرد. ابزارهای واقعی‌اش gitleaks و trufflehog هستند.\n","permalink":"https://justroham.ir/fa/glossary/secret-scanning/","summary":"جستجوی الگو و آنتروپی در کد و تاریخچه‌ی git برای پیدا کردن اعتبارنامه‌های لو رفته.","title":"Secret scanning"},{"content":"corpus اولیه مجموعه‌ی کوچکی از ورودی‌های معتبر است (در Go با f.Add و فایل‌های testdata/fuzz). fuzzer آن‌ها را جهش می‌دهد، پس seedهای خوب سریع به کد عمیق می‌رسند. ورودی‌های شکست‌خورده همان‌جا ذخیره و با go test ساده دوباره اجرا می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/seed-corpus/","summary":"ورودی‌های شروع که به fuzzer داده می‌شود، بهتر است نمونه‌های واقعی باشند.","title":"Seed corpus"},{"content":"شرطی که ۰٫۱٪ ردیف‌ها را بگیرد بسیار گزینشگر است و به نفع ایندکس؛ شرطی که ۷۰٪ را بگیرد نیست و معمولاً خواندن ترتیبی ارزان‌تر است.\n","permalink":"https://justroham.ir/fa/glossary/selectivity/","summary":"کسری از ردیف‌ها که یک شرط نگه می‌دارد.","title":"Selectivity"},{"content":"شیء مبتنی بر شمارنده که حداکثر N نفر را هم‌زمان راه می‌دهد و بقیه منتظر می‌مانند. برای سقف گذاشتن روی هم‌زمانی استفاده می‌شود، مثلاً حداکثر ۳ درخواست هم‌زمان. در asyncio همان asyncio.Semaphore(3) با async with است.\n","permalink":"https://justroham.ir/fa/glossary/semaphore/","summary":"شیء مبتنی بر شمارنده که حداکثر N نفر را هم‌زمان راه می‌دهد و بقیه منتظر می‌مانند.","title":"Semaphore"},{"content":"طبق قرارداد، نسخه‌ی patch باگ را درست می‌کند، minor قابلیت سازگار اضافه می‌کند و major ممکن است API را بشکند. بازه‌ای مثل ^1.2.3 هر نسخه از 1.2.3 تا قبل از 2.0.0 را می‌پذیرد.\n","permalink":"https://justroham.ir/fa/glossary/semver/","summary":"قرارداد نسخه‌گذاری MAJOR.MINOR.PATCH و سینتکس بازه (\u003ccode\u003e^\u003c/code\u003e و \u003ccode\u003e~\u003c/code\u003e) که npm برای انتخاب نسخه استفاده می‌کند.","title":"Semver"},{"content":"ضعیف‌تر از linearizability: یک read می‌تواند مقداری قدیمی‌تر از write تمام‌شده‌ی client دیگر برگرداند، به شرط این‌که یک ترتیب سراسری معتبر وجود داشته باشد.\n","permalink":"https://justroham.ir/fa/glossary/sequential-consistency/","summary":"همه یک ترتیب واحد از عملیات می‌بینند که ترتیب هر client را حفظ می‌کند، ولی لازم نیست با زمان واقعی بخواند.","title":"Sequential consistency"},{"content":"سرور پاسخی با Content-Type: text/event-stream را باز نگه می‌دارد و خط‌های data: می‌نویسد؛ EventSource مرورگر خودش دوباره وصل می‌شود. کلاینت روی این کانال پیامی نمی‌فرستد.\n","permalink":"https://justroham.ir/fa/glossary/server-sent-events/","summary":"جریان یک‌طرفه و متنی از رویدادها از سرور به مرورگر روی یک پاسخ معمولی HTTP.","title":"Server-Sent Events"},{"content":"instanceها شروع می‌شوند، crash می‌کنند و جابه‌جا می‌شوند، پس نشانی‌ها را نمی‌شود ثابت نوشت. client از DNS یا registry یا یک message bus می‌پرسد الان چه کسی زنده است.\n","permalink":"https://justroham.ir/fa/glossary/service-discovery/","summary":"پیدا کردن نشانی‌های فعلی instanceهای یک سرویس در حالی که می‌آیند و می‌روند.","title":"Service discovery"},{"content":"Envoy و Istio و Linkerd مثال‌های شناخته‌شده‌اند. هزینه‌اش یک قطعه‌ی متحرک اضافه به ازای هر instance است.\n","permalink":"https://justroham.ir/fa/glossary/service-mesh/","summary":"لایه‌ای از proxyهای sidecar کنار هر سرویس که discovery و load balancing و retry و TLS را بیرون از کد برنامه انجام می‌دهد.","title":"Service mesh"},{"content":"اگر instance تمدید نکند، ورودی‌اش بعد از TTL منقضی می‌شود. بین crash و انقضا registry کهنه است.\n","permalink":"https://justroham.ir/fa/glossary/service-registry/","summary":"سرویس کوچکی که نگه می‌دارد کدام instanceها زنده‌اند؛ instanceها با یک TTL ثبت می‌شوند و مدام آن را تمدید می‌کنند.","title":"Service registry"},{"content":"مرورگر فقط یک شناسه‌ی غیرقابل‌حدس دارد و سرور می‌داند کاربر کیست. حذف ورودی سمت سرور نشست را فوراً تمام می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/session/","summary":"وضعیتی که سرور نگه می‌دارد و با یک شناسه‌ی تصادفی در کوکی پیدا می‌شود.","title":"Session"},{"content":"بیت‌هایی که اجرایی را با هویت مالک (یا گروه) آن اجرا می‌کنند نه فراخواننده؛ روی پوشه، setgid باعث می‌شود فایل‌های جدید گروه پوشه را بگیرند. در ls -l به شکل s دیده می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/setuid/","summary":"بیت‌هایی که اجرایی را با هویت مالک (یا گروه) آن اجرا می‌کنند نه فراخواننده؛ روی پوشه، setgid باعث می‌شود فایل‌های جدید گروه پوشه را بگیرند. در ls -l به شکل s دیده می‌شوند.","title":"setuid and setgid"},{"content":"گیت محتوا (همراه header نوع و اندازه) را از SHA-1 رد می‌کند و خروجی را شناسه‌ی object قرار می‌دهد. repositoryهای جدیدتر می‌توانند به‌جای آن از SHA-256 با ۶۴ کاراکتر hex استفاده کنند.\n","permalink":"https://justroham.ir/fa/glossary/sha-1/","summary":"تابع هشی که گیت به‌طور پیش‌فرض برای نام‌گذاری objectها استفاده می‌کند (۴۰ کاراکتر hex).","title":"SHA-1"},{"content":"نشان می‌دهد کد جدید قبل از اینکه کاربری به آن وابسته شود چه رفتاری می‌داشت. هر mismatch یک کار است: یا باگ کد جدید است یا عجیب‌بودنی در کد قدیمی که باید درباره‌اش تصمیم بگیرید.\n","permalink":"https://justroham.ir/fa/glossary/shadow-mode/","summary":"اجرای پیاده‌سازی جدید کنار قدیمی روی ورودی واقعی، با پاسخ دادن فقط از قدیمی و شمردن تفاوت‌ها.","title":"Shadow mode"},{"content":"git clone --depth 1 فقط آخرین commit را می‌گیرد. سریع و کوچک است ولی دستورهای تاریخچه چیز کمی می‌بینند. git fetch --unshallow بقیه را برمی‌گرداند. partial clone را هم ببینید.\n","permalink":"https://justroham.ir/fa/glossary/shallow-clone/","summary":"clone با تاریخچه‌ی کوتاه‌شده، مثل \u0026ndash;depth 1.","title":"Shallow clone"},{"content":"کپی‌ای که فقط container بیرونی را تکرار می‌کند و عنصرهای داخلی همان شیءهای قبلی‌اند. deep copy آن‌ها را هم کپی می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/shallow-copy/","summary":"کپی‌ای که فقط container بیرونی را تکرار می‌کند و عنصرهای داخلی همان شیءهای قبلی‌اند. deep copy آن‌ها را هم کپی می‌کند.","title":"Shallow copy"},{"content":"کلیدهای تصادفی نویسه‌های مختلف را یکنواخت به کار می‌برند، پس آنتروپی‌شان بالاست؛ کلمه‌های معمولی امتیاز کمتری دارند. اسکنرها با آن رشته‌های شبیه کلید را علامت می‌زنند، به قیمت هشدار اشتباه برای چیزهایی مثل checksum.\n","permalink":"https://justroham.ir/fa/glossary/shannon-entropy/","summary":"معیاری برای اینکه یک رشته چقدر تصادفی به نظر می‌رسد، بر حسب بیت در هر نویسه.","title":"Shannon entropy"},{"content":"هر ردیف (یا کلید) دقیقاً به یک shard می‌رسد که با بازه، hash یا یک جدول جستجو (directory) انتخاب می‌شود. ظرفیت نوشتن و جای داده را زیاد می‌کند، ولی کوئری و تراکنشی که چند shard را لمس کند گران می‌شود. با partitioning درون یک node فرق دارد.\n","permalink":"https://justroham.ir/fa/glossary/sharding/","summary":"داده‌ی یک سیستم را با یک کلید (shard key) بین چند node تقسیم می‌کند تا هر node فقط بخشی از آن را نگه دارد.","title":"Sharding"},{"content":"معمولاً هر پروسه حافظه‌ی خودش را دارد. بلوک حافظه‌ی مشترک را چند پروسه map می‌کنند، پس کپی و pickle لازم نیست، اما هماهنگ‌سازی دسترسی با خودتان است و باید آزادش کنید (در Python: close() در هر پروسه و یک بار unlink()).\n","permalink":"https://justroham.ir/fa/glossary/shared-memory/","summary":"بلوکی از حافظه که چند پروسه هم‌زمان map می‌کنند و بدون کپی روی همان بایت‌ها می‌خوانند و می‌نویسند.","title":"shared memory"},{"content":"SharedArrayBuffer بین worker threadها کپی نمی‌شود: همه بایت‌های یکسان را می‌بینند. خواندن و نوشتن ساده روی آن race دارد، پس برای به‌روزرسانی تقسیم‌ناپذیر از Atomics (مثلاً Atomics.add) استفاده کنید.\n","permalink":"https://justroham.ir/fa/glossary/shared-array-buffer/","summary":"بلوک حافظه‌ای که هم‌زمان برای چند thread دیده می‌شود و با Atomics به کار می‌رود.","title":"SharedArrayBuffer"},{"content":"وقتی خاصیتی روی یک ورودی تصادفی بزرگ شکست می‌خورد، کتابخانه نسخه‌های کوچک‌تر را امتحان می‌کند و کوچک‌ترینِ شکست‌خورده را نگه می‌دارد. به‌جای یک slice سی‌وهفت عضوی، [0 1 0] را اشکال‌زدایی می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/shrinking/","summary":"کوچک کردن ورودی تصادفی شکست‌خورده تا کوچک‌ترین ورودی که هنوز شکست می‌خورد.","title":"Shrinking"},{"content":"کشتن اجباری (سیگنال ۹)؛ نه گرفته می‌شود نه نادیده، پس هیچ کد پاک‌سازی اجرا نمی‌شود. فقط بعد از شکست SIGTERM استفاده کنید. شل کد خروج ۱۳۷ (128+9) گزارش می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/sigkill/","summary":"کشتن اجباری (سیگنال ۹)؛ نه گرفته می‌شود نه نادیده، پس هیچ کد پاک‌سازی اجرا نمی‌شود.","title":"SIGKILL"},{"content":"پیام کوچک و ناهمگامی که کرنل یا پروسه‌ی دیگر به یک پروسه می‌فرستد، مثل SIGTERM یا SIGINT. پروسه می‌تواند بیشتر سیگنال‌ها را با handler (در شل trap) بگیرد، نادیده بگیرد یا کار پیش‌فرض را بپذیرد. SIGKILL و SIGSTOP گرفته نمی‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/signal/","summary":"پیام کوچک و ناهمگامی که کرنل یا پروسه‌ی دیگر به یک پروسه می‌فرستد، مثل SIGTERM یا SIGINT.","title":"Signal"},{"content":"سیگنالی که پروسه هنگام نوشتن در pipeی با خواننده‌ی بسته می‌گیرد (سیگنال ۱۳). به همین دلیل yes | head -1 می‌ایستد: yes با SIGPIPE تمام می‌شود و وضعیت ۱۴۱ دیده می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/sigpipe/","summary":"سیگنالی که پروسه هنگام نوشتن در pipeی با خواننده‌ی بسته می‌گیرد (سیگنال ۱۳).","title":"SIGPIPE"},{"content":"orchestratorها آن را قبل از SIGKILL (که نمی‌شود گرفتش) می‌فرستند. در Node.js با process.once('SIGTERM', ...) مدیریتش می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/sigterm/","summary":"سیگنال مؤدبانه‌ای که از پروسه می‌خواهد متوقف شود و پروسه می‌تواند قبلش آن را بگیرد و تمیزکاری کند.","title":"SIGTERM"},{"content":"هر محیط مجازی پوشه‌ی خودش را دارد؛ برای همین پکیج نصب‌شده در یکی در دیگری import نمی‌شود.\n","permalink":"https://justroham.ir/fa/glossary/site-packages/","summary":"پوشه‌ای داخل هر محیط که پکیج‌های شخص ثالث نصب‌شده در آن قرار می‌گیرد.","title":"site-packages"},{"content":"allocator در Go هر درخواست حافظه را به یکی از اندازه‌های ثابت گرد می‌کند. برای همین ظرفیت slice می‌تواند از چیزی که فقط فرمول رشد می‌گوید بزرگ‌تر باشد.\n","permalink":"https://justroham.ir/fa/glossary/size-class/","summary":"allocator در Go هر درخواست حافظه را به یکی از اندازه‌های ثابت گرد می‌کند. برای همین ظرفیت slice می‌تواند از چیزی که فقط فرمول رشد می‌گوید بزرگ‌تر باشد.","title":"Size class"},{"content":"با FOR UPDATE SKIP LOCKED هر worker ردیف‌هایی را برمی‌دارد که کسی قفل نکرده، پس چند worker هم‌زمان کارهای متفاوتی از یک جدول می‌گیرند. برای جدول‌های شبیه صف است و برای خواندن عمومی مناسب نیست، چون نتیجه به قفل‌های همان لحظه بستگی دارد.\n","permalink":"https://justroham.ir/fa/glossary/skip-locked/","summary":"گزینه‌ای برای \u003ccode\u003eSELECT ... FOR UPDATE\u003c/code\u003e که به‌جای انتظار، ردیف‌های قفل‌شده‌ی دیگران را رد می‌کند؛ برای ساخت صف کار.","title":"SKIP LOCKED"},{"content":"SLI عددی است که از شمارش‌ها به دست می‌آید، مثلاً درخواست‌های خوب تقسیم بر کل. این اندازه‌گیری است؛ هدف همان SLO است.\n","permalink":"https://justroham.ir/fa/glossary/sli/","summary":"شاخص سطح سرویس: نسبت اندازه‌گیری‌شده‌ی رویدادهای خوب به کل، مثل درخواست‌های غیر 5xx.","title":"SLI"},{"content":"slice در Go یک هدر سه‌کلمه‌ای است: اشاره‌گر به backing array، طول و ظرفیت. کپی‌کردن هدر عنصرها را کپی نمی‌کند.\n","permalink":"https://justroham.ir/fa/glossary/slice/","summary":"slice در Go یک هدر سه‌کلمه‌ای است: اشاره‌گر به backing array، طول و ظرفیت. کپی‌کردن هدر عنصرها را کپی نمی‌کند.","title":"Slice (Go)"},{"content":"برآورد برابر است با previous_count * (1 - elapsed/window) + current_count. برخلاف sliding log که هر timestamp را نگه می‌دارد، فقط چند عدد برای هر کلید لازم دارد.\n","permalink":"https://justroham.ir/fa/glossary/sliding-window/","summary":"limiter تقریبی که پنجره‌ی ثابت قبلی را به نسبت هم‌پوشانی‌اش با بازه‌ی اخیر وزن می‌دهد.","title":"Sliding window counter"},{"content":"SLO هدف قابلیت اطمینان است، مثلاً ۹۹٫۵٪ درخواست‌ها در ۳۰ روز موفق باشند. فاصله‌ی ۱۰۰٪ تا SLO همان error budget است.\n","permalink":"https://justroham.ir/fa/glossary/slo/","summary":"هدفی برای یک شاخص کیفیت سرویس در یک بازه، مثلاً ۹۹٫۵٪ موفقیت در ۳۰ روز.","title":"SLO"},{"content":"کلاینت کند هدر یا بدنه را چند بایت چند بایت می‌فرستد و هرگز تمامش نمی‌کند، پس هر اتصال منابع سرور را اشغال می‌کند. timeoutهایی مثل headersTimeout و requestTimeout دفاع اصلی‌اند.\n","permalink":"https://justroham.ir/fa/glossary/slowloris/","summary":"حمله‌ی منع سرویسی که در آن کلاینت درخواست را بسیار کند می‌فرستد تا اتصال‌های سرور را اشغال نگه دارد.","title":"Slowloris"},{"content":"معمولاً: باینری را روی loopback اجرا می‌کنید و endpoint سلامتش را صدا می‌زنید.\n","permalink":"https://justroham.ir/fa/glossary/smoke-test/","summary":"یک بررسی بسیار کوچک که نشان می‌دهد artifact ساخته‌شده اصلاً بالا می‌آید و پاسخ می‌دهد، پیش از بررسی‌های عمیق‌تر یا deploy.","title":"smoke test"},{"content":"یک بهینه‌سازی است نه منبع حقیقت: می‌توان آن را پاک کرد و از رویدادها دوباره ساخت.\n","permalink":"https://justroham.ir/fa/glossary/event-snapshot/","summary":"نسخه‌ی ذخیره‌شده‌ی وضعیت fold‌شده در یک version، تا بارگذاری فقط رویدادهای بعد از آن را replay کند.","title":"Snapshot (event sourcing)"},{"content":"در PostgreSQL، REPEATABLE READ همین‌طور کار می‌کند. خواندن هیچ‌وقت بلاک نمی‌شود و commitهای بعدی را نمی‌بیند، اما write skew همچنان ممکن است.\n","permalink":"https://justroham.ir/fa/glossary/snapshot-isolation/","summary":"هر تراکنش از یک snapshot سازگار از داده می‌خواند که لحظه‌ی شروعش گرفته شده است.","title":"Snapshot isolation"},{"content":"یک IP و پورت می‌تواند چندین سایت را سرو کند. با SNI کلاینت در ClientHello و پیش از هر HTTP می‌گوید کدام میزبان را می‌خواهد تا سرور گواهی مناسب را انتخاب کند.\n","permalink":"https://justroham.ir/fa/glossary/sni/","summary":"SNI: کلاینت در handshake اسم میزبان مورد نظر را می‌گوید.","title":"SNI"},{"content":"یک اتصال TCP با چهار مقدار آدرس مبدأ، port مبدأ، آدرس مقصد و port مقصد شناخته می‌شود. socket در حالت listen اتصال می‌پذیرد و هر اتصال پذیرفته‌شده یک socket تازه است.\n","permalink":"https://justroham.ir/fa/glossary/socket/","summary":"دستگیره‌ای از سیستم‌عامل که برنامه با آن روی شبکه می‌فرستد و می‌گیرد.","title":"Socket"},{"content":"ضعف در هر نقطه‌ی این زنجیره به کاربران شما می‌رسد، حتی اگر کد خودتان بی‌نقص باشد. دفاع یعنی بدانید به چه وابسته‌اید، آن را pin کنید، راستی‌آزمایی کنید و آگاهانه به‌روز کنید.\n","permalink":"https://justroham.ir/fa/glossary/software-supply-chain/","summary":"هر چیزی که نرم‌افزار شما از آن ساخته و با آن تحویل می‌شود: وابستگی‌ها، registryها، ابزار build و CI.","title":"software supply chain"},{"content":"git sparse-checkout set app باعث می‌شود working tree فقط app/ را داشته باشد. همراه partial clone فقط blobهای لازم دانلود می‌شود. برای monorepoهای بزرگ مفید است.\n","permalink":"https://justroham.ir/fa/glossary/sparse-checkout/","summary":"فقط بعضی پوشه‌ها را در working tree قرار می‌دهد.","title":"Sparse checkout"},{"content":"بعد از promote، primary قدیمی اگر هنوز روشن باشد نوشتن می‌پذیرد و تاریخچه‌ها از هم جدا می‌شوند. ادغام بعدی دستی است و اغلب با از دست رفتن داده همراه.\n","permalink":"https://justroham.ir/fa/glossary/split-brain/","summary":"دو node هر دو خود را primary می‌دانند و نوشتن‌های متفاوت می‌پذیرند.","title":"Split-brain"},{"content":"وقتی SQL را با چسباندن رشته‌ها می‌سازید رخ می‌دهد. راه دفاع، query پارامتری ($1) است: مقدارها جدا از متن SQL ارسال می‌شوند و هرگز به‌عنوان SQL خوانده نمی‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/sql-injection/","summary":"حمله‌ای که در آن ورودی کاربر بخشی از متن SQL می‌شود و معنای آن را عوض می‌کند.","title":"SQL injection"},{"content":"برنامه باید روی SQLSTATE تصمیم بگیرد، نه متن خطا. کلاس 23 نقض یکپارچگی است: 23505 unique، 23503 foreign key و 23514 check.\n","permalink":"https://justroham.ir/fa/glossary/sqlstate/","summary":"کد خطای استاندارد پنج‌کاراکتری، مثلاً 23505 برای نقض unique.","title":"SQLSTATE"},{"content":"git merge --squash مجموع تغییرات یک branch را روی درخت کاری اعمال می‌کند و می‌ایستد؛ شما یک بار commit می‌کنید. نتیجه پیوندی به commitهای اصلی ندارد، برای همین گیت هنوز آن branch را merge نشده می‌داند.\n","permalink":"https://justroham.ir/fa/glossary/squash-merge/","summary":"همه‌ی commitهای یک branch را به یک commit جدید روی branch مقصد تبدیل می‌کند.","title":"squash merge"},{"content":"با ssh-keygen -s ساخته و با ssh-keygen -L خوانده می‌شود. سرورها با TrustedUserCAKeys به CA اعتماد می‌کنند. برخلاف x509 زنجیره‌ای وجود ندارد.\n","permalink":"https://justroham.ir/fa/glossary/ssh-certificate/","summary":"کلید عمومی امضا‌شده با کلید CA، همراه principal و بازه‌ی اعتبار، به‌جای فهرستی از کلیدهای خام.","title":"SSH certificate"},{"content":"فایل خصوصی با امضای یک چالش هویت شما را ثابت می‌کند و خط عمومی به authorized_keys سرور می‌رود. ed25519 نوع جدید و کوچک است. فایل خصوصی باید حالت 0600 داشته باشد.\n","permalink":"https://justroham.ir/fa/glossary/ssh-key-pair/","summary":"یک کلید خصوصی نزد شما و یک کلید عمومی برای اشتراک، برای ورود بدون رمز عبور.","title":"SSH key pair"},{"content":"passphrase را یک بار می‌زنید و ssh از طریق یک سوکت از agent می‌خواهد امضا کند. هر کس به آن سوکت دسترسی داشته باشد می‌تواند به نام شما امضا کند؛ برای همین forward کردن agent به میزبان نامطمئن خطرناک است.\n","permalink":"https://justroham.ir/fa/glossary/ssh-agent/","summary":"فرایندی که کلیدهای خصوصی باز‌شده را در حافظه نگه می‌دارد و از طرف ssh امضا می‌کند.","title":"ssh-agent"},{"content":"هدف‌های رایج سرویس‌های داخلی روی loopback یا شبکه‌ی خصوصی‌اند. دفاع معمول allow-list میزبان‌هاست.\n","permalink":"https://justroham.ir/fa/glossary/ssrf/","summary":"SSRF (جعل درخواست سمت سرور): کاری که باعث می‌شود سرور آدرسی را که کاربر داده فراخوانی کند و به جاهایی برسد که خود کاربر نمی‌رسد.","title":"SSRF"},{"content":"اگر سفارش‌ها را بر اساس شهر مرتب کنید و دو سفارش شهر یکسان داشته باشند، مرتب‌سازی پایدار همان ترتیب ورود را نگه می‌دارد. به همین دلیل «اول بر اساس تاریخ، بعد شهر» کار می‌کند. merge sort پایدار است؛ quicksort ساده و heap sort نه. در Go، sort.Stable و slices.SortStableFunc این تضمین را می‌دهند.\n","permalink":"https://justroham.ir/fa/glossary/stable-sort/","summary":"مرتب‌سازی‌ای که ترتیب نسبی عناصر برابر را حفظ می‌کند.","title":"Stable sort"},{"content":"مجموعه‌ای آخرین‌ورودی-اولین‌خروجی (LIFO) که فقط از یک سر push و pop می‌شود. کاربردها: تاریخچه‌ی undo، تطبیق پرانتز و call stack.\n","permalink":"https://justroham.ir/fa/glossary/stack/","summary":"مجموعه‌ای آخرین‌ورودی-اولین‌خروجی (LIFO) که فقط از یک سر push و pop می‌شود. کاربردها: تاریخچه‌ی undo، تطبیق پرانتز و call stack.","title":"Stack"},{"content":"index هر مسیر tracked را با mode فایل و شناسه‌ی blob آن فهرست می‌کند. git add آن را به‌روز می‌کند، git commit آن را به tree تبدیل می‌کند و git restore --staged ورودی‌ها را از آن بیرون می‌کشد.\n","permalink":"https://justroham.ir/fa/glossary/staging-area/","summary":"عکسی از چیزی که commit بعدی خواهد داشت، ذخیره‌شده در .git/index.","title":"Staging area (index)"},{"content":"start method تعیین می‌کند پروسهی فرزند چگونه شروع شود. با spawn یک interpreter تازه ماژول اصلی را دوباره import می‌کند (برای همین guard یعنی if __name__ == '__main__': لازم است)؛ fork پروسه‌ی والد را کپی می‌کند. multiprocessing.get_start_method() روش فعلی را نشان می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/start-method/","summary":"روشی که multiprocessing با آن پروسه‌ی فرزند می‌سازد: spawn، fork یا forkserver.","title":"start method"},{"content":"git stash فایل‌های tracked تغییریافته را ذخیره می‌کند و درخت کاری را به HEAD برمی‌گرداند؛ git stash pop جدیدترین ورودی را اعمال و حذف می‌کند. فایل‌های untracked فقط با -u وارد می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/stash/","summary":"پشته‌ای از تغییرهای کنار گذاشته‌شده که بعداً برمی‌گردانید.","title":"Stash"},{"content":"وقتی statement از حد بگذرد سرور آن را با SQLSTATE 57014 لغو می‌کند و connection قابل استفاده می‌ماند. می‌شود آن را برای هر session، role یا database تنظیم کرد. ← lock timeout.\n","permalink":"https://justroham.ir/fa/glossary/statement-timeout/","summary":"تنظیمی در PostgreSQL که هر statement طولانی‌تر از زمان داده‌شده را لغو می‌کند.","title":"statement_timeout"},{"content":"ابزارهایی مثل go vet و staticcheck کد را می‌خوانند و الگوهای مشکوک را گزارش می‌دهند، مثلاً فعل قالب اشتباه. سریع و بی‌خستگی‌اند، ولی فقط الگوهایی را می‌شناسند که برایشان نوشته شده.\n","permalink":"https://justroham.ir/fa/glossary/static-analysis/","summary":"بررسی سورس برای پیدا کردن باگ‌های محتمل بدون اجرای آن.","title":"Static analysis"},{"content":"power احتمال این است که آزمون وقتی اثر واقعی است فرض صفر را رد کند. با نمونه‌ی کم پایین است: آزمونی که ساکت می‌ماند شاید فقط داده‌ی کم دیده، نه اینکه سیستم سالم باشد.\n","permalink":"https://justroham.ir/fa/glossary/statistical-power/","summary":"احتمال اینکه یک آزمون اثر واقعی را تشخیص دهد.","title":"Statistical power"},{"content":"مثال: دست‌کم ۹۹٪ درخواست‌های کلاینت در ۳۰۰ میلی‌ثانیه موفق شوند. آزمایش وقتی پاس می‌شود که با فعال بودن خطا هم steady state برقرار بماند. SLO را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/steady-state/","summary":"توصیف قابل‌اندازه‌گیری رفتار عادی، مثل یک SLO، که آزمایش نباید آن را نقض کند.","title":"Steady state"},{"content":"PostgreSQL این کار را با یک dictionary انجام می‌دهد که جزو text search configuration است، مثل english. configuration به نام simple اصلاً stemming نمی‌کند. stemming به زبان وابسته است و شکل‌های بی‌قاعده مثل ran ممکن است کوتاه نشوند.\n","permalink":"https://justroham.ir/fa/glossary/stemming/","summary":"برگرداندن کلمه به ریشه‌اش تا شکل‌های مختلف یک کلمه با هم تطبیق شوند؛ مثلاً running و runs و run همه می‌شوند run.","title":"Stemming"},{"content":"بیت مجوز پوشه (t در ls -l) که فقط به مالک فایل یا مالک پوشه اجازه‌ی حذف یا تغییر نام می‌دهد، مثل /tmp.\n","permalink":"https://justroham.ir/fa/glossary/sticky-bit/","summary":"بیت مجوز پوشه (t در ls -l) که فقط به مالک فایل یا مالک پوشه اجازه‌ی حذف یا تغییر نام می‌دهد، مثل /tmp.","title":"Sticky bit"},{"content":"روشی برای قابل‌اعتماد کردن ارسال: یک بسته می‌فرستی، منتظر تأییدش می‌مانی و با timeout دوباره می‌فرستی. به شماره‌ی ترتیب نیاز دارد تا گیرنده تکراری‌ها را تشخیص دهد. ساده است ولی در هر رفت‌وبرگشت فقط یک بسته می‌فرستد.\n","permalink":"https://justroham.ir/fa/glossary/stop-and-wait/","summary":"روشی برای قابل‌اعتماد کردن ارسال: یک بسته می‌فرستی، منتظر تأییدش می‌مانی و با timeout دوباره می‌فرستی.","title":"Stop-and-wait"},{"content":"strace یک دستور را اجرا می‌کند یا به پروسه‌ی در حال اجرا وصل می‌شود و هر فراخوان سیستمی را با آرگومان‌ها و مقدار بازگشتی چاپ می‌کند. روی ptrace تکیه دارد و پروسه‌ی ردیابی‌شده کندتر می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/strace/","summary":"ابزار Linux که فراخوان‌های سیستمی و سیگنال‌های یک پروسه را چاپ می‌کند.","title":"strace"},{"content":"این نام از توصیف مارتین فاولر از پیچکی گرفته شده که دور درخت رشد می‌کند. یک router سهم رو‌به‌رشدی از فراخوانی‌ها را به پیاده‌سازی جدید می‌دهد تا قدیمی حذف شود.\n","permalink":"https://justroham.ir/fa/glossary/strangler-fig/","summary":"جایگزین کردن تدریجی یک سیستم پشت یک router تا قدیم و جدید کنار هم کار کنند.","title":"Strangler fig"},{"content":"stream منبع یا مقصد داده‌ای است که تکه‌تکه پردازش می‌شود. Node.js چهار نوع دارد: Readable، Writable، Duplex و Transform. streamها با pipeline به هم وصل می‌شوند و مصرف‌کننده‌ی کند با backpressure محافظت می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/stream/","summary":"شیئی که داده را تکه‌تکه جابه‌جا می‌کند تا برنامه لازم نباشد همه‌ی آن را در حافظه نگه دارد.","title":"Stream"},{"content":"هر حرف یک ویژگی امنیتی را نقض می‌کند (اصالت، یکپارچگی، انکارناپذیری، محرمانگی، دسترس‌پذیری، مجوز). شش سؤال را به هر عنصر نمودار می‌پرسید.\n","permalink":"https://justroham.ir/fa/glossary/stride/","summary":"فهرستی از شش دسته تهدید: Spoofing، Tampering، Repudiation، Information disclosure، Denial of service و Elevation of privilege.","title":"STRIDE"},{"content":"دستور match در Python که مقدار را بر اساس شکلش (literal، دنباله، mapping، کلاس) باز می‌کند و guard هم می‌پذیرد.\n","permalink":"https://justroham.ir/fa/glossary/structural-pattern-matching/","summary":"دستور match در Python که مقدار را بر اساس شکلش (literal، دنباله، mapping، کلاس) باز می‌کند و guard هم می‌پذیرد.","title":"Structural pattern matching"},{"content":"یک نوع با هر شیئی که متدهای درست را داشته باشد برقرار است، بدون ارث‌بری صریح. در Python، typing.Protocol این شکل را برای type checkerها توصیف می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/structural-typing/","summary":"یک نوع با هر شیئی که متدهای درست را داشته باشد برقرار است، بدون ارث‌بری صریح. در Python، typing.Protocol این شکل را برای type checkerها توصیف می‌کند.","title":"Structural typing (Protocol)"},{"content":"سبکی که در آن taskهای هم‌زمان درون یک scope زندگی می‌کنند؛ scope منتظر همه می‌ماند و اگر یکی شکست بخورد بقیه را لغو می‌کند. در Python، asyncio.TaskGroup همین را می‌دهد: هیچ taskی از بلوک async with بیرون نمی‌ماند و خطاها در یک ExceptionGroup جمع می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/structured-concurrency/","summary":"سبکی که در آن taskهای هم‌زمان درون یک scope زندگی می‌کنند؛ scope منتظر همه می‌ماند و اگر یکی شکست بخورد بقیه را لغو می‌کند.","title":"Structured concurrency"},{"content":"فیلدهایی مثل level، reqId و res.statusCode را ابزارها بدون regex فیلتر می‌کنند. Pino، لاگر داخل Fastify، هر خط را یک شیء JSON می‌نویسد.\n","permalink":"https://justroham.ir/fa/glossary/structured-logging/","summary":"نوشتن هر خط لاگ به‌صورت یک شیء JSON با فیلدهای نام‌دار، به‌جای متن آزاد.","title":"Structured logging"},{"content":"کلاینت‌های امروزی نام میزبان را فقط با فهرست SAN (نام DNS و آدرس IP) تطبیق می‌دهند. فیلد Common Name تنها کافی نیست؛ مثلاً Go چنین گواهی‌ای را رد می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/subject-alt-name/","summary":"SAN: افزونه‌ای که نام‌ها و IPهای معتبر برای گواهی را فهرست می‌کند.","title":"SubjectAltName (SAN)"},{"content":"repository والد فایل‌ها را کپی نمی‌کند؛ یک gitlink به یک commit در repository دیگر و نشانی آن را در .gitmodules نگه می‌دارد. clone ساده پوشه را خالی می‌گذارد تا git submodule update --init را بزنید.\n","permalink":"https://justroham.ir/fa/glossary/submodule/","summary":"یک repository تو در تو که به یک commit مشخص پین شده است.","title":"Submodule"},{"content":"subnet بلوکی از آدرس‌هاست که prefix مشترک دارند و معمولاً یک broadcast domain است. با بلندترکردن prefix می‌شود بلوک بزرگ را تقسیم کرد، مثلاً یک /24 به چهار /26.\n","permalink":"https://justroham.ir/fa/glossary/subnet/","summary":"subnet بلوکی پیوسته از آدرس‌های IP است که یک prefix مشترک دارند.","title":"Subnet"},{"content":"فیلد imports در package.json: نام‌های مستعار خصوصی که با # شروع می‌شوند و به فایل نگاشت می‌شوند. import x from '#config' از طریق package.json حل می‌شود و دیگر مسیرهای ../../ طولانی لازم نیست. این نام‌ها فقط داخل همان پکیج کار می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/subpath-imports/","summary":"فیلد \u003ccode\u003eimports\u003c/code\u003e در package.json: نام‌های مستعار خصوصی که با \u003ccode\u003e#\u003c/code\u003e شروع می‌شوند و به فایل نگاشت می‌شوند.","title":"Subpath imports"},{"content":"با git subtree add/pull/split فایل‌ها در repository شما فایل معمولی می‌شوند و همکاران به قدم اضافه‌ای نیاز ندارند. split تاریخچه‌ی یک زیرپوشه را دوباره بیرون می‌کشد.\n","permalink":"https://justroham.ir/fa/glossary/subtree/","summary":"کپی کردن فایل‌های یک repository دیگر در یک زیرپوشه، با حفظ امکان merge تاریخچه‌ی آن.","title":"Subtree"},{"content":"برنامه‌ای که اگر سیاست sudoers اجازه بدهد، یک دستور را با هویت کاربر دیگری (معمولا root) اجرا می‌کند و آن را لاگ می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/sudo/","summary":"برنامه‌ای که اگر سیاست sudoers اجازه بدهد، یک دستور را با هویت کاربر دیگری (معمولا root) اجرا می‌کند و آن را لاگ می‌کند.","title":"sudo"},{"content":"فایل سیاستی که مشخص می‌کند کدام کاربر با sudo کدام دستور را با کدام هویت اجرا کند؛ فقط با visudo ویرایشش کنید که نحو را بررسی می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/sudoers/","summary":"فایل سیاستی که مشخص می‌کند کدام کاربر با sudo کدام دستور را با کدام هویت اجرا کند؛ فقط با visudo ویرایشش کنید که نحو را بررسی می‌کند.","title":"sudoers"},{"content":"surrogate key شناسه‌ای است که خود دیتابیس می‌سازد، مثلاً عدد GENERATED ALWAYS AS IDENTITY. برخلاف natural key مثل ایمیل، هرگز تغییر نمی‌کند. با این حال روی natural key هم یک قید UNIQUE بگذارید. primary key را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/surrogate-key/","summary":"شناسه‌ی مصنوعی ردیف بدون معنای کسب‌وکاری، مثل یک شماره‌ی identity.","title":"Surrogate key"},{"content":"SwapTotal و SwapFree در /proc/meminfo اندازه و مصرف آن را نشان می‌دهند. swap می‌تواند کمبود حافظه را عقب بیندازد، اما ماشینی که دائم swap می‌کند معمولاً کند است.\n","permalink":"https://justroham.ir/fa/glossary/swap/","summary":"فضایی روی دیسک که کرنل صفحه‌های کم‌استفاده‌ی حافظه را برای آزاد کردن RAM به آنجا منتقل می‌کند.","title":"Swap"},{"content":"فایل کوچکی که محتوایش مسیر فایل دیگری است. inode خودش را دارد و اگر مقصد حذف شود، بی‌مقصد می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/symbolic-link/","summary":"فایل کوچکی که محتوایش مسیر فایل دیگری است. inode خودش را دارد و اگر مقصد حذف شود، بی‌مقصد می‌ماند.","title":"Symbolic link"},{"content":"با مقدار پیش‌فرض on، commit فقط بعد از flush شدن WAL برمی‌گردد و همین آن را durable می‌کند. مقدار off سریع‌تر است ولی crash می‌تواند چند commit آخر را از بین ببرد (دیتابیس سالم می‌ماند).\n","permalink":"https://justroham.ir/fa/glossary/synchronous-commit/","summary":"تنظیم PostgreSQL که تعیین می‌کند COMMIT صبر کند تا WAL آن روی دیسک flush شود یا نه.","title":"synchronous_commit"},{"content":"ترتیب: emerg، alert، crit، err، warning، notice، info، debug. عدد کمتر مهم‌تر است؛ پس فیلتری مثل journalctl -p err یعنی اولویت 3 و هر چه شدیدتر.\n","permalink":"https://justroham.ir/fa/glossary/syslog-severity/","summary":"هشت سطح استاندارد لاگ از 0 (emerg) تا 7 (debug) که syslog(3) تعریف می‌کند.","title":"Syslog severity"},{"content":"System call راه برنامه برای خواستن کار از کرنل است: باز کردن فایل، خواندن، ساخت پروسه. ابزار strace در Linux فهرست آن‌ها را برای یک پروسه نشان می‌دهد.\n","permalink":"https://justroham.ir/fa/glossary/syscall/","summary":"درخواست یک برنامه از کرنل، مثل open یا read؛ ابزارهایی مثل strace آن‌ها را نشان می‌دهند.","title":"System call"},{"content":"systemd بقیه‌ی پروسه‌ها را بالا می‌آورد، نظارت می‌کند، در صورت تنظیم دوباره راه می‌اندازد و به ترتیب متوقف می‌کند. واحد (unit) پایه‌ی کارش است که با یک unit file توصیف می‌شود. ابزارهای systemctl و journalctl و systemd-analyze هم از آن هستند.\n","permalink":"https://justroham.ir/fa/glossary/systemd/","summary":"اولین پروسه و مدیر سرویس در بیشتر توزیع‌های Linux (PID 1).","title":"systemd"},{"content":"VACUUM ساده فضا را داخل همان فایل قابل استفاده‌ی دوباره می‌کند ولی معمولاً فایل را کوچک نمی‌کند؛ VACUUM FULL جدول را بازنویسی می‌کند و کوچک می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/table-bloat/","summary":"فضای هدررفته در جدول یا ایندکس به‌خاطر نسخه‌های مرده‌ای که دوباره استفاده نشده‌اند.","title":"Table bloat"},{"content":"یک جدول منطقی بزرگ را بر اساس یک کلید (بازه‌ی تاریخ، فهرست مقدار یا hash) به جدول‌های فیزیکی کوچک‌تر (پارتیشن) تقسیم می‌کند. در PostgreSQL خودِ جدول والد ردیفی ندارد و هر ردیف دقیقاً در یک پارتیشن است. کوئری و insert همچنان با اسم والد انجام می‌شود. partition pruning را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/partitioning/","summary":"یک جدول منطقی بزرگ را بر اساس یک کلید (بازه‌ی تاریخ، فهرست مقدار یا hash) به جدول‌های فیزیکی کوچک‌تر (پارتیشن) تقسیم می‌کند.","title":"Table partitioning"},{"content":"با pg_relation_filenode() قبل و بعد از دستور می‌شود فهمید: عدد جدید یعنی فایل جدید. روی جدول بزرگ، بازنویسی تا پایان کپی جلوی خواندن و نوشتن را می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/table-rewrite/","summary":"یک ALTER که کل جدول را در فایل جدید کپی می‌کند و در تمام این مدت قفل سنگین نگه می‌دارد.","title":"Table rewrite"},{"content":"اگر یک درخواست ۱۰۰ فراخوانی بزند و هر کدام ۱٪ مواقع کند باشد، حدود ۶۳٪ درخواست‌ها دست‌کم یک فراخوانی کند می‌بینند.\n","permalink":"https://justroham.ir/fa/glossary/tail-latency/","summary":"کندترین چند درصد درخواست‌ها (p99 و p999) که در سیستم‌های fan-out تجربه‌ی کاربر را تعیین می‌کنند.","title":"Tail latency"},{"content":"TCP بایت‌ها را شماره‌گذاری می‌کند، تأییدشان می‌گیرد و گم‌شده‌ها را دوباره می‌فرستد؛ پس برنامه یک جریان (stream) می‌بیند، نه پیام. مرز پیام‌ها وظیفه‌ی خود برنامه است.\n","permalink":"https://justroham.ir/fa/glossary/tcp/","summary":"پروتکل جریان بایتی مطمئن و مرتب روی IP.","title":"TCP"},{"content":"وقتی SO_KEEPALIVE روشن باشد، کرنل پس از مدتی بیکاری روی اتصال پروب‌های کوچک می‌فرستد. اگر طرف مقابل هیچ‌وقت جواب ندهد اتصال با خطا بسته می‌شود. این با keep-alive در HTTP که درباره‌ی استفاده‌ی دوباره از اتصال است فرق دارد.\n","permalink":"https://justroham.ir/fa/glossary/tcp-keepalive/","summary":"بسته‌های پروبی که کرنل روی اتصال بیکار می‌فرستد تا مرگ طرف مقابل را تشخیص دهد.","title":"TCP keepalive"},{"content":"هر لایه با همتای خودش در طرف مقابل حرف می‌زند و از لایه‌ی زیرین به‌عنوان سرویس استفاده می‌کند: link (یک گام روی یک شبکه)، internet (‏IP و مسیریابی گام‌به‌گام)، transport (‏TCP/UDP و port) و application (‏HTTP، DNS، gRPC). مدل ۷ لایه‌ی OSI تقسیم ریزتری از همین ایده برای آموزش است.\n","permalink":"https://justroham.ir/fa/glossary/tcp-ip-model/","summary":"مدل ۴ لایه‌ی اینترنت: link، internet، transport و application.","title":"TCP/IP model"},{"content":"یک حلقه‌ی کاری سه‌مرحله‌ای: red (نوشتن یک تست کوچک که شکست می‌خورد)، green (کمترین کد برای گذراندن آن)، refactor (تمیزکاری در حالی که تست‌ها سبز می‌مانند). این حلقه را در گام‌های کوچک تکرار می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/tdd/","summary":"توسعه‌ی تست‌محور: اول تست شکست‌خورده، بعد گذراندنش، بعد تمیزکاری (red، green، refactor).","title":"TDD"},{"content":"بدهی فنی یک استعاره است: یک میان‌بر الان چیزی به شما می‌دهد و بعداً «بهره‌اش» را با تغییرهای کندتر و پرخطرتر می‌پردازید. این استعاره وقتی مفید است که هزینه‌ی نگه‌داشتن و هزینه‌ی رفع را بتوانید اسم ببرید. یک راه پرداخت آن رفکتور است.\n","permalink":"https://justroham.ir/fa/glossary/technical-debt/","summary":"میان‌برها یا انتخاب‌های کهنه‌ی کد که تغییر بعدی را کندتر می‌کنند، مثل وامی که بهره دارد.","title":"Technical debt"},{"content":"شیء یا تابعی ساختگی که در تست جای وابستگی واقعی را می‌گیرد، مثل mock.fn() در Node.js. می‌تواند فراخوانی‌ها را ثبت هم بکند.\n","permalink":"https://justroham.ir/fa/glossary/test-double/","summary":"شیء ساختگی (mock، stub، fake) که در تست جای وابستگی واقعی می‌نشیند.","title":"Test double"},{"content":"روشی برای فکر کردن به هزینه‌ی تست‌ها. تست‌های پایین هرم (واحد) ارزان، سریع و پایدارند؛ تست‌های بالای هرم (سرتاسری) کند، پرهزینه و مستعد flaky شدن‌اند. این یک مدل برای سبک‌سنگین کردن است، نه قانون.\n","permalink":"https://justroham.ir/fa/glossary/test-pyramid/","summary":"مدلی: تست واحد زیاد و سریع، تست یکپارچگی کمتر و تست سرتاسری بسیار کم.","title":"Test pyramid"},{"content":"ابزاری که فایل‌های تست را پیدا می‌کند، اجرا می‌کند و نتیجه را گزارش می‌دهد. در Node.js ماژول node:test با node --test این کار را می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/test-runner/","summary":"ابزاری که فایل‌های تست را پیدا و اجرا می‌کند و نتیجه را گزارش می‌دهد.","title":"Test runner"},{"content":"thread‌های یک process متغیرهای یکسانی می‌بینند؛ اشتراک ارزان است و نوشتن بدون همگام‌سازی خطرناک. زمان‌بندی با سیستم‌عامل است؛ race condition را ببینید.\n","permalink":"https://justroham.ir/fa/glossary/thread/","summary":"جریان اجرای مستقل داخل یک process که حافظه را با thread‌های دیگر شریک است.","title":"Thread"},{"content":"اندازه‌اش با متغیر محیطی UV_THREADPOOL_SIZE تنظیم می‌شود. کارهای بیشتر از اندازه‌ی pool در صف می‌مانند و دسته‌دسته تمام می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/thread-pool/","summary":"مجموعه‌ی ثابتی از thread که کارهای بلاک‌کننده (فایل، crypto، DNS) را برای Node.js اجرا می‌کند؛ اندازه‌ی پیش‌فرض ۴.","title":"Thread pool"},{"content":"سیستم را می‌کشید، جاهایی که داده از مرز عبور می‌کند را علامت می‌زنید، برای هر عنصر تهدیدها را فهرست می‌کنید و برای هر کدام راه‌حل می‌گذارید. در زمان طراحی ارزان‌ترین است.\n","permalink":"https://justroham.ir/fa/glossary/threat-modeling/","summary":"روشی ساختارمند برای پرسیدن اینکه چه می‌سازیم، چه چیزی خراب می‌شود و چه می‌کنیم، پیش از آنکه مهاجم همین سؤال‌ها را بپرسد.","title":"Threat modeling"},{"content":"کلاینت segment با flag برابر SYN می‌فرستد، سرور با SYN+ACK جواب می‌دهد و کلاینت با ACK تأیید می‌کند. حالا هر دو طرف شماره‌ی ترتیب اولیه‌ی دیگری را می‌دانند و اتصال در حالت ESTABLISHED است.\n","permalink":"https://justroham.ir/fa/glossary/three-way-handshake/","summary":"SYN، SYN-ACK، ACK: روش باز شدن اتصال TCP.","title":"Three-way handshake"},{"content":"دیدن پدر مشترک به Git می‌گوید کدام طرف خط را عوض کرده است. merge.conflictStyle = zdiff3 متن پدر مشترک را داخل conflict چاپ می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/three-way-merge/","summary":"merge‌ای که دو سر شاخه را با پدر مشترکشان مقایسه می‌کند.","title":"Three-way merge"},{"content":"نمونه‌ی کلاسیک چند worker است که روی یک listening socket منتظرند. man page مربوط به epoll(7) پرچم EPOLLEXCLUSIVE را برای محدود کردن این بیدارشدن‌ها نام می‌برد؛ معنای دقیقش را در man page ببینید.\n","permalink":"https://justroham.ir/fa/glossary/thundering-herd/","summary":"وقتی یک رویداد چندین پروسه یا thread منتظر را بیدار می‌کند ولی فقط یکی می‌تواند از آن استفاده کند و کار هدر می‌رود.","title":"Thundering herd"},{"content":"بعد از بسته‌شدن، طرفی که اول FIN فرستاده مدتی در حالت TIME_WAIT می‌ماند (طبق مستندات حدود دو برابر عمر بیشینه‌ی segment). این کار اجازه می‌دهد بسته‌های دیررسیده از بین بروند و ACK آخرِ گم‌شده دوباره فرستاده شود.\n","permalink":"https://justroham.ir/fa/glossary/time-wait/","summary":"حالت طرفی که اول اتصال را بسته و مدتی بعد از پایان اتصال در این حالت می‌ماند.","title":"TIME_WAIT"},{"content":"TLS (Transport Layer Security) بین TCP و پروتکل برنامه قرار می‌گیرد. بعد از handshake دو طرف کلید مشترک دارند، کلاینت گواهی سرور را بررسی کرده و همه‌ی داده رمزنگاری و در برابر دستکاری محافظت می‌شود. HTTPS یعنی HTTP روی TLS.\n","permalink":"https://justroham.ir/fa/glossary/tls/","summary":"TLS: رمزنگاری و احراز هویت اتصال روی TCP.","title":"TLS"},{"content":"شرطی را بررسی می‌کنید و بعداً عمل می‌کنید، اما چیز دیگری می‌تواند وسط راه آن را عوض کند. راه‌حل این است که بررسی و استفاده یک گام اتمیک باشند یا روی همان چیزی که بررسی کردید عمل کنید. نگاه کنید به race condition.\n","permalink":"https://justroham.ir/fa/glossary/toctou/","summary":"Time-of-check to time-of-use: وضعیت بین بررسی و عملی که به آن تکیه دارد عوض می‌شود.","title":"TOCTOU"},{"content":"وضعیت دو عدد است: تعداد توکن و زمان آخرین پر شدن. leaky bucket وقتی به‌عنوان meter به کار رود همان تصمیم‌ها را می‌گیرد.\n","permalink":"https://justroham.ir/fa/glossary/token-bucket/","summary":"limiterی که توکن را با نرخ ثابت پر می‌کند و برای هر درخواست یکی خرج می‌کند؛ burst تا ظرفیت مجاز است.","title":"Token bucket"},{"content":"tolerant reader فقط فیلدهای لازم را برمی‌دارد و بقیه را نادیده می‌گیرد؛ پس اضافه‌کردن فیلد به پاسخ تغییری ایمن و غیرشکننده است. decoder سخت‌گیر که فیلد ناشناخته را رد می‌کند همان تغییر را به قطعی تبدیل می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/tolerant-reader/","summary":"کلاینتی که فیلدهای ناشناخته را نادیده می‌گیرد، پس تغییر افزایشی API آن را نمی‌شکند.","title":"Tolerant reader"},{"content":"اگر خانه‌ی حذف‌شده صرفاً خالی شود، کلیدی که با probe بعد از آن قرار گرفته بود دست‌نیافتنی می‌شود. tombstone زنجیره را سالم نگه می‌دارد؛ درج بعدی می‌تواند از آن استفاده کند و rehash همه‌شان را دور می‌ریزد.\n","permalink":"https://justroham.ir/fa/glossary/tombstone/","summary":"نشانه‌ای که هنگام حذف در جدول open addressing باقی می‌ماند تا جست‌وجوها از روی آن عبور کنند.","title":"Tombstone"},{"content":"استفاده از await مستقیم در بالاترین سطح یک ES module، بیرون از هر تابع async. فقط در ES module کار می‌کند و ماژول‌هایی که این ماژول را import می‌کنند منتظر پایانش می‌مانند.\n","permalink":"https://justroham.ir/fa/glossary/top-level-await/","summary":"استفاده از \u003ccode\u003eawait\u003c/code\u003e مستقیم در بالاترین سطح یک ES module، بیرون از هر تابع async.","title":"Top-level await"},{"content":"اگر یال u -\u0026gt; v یعنی «u باید پیش از v بیاید»، ترتیب توپولوژیک همه‌ی رأس‌ها را طوری فهرست می‌کند که هر یال رو به جلو باشد. فقط برای DAG وجود دارد و معمولاً یکتا نیست.\n","permalink":"https://justroham.ir/fa/glossary/topological-sort/","summary":"ترتیبی از رأس‌های یک DAG که در آن هر یال از رأس زودتر به رأس دیرتر می‌رود.","title":"Topological sort"},{"content":"ابزاری که بسته‌هایی با TTL (حد گام) رو‌به‌افزایش می‌فرستد. هر روتری که بسته را چون TTL صفر شده دور می‌اندازد، پیام ICMP برمی‌گرداند و همان گام دیده می‌شود. نگاه کنید به ICMP.\n","permalink":"https://justroham.ir/fa/glossary/traceroute/","summary":"traceroute لیست روترهای مسیر تا یک میزبان را با فرستادن بسته‌هایی که TTL آن‌ها از ۱ شروع و زیاد می‌شود نشان می‌دهد.","title":"traceroute"},{"content":"trait نقش interface را دارد و هم به‌عنوان قید generic (T: Display، static dispatch) و هم به‌شکل trait object (dyn Display، dynamic dispatch) استفاده می‌شود. برخلاف interfaceهای Go، یک نوع باید صریحاً impl آن را بنویسد.\n","permalink":"https://justroham.ir/fa/glossary/trait/","summary":"مجموعه‌ای از متدها که یک نوع می‌تواند پیاده کند؛ روش Rust برای اشتراک رفتار.","title":"Trait"},{"content":"در PostgreSQL هر دستور داخل یک تراکنش اجرا می‌شود؛ بدون BEGIN هر دستور تراکنش خودش را دارد (autocommit). COMMIT تغییرها را ماندگار می‌کند و ROLLBACK آن‌ها را دور می‌ریزد.\n","permalink":"https://justroham.ir/fa/glossary/transaction/","summary":"گروهی از دستورها که دیتابیس آن‌ها را یک واحد می‌بیند: یا همه اثر می‌کنند یا هیچ‌کدام.","title":"Transaction"},{"content":"در خروجی npm ls --all عمیق‌تر دیده می‌شوند. نسخه‌شان را npm انتخاب می‌کند و در lockfile قفل می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/transitive-dependency/","summary":"پکیجی که مستقیم نخواسته‌اید، ولی یکی از وابستگی‌هایتان به آن نیاز دارد.","title":"transitive dependency"},{"content":"هر commit به یک tree ریشه اشاره می‌کند و به این شکل snapshot کل پروژه ذخیره می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/git-tree/","summary":"object گیت که یک پوشه را نشان می‌دهد: نام، mode و هش blobها و زیرپوشه‌ها.","title":"tree"},{"content":"rotation راست، فرزند چپ را بالای پدرش می‌آورد. درخت AVL برای حالت‌های LL و RR یک rotation و برای LR و RL دو rotation پشت‌سرهم لازم دارد.\n","permalink":"https://justroham.ir/fa/glossary/tree-rotation/","summary":"جابه‌جایی محلی اشاره‌گرهای دو یا سه node که شکل درخت جست‌وجو را عوض می‌کند ولی ترتیب in-order را حفظ می‌کند.","title":"Tree rotation"},{"content":"پیمایش in-order در درخت جست‌وجوی دودویی کلیدها را مرتب می‌دهد. level-order از queue استفاده می‌کند و درخت را ردیف‌به‌ردیف می‌بیند.\n","permalink":"https://justroham.ir/fa/glossary/tree-traversal/","summary":"ترتیبی منظم برای دیدن همه‌ی node‌ها: pre-order، in-order، post-order یا level-order.","title":"Tree traversal"},{"content":"trie (درخت پیشوندی) مجموعه‌ای از رشته‌ها را طوری نگه می‌دارد که هر گره یک پیشوند است و هر یال یک نویسه اضافه می‌کند. درج، جست‌وجو و پرس‌وجوی پیشوند یک مسیر به طول کلمه را می‌پیمایند. autocomplete در آن طبیعی است: گره‌ی پیشوند را پیدا کن و هرچه زیر آن است فهرست کن.\n","permalink":"https://justroham.ir/fa/glossary/trie/","summary":"درختی که هر یال یک نویسه است، پس کلمه‌هایی که پیشوند مشترک دارند یک مسیر مشترک دارند. هزینه‌ی جست‌وجو به طول کلمه بستگی دارد، نه به تعداد کلمه‌ها.","title":"Trie"},{"content":"در مایگریشن برای هم‌گام نگه داشتن ستون قدیمی و جدید مفید است، تا وقتی که برنامه هنوز در حال تغییر است.\n","permalink":"https://justroham.ir/fa/glossary/trigger/","summary":"تابعی که دیتابیس خودکار قبل یا بعد از INSERT، UPDATE یا DELETE روی یک جدول اجرا می‌کند.","title":"Trigger"},{"content":"extension به نام pg_trgm تابع similarity()، عملگر % و operator classهای trigram برای ایندکس GIN را می‌دهد که LIKE '%text%' را هم سریع می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/trigram/","summary":"گروه سه‌حرفی پشت‌سرهم؛ مقایسه‌ی مجموعه‌ی trigramهای دو رشته یک امتیاز شباهت می‌دهد که برای تطبیق تقریبی به کار می‌رود.","title":"Trigram"},{"content":"همه تغییرهای کوچک را دست‌کم روزانه به main می‌رسانند و کار نیمه‌تمام به‌جای branch طولانی پشت feature flag پنهان می‌شود. به CI سریع و تست خوب وابسته است.\n","permalink":"https://justroham.ir/fa/glossary/trunk-based-development/","summary":"trunk-based: تغییرهای کوچک و روزانه به branch اصلی.","title":"Trunk-based development"},{"content":"هرچه از مرز اعتماد رد می‌شود باید اعتبارسنجی یا احراز هویت شود. بیشتر تهدیدها روی همین خط‌ها جمع می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/trust-boundary/","summary":"خطی در نمودار که داده از آن میان بخش‌هایی با سطح اعتماد متفاوت عبور می‌کند، مثلاً از اینترنت به API شما.","title":"Trust boundary"},{"content":"رفتار یک شیء در زمینه‌ی منطقی. در Python صفر، None و containerهای خالی false هستند و بیشتر مقدارهای دیگر true.\n","permalink":"https://justroham.ir/fa/glossary/truthiness/","summary":"رفتار یک شیء در زمینه‌ی منطقی. در Python صفر، None و containerهای خالی false هستند و بیشتر مقدارهای دیگر true.","title":"Truthiness"},{"content":"to_tsvector('english', 'running shoes') نتیجه‌ی 'run':1 'shoe':2 می‌دهد. آن را با عملگر @@ با یک tsquery تطبیق می‌دهید و با ایندکس GIN ایندکس می‌کنید.\n","permalink":"https://justroham.ir/fa/glossary/tsvector/","summary":"نوع داده‌ای در PostgreSQL که یک سند را به شکل فهرست مرتب‌شده‌ی کلمه‌های نرمال‌شده (lexeme) با موقعیتشان نگه می‌دارد؛ برای جست‌وجوی متنی.","title":"tsvector"},{"content":"TTFB فاصله‌ی ارسال درخواست تا رسیدن اولین بایت پاسخ است. TTFB بزرگ معمولاً یعنی سرور مشغول پردازش بوده؛ زمان زیاد بعد از آن یعنی بدنه کند آمده است. ابزارها آن را از نقطه‌های شروع متفاوت اندازه می‌گیرند، پس بگویید کدام را به‌کار برده‌اید.\n","permalink":"https://justroham.ir/fa/glossary/ttfb/","summary":"زمان تا اولین بایت: چقدر طول می‌کشد تا اولین بایت پاسخ برسد.","title":"TTFB"},{"content":"هر رکورد DNS یک TTL دارد. resolverِ cache‌کننده آن را کم می‌کند، پس پرسش‌های پشت‌سرهم عدد کوچک‌تری نشان می‌دهند تا منقضی شود و دوباره از authoritative server بپرسد.\n","permalink":"https://justroham.ir/fa/glossary/ttl/","summary":"تعداد ثانیه‌هایی که رکورد cache‌شده بدون پرسش دوباره قابل استفاده است.","title":"TTL"},{"content":"در فاز اول هر participant کارش را durable می‌کند و رأی yes یا no می‌دهد. در فاز دوم coordinator پس از ثبت تصمیم در log به همه می‌گوید commit یا abort. این روش atomicity بین چند سیستم می‌دهد، اما participantی که prepared شده باید منتظر coordinator بماند و در این مدت lockهایش را نگه می‌دارد.\n","permalink":"https://justroham.ir/fa/glossary/two-phase-commit/","summary":"پروتکلی که در آن coordinator از همه‌ی participantها می‌خواهد prepare کنند و بعد به همه می‌گوید commit کنید یا همه abort.","title":"Two-phase commit (2PC)"},{"content":"در SQLite ستونی که INTEGER تعریف شده affinity عددی دارد: متن '12' به عدد صحیح 12 تبدیل می‌شود، ولی 'abc' بدون خطا به‌صورت متن ذخیره می‌شود. هر مقدار نوع خودش را دارد. جدول‌های STRICT نوع تعریف‌شده را اجبار می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/type-affinity/","summary":"قاعده‌ی SQLite که ستون یک نوع را ترجیح می‌دهد و در صورت امکان مقدار را تبدیل می‌کند، ولی سخت‌گیرانه اجبارش نمی‌کند.","title":"Type affinity"},{"content":"ابزاری مثل mypy که type hintها را می‌خواند و بدون اجرای برنامه خطاهای نوع را گزارش می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/type-checker/","summary":"ابزاری مثل mypy که type hintها را می‌خواند و بدون اجرای برنامه خطاهای نوع را گزارش می‌کند.","title":"Type checker"},{"content":"یک annotation اختیاری مثل x: int یا -\u0026gt; str که نوع مورد انتظار را می‌گوید. مفسر آن را ذخیره می‌کند اما اعمال نمی‌کند؛ type checkerها آن را می‌خوانند.\n","permalink":"https://justroham.ir/fa/glossary/type-hint/","summary":"یک annotation اختیاری مثل x: int یا -\u0026gt; str که نوع مورد انتظار را می‌گوید. مفسر آن را ذخیره می‌کند اما اعمال نمی‌کند؛ type checkerها آن را می‌خوانند.","title":"Type hint"},{"content":"دفاع: نام هر وابستگی تازه را بازبینی کنید، از lockfile بازبینی‌شده نصب کنید نه از نام‌های دست‌نویس، و بسته‌های شناخته‌شده را ترجیح دهید.\n","permalink":"https://justroham.ir/fa/glossary/typosquatting/","summary":"منتشر کردن بسته‌ی مخرب با نامی شبیه یک بسته‌ی محبوب، به امید اشتباه تایپی.","title":"typosquatting"},{"content":"اگر کسب‌وکار می‌گوید «ثبت سفارش»، متد Place است، نه Submit یا Finalize. داخل یک bounded context هر واژه یک معنا دارد.\n","permalink":"https://justroham.ir/fa/glossary/ubiquitous-language/","summary":"واژگان مشترک توسعه‌دهندگان و متخصصان دامنه که در کد هم عیناً به کار می‌رود.","title":"Ubiquitous language"},{"content":"UDP فقط پورت و checksum را به IP اضافه می‌کند و datagramها مستقل فرستاده می‌شوند. چیزی برایتان دوباره ارسال نمی‌شود و برنامه خودش با گم‌شدن کنار می‌آید؛ برای پروتکل‌های کوچک درخواست/پاسخ مثل DNS مناسب است.\n","permalink":"https://justroham.ir/fa/glossary/udp/","summary":"پروتکل datagram بدون اتصال روی IP، بدون تضمین تحویل.","title":"UDP"},{"content":"ماسکی برای هر پروسه که بیت‌های مجوز آن از فایل‌ها و پوشه‌های تازه حذف می‌کند. با 022 فایل جدید 644 و پوشه 755 می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/umask/","summary":"ماسکی برای هر پروسه که بیت‌های مجوز آن از فایل‌ها و پوشه‌های تازه حذف می‌کند. با 022 فایل جدید 644 و پوشه 755 می‌شود.","title":"umask"},{"content":"از Node 15 به بعد رفتار پیش‌فرض این است که process با exit code برابر 1 از کار می‌افتد (اینجا روی Node 20 بررسی شد). همیشه promise را handle یا return کنید.\n","permalink":"https://justroham.ir/fa/glossary/unhandled-rejection/","summary":"promise ردشده‌ای که هیچ‌کس با catch یا try/catch رسیدگی‌اش نکرده.","title":"Unhandled rejection"},{"content":"union by size برای هر ریشه اندازه نگه می‌دارد و همیشه درخت کوچک‌تر را زیر بزرگ‌تر می‌آویزد. عمق یک گره فقط وقتی زیاد می‌شود که درخت‌اش دست‌کم دو برابر شود، پس عمق حداکثر log2 n می‌ماند. union by rank همین ایده با تخمینی از ارتفاع است.\n","permalink":"https://justroham.ir/fa/glossary/union-by-size/","summary":"هنگام ادغام دو درخت، کوچک‌تر را زیر ریشه‌ی بزرگ‌تر بگذار تا درخت‌ها کم‌عمق بمانند.","title":"Union by size"},{"content":"union-find یا disjoint set عنصرها را در گروه‌های بدون اشتراک نگه می‌دارد. Find(x) نماینده‌ی گروه x را برمی‌گرداند و Union(a, b) دو گروه را ادغام می‌کند. با path compression و union by size، کل دنباله‌ی عملیات طبق منابع تقریباً خطی است.\n","permalink":"https://justroham.ir/fa/glossary/union-find/","summary":"ساختاری که نگه می‌دارد کدام عنصرها در یک گروه‌اند، با Find (کدام گروه؟) و Union (ادغام دو گروه).","title":"Union-find"},{"content":"نام فایل با نوع واحد تمام می‌شود: .service و .timer و .socket و .target و .mount و .path. بخش‌هایی مثل [Unit] و [Service] و [Install] تنظیمات را نگه می‌دارند. بعد از ویرایش باید systemctl daemon-reload را اجرا کنید.\n","permalink":"https://justroham.ir/fa/glossary/unit-file/","summary":"فایل متنی کوچکی شبیه INI که به systemd می‌گوید یک کار را چطور اجرا یا زمان‌بندی کند.","title":"Unit file"},{"content":"Session در SQLAlchemy یک unit of work است: شیءها را اضافه و ویرایش می‌کنید و هنگام flush دستورهای INSERT/UPDATE را به ترتیب وابستگی می‌فرستد. commit آن‌ها را ماندگار و rollback دور می‌ریزد.\n","permalink":"https://justroham.ir/fa/glossary/unit-of-work/","summary":"الگویی که در آن یک شیء تغییرها را ردیابی می‌کند و همه را یک‌جا در یک transaction می‌نویسد.","title":"Unit of work"},{"content":"بعضی قالب‌ها فقط داده را توصیف نمی‌کنند، بلکه می‌گویند برای ساختن دوباره کدام تابع صدا زده شود. اگر مهاجم بایت‌ها را کنترل کند، تابع را او انتخاب می‌کند. قالب‌های داده‌ی ساده مثل JSON همراه با schema validation این مشکل را ندارند. نگاه کنید به pickle.\n","permalink":"https://justroham.ir/fa/glossary/unsafe-deserialization/","summary":"ساخت دوباره‌ی شیء از بایت‌های نامطمئن با قالبی که هنگام decode می‌تواند کد اجرا کند، مثل pickle در Python.","title":"Unsafe deserialization"},{"content":"payload نسخه‌ی ۱ با amount برابر ۵ به‌صورت amount_cents برابر ۵۰۰ به‌همراه currency خوانده می‌شود؛ سطر ذخیره‌شده دست‌نخورده می‌ماند.\n","permalink":"https://justroham.ir/fa/glossary/upcasting/","summary":"تبدیل شکل قدیمی رویداد ذخیره‌شده به شکل فعلی هنگام خواندن، به‌جای ویرایش رویدادهای ذخیره‌شده.","title":"Upcasting"},{"content":"بعد از free(p) اشاره‌گر هنوز آدرس قدیمی را دارد و خواندنش حتی ممکن است سالم به نظر برسد. در Rust قواعد ownership و قرض‌گیری همین اشتباه را به خطای کامپایل تبدیل می‌کنند.\n","permalink":"https://justroham.ir/fa/glossary/use-after-free/","summary":"استفاده از اشاره‌گری که حافظه‌ی مقصدش آزاد شده است.","title":"Use-after-free"},{"content":"در یک صف ساده زمان انتظار مثل 1/(1-ρ) رشد می‌کند و وقتی ρ به ۱۰۰٪ نزدیک شود latency منفجر می‌شود. برای همین برنامه‌ی ظرفیت ۵۰ تا ۷۰٪ را هدف می‌گیرد، نه ۹۵٪.\n","permalink":"https://justroham.ir/fa/glossary/utilization/","summary":"کسری از زمان که سرور مشغول است: نرخ ورود تقسیم بر نرخ سرویس.","title":"Utilization"},{"content":"دستورهایش شامل uv init، uv add، uv run، uv sync و uv pip است و uv.lock را می‌نویسد.\n","permalink":"https://justroham.ir/fa/glossary/uv/","summary":"ابزاری که نسخه‌ی Python، محیط مجازی، وابستگی‌ها و lock file را مدیریت می‌کند.","title":"uv"},{"content":"autovacuum آن را در پس‌زمینه اجرا می‌کند و می‌توانید VACUUM table را دستی هم بزنید. جدول‌های پر‌update به آن نیاز دارند.\n","permalink":"https://justroham.ir/fa/glossary/vacuum/","summary":"دستور نگهداری PostgreSQL که نسخه‌های مرده‌ی ردیف را پاک می‌کند و visibility map را به‌روز می‌کند.","title":"VACUUM"},{"content":"دو مقدار Money با مبلغ و ارز یکسان برابرند. سازنده آن‌ها را اعتبارسنجی می‌کند، پس مقدار نامعتبر وجود نخواهد داشت.\n","permalink":"https://justroham.ir/fa/glossary/value-object/","summary":"شیئی تغییرناپذیر و بدون هویت که با مقدارش مقایسه می‌شود، مثل پول یا نشانی ایمیل.","title":"Value object"},{"content":"هر process خانه‌ی خودش را زیاد می‌کند و هنگام receive max عنصر به عنصر می‌گیرد. هزینه‌اش vectorی به اندازه‌ی تعداد شرکت‌کننده‌هاست.\n","permalink":"https://justroham.ir/fa/glossary/vector-clock/","summary":"یک شمارنده برای هر process؛ مقایسه‌ی دو vector دقیقاً می‌گوید قبل، بعد یا هم‌زمان.","title":"Vector clock"},{"content":"اگر یک vector بر دیگری غلبه کند مقدار قدیمی‌تر کنار می‌رود؛ اگر هم‌زمان باشند هر دو به‌عنوان sibling نگه داشته می‌شوند تا برنامه ادغامشان کند.\n","permalink":"https://justroham.ir/fa/glossary/version-vector/","summary":"یک vector clock که به مقدار ذخیره‌شده وصل می‌شود تا replicaها بتوانند به‌روزرسانی را از تعارض تشخیص دهند.","title":"Version vector"},{"content":"معمولاً یک سر در میزبان می‌ماند و سر دیگر به network namespace منتقل می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/veth/","summary":"جفت رابط اترنت مجازی: هرچه وارد یک سر شود از سر دیگر بیرون می‌آید.","title":"veth"},{"content":"با python3 -m venv .venv یا uv venv ساخته می‌شود. داخل آن sys.prefix با sys.base_prefix فرق دارد. site-packages را هم ببینید.\n","permalink":"https://justroham.ir/fa/glossary/virtual-environment/","summary":"پوشه‌ای جدا با لینک interpreter و site-packages مخصوص خودش تا هر پروژه وابستگی‌های خودش را داشته باشد.","title":"virtual environment"},{"content":"VACUUM بیت‌ها را می‌گذارد و update روی یک صفحه بیتش را پاک می‌کند. Index Only Scan به آن وابسته است.\n","permalink":"https://justroham.ir/fa/glossary/visibility-map/","summary":"یک bitmap برای هر جدول که صفحه‌های heap را که همه‌ی ردیف‌هایشان برای همه‌ی تراکنش‌ها قابل‌دیدن است علامت می‌زند.","title":"Visibility map"},{"content":"این لاگ ریکاوری بعد از crash و replication را ممکن می‌کند. هر تغییر در جدول یا ایندکس رکورد WAL تولید می‌کند، پس تعداد بایت‌های WAL راهی قطعی برای سنجش کار یک نوشتن است.\n","permalink":"https://justroham.ir/fa/glossary/wal/","summary":"write-ahead log: PostgreSQL هر تغییر را پیش از دست زدن به فایل‌های داده در یک لاگ ترتیبی ثبت می‌کند.","title":"WAL"},{"content":"عملگر := در Python که داخل یک عبارت به یک نام مقدار می‌دهد، مثل if (n := len(x)) \u0026gt; 5.\n","permalink":"https://justroham.ir/fa/glossary/walrus-operator/","summary":"عملگر := در Python که داخل یک عبارت به یک نام مقدار می‌دهد، مثل if (n := len(x)) \u0026gt; 5.","title":"Walrus operator"},{"content":"بعد از یک handshake روی HTTP، همان اتصال TCP فریم‌های کوچک را در دو جهت می‌برد و سرور می‌تواند بدون درخواست قبلی پیام بفرستد. تعریفش در RFC 6455 است.\n","permalink":"https://justroham.ir/fa/glossary/websocket/","summary":"پروتکلی برای یک کانال پیام دوطرفه‌ی پایدار که با یک upgrade روی HTTP شروع می‌شود.","title":"WebSocket"},{"content":"نام فایل Python و پلتفرم پشتیبانی‌شده را نشان می‌دهد؛ برای Python خالص py3-none-any. نصب wheel یعنی باز کردن آن در site-packages.\n","permalink":"https://justroham.ir/fa/glossary/wheel/","summary":"یک بسته‌ی Python ساخته‌شده: فایل zip با پسوند whl که بدون اجرای هیچ مرحله‌ی build نصب می‌شود.","title":"wheel"},{"content":"آیتم جدید فقط وقتی شروع می‌شود که دیگری تمام شود. cycle time را کوتاه می‌کند، اما حد خیلی پایین آدم‌ها را بیکار می‌گذارد.\n","permalink":"https://justroham.ir/fa/glossary/wip-limit/","summary":"سقف تعداد آیتم‌هایی که همزمان در جریان‌اند.","title":"WIP limit"},{"content":"بعد از expand شدن متغیر، shell نتیجه را روی space، tab و newline (همان IFS) می‌شکند و بعد globbing را اعمال می‌کند. نوشتن \u0026ldquo;$var\u0026rdquo; هر دو را متوقف می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/word-splitting/","summary":"مرحله‌ای در shell که یک expansion بدون quote را به چند کلمه‌ی جدا می‌شکند.","title":"Word splitting"},{"content":"به‌جای ساختن یک goroutine برای هر کار، N کارگر بالا می‌آورید که از یک channel کارها می‌خوانند. این کار مصرف حافظه و فشار روی سرویس پایین‌دست را محدود می‌کند. تولیدکننده بعد از اتمام channel را می‌بندد و کارگرها با پایان range خارج می‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/worker-pool/","summary":"تعداد ثابتی goroutine که کارها را از یک صف مشترک برمی‌دارند.","title":"Worker pool"},{"content":"ماژول worker_threads در Node چند thread اضافه در همان process می‌سازد. هر کدام event loop و حافظه‌ی خودش را دارد؛ داده با کپی از راه postMessage، با انتقال یا با SharedArrayBuffer جابه‌جا می‌شود.\n","permalink":"https://justroham.ir/fa/glossary/worker-threads/","summary":"threads داخل یک process در Node، با event loop و heap جدا، برای کار CPU-bound.","title":"Worker threads"},{"content":"working tree اولین ناحیه از سه ناحیه‌ی گیت است. تغییرهای آن تا وقتی با git add به staging نروند در commit بعدی دیده نمی‌شوند.\n","permalink":"https://justroham.ir/fa/glossary/working-tree/","summary":"فایل‌های روی دیسک که ویرایش می‌کنید، در برابر چیزی که گیت stage یا commit کرده است.","title":"Working tree"},{"content":"با git worktree add ../fix -b fix می‌توانید دو branch را همزمان checkout کنید، بدون clone دوباره. گیت اجازه نمی‌دهد یک branch در دو worktree باز باشد.\n","permalink":"https://justroham.ir/fa/glossary/worktree/","summary":"یک پوشه‌ی کاری اضافه متصل به همان repository که branch خودش را checkout کرده است.","title":"Worktree"},{"content":"مثال کلاسیک: دو پزشک کشیک هر کدام چک می‌کنند دیگری هنوز سر کار است و بعد هر دو می‌روند. snapshot isolation این را اجازه می‌دهد؛ SERIALIZABLE نه.\n","permalink":"https://justroham.ir/fa/glossary/write-skew/","summary":"دو تراکنش داده‌ی مشترکی را می‌خوانند، هر کدام ردیف متفاوتی را به‌روز می‌کند و با هم قاعده‌ای را می‌شکنند که هیچ‌کدام تنها نمی‌شکست.","title":"Write skew"},{"content":"گواهی X.509 شامل کلید عمومی، صاحب گواهی (subject)، صادرکننده‌ی امضاکننده، بازه‌ی اعتبار و افزونه‌هایی مثل SubjectAltName است. دستور openssl x509 -text همه‌ی اینها را چاپ می‌کند.\n","permalink":"https://justroham.ir/fa/glossary/x509-certificate/","summary":"گواهی X.509: سندی امضاشده که یک کلید عمومی را به یک نام وصل می‌کند.","title":"X.509 certificate"},{"content":"آیتم‌ها را از stdin می‌خواند و دستوری را با آن‌ها به‌عنوان آرگومان اجرا می‌کند. برای نام فایل‌های دارای فاصله، -0 را با find -print0 به کار ببرید.\n","permalink":"https://justroham.ir/fa/glossary/xargs/","summary":"آیتم‌ها را از stdin می‌خواند و دستوری را با آن‌ها به‌عنوان آرگومان اجرا می‌کند. برای نام فایل‌های دارای فاصله، \u003ccode\u003e-0\u003c/code\u003e را با \u003ccode\u003efind -print0\u003c/code\u003e به کار ببرید.","title":"xargs"},{"content":"وقتی رخ می‌دهد که ورودی غیرقابل‌اعتماد بدون escape مناسبِ جایی که در آن قرار می‌گیرد داخل صفحه نوشته شود. دفاع اصلی output encoding وابسته به زمینه است و Content Security Policy لایه‌ی دوم.\n","permalink":"https://justroham.ir/fa/glossary/xss/","summary":"Cross-site scripting: متنی که مهاجم کنترل می‌کند در مرورگر کاربر دیگر به‌عنوان HTML یا JavaScript اجرا می‌شود.","title":"XSS"},{"content":"کلید رتبه‌ی r با احتمالی متناسب با 1/r^s درخواست می‌شود. ترافیک واقعی اغلب چنین چولگی‌ای دارد و برای همین cache کوچک می‌تواند hit rate بالایی داشته باشد.\n","permalink":"https://justroham.ir/fa/glossary/zipf-distribution/","summary":"الگوی دسترسی نامتقارن که در آن چند کلید بیشتر درخواست‌ها را می‌گیرند و دنباله‌ی بلندی کم.","title":"Zipf distribution"},{"content":"فرزندی که تمام شده اما والدش هنوز wait نزده، پس ردیفش در جدول پروسه‌ها مانده است. در ps وضعیت Z دارد. کشته نمی‌شود؛ وقتی والد آن را جمع کند یا خارج شود، از بین می‌رود.\n","permalink":"https://justroham.ir/fa/glossary/zombie-process/","summary":"فرزندی که تمام شده اما والدش هنوز \u003ccode\u003ewait\u003c/code\u003e نزده، پس ردیفش در جدول پروسه‌ها مانده است.","title":"Zombie process"},{"content":"سوییچ یک گام ارزان است (یک symlink یا هدف load balancer)، پس برگشت همان گام در جهت عکس است. هزینه‌اش اجرای دو نسخه و پایگاه داده‌ای است که هر دو نسخه بتوانند با آن کار کنند.\n","permalink":"https://justroham.ir/fa/glossary/blue-green-deployment/","summary":"دو نسخه‌ی یکسان کنار هم؛ ترافیک فقط وقتی نسخه‌ی جدید سالم بود از نسخه‌ی زنده به آن منتقل می‌شود.","title":"استقرار blue/green"},{"content":"منتخبی از پروژه‌های عمومی من. بسیاری از آن‌ها تمرین عملی مفاهیمی هستند که می‌خواستم عمیق بفهمم.\nquant-core Rust — موتور تحلیل بازار با کارایی بالا برای تشخیص پرایس‌اکشن، الگوهای فرکتال و ساختار بازار در چند تایم‌فریم. فعلاً روی XAUUSD و EURUSD متمرکز است و برای هر ابزار مالی قابل گسترش است.\ngo-gold-analyzer Go — تحلیل تکنیکال خودکار برای طلا. هر دقیقه داده‌ی Yahoo Finance را می‌گیرد، RSI و MACD و ATR را حساب می‌کند و سیگنال BUY / SELL / HOLD همراه با لاگ تولید می‌کند.\ngo-nats-demo Go — سرویس‌های Publisher و Worker روی NATS JetStream با durable subscription، retry اتصال و داشبورد مدیریتی، همه با Docker.\ngo-kafka-first Go — تمرین عملی Kafka: topic، partition، offset و consumer group، با KRaft و Kafka UI از طریق Docker Compose.\nnestjs-structure TypeScript — ساختار پروژه‌ی NestJS با تنظیمات بر اساس محیط (default، development، production، test).\nیادداشت‌های همروندی در Go آزمایش‌های کوچک روی گوروتین و context: go-goroutine-01، go-context-01، go-connectivity-test.\n","permalink":"https://justroham.ir/fa/projects/","summary":"\u003cp\u003eمنتخبی از پروژه‌های عمومی من. بسیاری از آن‌ها تمرین عملی مفاهیمی هستند که می‌خواستم عمیق بفهمم.\u003c/p\u003e\n\u003ch2 id=\"quant-core\"\u003e\u003ca href=\"https://github.com/h-agharezaei/quant-core\"\u003equant-core\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eRust\u003c/strong\u003e — موتور تحلیل بازار با کارایی بالا برای تشخیص پرایس‌اکشن، الگوهای فرکتال و ساختار بازار در چند تایم‌فریم. فعلاً روی XAUUSD و EURUSD متمرکز است و برای هر ابزار مالی قابل گسترش است.\u003c/p\u003e\n\u003ch2 id=\"go-gold-analyzer\"\u003e\u003ca href=\"https://github.com/h-agharezaei/go-gold-analyzer\"\u003ego-gold-analyzer\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGo\u003c/strong\u003e — تحلیل تکنیکال خودکار برای طلا. هر دقیقه داده‌ی Yahoo Finance را می‌گیرد، RSI و MACD و ATR را حساب می‌کند و سیگنال BUY / SELL / HOLD همراه با لاگ تولید می‌کند.\u003c/p\u003e","title":"پروژه‌ها"},{"content":"دستور git commit --fixup \u0026lt;commit\u0026gt; کامیتی با عنوان fixup! \u0026lt;subject\u0026gt; می‌سازد. بعد git rebase -i --autosquash آن را کنار هدفش می‌برد و ادغام می‌کند تا یک اصلاح کوچک در تاریخچه ردیف جداگانه نشود.\n","permalink":"https://justroham.ir/fa/glossary/fixup-commit/","summary":"کامیتی که قرار است هنگام rebase با autosquash داخل کامیت قبلی ادغام شود.","title":"کامیت fixup"},{"content":"هوک‌ها فایل‌های اجرایی‌اند که نامشان همان رویداد است (pre-commit، commit-msg، pre-push). اگر یکی از آن‌ها با کد غیرصفر خارج شود، Git عملیات را متوقف می‌کند. به‌صورت پیش‌فرض در .git/hooks هستند که version نمی‌شود، یا در پوشه‌ای که core.hooksPath مشخص می‌کند. گزینه‌ی --no-verify آن‌ها را رد می‌کند، پس مانع امنیتی نیستند و فقط حفاظ‌اند.\n","permalink":"https://justroham.ir/fa/glossary/git-hook/","summary":"اسکریپتی که Git در نقطه‌ای از جریان کار، مثلاً پیش از commit، خودش اجرا می‌کند.","title":"هوک Git"}]