در یک مراسم بسیار مذهبی، در یک مکان بسیار مذهبی و با حضور بانوان بسیار مذهبی (مراسم روز مادر است) هستم و جلوی خودم را گرفتهام تا به مجریّن مراسم بابت ادبشان فحش ندهم!
اگر اینجا هم بانوی مذهبی و باحیا بناست در عذاب باشد (که میبینم)، پس… ؟
در یک مراسم بسیار مذهبی، در یک مکان بسیار مذهبی و با حضور بانوان بسیار مذهبی (مراسم روز مادر است) هستم و جلوی خودم را گرفتهام تا به مجریّن مراسم بابت ادبشان فحش ندهم!
اگر اینجا هم بانوی مذهبی و باحیا بناست در عذاب باشد (که میبینم)، پس… ؟
باشد قبول، «الباطِلُ یمُوت بِتَرك ذِكرِه»! اما این طوری که شما ولش کردید و آنها سخت مشغول Streamاند، سکوتتان بیشتر شبیه علامت رضاست! و طولی نمیکشد که «كَيْفَ بِكُمْ إِذَا رَأَيْتُمُ اَلْمَعْرُوفَ مُنْكَراً وَ اَلْمُنْكَرَ مَعْرُوفاً؟!»…
پ.ن: حالا بماند که این جمله اصلاً حدیث نیست!
یکی از مشکلات برنامهنویسی پروژهها روی چیپهای اقتصادی و نهفتهی دستگاهها مانند نانوپای یا Luckfox Pico، این است که کامپایل برنامهها روی آنها بسیار طولانی و زمانبر است. در این مواقع امکان کامپایل میان-پردازندهای (Cross-Compile) موجب افزایش سرعت بیلد و توسعهی پروژه میگردد.
در این آموزش کوتاه یاد میگیریم که چگونه روی Debian (من به صورت WSL روی یک رایانه x64 نصب کردهام) برنامهی C یا C++ را برای لینوکس armhf کامپایل کنیم.
|
1 |
sudo dpkg --add-architecture armhf |
|
1 |
sudo apt update |
|
1 2 3 4 |
sudo apt update sudo apt install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \ pkg-config qemu-user-static |
حالا CMakeLists.txt را به نحوی تنظیم میکنیم تا تنظیمات کلی و بدون مشکل برای معماریهای مختلف در آن قرار گیرد:
|
1 2 3 4 5 6 7 8 |
cmake_minimum_required(VERSION 3.16) # Minimum required CMake version project(PROJECT_NAME) # Set your project name here add_compile_options(-s -flto=auto ${TARGET_COMPILE_OPTIONS}) add_compile_options(-O3 -Wall -Wextra) add_compile_options(-mfpu=neon -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7) ... |
و تنظیمات وابسته به بیلد armhf در cmake/Toolchain-armhf.cmake قرار میگیرد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# cmake/Toolchain-armhf.cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) # or armv7 # Cross compilers set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) # Avoid try-run during checks set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) set(CMAKE_SYSROOT "/") # Tell find_* and pkg-config to search the ARM sysroot first set(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # build tools from host set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # libraries from target set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # headers from target set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # packages from target # Use the host pkg-config binary but point it at the ARM pc files: if(NOT DEFINED ENV{PKG_CONFIG_SYSROOT_DIR}) set(ENV{PKG_CONFIG_SYSROOT_DIR} "${CMAKE_SYSROOT}") endif() set(_pc_paths "${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig" "${CMAKE_SYSROOT}/usr/lib/pkgconfig" "${CMAKE_SYSROOT}/usr/share/pkgconfig" "${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf/glib-2.0/pkgconfig" "${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig" ) string(JOIN ":" _pc_joined ${_pc_paths}) set(ENV{PKG_CONFIG_LIBDIR} "${_pc_joined}") find_program(CMAKE_AR arm-linux-gnueabihf-gcc-ar) find_program(CMAKE_RANLIB arm-linux-gnueabihf-gcc-ranlib) find_program(CMAKE_NM arm-linux-gnueabihf-gcc-nm) |
|
1 2 3 |
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchain-armhf.cmake \ cmake --build build -j |
برای مطمئن شدن از نوع معماری خروجی کامپایل، میتوانید از دستور file استفاده کنید.
If USA was good, the “USB” never has been invented 😒
آیا اول پروژهی خود را به نسخه رساندهاید و سپس تصمیم گرفتید پروژه را Gitدار کنید؟
آیا پروندهی .gitignore در گیت خود گذاشتهاید اما انگار کار نمیکند؟
آیا از دیدن پروندههای Cache و Build پروژه که هی کم و زیاد میشوند و تغییرات گیت را بیخودی زیاد میکنند رنج میبرید؟
راه حل شما تنها همین دو دستور گیت است تا Cache گیت را پاک کنید:
|
1 2 |
git rm -rf --cached . git add . |
شیعةُ علیٍّ هم الذین … و هم الذین لایراهم الله حیث نهاهم و لا یفقدهم حیث امرهم …
شیعیان علی(ع) کسانی هستند که … و خداوند آنها را در جایی که نهی کرده، نمیبیند و در آن جا كه امر كرده، هميشه حاضر مىبيند …
امام حسن عسکری(ع)
(بحارالأنوار / ج65 / ص163)
جالب بود؛ خداوند آنها را «نمیبیند» و «میبیند».
اگر از یکی از توزیعهای لینوکس به صورت WSL (Windows Subsystem for Linux) در ویندوز استفاده میکنید، شاید لازم داشته باشید تا از دستگاه دیگری در شبکه محلی به آن ssh بزنید.
اگر شبکهی WSL به صورت NAT تنظیم شده باشد، IP لینوکس همان IP شماست؛ اما لینوکس IP خود را چیزی شبیه به 172.xxx.xxx.xxx/20 معرفی میکند.
پس چگونه باید به آن ssh بزنیم؟
اتصال ssh به صورت پیشفرض روی پورت 22 انجام میشود (میتوان از پرونده /etc/ssh/sshd_config آن را تغییر داد)؛ برای اتصال از دستگاههای دیگر در شبکه، باید یکی از پورتهای دستگاه میزبان (ویندوز خودمان) را به پورت 22 لینوکسمان فوروارد کنیم.
یک ترمینال Powershell با دسترسی Run As Administrator اجرا کرده و از دستور زیر استفاده کنید (نشانی IP را تغییر دهید) تا پورت 2222 ویندوز (یا هر پورت دیگری) به پورت 22 لینوکس فوروارد شود:
|
1 2 3 4 |
# Forward all IPv4 traffic on port 2222 to WSLs port 22 netsh interface portproxy add v4tov4 ` listenaddress=0.0.0.0 listenport=2222 ` connectaddress=172.xxx.xxx.xxx connectport=22 |
حالا با استفاده از همان ترمینال Powershell، دستور زیر را وارد کنید تا پورت 2222 برای استفاده TCP آزاد شود:
|
1 2 3 4 5 6 |
New-NetFirewallRule ` -DisplayName "WSL2 SSH (2222)" ` -Direction Inbound ` -Action Allow ` -Protocol TCP ` -LocalPort 2222 |
حالا میتوان با اضافه کردن مقدار پورت به دستورات ssh و scp، به لینوکس روی wsl متصل شد:
|
1 2 3 4 |
# SSH (-p) ssh -p 2222 linuxUser@192.168.1.xxx # SCP (-P) scp -P 2222 .\Desktop\test.txt linuxUser@192.168.1.xxx:~ |
مایکروسافت به تازگی نسخهی بازسازی شدهی ویرایشگر معروف و قدیمی تحت خط فرمان خود (edit) را با زبان برنامهنویسی راست (Rust) و به صورت متن باز منتشر کرده است.

این ویرایشگر با وجود اینکه به تازگی منتشر شده، نظر بسیاری از کاربران را به خود جلب کرده و نظر شخصی خودم هم این است که این ویرایشگر به زودی مانند Visual Studio Code، جای خود را بین ویرایشگرهای TUI باز کرده و جایگزین آنها میشود؛ دلیل آن هم «استاندارد» بودن رابط کاربری این نرمافزار است. به طور مثال کاربران میدانند که در تمام نرمافزارها Ctrl+Q برای خروج، Ctrl+F برای یافتن (Find) و Ctrl+S برای ذخیرهکردن (Save) است و این استانداردها مورد پذیرش همه قرار گرفته است؛ در حالی که مثلا در vim، برای خروج باید به صورت زیر عمل کرد:
:q to quit (short for :quit):q! to quit without saving (short for :quit!):wq to write and quit:wq! to write and quit, attempting to force the write if the file lacks write permission:x to write and quit; like :wq but writes only if modified (short for :exit):qa to quit all (short for :quitall):cq to quit, without saving, with a nonzero exit code to indicate failure (short for :cquit)موفق باشید!
بگذریم؛ برای نصب این ویرایشگر روی ویندوز، میتوان به راحتی از طریق WinGet اقدام کرد:
|
1 |
winget install Microsoft.Edit |
در توزیعهای دبیانی، به دلیل اینکه هنوز Edit وارد بستههای apt نشده است، میتوان از طریق دستورات زیر به صورت مستقیم دانلود و نصب کرد:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Download the package wget https://github.com/microsoft/edit/releases/download/v1.2.0/edit-1.2.0-x86_64-linux-gnu.tar.zst # Extract the archive tar xvf edit-1.2.0-x86_64-linux-gnu.tar.zst # Include it in the bin directory for anywhere access # Have extracted to the user's home directory, adjust the path accordingly sudo ln -s ~/edit /usr/bin/msedit # Launch the editor msedit |
ممکن است هنگامی که مطلب را میخوانید، نسخه جدیدی به جای 1.2.0 منتشر شده باشد.
این دستور نام عمومی «msedit» را برای اجرا تنظیم میکند (ممکن است برنامه دیگری با نام edit وجود داشته باشد، لذا از آن استفاده نشد)
وقتی بعضی کانالهای تلگرامی (به خصوص کانال خبرگزاریها) رو میخوانم، گاهی سردرگم میشوم که چطور نظرم رو در مورد اون مطلب با شکلکهای پای مطلب ابراز کنم؟
اگر لایک کنم یا قلب بذارم یعنی «موافقم» اگر دیسلایک کنم یا شکلک فحش (🤬) بذارم، ممکنه اینطور برداشت بشه که با موضوع یا فردی که در مطلب ازش یاد شده مخالفم؛ دقیقا با چه شکلکی میشه به نویسندهی مطلب گفت که تو خیلی … چیز یعنی شما در نوشتن مطلب سهلانگاری کرده و خطا کردهاید که این مطلب را نوشتهاید؟ 😑
با استفاده از فرمول اکسل زیر میتوانید شمارههای تلفن همراه تصادفیای را بسازید که دارای پیششمارههای تصادفی ولی معتبر و 7 رقم شماره تصادفی باشد:
|
1 |
=CHOOSE(RANDBETWEEN(1,5),"0937","0912","0919","0910","0935") & TEXT(RANDBETWEEN(1000000,9999999),"0000000") |
در اکسلهایی که به جای , از ؛ پشتیبانی میکنند:
|
1 |
=CHOOSE(RANDBETWEEN(1؛5)؛"0937"؛"0912"؛"0919"؛"0935"؛"0910") & TEXT(RANDBETWEEN(1000000؛9999999)؛"0000000") |