mnr tech – Telegram
mnr tech
108 subscribers
24 photos
4 videos
7 files
53 links
توی این کانال لینک ویدیو های آموزشی کانالم در یوتیوب قرار میگیره.
آدرس سایت : https://mnrtech.ir
همچنین ممکنه نکته های آموزشی برنامه نویسی و شاید اخبار و همچنین معرفی پروژه های خودم هم قرار بگیره.
ارتباط با ما : @mnr73
Download Telegram
چند روز پیش به طور اتفاقی متوجه شدم وقتی توی صفحه مرورگر از تاچ پد لپتاپ برای zoom کردن استفاده میکنم رفتارش با zoom کردن معمولی که با ctrl+scroll wheel موس انجام میدیم متفاوته. یعنی zoop مرورگر افزایش پیدا نمیکنه و خود اون قسمت زوم میشه.

به نظرم قابلیت خوبی اومد سعی کردم راهی پیدا کنم تا همین رفتار رو با موس بشه انجام داد ولی راهی نبود. دست آخر توی اکستنشن ها دنبالش گشتم تا اکستنشن زیر رو پیدا کردم.

به نظرم این قابلیت خیلی مفیده برای وقت هایی که میخوای توی یه سایتی یه چیزی رو بزرگتر ببینی مثلا عکس پروفایل.
یا مثلا اگر برنامه نویس فرانت هستی و میخوای جزئیات بیشتری رو ببینی میتونی از این اکستنشن استفاده کنی.

😜 بعد از نصب باید مرورگر رو از اول باز کنی

https://chromewebstore.google.com/detail/mouse-pinch-to-zoom/pffiadlahfhoniddbipeiiohjnlongfi
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤‍🔥21
mnr tech
اگر شما هم از Docker روی WSL ویندوز استفاده می‌کنید حتما به این مورد بر خوردید که بعضی وقت ها خطا میده که این پورت ها بسته هست Error response from daemon: Ports are not available: exposing port TCP ... ولی شما از اون پورت ها استفاده نمیکنید. برای حل این…
از این روش اگر استفاده کنید داکر درست میشه ولی git push و git pull کار نمیده دیگه. گفتم در جریان باشید تا سر فرصت بررسی کنم ببینم چطور باید این مشکل رو حل کرد.
👍2
📣 اختلال سراسری به دلیل Iran Access

🟡 پذیرندگان گرامی زرین‌پال

به اطلاع می‌رساند با توجه به اعلام شاپرک و نهادهای امنیتی، تا اطلاع بعدی تمام پرداخت‌های حضوری و غیر حضوری شبکه بانکی و مالی کشور، فقط با IP ایران و از داخل کشور قابل دسترس است. در غیر این صورت ممکن است پرداخت‌ها با اختلال همراه باشد.

با تشکر از همراهی و همدلی شما

💛 @zarinpal
🤬1
زرین‎پال | ZarinPal
📣 اختلال سراسری به دلیل Iran Access 🟡 پذیرندگان گرامی زرین‌پال به اطلاع می‌رساند با توجه به اعلام شاپرک و نهادهای امنیتی، تا اطلاع بعدی تمام پرداخت‌های حضوری و غیر حضوری شبکه بانکی و مالی کشور، فقط با IP ایران و از داخل کشور قابل دسترس است. در غیر این صورت…
تمام درگاه ها ایران اکسس شده و اگر هاست یا سروری دارین با ip‌ خارج پرداخت های کاربران به مشکل می‌خوره. امیدوارم این اتفاق موقت باشه و به زودی حل بشه. در غیر این صورت این یک گام بزرگ به سمت محدودیت اینترنت و اینترنت ملی هست.
👍1
پلتفرم پایش و کنترل شیواامواج

نمونه اولیه این پلتفرم در کمتر از یک ما برای دمو در بیست و چهارمین نمایشگاه بین‌المللی تهران آماده شد و در حال حاظر با موفقیت در غرفه شیواامواج در نمایشگاه قرار دارد.
در حال حاظر این پلترفم برای پایش ترانس های برق کاربرد دارد ولی به زودی محصولات دیگری در زیمنه IOT به این سامانه اضافه می‌شود.
برای وبسایت این محصول از vue.js و Laravel و برای ارتباط با دستگاه از پروتکل MQTT استفاده شده که که ارتباط لحظه ای را فراهم می‌کند، همچنین برای بخش سخت افزاری از ماژول Quectel EC200U استفاده شده که برنامه نویسی آن را همکارم به عهده داشت.
خوشحالم که افتخار این رو داشتم و شرکت شیواامواج این فرصت رو بهم داد که در طراحی سیستم و تعریف این پروژه نقش پررنگی داشته باشم و همچنین مواردی مانند طراحی بکند، فرانت سامانه، ui/ux و پیاده سازی زیرساخت‌ها را انجام دهم و همچنین داشتن ارتباط نزدیک با همکارم که بخش الکترونیکی آن را به عهده داشت موجب موفقیت اولیه در این پروژه شد.
البته این فقط نسخه اولیه و شروع کار است و در روزهای پیش رو این پروژه هر روز کامل‌تر می‌شود.

پست در لینکدین
🔥5
اگر از wsl روی ویندوز استفاده می‌کنید حتما شده که فایلی رو از ویندوز به wsl کپی کنید یا انتقال بدید. وقتی این کار رو میکنید یه فایل به همون اسم با پسوند :Zone.Identifier ساخته میشه.

فایل‌های Zone.Identifier فایل‌های متاداده‌ای هستند که توسط ویندوز ایجاد می‌شوند تا اطلاعات مربوط به منطقه امنیتی فایل‌ها (security zone) را ذخیره کنند. این اطلاعات مشخص می‌کنند که یک فایل از چه منبعی آمده است (مثلاً اینترنت، شبکه محلی، یا سیستم محلی) و به ویندوز کمک می‌کنند تصمیم بگیرد که آیا فایل باید با احتیاط بیشتری باز شود یا نه.

آیا حذف این فایل‌ها مشکلی ایجاد می‌کند؟
حذف فایل‌های Zone.Identifier معمولاً مشکلی ایجاد نمی‌کند و باعث نمی‌شود فایل اصلی تحت تأثیر قرار بگیرد، زیرا این فایل‌ها تنها اطلاعات متاداده هستند. با این حال، با حذف آن‌ها ممکن است برخی ویژگی‌های امنیتی ویندوز از کار بیفتند (مثلاً هشدار درباره باز کردن فایل‌های دانلود شده).

نکنه اول اینکه حتما این فایل هارو به .gitignore اضافه کنید تا الکی توی پروژه هاتون پوش نشن.
*.Identifier
// یا این
*:Zone.Identifier


بعد اگر فایل ها رو اعصابتونن و الکی ریپویی که روش کار می‌کنید رو شلوغ کردن دو راه دارین یا برین توی روت پروژه و دستور زیر رو بزنید تا همه فایل ها کلا حذف بشن
find . -type f -name "*:Zone.Identifier" -exec rm -f {} +


یا اینکه ولشون کنین و بذارین به زندگی خودشون ادامه بدن (سازمان حمایت از حقوق فایل های Zone.Identifier 😂) ولی یه کاری کنید که توی vsCode نشون داده نشن برای این کار کافیه کانفیگ زیر رو به فایل setting.json اضافه کنید
"files.exclude": {
"**/*:Zone.Identifier": true
}


محتوای این پست با کمک chat GPT درست شده
👍21
امروز با همکارم احسان توی سمینار 900 نفری Sisoog که در مورد IOT و سیستم های امبدد بود شرکت کردیم و مطالب جالبی یاد گرفتیم.

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

در آخر ممنونم از تیم سیسوگ و دانشگاه صنعتی اصفهان که سمیناری با این تعداد افراد را با مدیریت خوب برگذار کردن و امیدوارد در آینده شاهد برگذاری سمینار های بیشتری در این حوزه در اصفهان باشیم.
5
اگر قرار باشه توی یک پروژه کاربرای بین‌المللی داشته باشیم چطور باید شماره هارو هندل کنیم؟

شاید توی پروژه های بزرگ بین‌المللی براتون سوال بشه که ما چطور میتونیم شماره موبایل ها با کد های کشور های مختلف رو هندل کنیم؟

خوب قسمت راحت کار اینجاست که بگیم کاربر رو مجبور می‌کنیم طبق استاندارد E.164 شماره کامل رو با کد کشور وارد کنه مثلا برای ایران به این صورت
+98901*******

خوب این ساده ترین حالته ولی ux خوبی نداره مخصوصا برای کاربرای ایرانی که معمولا شمارشون رو با 0 وارد میکنن.
پس باید چکار کرد؟ شاید به ذهنتون برسه که یه ولیدیشن ساده مینویسیم و با چند تا شرط هندلش می‌کنیم ولی قراره به چالش های زیادی بخوریم. پس بیاین اول به سوالات زیر جواب بدیم.

آیا کد کشور ها همه تعداد ارقامش یکسانه؟
خیر. مثلا کد ایران 98 و آمریکا 1 هست

آیا طول شماره های موبایل کشور های مختلف بدون کد کشور یکسان هست؟
خیر. طول شماره موبایل در خیلی از کشور ها 10 رقم هست (بدون کد کشور)
ولی استثنا هم داریم برای مثال شماره موبایل توی آلمان میتونه بین 10 تا 13 رقم متغییر باشه.

آیا شماره موبایل همه کشور ها وقتی از کد استفاده نمیکنیم از 0 ابتدای شماره استفاده می‌کنیم؟ و آیا با اضافه کردن کد 0 اول شماره حذف میشه؟
در بیشتر کشور ها شماره های موبایل با صفر شروع میشه و با اضافه شدن کد کشور صفر حذف میشه ولی همیشه اینطوری نیست
ایران:
09123456789 → +989123456789
هند:
09876543210 → +919876543210
آلمان:
015123456789 → +4915123456789
در شماره های بالا دقیقا همینطوره ولی در بعضی موارد مثل موارد زیر اینطوری نیست

استثناها و نکات:
برخی کشورها اصلاً از صفر ابتدایی استفاده نمی‌کنند: مثلاً در ایالات متحده، شماره‌ها مستقیماً با کد منطقه (area code) شروع می‌شوند، و وقتی کد کشور اضافه می‌شود، هیچ تغییری در ساختار داخلی شماره رخ نمی‌دهد:

آمریکا:
1234567890 → +11234567890
صفر ممکن است حفظ شود: در برخی از کشورها، حتی در حالت بین‌المللی، صفر ابتدایی شماره حفظ می‌شود:

ایتالیا: (صفر حفظ می‌شود).
03491234567 → +3903491234567

استاندارد E.164: این استاندارد که در مخابرات جهانی استفاده می‌شود، تأکید می‌کند که شماره‌ها در قالب بین‌المللی باید بدون صفر ابتدایی نوشته شوند، مگر اینکه صفر بخشی از شماره واقعی باشد.

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

ولی نیاز به این کار نیست چون از قبل پکیج هایی برای این کار نوشتن. مثلا libphonenumber برای جاوااسکریپت و پایتون

همچنین این پکیج برای لاراول
https://github.com/Propaganistas/Laravel-Phone

مثلا به کمک این پکیج وقتی کاربر کشورش رو انتخاب میکنه دیگه توی فیلد شماره موبایل فرقی نمیکنه کاربر شماره رو با 0 وارد کنه یا بدون 0 چون به راحتی شما توی بکند میتونید با توجه به کشورش شماره رو به فرمت استاندارد E.164 در بیارین و بعد توی دیتابیس ذخیره کنید.

دقت کنید حتما وقتی همچین پکیج هایی اضافه می‌کنید به پروژتون برای عملکرد مورد انتظارتون چند تا تست بنویسید.
👍4🙏1
This media is not supported in your browser
VIEW IN TELEGRAM
با استفاده از پکیجی که توی پست قبل معرفی کردم ببینید چه ux خوبی میشه پیاده سازی کرد.

من به عنوان کاربر شماره رو با صفر و بدون صفر زدم حتی با 98 و با استفاده از همین پکیج توی بکند راحت تبدیلش میکنم به شماره استاندارد. و لازم نیست به کاربر بگم شماره رو حتما طبق فرمت مورد نظر من وارد کن.

فقط کافیه کد iso کشور و شماره رو داشته باشیم.

حتی خودش ولیدیشن داره و به راحتی با توجه به کشور و شماره اون رو ولیدیت میکنه و اگر مشکلی داشته باشه خطا بر میگردونه.
👍2
آخرین چالشی که داشتم و تونستم با موفقیت انجامش بدم پیاده سازی Single Sign On یا همون SSO بود.

اولین باری که از من خواسته شد این کار رو انجام بدم کمی مخالفت کردم چون هم فکر میکردم کار رو پیچیده کنه و کلی چالش و هزینه اضافه میکنه و هم اینکه ما نهایتا دو سایت داشتیم و نیاز شدیدی به SSO نداشتیم.

اما بعدش بیشتر روی این موضوع فکر کردم و دوست داشتم انجامش بدم، تصور این که یک سرویس SSO مثل Google oAuth پیاده سازی کنم بدجوری من رو هیجان زده کرده بود. همچنین تعداد سایت های شرکت بیشتر شد و توی پلن های آینده قرار بود بیشتر هم بشه. پس کمی در موردش تحقیق کردم و با Chat GPT مشورت کردم و بعدش این رو به عنوان یه طرح دوباره پیشنهاد دادم. وقتی موافقت شد حدود 2 هفته طول کشید که این سرویس جدید با موفقیت دپلوی بشه و در اولین سایت استفاده بشه.

به دلیل این که تا الان فقط از Sanctum توی Laravel استفاده کرده بودم، پیاده سازی یک SSO با پاسپورت کمی برام چالش بر انگیز بود و خوب من عاشق چالش های جدیدم، البته که طبق معمول از chat GPT هم کم کمک نگرفتم.
👍3
در ابتدا docker و docker compose با هم دیگه یکی نبودن به عبارتی دیگه docker-compose به عنوان یک ماژول اضافه تر باید در کنار داکر نصب می‌شد و دستوراتش هم به این شکل بود

docker-compose up


دقت کنید که یه dash (-) وجود داره.

اما بعد چند سال داکر کمپوز به هسته داکر اضافه شد و دستورش هم فرق کرد و اون dash دیگه نیاز نیست. به این شکل

docker compose up


حالا من به یه پروژه ای برخوردم که یک سری اسکریپت توش هست قبل از اجرای اسکریپت میاد چک میکنه آیا فایل اجرایی برای docker-compose توی path وجود داره یه خیر؟ به بیان ساده تر چک میکنه ببینه فایلی به اسم docker-compose در مسیر /usr/local/bin/docker-compose وجود داره یا خیر؟

# Ensure docker-compose exists
if hash docker-compose 2>/dev/null; then

خط کد بالا توی بش این کار رو میکنه. درسته که docker compose الان از دستور قدیمی هم پشتیبانی میکنه ولی این خط کد false میشه چون فایل مورد نظر تو مسیر PATH نیست.

برای حل این مشکل چند راه بود ولی بهترین راهی که میشه انجام داد تا به صورت کامل پشتیبانی بشه توسط همچین اسکریپت هایی این هست 👇🏻

یک فایل به نام docker-compose در یکی از مسیرهای موجود در PATH بسازید:

sudo nano /usr/local/bin/docker-compose


محتوای زیر را در فایل بنویسید:

#!/bin/bash
docker compose "$@"


به فایل اجازه اجرا بدهید:

sudo chmod +x /usr/local/bin/docker-compose


درواقع با این کار یه wrapper برای docker compose ایجاد میکنیم که با دستور docker-compose اجرا میشه.

میشه از روش های دیگه هم استفاده کرد مثلا تعریف alias توی bashrc ولی این کار باز هم این مشکل رو حل نمی‌کنه
یا نصب docker compose v2 plugin با دستور زیر
sudo apt-get update
sudo apt-get install docker-compose-plugin
👍6🔥1
محیط کار دستکتاپ ما یکی از مهمترین چیز هایی هست که ما روزانه باهاشون سر و کار داریم.

همیشه ابزار هایی هستند که کار با دستکتاپ رو برای ما ساده می‌کنن. و سرعت ما رو بیشتر می‌کنن.

یکی از این دسته برنامه ها keyboard launcher هست که به اون app launcher یا حتی run launcher هم میگن.

اساس کار این برنامه ها به این شکل هست که با زدن یک شورت کات یک اینپوت ساده باز میشه و شما میتونید چیزی که میخواین رو توی اون تایپ کنید. ساده ترین حالتش اینه که اسم یک برنامه رو جستجو کنید و راحت توی لیست پیدا کنید و بازش کنید. اما قابلیت های پیشرفته تری هم داره مثلا این که توی vscode یه ریپازیتوری خاصی رو باز کنید. یا کلی امکانات پایه مثل محاسبات ریاضی، ابزار های تبدیل و .... باید با این ابزار کار کنید تا ببینید چقدر مفیده.

⚡️ معرفی ابزار ها:

❤️ spotlight (مک)
اگر از مک استفاده میکنید ابزاری هست به اسم spotlight که این کار رو برای شما انجام میده و امکانات فوق العاده ای داره حتما باید امتحانش کنید.

😥 power toys | windows run (ویندوز)
توی ویندوز اگر power toys رو نصب کنید که امکانات زیادی داره یکی از امکاناتش windows run هست که دقیقا این کار رو براتون انجام میده و امکانات زیادی داره.

😴 albert launcher (مک و لینوکس)
این یه ابزار اپن سورس هست و امکانات زیادی بهتون میده اگر از لینوکس استفاده می‌کنید میتونید از این لانچر استفاده کنید.
https://albertlauncher.github.io/

😴 Ulauncher (لینوکس)
یک لانچر زیبا و قوی دیگه برای لینوکس که ظاهر و امکانات خوبی داره
https://ulauncher.io/

😴 cerebro-app (لینوکس، مک و ویندوز)
آخرین مورد هم cerebro-app هست که توی همه سیستم عامل ها قابل استفاده هست.
https://www.cerebroapp.com/

من راجع به هر کدوم اینها به طور جدا صحبت نکردم چون کارایی همشون مثل هم هست. 3 مورد آخر امکان اضافه کردن ماژول یا اکسنشن برای قابلیت های بیشتر رو دارن و همچنین مورد آخر امکان شخصی سازی زیادی داره.

پیشنهاد میکنم اگر تا حالا از این لانچر ها استفاده نکردین حتما امتحانش کنید

من خودم روی لینوکس ulaucher و albert رو تست کردم و ulaucher به نظرم خیلی بهتر بود هم از نظر ظاهری و هم اینکه اکستنشن های زیادی داره که میشه اضافه کرد. در مورد cerebro گیتهابش رو چک کردم آخرین فعالیت برای ۲ سال پیش بوده پس به نظرم برای لینوکس بهترین آپشن ulauncher هست
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
در خیلی مواقع ممکنه شما به عنوان برنامه نویس پروژه ها و ریپو های زیادی روی سیستمتون داشته باشین. حالا فرض کنید میخواین سیستم عاملتون رو عوض کنید و خوب قطعا این ریپو ها رو توی گیت دارین ولی چیزی که توی گیت نیست فایل های env هست. اگر تعداد پروژه ها زیاد باشه (مثلا در مورد خودم شاید حدود ۵۰ تا پروژه داشته باشم) کپی و انتقال فایل های env سخت میشه.

با کمک اسکریپت زیر میتونید دایرکتوری پروژه هاتون رو به صورت تو در تو بررسی کنید و هر فایل env رو با توجه به ساختار دایرکتوری والد کپی کنید.

#!/bin/bash

# دایرکتوری پروژه‌ها
SOURCE_DIR="$HOME/prj" # مسیر دایرکتوری اصلی را اینجا تغییر دهید
# دایرکتوری مقصد
DEST_DIR="$HOME/env_backups"

# بررسی وجود دایرکتوری مقصد
mkdir -p "$DEST_DIR"

# جستجوی فایل‌های .env و کپی با حفظ ساختار دایرکتوری
find "$SOURCE_DIR" -type f -name ".env" | while read -r env_file; do
# مسیر نسبی فایل .env نسبت به دایرکتوری اصلی
relative_path="${env_file#$SOURCE_DIR/}"
# مسیر مقصد با ساختار دایرکتوری
dest_path="$DEST_DIR/$relative_path"
# ایجاد دایرکتوری‌های والد
mkdir -p "$(dirname "$dest_path")"
# کپی فایل به مقصد
cp "$env_file" "$dest_path"
echo "Copied: $env_file -> $dest_path"
done

echo "Backup completed. All .env files are copied to $DEST_DIR."


کافیه یک فایل بش بسازین کدهای بالا رو توش بنویسید، آدرس های مورد نظر رو تنظیم کنید و فایل بش رو اجرا کنید.
5🤔1