TGViewer
Channel Public Channel
Agora

Agora

@dr_biglari_ds

Subscribers
852
Photos
485
Videos
58
Links
1.1K
Recent Posts 18 shown
Post #3359
Channel photo updated
Post #3354 870
ای کسی که از این آستانه می گذری، آرزوها را فراموش کن.
Post #3353 775
جالبه. وقتی تعداد مخطاب‌هات بالا می‌ره، فکر می‌کنی (می‌کنن) که یه رسالتی داری که باید انجامش بدی. باید روی بالاترین و دور‌ترین ارتفاعی که گیر میاری بایستی و دهن به نصیحت باز کنی. درست وقی احساس مهم بودن تا ابرو تو رو درخودش فرو برد، رفتار‌هات رو به شکلی پیامبر گونه تعریف می‌کنی و بقیه رو دعوت می‌کنی. روایت‌های شخصیت رو در چهارچوب شخصیت نگه نمی‌داری و می‌خوای این رو سر بدی در زندگی پیروان خیالیت. یواشکی و با خجالت اون رو دیکته کنی.

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

فراموش نکن که کسی به تو نگفت «اقرأ» که دهن باز کنی. تو فقط هیجان زده‌ای. هیجان زده‌ از تعداد آدم‌های تو کانالت. از ناظرات. هیجان زده از کاری که هیچ‌وقت تا حالا نکردی و خیلی هم قرارنیست ادامه‌ش بدی. تو رسالتی نداری که بخوای اون رو انجام بدی. پس بیا پایین.
Post #3352 619
Most people think GPU programming is about throwing more cores at a problem.

It's not. It's about understanding how those cores actually work and writing code that cooperates with the hardware instead of fighting it.

Parallel reduction is the perfect example. It's just a sum. An array in, a number out. Dead simple.

But the difference between a naive CUDA kernel and an optimized one is an 8× speedup , not from better math, but from:

• Fixing an addressing pattern that was silently serializing warps
• Letting the compiler eliminate dead code at compile time
• Skipping synchronization barriers that weren't needed
• Moving from shared memory to register-level communication



Parallel Reduction in CUDA
Medium Parallel Reduction in CUDA A comprehensive guide to summing arrays at the speed of silicon : from naive synchronization to warp-level magic and loop unrolling.
Post #3348 606
جالبه. چند وقت پیش داشتم راجع‌به ماجرهای ساخت بازی Silent Hill II یه ویدیو می‌دیدم که Hiroyuki Owakue از چه منابعی الهام گرفت. توش به کتاب جنایت و مکافات داستایوفسکی اشاره کرد. با توجه به تجربه‌ای که سر کتاب مرگ ایوان ایلیچ به‌دست آوردم به دو راه حل رسیدم برای این که کتاب‌های پر اسم رو نصف‌و‌نیمه ول نکنم:
۱- دائم از AIها بخوام شخصیت‌های کتاب رو یادآوری کنن
۲- خودم دست به یادداشت اسم‌ها بزنم و هی به اون مراجعه کنم.

من در به‌خاطر سپردن اسامی اینقدر افتضاحم که حتی در فیلم‌های کم کارکتر هم اسم کارکتر‌ها رو زحمت نمی‌دم به خودم که حفظ کنم. فقط تصویرشون رو به‌خاطر نگه می‌دارم. حالا هم می‌بینم که اوضاع اینقدر در رومان‌های روسی بی‌ریخته که این کتاب‌خون‌هاشون هم گیج می‌شن.
باز دست خداداد رضاخانی درد نکنه علت این‌همه روده درازی رو گفت.
Post #3347 536
Agora // strAttack.go package timeAttack import ( "fmt" "math/rand" "sort" "time" ) const SECRET = "s3cr3t_k3y" // Use a sink variable — prevents compiler from optimizing away the work loop var sink int func vulnerableCheck(input string) bool…
این دکمه‌ چه بامزه‌ست :)
Post #3346 509
نمونه‌ی خروجی:
Secret length is known (or guessed): 9

Cracking position 0... found '4' (signal: 0s) → recovered so far: 4
Cracking position 1... found 'o' (signal: 0s) → recovered so far: 4o
Cracking position 2... found 'P' (signal: 0s) → recovered so far: 4oP
Cracking position 3... found 'Q' (signal: 0s) → recovered so far: 4oPQ
Cracking position 4... found 'D' (signal: 0s) → recovered so far: 4oPQD
Cracking position 5... found 'x' (signal: 0s) → recovered so far: 4oPQDx
Cracking position 6... found 'f' (signal: 0s) → recovered so far: 4oPQDxf
Cracking position 7... found 'S' (signal: 0s) → recovered so far: 4oPQDxfS
Cracking position 8... found '8' (signal: 0s) → recovered so far: 4oPQDxfS8

:( Got: "4oPQDxfS8" (close but timing noise interfered)
Run again — noise can cause misses on a busy system.
Secret length is known (or guessed): 10

Cracking position 0... found 's' (signal: 1.084µs) → recovered so far: s
Cracking position 1... found '3' (signal: 2.209µs) → recovered so far: s3
Cracking position 2... found 'c' (signal: 3.333µs) → recovered so far: s3c
Cracking position 3... found 'r' (signal: 4.458µs) → recovered so far: s3cr
Cracking position 4... found '3' (signal: 5.583µs) → recovered so far: s3cr3
Cracking position 5... found 't' (signal: 6.708µs) → recovered so far: s3cr3t
Cracking position 6... found '_' (signal: 7.834µs) → recovered so far: s3cr3t_
Cracking position 7... found 'k' (signal: 8.958µs) → recovered so far: s3cr3t_k
Cracking position 8... found '3' (signal: 10.042µs) → recovered so far: s3cr3t_k3
Cracking position 9... found 'y' (signal: 11.167µs) → recovered so far: s3cr3t_k3y

:) Secret recovered: "s3cr3t_k3y"
Post #3345 419
// strAttack.go
package timeAttack

import (
"fmt"
"math/rand"
"sort"
"time"
)

const SECRET = "s3cr3t_k3y"

// Use a sink variable — prevents compiler from optimizing away the work loop
var sink int

func vulnerableCheck(input string) bool {
if len(input) != len(SECRET) {
return false
}
for i := 0; i < len(SECRET); i++ {
if input[i] != SECRET[i] {
return false
}
// sink prevents dead-code elimination by the compiler
for j := 0; j < 1000; j++ {
sink += j
}
}
return true
}

func measureTime(input string, trialsCount int) time.Duration {
samples := make([]int64, trialsCount)
for i := 0; i < trialsCount; i++ {
start := time.Now()
vulnerableCheck(input)
samples[i] = time.Since(start).Nanoseconds()
}
sort.Slice(samples, func(i, j int) bool { return samples[i] < samples[j] })
// lower quartile — stable against GC/scheduler spikes
return time.Duration(samples[trialsCount/4])
}

func Attack(guessedLength int) string {
const trials = 3_000
charset := "abcdefghijklmnopqrstuvwxyz0123456789_!ABCDEFGHIJKLMNOPQRSTUVWXYZ"
recovered := make([]byte, guessedLength)

for i := range recovered {
recovered[i] = 'a'
}

for index := 0; index < guessedLength; index++ {
fmt.Printf("Cracking position %d... ", index)

bestChar := charset[0]
bestTime := time.Duration(0)
first := true

// Shuffle charset order to avoid positional bias
order := rand.Perm(len(charset))

for _, ci := range order {
recovered[index] = charset[ci]
elapsed := measureTime(string(recovered), trials)

if first || elapsed > bestTime {
bestTime = elapsed
bestChar = charset[ci]
first = false
}
}

recovered[index] = bestChar
fmt.Printf("found '%c' (signal: %v) → recovered so far: %s\n",
bestChar, bestTime, string(recovered[:index+1]))
}

return string(recovered)
}


// main.go
package main

import (
"fmt"
"practice/timeAttack"
)

func main() {
fmt.Println("=== Timing Attack Demo ===")

for i := 1; i < 11; i++ {

fmt.Printf("Secret length is known (or guessed): %d\n\n", i)

result := timeAttack.Attack(i)

fmt.Println()
if result == timeAttack.SECRET {
fmt.Printf(":) Secret recovered: \"%s\"\n", result)
break
} else {
fmt.Printf(":( Got: \"%s\" (close but timing noise interfered)\n", result)
fmt.Println(" Run again — noise can cause misses on a busy system.")
}

}

}
Post #3344 449
Agora بررسی تساوی دو رشته در جاوا - بخش دوم ـــــــــــــــــــــــــــــــــــ حالا اگر آدرس‌ها یکی نبود چی؟ بهتره یک نگاهی به پیاده‌سازی equals توی StringLatin1 و StringUTF16 بندازیم: public static boolean equals(byte[] value, byte[] other) { if (value.length…
حمله‌ی زمان‌بندی

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

این بهینه‌سازی یک ریسک داره: Timing Attack.

فرض کنین می‌خوایید این دو رشته رو با الگوریتم بالا تساوی‌شون رو بررسی کنین:

a = "123abc"
b = "123bbc"

در اندیس سوم، چک کردن تساوی به‌اتمام می‌رسه چون که a و b باهم برابر نیستند. اگر فرض کنیم عملیات بررسی تساوی ۱ میکروثانیه طول می‌کشه، با صرف ۴ میکروثانیه متوجه می‌شیم که این دو تا رشته باهم برابر نیستن.

فرض کنین یک جعبه سیاه دارید. این جعبه یک ورودی می‌گیره و اون هم رشته‌ی شماست. می‌دونین که این جعبه داخلش یک کار انجام می‌شه: «تساوی ورودی رو با رشته‌ای که اون تو مخفی شده چک می‌کنه و تنها مدت زمان انجام این عملیات رو برمیگردونه.»

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

پس شروع می‌کنید رشته‌هایی به طول ۶ تولید کردن (فرض کنین که رشته‌ی مخفی ما همون 123abc بود) :

111111
۲ میکروثانیه: اولین ۱ با ۱ مچ شد. دومین ۱ با ۲ در رشته‌ی اصلی مچ نشد. دو تا عملیات مچ و تمام. پس فهمیدیم رشته‌ی رمز ما با ۱ شروع می‌شه. حالا باید کارکتر دوم رو از یک عوض کنیم.

121111


۳ میکروثانیه: اولین ۱ با ۱ مچ شد. ۲ با ۲ مچ شد. ۱ با ۳ مچ نشد. سه مقایسه و تمام. پس فهمیدیم کارکتر دوم ۲عه. حالا باید سوم رو عوض کنیم. اون رو به ۳ تغییر می‌دیم (این درواقع بروت فورسه. می‌تونست هر کارکتر دیگه‌ای باشه. برای ساده‌سازی کارکتر درست رو انتخاب کردم.)

123111

۴ میکروثانیه: ۱ با ۱، ۲ با ۲ و حالا ۳ با ۳ مچ شد. ۱ با ۴ مچ نشد. عملیات با ۴ مقایسه تموم میشه. حالا وقتشه که کارکتر چهارم رو عوض کنیم. a رو جاش قرار می‌دیم:

123a11

و با همین روند می‌شه حدس زد و تمام کارکتر‌ها تا آخر پیش برد:

123abc
حالا هرچند بار که به جعبه این ورودی رشته رو می‌دیم مدت زمان تغییر نمی‌کنه. یا وقتی که رشته‌ای با طول بیشتر از این میدیم با زمانی خیلی کمتر کار رو خاتمه می‌ده.

با این روش، بدون این‌که هیچ دسترسی مستقیمی به داخل جعبه داشته باشیم، تونستیم رشته‌ی مخفی رو کارکتر به کارکتر بازسازی کنیم. به این حمله Timing Attack می‌گن. احتمالا هم حدس زدین که برای حدس کلید‌ها در صورتی که از الگوریتم بالا (یعنی یک تساوی ساده) برای مقایسه استفاده کنن می‌شه استفاده کرد. این‌ها نمونه‌های واقعی از بهره‌برداری از timing attack در دنیای واقعی بودن:

1. OpenSSL & RSA Private Key — Brumley & Boneh (2003)

Brumley and Boneh devised a timing attack against OpenSSL and successfully extracted a factor of the RSA modulus (and therefore the private key) over a local network. Before this attack, it was generally believed that timing attacks would not work against general-purpose servers because timing variations would mask the decryption times.
They reported using about a million queries to remotely extract a 1024-bit key from an OpenSSL 0.9.7 server in about two hours. The fix was enabling RSA blinding by default in OpenSSL.


2- Django — User Enumeration via Timing (2013)

A test setup showed that for a correct username, the login response was 2–10 times slower than for an incorrect one, even when only running 5 queries per candidate. The difference was described as immediately obvious and easy to detect through any modern network with even a basic script. 


و خیلی مثال‌های دیگه. حالا شاید بپرسین: «وقتی درخواست از طریق اینترنت میاد، تاخیر شبکه همه چیز رو خراب نمی‌کنه؟»
جواب اینه که نه، لزوماً. در همین مثال‌های بالا نشون دادن که با تکنیک‌های آماری روی هزاران درخواست، می‌شه سیگنال زمانی رو حتی از پشت تاخیر شبکه هم استخراج کرد. در شبکه‌های داخلی (مثل سرویس‌های میکروسرویس که با هم روی یه VPC صحبت می‌کنن) این حمله خیلی راحت‌تره چون تاخیر شبکه خیلی کمه.

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

MessageDigest.isEqual()

subtle.ConstantTimeCompare()

hmac.compare_digest()


در ادامه سناریو‌‌ای که با گولنگ پیاده کردم می‌ذارم:
Post #3343 565
چیزی که اذیتم می‌کنه که اینه که دوستان ما که چند سال پیش شانس مهاجرت داشتن، باهاش فخر می‌فروشن و فکر می‌کنن که تو کون فیل قیچی برگردون زدن. از شما هم مثل خیلی‌های دیگه متنفرم.
Post #3342 635
یک موسسه‌ای آمار ویزا‌های اروپا رو هم در بیاره بد نیست. استرالیا رو هم تا جایی که شنیدم دست کمی از آمریکا نداره. به‌خصوص در ایام جنگ، سخت ویزا میدادن.
Post #3340 675
پیش از آغاز دور دوم ریاست‌جمهوری ترامپ، هر ماه بیش از ۱۰۰۰ ویزای توریستی و تجاری (B1/B2) برای ایرانیان صادر می‌شد. اما پس از اجرای ممنوعیت سفر در ژوئن ۲۰۲۵، این آمار به شکل شدیدی سقوط کرد:

• ژوئن ۲۰۲۵: تنها ۹۸ ویزا
• ژوئیه: صفر
• اوت: ۲ ویزا
• سپتامبر: ۲ ویزا

ویزاهای دانشجویی نیز به همان شدت آسیب دیدند.

بین ژوئن تا سپتامبر ۲۰۲۴، مجموعاً ۱۲۹۷ ایرانی موفق به دریافت ویزای دانشجویی آمریکا شدند. اما در همان بازه زمانی در سال ۲۰۲۵، تنها ۱۳ ویزای دانشجویی صادر شد؛ و در ماه‌های اوت و سپتامبر ۲۰۲۵، این عدد عملاً به صفر رسید.

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

نتیجه، تقریباً بسته شدن کامل مسیرهای آموزشی برای دانشجویان ایرانی است.

تا سپتامبر ۲۰۲۵، مجموع ویزاهای غیرمهاجرتی صادرشده برای ایرانیان تنها ۹۵ مورد بود — و اگر ویزاهای مربوط به کارکنان سازمان‌های بین‌المللی را حذف کنیم، این عدد فقط ۴ ویزا می‌شود.

این در حالی است که در سپتامبر ۲۰۲۴، مجموع این ویزاها ۱۶۶۴ مورد بود.
Post #3339 485
Agora یکی از پروژه‌هایی که بعد از رهایی از دانشگاه می‌خواستم پیش ببرم که خودش چند زیر پروژه داره و هر کدوم یک پست مفصل می‌طلبه، طراحی Homelab خودم بود. فعلا همچنان تو فاز پسا خرید تجهیزات مونده. اینقدر درگیر و مشغولم که فرصت نمی‌کنم به زندگی برسم و به طبع این پروژه…
RSS Feed هم به بلاگ اضافه شد :)

فارسی | انگلیسی
Post #3338 753
یکی از پروژه‌هایی که بعد از رهایی از دانشگاه می‌خواستم پیش ببرم که خودش چند زیر پروژه داره و هر کدوم یک پست مفصل می‌طلبه، طراحی Homelab خودم بود. فعلا همچنان تو فاز پسا خرید تجهیزات مونده. اینقدر درگیر و مشغولم که فرصت نمی‌کنم به زندگی برسم و به طبع این پروژه هم فعلا متوقف شده. با این حال، من یک روایت مفصل از تجربه‌ی خودم از یادگیری‌های تدریجی و مقدماتی رو نوشتم و طراحی‌ای که مد نظرمه. چه از نظر طراحی فیزیکی و منطقی، و چه از نظر امکاناتی که مد نظرمه.

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


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

https://a-azadi.blog/post/homelab-p1
Alireza Azadi's Blog طراحی و راه‌اندازی homelab - قسمت اول در اولین پست از مجموعه‌ی احتمالا چندقسمتی «طراحی و راه‌اندازی homelab» کار‌هایی که تا الان روی شبکه‌ی خونه انجام دادم رو تعریف می‌کنم. درادامه به تعریف نیازمندی‌ها و جزئیات نسخه‌ی اول اولین آزمایشگاه خونگیم می‌پردازم. از طراحی topology تا خرید وسایل. این…
Older posts →

About this channel

How can I read @dr_biglari_ds without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Agora: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Agora have?
Agora (@dr_biglari_ds) has 852 subscribers on Telegram, refreshed roughly every 30 minutes.
Does Agora know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →