Jadoo

آموزش‌های جادو

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

توی ویندزو ۱۱ لازم است ابتدا Power Shell رو ابتدا به صورت Run As Administrator باز کنید و دستور زیر رو اجرا کنید.

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

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

# System Info Overlay Widget for Windows 11
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# Get system info
$os = Get-CimInstance Win32_OperatingSystem
$winVersion = "$($os.Caption) $($os.Version)"
$winBuild = $os.BuildNumber
$computerName = $env:COMPUTERNAME

# === 2. Get Active IP Addresses (LAN & Wi-Fi) ===
$ips = @()
$adapters = Get-NetAdapter | Where-Object { $_.Status -eq 'Up' -and $_.InterfaceDescription -notlike "*Loopback*" }
foreach ($adapter in $adapters) {
    $ipConfig = Get-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue
    if ($ipConfig) {
        $ips += "$($adapter.Name): $($ipConfig.IPAddress)"
    }
}
$ipText = if ($ips.Count -gt 0) { ($ips -join "`n") } else { "No active network" }



# Create form (widget window)
$form = New-Object System.Windows.Forms.Form
$form.Text = "System Info"
$form.Size = New-Object System.Drawing.Size(340, 180)
$form.StartPosition = "Manual"


# --- SAFE POSITIONING IN BOTTOM-RIGHT ---
try {
    $screen = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea
    # Force integers
    $screenWidth = [int]$screen.Width
    $screenHeight = [int]$screen.Height
    $formWidth = [int]$form.ClientSize.Width
    $formHeight = [int]$form.ClientSize.Height

    $x = $screenWidth - $formWidth - 40
    $y = $screenHeight - $formHeight - 20

    # Ensure non-negative
    $x = [Math]::Max(0, $x)
    $y = [Math]::Max(0, $y)
    $form.StartPosition = 'Manual'
    $form.Location = New-Object System.Drawing.Point($x, $y)
} catch {
    # Fallback to default location if screen info fails
    $form.StartPosition = 'CenterScreen'
}
#$form.Location = New-Object System.Drawing.Point(20, 20)  # Top-left corner

# Remove always-on-top
$form.TopMost = $false



# Transparent background (black = transparent)
$form.FormBorderStyle = 'None'
$form.ShowInTaskbar = $false
$form.Opacity = 0.92
$form.BackColor = [System.Drawing.Color]::Black
$form.TransparencyKey = [System.Drawing.Color]::Black


# === 4. Create Label ===
$label = New-Object System.Windows.Forms.Label
$label.ForeColor = [System.Drawing.Color]::White
$label.Font = New-Object System.Drawing.Font("Segoe UI", 14)
$label.AutoSize = $false
$label.Size = $form.ClientSize
$label.TextAlign = "MiddleLeft"
#$label.Padding = New-Object System.Windows.Forms.Padding(10, 0, 0, 0)  # Left padding for readability
$label.Text = "$winVersion `nPC: $computerName `n$ipText"

# Add label to form
$form.Controls.Add($label)

# Make it click-through (optional)
$form.TopMost = $false
$form.Show()
$form.Focus()

# Keep the window alive
while ($form.Created) {
    [System.Windows.Forms.Application]::DoEvents()
    Start-Sleep -Milliseconds 100
}

این فایل رو با نام دلخوام و پسوند ps1 ذخیره کنید. خوب فایل ما آماده شد. برای تست کردن روی اون راست کلیک کنید و Run with PowerShell رو بزنید. باید ویدجت شما بالا بیاد. حالا میخوایم همین رو کاری کنیم با بالا اومدن ویندوز خودش بالا بیاد و لازم نباشه هر بار به صورت دستی بازش کنیم. برای این کار مسیر زیر رو برید:

1- Press `Win + R` , type `shell:startup`, hit enter.
2- Right-click → New → Shortcut
3- location:
-- powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Path\To\SystemInfoWidget.ps1"

4- Name it (e.g., "SysInfo Widget").

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

CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File ""F:\SystemInfoWidget.ps1""", 0, False

حالا برای این فایل جدید در shell:startup یک میانبر با ادرس زیر بسازید:

 wscript.exe "F:\RunWidget.vbs"

کار با PDF در لینوکس (CLI Tools)

کار با فایل های pdf در سیستم‌عامل ویندوز یا مک احتمالا خیلی راحت باشد. البته به شرطی که بخواهید از ابزار های تجاری موجود استفاده کنید. ابزار هایی مثل adobe acrobat ، PDF Exchange یا Foxit PDF Editor pro و ... . اما واریش و کار با این ابزار ها عموما در لینوکس امکان پذیر نیست از طرفی شما وابسته هستید به این ابزار ها و امکانات آنها. اما در لینوکس و کلا سیستم های آزاد هم شما ابزار هایی برای کار با pdf ها دارید. در این پست دستورات مختلفی که در طی زمان با اون ها کا رمیکنم رو معرفی می کنم.

میخوام همه‌ی صفحات رو بچرخونم

برای این کار ابزار qpdf میتونه کمک کننده باشه:

qpdf sample.pdf --rotate=90 -- output.pdf

persian layout

یکی از تفاوت‌هایی که چینش زاستاندارد صفحه کلید فارسی در ویندوز و لینوکس دارند. دکمه های ترکیبی با AltGr یا همون دگرساز سمت راست است. در ادامه یک چینش مطابق چیزی که در لینوکس وجود دارد رو ایجاد کردم و میتوانید از اون توی ویندزو استاده کنید.

برای تولید این چینش از نرم افزار KbdEdit استفاده شده است.

لینک دانلود فایل‌ها: download

نکات مهم

در صورتی که در شبکه های مجازی لازم باشد متنی بنویسیم که از ترکیب کلمات فارسی و انگلیسی باشد عموما این نرم افزار ها برای تشخسص جهت از اولین کاراکتر نوشته شما کمک میگیرند و RTL بودن یا نبودن رو تشخیص میدهند. حالاتصور کنید اگه کلمه ای که میخواهید بنویسید بصورت انگلیسی باشد. به این ترتیب در زمان نمایش با کل متن شما به عنوان یک جمله انگلیسی (یا به بیانی دیگر LTR) برخورد میشود. خوب توی کیبور استاندارد میتونید از نویسه RLM استفاده کنید. این یک نویسه از نوع فرمت بندی است. و شما پس از نوشت این نویسه چیزی در متن مشاهده نمی‌کنید. برای دسترسی به این نویسه راه های زیر را در اختیار دارید: در کیبورد استاندارد: altGr + 0 ، در HTML از ‏ و ‏ و ‏ استفاده میکنیم و در نهایت کد unicode این نویسه U+200F است.

برای نوشتن هر نویسه با کد unicode اون در لینوکس فرایند زیر را انجام دهید. ابتدا با گرفتن دکمه های ctrl+shift+u‍ در محل نوشت یک حرف u انگلیسی ظاهر میشود. دکمه ها را رها کنید. کد مورد نظر را تایپ کنید و یک بار اسپیس بزنید. نویسه مورد نظر شما چاپ می‌شود.

python

یکی از مشکلاتی که خیلی وقت‌ها با اون مواجه می‌شوم. مشکل دانلود فایل‌های کتابخونه‌هایی است که استفاده می‌کنم. مشکل از اونجایی است که گاهی حجم این‌ها زیاد است و مشکل بزرگتر هم سرعت اینترنت در ایران است. از این رو توی این پست میخوام راه کاری که برای پایتون (Python) بهش رسیدم رو توضیح بدم.

نکته اول اینکه لازم است یک سرور محلی برای خودتون درست کنید برای این منظور هم کتابخونه pypi-server رو پیشنهاد می‌دهم. بعد از نصب این ابزار (یک کتابخونه پاتونی است) کافیه که بهش پوشه حاوی فایل های whl خودتون رو بدید.

# install from 
## https://pypi.org/project/pypi-server/
pypi-server run -p 8091 /$HOME/whlRepo

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

pip download --extra-index-url http://localhost:8091 -d /$HOME/whlRepo <packages name>

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

pip install --extra-index-url http://localhost:8091  <packages name>

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

# in .bashrc

mypip() {
  PKGS=("$@")
  pip download "${PKGS[@]}" --extra-index-url http://localhost:8091 -d /$HOME/whlRepo && pip install "${PKGS[@]}" --extra-index-url http://localhost:8091
}

البته برای اینکه همیشه این سرویس بالا باشه میتونیم یه سرویس توی systemd ایجاد کنیم بصورت زیر :

sudo nano /etc/systemd/system/pipyserver.service

و محتویاتش رو به شکل زیر بنویسیم:

[Unit]
Description=A minimal PyPI server for use with pip/easy_install.
After=network.target

[Service]
Type=simple
# systemd requires absolute path here too.
PIDFile= /home/<your user>/whlRepo/pypiserver.pid
User=<your user>
Group=<your user>

ExecStart=pypi-server run -p 8091 /home/<your user>/whlRepo --log-file /home/<your user>/whlRepo/log.log
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

WorkingDirectory=/home/<your user>/whlRepo

TimeoutStartSec=3
RestartSec=5

سپس با دستورات زیر فعالش کنید:

sudo systemctl enable pipyserver.service   
sudo systemctl start pipyserver.service  
sudo systemctl status pipyserver.service    

python-go-rust

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

گولنگ (Go)

در لینوکس یا مک به راحتی با دستور زیر میتونید از gpproxy.cn استفاده کنید

$ echo "export GO111MODULE=on" \u003e\u003e ~/.profile
$ echo "export GOPROXY=https://goproxy.cn" \u003e\u003e ~/.profile
$ source ~/.profile

در ویندوز هم در بخش system environment variables به راحتی دو متغییر تعریف کنید مقادیسر اون ها رو مطابق زیر قرار دهید:

# Variable : Value
GO111MODULE : on
GOPROXY : https://goproxy.cn

منبع:‌ goproxy

راست (Rust)

برای کسانی که از زبیان راست استفاده می کنند می توان میررور https://rsproxy.cn/ را معرفی کرد. برای استفاده هم فقط کافیه دو متغیر زیر رو توی سیستم تعریف کنید:

export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"

منبع: rsproxy

پایتون (Python)

برای پایتون چندید میرور لیست وجود دارد که می توانید از آنها برای بهبود سرعت دانلود استفاده کنید. برای مثال شرکت های ایرانی ارائه دهنده PyPi mirror مثل runflare. در ادامه لیستی از این شرکت ها ارئه شده است.

کشور سرور(host) ادرس(address)
🇮🇷 https://mirror-pypi.runflare.com https://mirror-pypi.runflare.com/simple/
🇨🇳 https://pypi.tuna.tsinghua.edu.cn https://pypi.tuna.tsinghua.edu.cn/simple/
🇨🇳 https://mirrors.aliyun.com https://pypi.tuna.tsinghua.edu.cn/simple/
🇨🇳 https://pypi.mirrors.ustc.edu.cn https://pypi.mirrors.ustc.edu.cn/simple/
🇨🇳 https://repo.huaweicloud.com https://repo.huaweicloud.com/repository/pypi/simple/
🇨🇳 http://pypi.douban.com http://pypi.douban.com/simple/
🇨🇳 http://pypi.sdutlinux.org http://pypi.sdutlinux.org/

برای استفاده از هرکدام از سرور‌های فوق از دستور الگوی زیر استفاده کنید

pip install --trusted-host [host] -i [address] package-name

البته میتوانید از دستورات زیر برای تنظیم به صورت سراسری استفاده کنید

pip config --user set global.index [address]
pip config --user set global.index-url [address]
pip config --user set global.trusted-host [host]

Windows context menu

این چند وقت یهو دیدم دیگه نمی‌تونم فایل‌ها و پوشه ها رو به راحتی با vscode باز کنم. درواقع میخوام با راست کلیک کردن روی پوشه‌ها و فایل ها، گزینه‌ای برای باز کردن با vscode داشته باشم. برای این منظور لازمه یه کم تغیراتی رو توی registery بدیم.

البته در ادامه فایلی که من اماده کردم رو هم میتونید اجرا کنید و خودش توی رجیستری تغییرات را اعمال میکنه. Vscode.reg

حالا باید چکار کنیم؟

اول دکمه های win + r رو میزنیم. توی برنامه ای که باز شد مینویسیم: regedit

برای فایل‌ها

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

[Computer\HKEY_CLASSES_ROOT\*\shell]

یک دارکتوری به نام Vscode بسازیم. سپس توی این دارکتوری یک دارکتوری به اسم command در ادرس

[\Computer\HKEY_CLASSES_ROOT\*\shell\Vscode]

بر روی فایل ‍‍(Default) راست کلیک کرده و modify بزنید.

اینجا در این سمت مقدار هرچیزی که بنویسید توی منوی راست کلیک نمایش داده می‌شود من نوشتم : Open with Code. حالادر همین ادرس یک Key ایجاد کنید با عنوان Icon و مقدار

C:\Users\ssmns\AppData\Local\Programs\Microsoft VS Code\Code.exe

یا هر ادرسی که یک ایکون برای Vscode دارید.

خوب تا اینجای کار برای فایل ها تغییرات داده شده ولی فقط یک ایتم توی منو ایجاد شده و نه اینکه کار کنه. پس توی ادرس زیر

[\Computer\HKEY_CLASSES_ROOT\*\shell\Vscode\command]

بر روی فایل ‍‍(Default) راست کلیک کرده و modify بزنید.

اینجا بنویسد:

"C:\Users\ssmns\AppData\Local\Programs\Microsoft VS Code\Code.exe\" "%1

خوب کارمون تموم شده با این تفاوت که هنوز برای پوشه ها کاری نکردیم.

پوشه‌ها

برای اون ها همین کار ها رو انجام بدید با این تفوات که مسیر اصلی به صورت زیر است:

[Computer\HKEY_CLASSES_ROOT\Directory\shell]

و مقدار

[\Computer\HKEY_CLASSES_ROOT\Directory\shell\Vscode\command]

باید به صورت زیر باشد:

"C:\Users\ssmns\AppData\Local\Programs\Microsoft VS Code\Code.exe" "%V"