正在加载视频...

视频加载失败

وضعیت ترسناک سد کرج، تا حالا سد کرج رو اینجوری کم آب ندیده بودم

166,712 次观看 • 1 年前 •via X (Twitter)

0 条评论

暂无评论

原始帖子的评论将显示在这里

相关视频

بخش بزرگی از کسانی که اسم #خلیج_فارس به گوش‌شان خورده، نمی‌دانند نحوه شکل‌گیری این حجم بسیار محدود آب چیست. فرض کنید یک دره عادی به طول چند صد کیلومتر به خاطر بالا آمدن آب‌های آزاد زیر آب رفته. حالا عمق متوسط آن حدود ۳۵ متر باشد. این یک دریای باز با جریان معمولی دریایی نیست. شورتر کردن این حجم آبین محدود با شورابه آب‌شیرین‌کن‌ها و کاهش حجم آب و رسوب ورودی به خاطر سدسازی‌ها در بالا دست، شرایط این محدوده را به شدت تغییر داده است. به یکی از کسانی که می‌گفت باید کویر لوت و کویر مرکزی را دوباره پر آب کنیم تا همان‌طوری باشد که قبلا بوده، گفتم می‌توانی خلیج فارس را به وضعیت قبل از ۱۵ هزار سال پیش در بیاوری؟ متوجه منظورم نشد. ما الان در دوره‌ای زندگی می‌کنیم که هر تغییری در حجم و کیفیت دریاها و منابع آب، روی زندگی خودمان و زیست‌مندان دیگر تاثیر می‌گذارد، پس بهتر است قبل از ایده‌پردازی و رویا پروری، حداقل تاریخچه‌ها را بشناسیم و فقط با دیدن نقشه سطحی، از پروژه‌های بزرگ حرف نزنیم.

Nik Kowsar

70,458 次观看 • 10 个月前

💣بدنه اجتماعی هسته سخت جمهوری اسلامی، بزرگترین خطر دوران پساخامنه‌ای برای ایران این آدمهایی که برای مرگ #خامنه‌ای تو این شرایط دارن عزاداری می کنن رو کسی به زور نیاورده بیرون. با ساندیس و اتوبوس مجانی هم اینجا نیستن. اینها همون پایگاه اجتماعی و فرهنگی و پیاده نظام #هسته_سخت قدرت جمهوری اسلامی هستن. کم و بیش ۱۵ تا ۲۰ درصد مردم. چیزی بین ۱۲ تا ۱۸ میلیون نفر. اینها حاضرن برای عقیدشون بکشن و کشته بشن. کاملا هم آخرالزمانی فکر می کنن! رهبران جمهوری اسلامی رو میشه با بمب و موشک حذف کرد ولی این جماعت رو نمی تونی با بمب و موشک حذف کنی. هر چه بیشتر حذف کنی ازشون مثل یه خرس زخمی خطرناک تر می شن. باید فکری اساسی به حال این مسئله کرد. جوگیری، ذوق زدگی از کشته شدن خامنه‌ای و چند تا سپاهی و نگاه فانتزی به رژیم چینج رو باید گذاشت کنار. سرنگون کردن جمهوری اسلامی پلی استیشن و کال آف دیوتی بازی کردن نیست. اینها رو نتونیم اقناع کنیم جنگ داخلی راه می افته! با فحش دادن تو توییتر و هشتگ #جاويدشاه‌ و #از_دموکراسی_بگو و #زن_زندگی_آزادی نمی تونی اینا رو سر عقل بیاری. با بمباران خارجی هم اینا متحد تر می شن. باید هر چه سریعتر برای این وضعیت خطیر چاره ای اندیشید...

Ali Bornaei

150,361 次观看 • 5 个月前

خودشیفته، نارسیسیت، نابالغ، اینسکیور، دغل‌باز، لاشی... فرقی نمی‌کنه که اسمش رو چی بذارید. اما اگه اندازه ۵ دقیقه حوصله کنید می‌خوام برای شما از یک لحظه بگم. لحظه‌ای که اولین جرقه‌ی همه دردسرهای بعدی رو می‌زنه. لحظه‌ای که مثل تیغی در گلو هم دردآوره و هم اجازه نمی‌ده غذا بخوری. که اگه فکری به حالش نکنی، باعث می‌شه سوتغذیه نحیفت کنه یا حتی بکشتت. (قبلش ویدیوی این پست رو ببینید) 🔖 پرده اول: کودکی گریه می‌کنه. شاید از گشنگی کلافه شده، شاید از تنهایی ترسیده. شاید پوشکش اذیتش می‌کنه. شاید پرخاش مراقبینش به همدیگه رو دیده. دستانش رو در هوا تکون می‌ده و رد چشمانش به دنبال چهره گرم مامان یا دست حمایتگر بابا می‌گرده. مامان درد مزمنی پیدا کرده. شاید کمرش درد می‌کنه. شاید چند وقتیه درگیر ترفیع شغلی باباست چون بابا پروژه جدیدی گرفته و چند وقتیه دیر وقت به خونه میاد و در دسترس نیست. مامان شاید بعد از زایمان، افسردگی گرفته. شاید مشکل مالی‌ای پیش اومده و بابای تحت فشار، مامان رو هم مضطرب و نگران کرده. شاید مامان و بابا به این‌جای زندگی فکر نکرده بودن و حالا چکه‌های گاه و بی‌گاه سقف رابطه‌شون تبدیل به نم‌گرفتگی همیشگی و پوسیدگی رنگ و گچ شده. هر چه که هست چشم‌های کودک می‌گرده و خط نگاهش به چهره در هم کشیده‌ای می‌خوره. به چشمانی کم‌فروغ. به صورتی عصبانی. به لب‌هایی که گوشه‌هاش پایین افتاده. به ابروهای درهم‌کشیده‌ای که نشانی از محبت در اون‌ها نیست. شاید چشم‌‌های کودک می‌گرده و می‌گرده اما نگاهی پیدا نمی‌کنه. و این نه ماجرای امشب و هفته پیش و ماه گذشته، بلکه پاسخیه که - شاید همیشه، شاید گاه‌به‌گاه - اما مستمر و پیوسته دریافت می‌کنه: ⚡️لحظه‌ای که چشم‌ها به جست‌وجوی چشمه خنک و زلال توجه و محبت رفتن اما تشنه، با مشک خالی و با مُشتی خاک در کام برگشتن. 🔖 پرده دوم: کودک بزرگ‌تر می‌شه. به هر حال شیرین و بامزه‌اس (مگر این که خیلی بدشانس باشه که حتی بامزه و لپ‌دار هم نباشه). اون‌طور که هر کودک ۳-۴ ساله‌ای به توجه و دیده شدن نیاز داره، او هم به دنبال نیازش می‌گرده. مثل ریشه‌ای در خاک به دنبال آب، مثل گرسنه‌ای به دنبال غذا. شاید اگه بچه گربه وحشی رو در جنگل یا صحرا پیدا کنید و نون خشکی جلوش بندازید، حتی بوش هم نکنه. اما گربه‌ی توی کوچه - البته نه کوچه‌های حالا که پر از غذای خشک خارجیه - با دنده‌هایی که از زیر پوستش کمی معلومه و تن نحیفش، همون نون خشک رو هم به دندون می‌کشه و با میو کردن ضعیفی سعی می‌کنه شما رو راضی کنه تا سوسیس وسط نون که بوش بهش خورده رو هم بهش بدید. هر چه که هست، کودک به روشی که نمی‌دونه از کجا میاد ولی براش کار می‌کنه، توجه رو می‌گیره و سیراب می‌شه. شاید چون مودبه، شاید چون همیشه موهاش آب و شونه شده‌اس، شاید چون بلده دست به کنترل تلویزیون نزنه. شاید چون وقتی عصبانیه می‌گه چشم و گریه نمی‌کنه، شاید چون بلده شعری که بچه‌های ۷-۸ ساله با مشکل می‌خونن رو از حفظ بخونه. شاید چون بلده باز هم به چشمان بی‌فروغ و صورت در هم‌کشیده یا لب‌هایی که نمی‌جنبه و شاید حتی چشمی که نیست، نگاه کنه بی آن که خم به ابرو بیاره. در عوض کاری کنه که اون چشم‌ها اندکی برق بزنن و لب‌ها کمی بخندن. ⚡️بالاخره راه‌حل کنار اومدن با اون لحظه پیدا می‌شه. 🔖 پرده سوم: نوجوون ۱۳ ساله در اتاقش نشسته و با خودش فکر می‌کنه - یا شاید حتی فکر نمی‌کنه و بعداً متوجه جریان ناخودآگاه فکرش می‌شه - و می‌گه: «دیدی چه بیابان وحشتی بود؟ دیدی که چه گرسنه و تشنه بودیم؟ اما ما موفق شدیم. نه! یه ذره دیگه تا موفقیت مونده... ولی دیدی چیزی رو ساختیم که دیگه همه چشم‌ها با ذوق و همه لب‌ها با خنده باهاش روبرو می‌شن؟ می‌دونم... همه‌ی همه که نیست. کلی چهره هست که تا حالا ندیدیم. این صورتایی که هر روز می‌بینیم هم به نظر می‌رسه هنوز هم بعضی وقت‌‌ها در‌هم‌کشیده و کم‌فروغه. آخ! دیدی پریروز دو تاشون بهمون لبخند نزدن؟ خیلی تلخ بود. ولی جای نگرانی نیست. چون این چیزی که داریم می‌سازیم یکم دیگه، اگه فقط یکم دیگه روش کار کنیم دیگه به همه چشم‌ها و لب‌ها ذوق و خنده میاره» 🔖 از پرده سوم به بعد، برنامه‌ریزی پیش‌فرض مشخصه: یکم دیگه روی اون چیزی که داریم می‌سازیم کار کنیم تا دیگه همه بپسندنش. تا دیگه از اون جست‌وجو با کام تشنه و پرخاک و مشک خالی برنگردیم. تا دیگه اون لحظه ⚡️ تکرار نشه. اما کیه که ندونه دنیا کارش ناکام کردنه؟ کیه که ندونه آدم‌ها اصلاً به مشک ما نگاه نمی‌کنن که بخوان پرش کنن؟ این رو من و شما می‌دونیم، اما گربه‌ای که با نون خشک سیر شده نمی‌دونه. ریشه‌ای که جون کنده تا خودش رو به آب برسونه نمی‌دونه. و این همون تیغ در گلوست. هر ارتباط جدید با برنامه‌ریزی پیش‌فرض تکرار نشدن اون لحظه آغاز می‌شه و بعد از اندکی - اگه ادامه‌دار بشه - به گروگان گرفته می‌شه تا هیچ وقت باعث رخ دادن دوباره اون لحظه ⚡️ نشه. به هر حال اون لحظه خیلی خیلی دردناکه و ما هم این همه سال زحمت کشیدیم تا این محصول همه‌پسند رو بسازیم. حالا درسته کماکان یکی دو تا جاش گیر و گور داره. اما تیم توسعه قول داده با فیدبک‌های جدید حتماً محصول نهایی رو تا چند ماه دیگه آماده کنه. چیزی که مهمه اینه که تیغ رو دست نزنیم. چون دست زدن بهش درد داره. اما خب این شکم گرسنه نیاز به غذا داره. با هر لقمه هم تیغْ گلو رو خراش می‌ده و درد داره و غذا بهش می‌چسبه. درسته که یکمی درد داره. اما محصول ما قراره درد تیغ رو در نسخه نهایی کاملاً رفع کنه. از طرفی اگه تیغ رو دربیاریم ممکنه گلومون بچسبه بهم و دیگه نتونیم غذا بخوریم. حتی تیم توسعه گفته شاید کل دستگاه گوارش رو از کار بندازه. ما که نمی‌دونیم چی می‌شه. بعد خب معده و روده رو هم نمی‌شناسیم که بخوایم بهشون رسیدگی کنیم. فقط تیغ و گلو رو می‌شناسیم و غذا. ولی این درد گلو باعث می‌شه نه درست طعم غذا رو بفهمیم، نه درست بجویم و قورتش بدیم. بقیه هم تا کی تحمل آخ و اوخ و غذا خوردن خاص ما رو بکنن؟ خسته می‌شن دیگه... البته ما هم می‌تونیم سریع‌تر از سر سفره پاشیم تا کسی متوجه تیغ در گلو و رژیم خاصمون نشه. رژیم غذاییمون هم به خاطر عفونت و زخم‌های مکرر محدود و محدودتر می‌شه. ♻️ و زندگی همین‌طور پیش می‌ره... اگه خوش‌شانس باشیم، با یکی هم‌سفره می‌شیم که بالاخره یه فیدبکی به این محصول و این حقیقت که هنوز بعد از این همه سال تحقیق و توسعه نتونسته مشکل تیغ در گلو رو حل کنه، بده. و سوالی که بعد از اون هر بار تکرار می‌شه و باید بهش جواب بدیم، اینه: آیا جرئت مواجه شدن با اون لحظه⚡️ و در آوردن تیغ و درد و مراقبت‌های بعدش رو داریم... یا به کار روی محصول ادامه می‌دیم؟

Mehdi Jahani

17,740 次观看 • 8 个月前

شرم بر Object oriented programming! خیلی درباره‌ی بازدهی در برنامه‌نویسی صحبت می‌شه و همیشه درباره‌ی الگوریتم سریعتر یا ساختمان‌داده‌ی مناسب بحث می‌شه. اما نی‌خوام درباره‌ی یه مساله‌ای که کمتر دیدم صحبت بشه موضوعی رو باز کنم. اون هم استفاده از ویژگی‌های cpuهای مدرن مثل prefetching یا SIMD ـه! قبل از همه چیز باید بدونیم پردازش مربوط به خوندن و نوشتن اطلاعات از روی RAM و اعمال دستورات روی CPU مربوط می‌شه. اما سرعت پیشرفت و بازدهی CPUها خیلی بیشتر از RAM بوده. این عکس فاصله‌ی بازدهی پردازنده‌ها رو با رم نشون می‌ده. یعنی اگر درست کد نزنیم پردازنده زمان زیادی رو منتظر اطلاعات می‌مونه تا بتونه کارش رو ادامه بده. در این بین خیلی از ویژگی‌ها مثل سطوح مختلف Caching در پردازنده‌ها ایجاد شده مثل L1, L2, L3 و احتمالاً موقع خرید CPU بهش برخورد کردید. کاری که این Caching انجام میده خوندن اطلاعات از رم و آماده نگه داشتن اونا وقتیه که CPU در حال محاسبه ست. (به صورت فیزیکی واقعاً نزدیکتر می‌شه) از سمت دیگه چندین هسته‌ی CPU و thread استفاده می‌کنیم تا به صورت موازی پردازش‌ها رو انجام بدیم. اما هرکسی تا حالا کد برای سیستم موازی زده باشه می‌دونه اصلاً راحت نیست و الزاماً استفاده از دو خط موازی به معنی دوبرابر شدن سرعت نیست! بسته به سناریویی که قرار داریم ممکنه ۳۰ تا ۵۰ درصد افزایش سرعت داشته باشیم (بله سرعت دو برابر هم می‌رسیم مگر هیچ sync point ایی لازم نباشه اما خیلی محدوده!) اما در پردازنده‌های مدرن پردازش موازی به هسته یا thread محدود نمی‌شه. بلکه قابلیت SIMD وجود داره که کارش انجام یک عمل ریاضی روی چندین داده به صورت همزمانه. Single Instruction Multiple Data. همین‌طور CPUهای امروزی قابلیت خاصی برای پیش‌بینی شاخه در دستوراتی که اجر میشن دارند. به این صورت که وقت شما از if استفاده می‌کنید. CPU هر دو حالت true و false رو محاسبه می‌کنه و هر وقت شرط مشخص شد جواب شاخه‌ی درست رو بر می‌گردونه! حالا این قضیه در خودش یه سری روش اجرای کد و مشکل امنیتی هم داشته که مورد بحث ما نیست. حالا اگر طوری کد بنویسیم که CPU لازم نباشه مداوم branch بررسی کنه باعث افزایش سرعت پایپلاین‌های پردازشی می‌شیم. (جزییات بیشترش رو در uOps باید صحبت کنیم). حالا اگر تمام موارد بالا رو در نظر بگیریم و می‌تونیم بهینه‌ترین حالت ممکن کد بزنیم. فکر می‌کنید این افزایش سرعت تا چه حده؟ بستگی به سناریوی مساله می‌تونه بین ۱۰ تا ۱۰۰ برابر (حتی بیشتر) سریعتر باشه! اصلاً شوخی نمی‌کنم. اول مقاله نوشتم شرم بر object-oriented programming. این رو برای جلب توجه ننوشتم. در حقیقت این پارادایم برنامه‌نویسی حدود سال‌های ۸۰ میلادی محبوب شد و هنوز ادامه داره اما با پیشرفت تکنولوژی شاهد تغییر پارادایم نبودیم. در ابتدا که فاصله‌ی سرعت CPU و RAM به هم نزدیک بود تفاوت چندانی نمی‌دیدیم و همه چیز با OOP اکی بود. اما به مرور زمان که سخت‌افزار به روز شد نرم‌افزار وابسته به تفکر قدیمی باقی موند. مثلاً در OOP ما یه سری کلاس می‌سازیم و اونا رو encapsulate می‌کنیم و از اونا شی می‌سازیم و روشون پردازش انجام می‌دیم. یه چیزی مثل: struct particle { float x, y; float vx, vy; particle(const float x, const float y, const float vx, const float vy) : x(x), y(y), vx(vx), vy(vy) { } virtual ~particle() = default; virtual void update(const float delta_time) =0; }; یه کلاس خیلی ساده ذرات - particle که مختصات محیط دو بعدی x و y داره و به همین منوال سرعت در اون جهت. یه تابع virtual هم داره برای بقیه که ارث ببرند و ویژگی‌های متفاوت اضافه کنند. تو particle system یا سیستم ذارت که برای جلوه‌های ویژه VFX مثل دود، غبار، آب و غیره استفاده می‌شه ممکنه تا چندین میلیون ذره پردازش بشن (فیلم مومیایی رو یادتونه؟ آفرین همون شن‌ها) حالا من از اون کلاس ارث بردم و این تابع خیلی ساده رو پیاده کردم که فقط در هر فریم سرعت ذره رو حساب می‌کنه: void update(const float delta_time) override { volatile float x = this->x; volatile float y = this->y; x += vx * delta_time; y += vy * delta_time; this->x = x; this->y = y; } این که چرا volatile استفاده کردم به خاطر اینه که این مثال خیلی ساده ست و کامپایلر این تابع رو بهینه می‌کنه در اصل کاری که می‌کنه اجازه‌ی ساختن virtual table رو نمی‌ده و تابع بقیه جاها inline می‌شه. اما تو پروژه‌ی بزرگ با چند لایه ارث‌بری همیشه بهره بردن از بهینه‌سازی کامپایلر ممکن نیست. حالا جلوتر این رو هم بر می‌دارم که دعوایی نباشه. بعد هم کلاس particle system رو داریم که خیلی ساده هر ذره رو آپدیت می‌کنه. فقط توجه داشته باشید هر ذره به صورت یک شی در حافظه new می‌شه. حالا اگر ۱۰۰ میلیون پارتیکل رو یک بار آپدیت کنم حدود ۶۵۳ میلی‌ثانیه طول می‌کشه. بد نیست ها؟ افتضاحه! تو بازی ویدیویی که ۶۰ فریم بر ثانیه اجرا می‌شه ما ۱۶ میلی ثانیه وقت داریم تا چند میلیارد محاصبه رو انجام بدیم. (بدون volatile حدود ۵۳۰ میلی‌ثانیه) برای افزایش باذهی من یه کار خیلی ساده می‌کنم به جای این که تمام این ذرات رو new کنم که باعث می‌شه هر کدوم یه جای RAM به صورت تصادفی پخش بشن اونا رو پشت‌سر هم در یک آرایه قرار می‌دم. یعنی تمام آدرس اونا پشت‌سر هم قرار می‌گیره. فقط همین تغییر باعث می‌شه همین تعداد ۱۱۵ میلی‌ثانیه زمان ببره. حدود ۵ برابر سریعتر! همین تغییر کوچیک! چرا چون زمان پیدا کردن هر آبجکت به صورت پراکنده تبدیل شده به آدرس‌های پشت‌سر هم و CPU سریعتر می‌تونه اطلاعات رو بخونه! به این شکل: struct particles_chunk { std::vector > x; std::vector > y; std::vector > vx; std::vector > vy; } حالا در مرحله‌ی بعدی همون کد ساده رو با دستورات SIMD می‌نویسم. نتیجه‌ می‌شه ۱۱۸ میلی ثانیه: void update_simd(const float delta_time) { const size_t num_particles = particles_.x.size(); const size_t simd_end = num_particles - (num_particles % 8); const __m256 dt_v = _mm256_set1_ps(delta_time); for (size_t i = 0; i (1, std::thread::hardware_concurrency()); const size_t base_chunk_size = num_particles / num_threads; const size_t aligned_chunk_size = ((base_chunk_size + 7) / 8) * 8; std::vector threads; threads.reserve(num_threads); for (size_t t = 0; t (&particles_.x[i + prefetch_distance]), _MM_HINT_T0); _mm_prefetch(reinterpret_cast (&particles_.vx[i + prefetch_distance]), _MM_HINT_T0); _mm_prefetch(reinterpret_cast (&particles_.y[i + prefetch_distance]), _MM_HINT_T0); _mm_prefetch(reinterpret_cast (&particles_.vy[i + prefetch_distance]), _MM_HINT_T0); } _mm256_store_ps(&particles_.x[i], _mm256_fmadd_ps(_mm256_load_ps(&particles_.vx[i]), dt_v, _mm256_load_ps(&particles_.x[i]))); _mm256_store_ps(&particles_.y[i], _mm256_fmadd_ps(_mm256_load_ps(&particles_.vy[i]), dt_v, _mm256_load_ps(&particles_.y[i]))); } تا اینجا من هیچ کار عجیب و غریبی نکردم. حافظه مرتب، پشت‌سر هم و با استفاده از SIMD کد نوشتم. نه ساختمان‌داده مطرحه و نه الگوریتم و بیشتر از ۶ برابر افزایش سرعت رسیدیم! مثال بعدی که branch prediction باشه رو آخر تست یادم اومد و نشد با بقیه مقایسه کنم. اما به هر حال. فقط این مثال ساده رو ببینید: for (size_t i = 0; i < num_particles; ++i) { if (particles_.is_active[i]) { particles_.x[i] += particles_.vx[i] * delta_time; particles_.y[i] += particles_.vy[i] * delta_time; } } کاری که می‌کنیم با if چک کنیم اگر ذره فعاله سرعتش رو حساب کنیم اگر نیست هیچی. این مثال ساده حدود ۱۴۱ میلی ثانیه طول می‌کشه. اگر اون if رو حذف کنم و بیام به جاش در محاسبه غیرفعال بودن رو صفر در نظر بگیرم و جلوی branching رو بگیرم: void update_branchless(const float delta_time) { const size_t num_particles = particles_.x.size(); for (size_t i = 0; i < num_particles; ++i) { particles_.x[i] += particles_.vx[i] * delta_time * particles_.is_active[i]; particles_.y[i] += particles_.vy[i] * delta_time * particles_.is_active[i]; } } با این روش ۱۱۹ میلی ثانیه طول می‌کشه تا کدم اجرا بشه. یعنی با وجود if تقریباُ کد ما ۸۰ درصد اجرا می‌شه. این در شرایطیه که فعال بودن ذرات تصادفیه و cpu نمی‌تونه branch perdiction درستی داشته باشه. برای همین کند می‌شه. حالا شاید بگید که تو گفتی چند میلیون محاسبه زیر ۱۶ میلی‌ثانیه. بله درسته. من اینجا از دو thread استفاده کردم. فقط جنبه‌ی نمایش داشت از warmup و اینا هم اجتناب کردم چون در دنیای واقعی این پردازش‌ها می‌ره روی GPU و Compute shader که معرفی اون خودش یه پست دیگه ست. کدها رو روی CPU قدیمی اجرا کردم: Intel Core i7 6700K @ 4.00GHz Skylake 14nm 16.0GB Dual-Channel DDR4 @ 1069MHz اگر دوست داشتید این محاسبه رو با زبان برنامه‌نویسی مورد علاقه‌تون تست کنید و سعی در بهینه کردنش کنید. در ضمن اگر تمام اینا رو کنار هم بذاریم با یه سری مفاهیم شبیه به همین‌هایی که گفتیم با جزییات بیشتر می‌شه Data oriented programming که در زبان‌های مختلف مثل خانواده‌ی C، Rust، Zig و غیره براشون کتابخونه و آموزش موجوده. خلاصه بازدهی فقط به الگوریتم و ساختمان‌داده محدود نمی‌شه.

Mohamad Iraji

22,055 次观看 • 1 年前