تفاوت r و +r و w و +w در fopen زبان C

تابع fopen در زبان C برای باز کردن فایلهای متنی و باینری کاربرد دارد. این تابع دو پارامتر به شرح زیر می گیرد:

FILE *fopen(const char *filename, const char *mode)

پارامتر اول این تابع، مسیر فایل است و پارامتر دوم آن که محل بحث است نحوه ی باز کردن فایل است. این پارامتر می تواند گزینه های متعددی با ترکیب حروف اختصاری w,r,t,b و + داشته باشد. در این بین معمولا گزینه های +r و +w گیج کننده هستند که در ادامه تفاوت این دو را بیان می کنم:
+r یعنی فایل در مد خواندن باز می شود ولی امکان نوشتن هم دارید! نکته اش این است که اگر فایل از قبل وجود نداشته باشد، فایل ایجاد نخواهد شد.
+w یعنی فایل در مد نوشتن باز می شود ولی امکان خواندن هم دارید. تفاوتش با +r این است که اگر فایل وجود نداشت، فایل را ایجاد خواهد کرد.

گراف زیر تفاوت کامل این مدها را نمایش می دهد:

تفاوت r و r+ و w و w+ در fopen
Share

کاهش حجم ویدیو (برای برنامه شاد)

یکی از مشکلاتی که این روزها معلمها با آن درگیر هستند موضوع ارسال فایل های ویدیویی در برنامه شاد است. حجم فایل های ویدیویی که نوعا توسط دوربین های گوشی تهیه می شود خیلی زیاد بوده و معمولاً یک ویدیوی ۵ دقیقه ای حجمی حدود ۱۵۰ مگابایت یا بیشتر تولید می کند. حجم این ویدیوها که باید در شبکه شاد آپلود شوند، یک چالش بزرگ است که اکثر معلمها و البته دانش آموزان با آن درگیر هستند. در نظر بگیرید اگر معلمی روزانه تنها ۶۰ دقیقه ویدیو تهیه کند بیش از ۱.۵ گیگابایت باید آپلود کند! خود نرم افزار شاد (که خیلی شبیه روییکا است!) در واقع باید این قابلیت را داشته باشد و البته یک چیزهایی هم دارد ولی خیلی بد عمل می کند.

چون فرزند خودم هم درگیر این مشکل بود و بخش عمده ای از زمانش صرف دانلود این ویدیوها می شد تصمیم گرفتم یک ویدیوی کوتاه برای کاهش حجم ویدیو تهیه کنم و برای معلمش بفرستم. گفتم شاید به درد سایر معلمان کشورم هم بخورد. لذا ویدیو را در اینجا هم به اشتراک می گذارم.

نرم افزارهای متعددی برای کاهش حجم ویدیو وجود دارد. یکی از ساده ترین و کاربردی ترین نرم افزارها برای اندروید نرم افزار Video Transcoder است. در این نرم افزار با انجام تنظیمات ساده ای مثل تنظیم نرخ فریم، تنظیم کیفیت تصویر و صدا، می توانید حجم ویدیو را تا یک ششم یا بیشتر کاهش دهید.

برای نمایش ویدیوی کاهش حجم ویدیو در آپارات روی لینک زیر کلیک کنید:
کاهش حجم فیلم اندروید

Share

ریست شدن مداوم کامپیوتر محاسباتی (راه حل)

اواسط اسفند بود که یک کامپیوتر محاسباتی برای شرکت شهاب خریدم. مهمترین مشخصه این کامپیوتر، کارت گرافیک MSI GeForce RTX 2080 Gaming Trio بود که با داشتن ۲۹۴۴ هسته پردازشی برای کاربردهای یادگیری عمیق و آموزش شبکه های کانولوشنی خیلی مناسب بود. در کنار آن ۳۲ گیگابایت حافظه ی RAM با فرکانس ۳۲۰۰ مگاهرتز و پردازنده Core i7 9700K که تا فرکانس ۴۹۰۰مگاهرتز را پشتیبانی می کند، نیازمندیهای محاسباتی ما را تامین می کردند. دو هارد SSD و یک هارد HDD هم کار ذخیره سازی اطلاعات و داده ها را بر عهده داشتند.

کامپیوتر محاسباتی با گرافیک RTX 2080

مشکل ریست شدن مداوم هنگام استفاده از کارت گرافیک ۲۰۸۰

یکی دو روز اول که مشغول نصب ویندوز و برنامه های مورد نیاز بودم و سیستم به خوبی کار می کرد تا اینکه خواستم اولین شبکه عمیق را آموزش دهم. بعد از مدت کوتاهی سیستم بازنشانی (ریستارت یا ریست!) شد. گفتم ان شاءالله گربه بوده! دوباره آموزش را با پایتون روی GPUی گران قیمت سیستم با حدود ۳۰۰۰ هسته ی کودا (CUDA Core) شروع کردم و باز بعد از مدتی سیستم خاموش شد. این کار بارها تکرار شد. با شرکت فروشنده سیستم تماس گرفتم و گفتم چنین مشکلی دارم، و آنها که بیش از یک هفته سیستم را برای تست نگه داشته بودند و ۵۰۰ هزار تومان هزینه تست پایداری سیستم گرفته بودند گفتند درایورت را عوض کن و درایور قدیمی تر نصب کن. ما اینجا کلی تست گرفتیم مشکلی نداشته! الحمدلله مسئول پشتیبانی شرکت، خوش برخورد بود ولی فرایند دو هفته ای فروش و دردسرهای پس از فروش واقعا خسته کننده بود و بعید است دوباره از این شرکت خرید کنم. به هر حال مشکل اساسی تر از این حرفها بود و به نظر می رسید در تستهایی که گرفته اند GPU زیر بار ۱۰۰% نرفته چرا که با اجرای یک benchmark کوچک که گرافیک را برای لحظاتی زیر بار سنگین می برد، باز هم سیستم خاموش می شد.

بگذریم. بعد از مدتی تماس و پاسخ، متوجه شدم که به آنها امیدی نیست. لذا تستهای متعددی را شروع کردم که از نیمه اسفند ۹۸ تا ۳۰ فروردین ۹۹ (به طور گسسته) طول کشید. البته بخشی از این زمان را به دلیل شیوع کرونا، دسترسی مستقیم به کامپیوتر نداشتم و از راه دور با ریموت دسکتاپ تست می گرفتم. اما بالاخره ریشه مشکل پیدا شد و الان بیش از ۳۶ ساعت است که کامیپوتر زیر بیشترین بار محاسباتی (CPU و GPU نزدیک ۱۰۰%، حافظه گرافیک حدود ۹۰% و حافظه ی رم حدود ۷۰%) و در حالت OverClock گرافیک و CPU و RAM، خاموش نشده است. لذا حیفم آمد تجربیاتی که کسب شد را به اشتراک نگذارم:

۱. اولین کار این بود که ببینم منشاء مشکل از کجاست. و البته چون فقط زمانی خاموش می شد که از کارت گرافیک کار زیادی می کشیدم حدسم این بود که مشکل از کارت گرافیک است. این کار را با تحت فشار گذاشتن پردازنده و حافظه رم در حالیکه گرافیک بیکار بود تست کردم و تقریبا مطمئن شدم که مشکل از کارت گرافیک است.

۲. دومین کار این بود که درایور کارت گرافیک را عوض کنم. چندین نسخه را تست کردم (از نسخه ۳۹۱.۳۵ تا آخرین نسخه که ۴۴۵.۸۷ بود). برخی نسخه ها مثل ۴۱۸.۹۱ و ۴۲۵.۳۱ پایداری بیشتری داشتند طوری که مثلا نسخه ۴۱۸ یک بار نزدیک ۲۴ ساعت (در مد Silent که کمترین فشار روی پردازنده ها هست) کار کرد ولی متاسفانه بعد از آن دوباره ریست شدن ها شروع شد.

۳. سومین حدس من این بود که شاید مشکل از سیستم عامل باشد، لذا در کنار سیستم عامل فعلی که ویندوز سرور ۲۰۱۹ بود، یک ویندوز ۱۰ ۶۴ بیتی هم نصب کردم و تستها را روی آن شروع کردم. تقریبا هیچ تفاوتی حاصل نشد و همان اتفاقات تکرار شد.

۴. چهارمین حدسم این بود که مشکل از محافظ ولتاژ باشد. چرا که همه ی کابلهای کیس و مانیتور به یک محافظ ولتاژ وصل بودند که سیم اصلی آن نازک بود و حدسم این بود که نمی تواند جریان کافی را تامین کند لذا کامپیوتر بدون اینکه بتواند هیچ چیزی را لاگ کند خاموش می شود. لاگ ویندوز را با Event Viewer می شود دید و هر بار هم که کامپیوتر خاموش می شد سراغ رویدادهای ویندوز می رفتم و تنها پیام این بود که ویندوز به طور غیرمعمول خاموش شده است! که عمدتا این پیام ناشی از مشکلات تغذیه کامپیوتر است یا اینکه کسی دکمه ریست را زده باشد. اما این حدس هم اشتباه بود. با تعویض کابل تغذیه کیس باز هم مشکلات برقرار بود.

۵. حدس پنجم این بود که مشکل از نوسان ولتاژ برق باشد. چون جایی که بنده کار می کنم سابقه نوسانات شدید تا ۲۷۰ ولت و بیشتر را داشته و الان هم در شرایط عادی ولتاژ آن به جای ۲۲۰، حدود ۲۳۵ ولت است. لذا کلا کیس را به منزل منتقل کردم. این بار هم نزدیک به ۲۴ ساعت کامپیوتر در شرایط Silent کار کرد ولی صبح روز بعد، باز دیدم که سیستم ریست شده است.

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

۷. همچنان روی مشکلات جریان متمرکز بودم که به این نتیجه رسیدم کلا آورکلاک گرافیک را غیرفعال کنم (ضمن اینکه چند روزی بود که کلا آورکلاک پردازنده و رم را از طریق بایاس غیرفعال کرده بودم.) لذا با کمک نرم افزار MSI Afterburner فرکانس پردازنده گرافیکی و حافظه ی گرافیک را ۵۰۰ هرتز کمتر از مقدار استاندارد کردم (یعنی نه تنها آورکلاک را غیرفعال کردم بلکه کاهش دادم!). با این کار پایداری سیستم خیلی افزایش یافت و به راحتی تا حدود ۲۰ ساعت کار می کرد ولی باز هم بالاخره خاموش می شد در حالیکه برای کار ما گاهی باید هفته ها روشن بماند. ضمن اینکه نمی خواهیم از مزایای آورکلاک سیستم محروم شویم!

غیر از موارد فوق تستهای دیگری هم گرفتم مثلا چون حافظه های رم از دو شرکت متفاوت بودند دو ماژول متمایز را برداشتم که شاید به دلیل ناسازگاری با یکدیگر، سیستم را دچار مشکل می کنند ولی ربطی به این موضوع هم نداشت. و اما راه حل:

راه حل جلوگیری از ریست شدن مداوم ویندوز در اثر فشار روی کارت گرافیک

ضرورت اتصال دو کابل مستقل به کارت گرافیک RTX 2080

یک راه حلی در یکی از جستجوهای انگلیسی همان اوایل کار به آن رسیدم ولی خیلی جدی نگرفته بودم (و کاش جدی می گرفتم!) این بود که برای اینکه کارت گرافیک تحت فشار زیاد به مشکل نخورد باید دو کابل مستقل VGA از منبع تغذیه به سوکتهای کارت گرافیک وصل کنیم و از اتصال یک کابل دو شاخه، پرهیز کنیم! این راه حل، جواب مشکل من بود که خدا همان اوایل در نتایج جستجوها به من نشان داد ولی من به آن توجهی نکردم (چون دردسر داشت و باید کیس و پاور را باز می کردم و یک کابل مجزا تهیه می کردم و …) بالاخره وقتی دیدم هیچ راهی جواب نداد و از طرفی هم مطمئن شده بودم که مشکل به جریان کِشی برمی گردد، گفتم این راه را تست کنم. لذا یک کابل دیگر تهیه کردم و آن را به طور مستقیم به سوکت ۸ تایی دوم گرافیک وصل کردم (شکل بالا). وقتی یک کابل را دو شاخه می کنیم و به دو سوکت گرافیک وصل می کنیم، کابلها توان جریان دهی کافی ندارند ولی وقتی دو کابل مجزا از منبع تغذیه به دو سوکت گرافیک وصل می کنیم، جریان کافی تامین می شود.

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

Share

راه حل خطای Failed to find Build Tools revision 27.0.3 در اندروید استودیو

اندروید استودیو هر بار که به روزرسانی می شود، مشکل جدیدی برای توسعه دهندگان، مخصوصا برنامه نویسان ایرانی به وجود می آورد. نسخه ۳ اندروید استودیو، در کنار مشکلات فراوانی که بابت عدم اتصال به سرور حتی با قند شکن! ایجاد کرده است، یک خطای روی اعصابی دارد که خیلیها در سراسر دنیا گرفتار آن شده اند. خطا این است:

Failed to find Build Tools revision 27.0.3

Install Build Tools 27.0.3 and sync project

برای رفع مشکل، پیشنهاد خود اندروید استودیو و خیلی از فرومها این است که نسخه ابزار-کامپایل ۲۷٫۰٫۳ را دانلود کرده و در پوشه مناسب (که نوعا در مسیر C:\Users\Hossein\AppData\Local\Android\sdk\build-tools است) Extract کنید. اما معمولا شما یک نسخه دیگر از build tools را دارید و کارتان را هم راه می اندازد! مثلا من نسخه ۲۶٫۰٫۲ و ۲۸٫۰٫۱ را دارم، دلیلی برای دانلود ندارم!

در این حالت برای رفع مشکل به صورت زیر عمل کنید:

راه حل خطای build tools revision

فایل build.gradle (از ماژول app) را باز کنید و عبارت زیر را در بخش android اضافه کنید یا اگر هست، نسخه آن را اصلاح کنید:

android {
buildToolsVersion “28.0.1”
}

دقت کنید که به جای ۲۸٫۰٫۱ همان نسخه ای را باید بگذارید که موجود دارید. و نکته دیگری اینکه عبارتهای compileSdkVersion، targetSdkVersion و minSdkVersion هم حتما باید کمتر مساوی نسخه build-tools باشند (اینها در همین گردل هستند و ممکن است در جاهای دیگر هم باشند که باید جستجو و جایگزین کنید). مثلا در حالت فوق که من نسخه ۲۸٫۰٫۱ را استفاده می کنم، حداکثر ورژنی که می توانم برای این سه دسته انتخاب کنم، ۲۸ است که البته معقول نیست چون خیلی از موبایلها هنوز با APIهای خیلی قدیمی تر مثل ۲۰ دارند کار می کنند لذا minSdkVersion را روی عددی مثل ۲۰ یا کمتر بگذارید.

Share

سی پلاس پلاس ++C یا پایتون Python

مقایسه ++C و پایتون

داشتم پروژه های نمونه Opnecv (شامل image stitching و image stitching detailed) برای تولید تصاویر پانوراما را تحلیل می کردم که به عنوان مثال درس بینایی ماشین در کلاس توضیح دهم. برای درک بیشتر، به دنبال مثالهایی با توضیحات کاملتر در وب بودم که در حین جستجو به پروژه ای رسیدم که با پایتون نوشته شده بود و خیلی خوب تمام بخشهایش توضیح داده شده بود. این شد که پایتون را به ویژوال استودیو اضافه کرده و پروژه مذکور را را کامپایل و اجرا کردم. دیدم با وجود اینکه این برنامه از نسخه باینری کتابخانه OpenCV استفاده می کند، زمان اجرا خیلی کند است. بررسی کردم دیدم مشکل سر یک تابعی هست که دو حلقه for تو در تو دارد. برای مقایسه با ++C تصمیم گرفتم کد را به ++C بنویسم و این شد که پایتون را یاد گرفتم و طی چند ساعتی، کد را به ++C تبدیل کردم.

مقایسه زمان اجرای برنامه در پایتون و ++C

نتیجه مقایسه جالب بود. غیر از حلقه for بقیه بخشها از نظر زمانی تقریبا یکسان بود چرا که هر دو از کتابخانه OpenCV استفاده می کردند که اصالتا کد ++C است. اما در حلقه for کد ++C نزدیک به ۱۰ برابر سریعتر از پایتون اجرا می شود. زمانها را ببینید:
مقایسه سی پلاس پلاس و پایتون

​زمان اجرای کد سی پلاس پلاس ۱٫۲۵ ثانیه و زمان اجرای کد پایتون ۱۰٫۴۷ ثانیه بود.
از این زمانها در پایتون حدود ۱٫۵ ثانیه مربوط به توابع داخلی OpenCV بوده و ۹ ثانیه مربوط به حلقه for تو در تو است که روی کل تصویر جاروب می شود.

در C++ کل زمان تقریبا مربوط به توابع داخلی OpenCV بوده و حلقه for تودرتو تنها ۰٫۰۰۲ ثانیه زمان برد.

لذا در کل برنامه، ++C حدود ۱۰ برابر سریعتر بوده و در حلقه for تفاوت سرعت وحشتناک است: ۹ ثانیه به ۰٫۰۰۲ ثانیه می شود ۴۵۰۰ برابر سرعت بهتر ++C نسبت به زبان اسکریپتی پایتون.

نتیجه مقایسه ++C و پایتون

پایتون بسیار ساده تر از ++C است. لذا اگر برنامه نویس حرفه ای ++C هستید در کمتر از یک روز پایتون را یاد می گیرید. سرعت کد نویسی پایتون به دلیل برخورداری از امکانات فراوان، که الان جای بحثش نیست، زیاد است. اما دو مشکل دارد: یکی اسکریپتی بودن و اجرای خط به خط که همیشه نیازمند این هستید که پایتون (همان ورژنی که شما استفاده کرده اید) در کامپیوتر مقصد نصب باشد. دوم سرعت کم در حلقه ها و دستورات شرطی.

لذا برای کاربردهایی که پردازشهای سنگین و حلقه های زیاد ندارید استفاده از پایتون خوب است. برای کارهای پردازشی یا باید سراغ ++C بروید یا اینکه اگر اصرار به استفاده از پایتون دارید، بخشهای پردازشی کد را حتما از نسخه های باینری کتابخانه های ثالث استفاده کنید.

 

Share