لینوکس و من

۲۱۶ مطلب با موضوع «ترفند» ثبت شده است

ذخیره اسکرین شات های گنوم با پسوند jpg

برنامه اسکرین شات گنوم یه ابزار راحت برای هر نوع عکس گرفتن از صفحه نمایشه. این برنامه عکسها رو بطور پیشفرض با فرمت png ذخیره میکنه. اما اگه بخوایم عکسها با فرمت دیگه ای مثلا jpg ذخیره بشن هیچ جا تنظیمی برای اینکار وجود نداره. اما با رفتن به dconf میتونیم این کار رو بکنیم.

با تغییر دادن default-file-type این اتفاق خواهد افتاد. یا اگه خیلی عجله دارین این رو در ترمینال اجرا کنین:
 dconf write /org/gnome/gnome-screenshot/default-file-type "'jpg'"

حالا وقتی خود برنامه رو باز کنید و اسکرین شات بگیرید فایلها بصورت jpg ذخیره میشن. اما اگه با شورت‌کات های کیبورد این کارو بکنین همچنان png هستند. راه حلی که خودم برای این موضوع بکار بردم اینه که در keyboard shortcuts اسکرین شاتهای فعلی رو غیر فعال کنید و در عوض سه تا دستور اسکرین شات با شورتکاتهای دلخواه بسازین:


و یه نکته دیگه هم اینکه برای اینکه تعیین کنید وقتی اسکرین شات میگیرید بصورت خودکار در چه دایرکتوری ای ذخیره بشن، طبق عکس اولی عمل کنید و مقادیر مربوطه رو به دلخواه خودتون تغییر بدید

داستان تغییر زبان

از اونجایی که در ویندوز از سالها قبل هممون عادت کردیم برای تغییر زبان کیبورد به فارسی/انگلیسی از کلید های Alt+Shift هر دو طرف استفاده کنیم، حالا برامون سخته که بخوایم از ترکیب های دیگه در گنوم یا سایر دسکتاپ ها استفاده کنیم.همچنین عده ای با Alt+Shift سمت راست راحت هستن و عده ای هم با سمت چپ. اما در تنظیمات کیبورد فقط ترکیب سمت چپ وجود داره. و در گنوم هم که اصلا Alt+Shift وجود نداره!
قبلا در این مورد نوشته بودم. اما اون فقط مخصوص دسکتاپ گنوم بود. و فقط هم کلیدهای ترکیبی سمت چپ رو فعال میکرد. اما حالا با قرار دادن این دستور در استارتاپ، هر دو کلید های ترکیبی سمت راست و چپ فعال میشن. در هر دسکتاپی که باشید.
setxkbmap us,ir -option "lv3:ralt_alt,grp:alt_shift_toggle"
میتونید یک بار دستور بالا رو در ترمینال اجرا کنید و تست کنید. بعدش اونو در استارتاپ قرار بدید، که بسته به نوع دسکتاپ روشش فرق میکنه.

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

ممکنه براتون پیش بیاد که بخواید وقتی مثلا به مدت سه دقیقه از کامپیوترتون استفاده نکردید یک اتفاقی بیفته. مثلا من همیشه یادم میره کلید Numlock رو خاموش کنم، و از اونجایی که در کیبورد من عدد 1 در حالت Numlock خاموش مساوی است با End این موضوع خیلی روی اعصابه، و هر وقت که میزنم End تایپ میکنه 1. بنابراین میام به سیستم میگم هر وقت به مدت ۵ ثانیه کسی بهت دست نزد numlock رو خاموش کن. خیلی کارها میشه با این اسکریپت کرد...

اول از همه پیش نیاز های این اسکریپت رو نصب میکنیم. در توزیع خودتون اینها رو باید نصب کنید: sdotool , xprintidle , wmctrl و بعد اسکریپت زیر رو در یک فایل با پسوند py ذخیره میکنیم:
#!/usr/bin/env python3
import subprocess
import time
import sys

idletime = int(sys.argv[1])
command = sys.argv[2]

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()

def get_res():
    xr = [s for s in get(["xrandr"]).split() \
          if "+0+0" in s][0].split("x"); xr[1] = xr[1].split("+")[0]
    return xr

res = get_res()

def check():
    front = [l for l in get(["xprop", "-root"]).splitlines() \
             if "_NET_ACTIVE_WINDOW(WINDOW):" in l][0].split("#")[-1].strip()
    front = front[:2]+(10-len(front))*"0"+front[2:]
    try:
        wdata = subprocess.check_output(
            ["wmctrl", "-lG"]
            ).decode("utf-8").splitlines()
        match = [l for l in wdata if front in l][0].split()[4:6]
        if match == res:
            return True
        else:
            return False
    except subprocess.CalledProcessError:
        pass

minus = 0; real_idle = 0; t1 = 0; due_1 = False
while True:
    time.sleep(1)
    fscreen = check()
    t2 = int(int(get(["xprintidle"]))/1000)
    if t2 < t1:
        minus = 0; real_idle = 0
    else:
        if fscreen == True:
            minus = t2
    real_idle = t2 - minus
    due_2 = [real_idle > idletime][0]
    if all([real_idle > idletime, due_1 != due_2]):
        subprocess.Popen(["/bin/bash", "-c", command])
    due_1 = due_2
    t1 = t2
و بعد مجوز اجرایی به این اسکریپت میدیم.
برای خاموش کردن numlock هم از numlockx استفاده میکنیم که با off خاموش و با on روشن میکنه. مثلا numlockx off

برای استفاده از این اسکریپت به صورت زیر عمل میکنیم:
python3 /pat/to/idle.py 5 "numlockx off"

دستور بالا (باید مکان اسکریپت و نام اون رو طبق چیزی که میخواید تغییر بدید) پس از اجرا شدن (که ما اون رو در کرون میذاریم تا موقع استارتاپ اجرا بشه) پس از ۵ ثانیه استفاده نکردن از سیستم کلید numlock رو خاموش میکنه. شما به جای متغیر زمان و دستور میتونید هر چیز دیگه ای رو بذارید.

پخش آلارم هنگام Low battery

در دسکتاپ گنوم، وقتی باتری لپتاپ به مقدار مشخصی برسه، نوتیفیکیشن هشدار داده میشه. اما این نوتیفیکیشن صدا نداره. یکی از دوستان پرسیده بود که چطور میشه کاری کرد که وقتی باتری به درصد خاصی میرسه نوتیفیکیشن همراه با آلارم پخش بشه؟
دو راه برای اینکار هست. یکی اینکه از udev استفاده کنیم، که در ویکی آرچ توضیح داده شده. اما من استفاده کردم و موفقیت آمیز نبود. ظاهرا هر لپتاپی اینجور نیست که اطلاعات باتری رو به udev بفرسته. راه دوم که کار راه بندازه و زیادم بد نیست استفاده از cron است. یعنی یه اسکریپتی بنویسیم که هر مثلا ۶ دقیقه درصد باتری رو چک کنه و اگه کمتر مقدار تعیین شده بود کاریو که ما میخوایم انجام بده.
اسکریپتی که در ویکی آرچ نوشته بود و من هم کمی شخصی سازیش کردم در زیر میبینید:
#!/bin/sh
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
    read -r status capacity

    if [ "$status" = Discharging -a "$capacity" -lt 15 ]; then
        logger "Critical battery threshold"
        /usr/bin/notify-send -u critical --hint int:transient:1 -i "/usr/share/icons/hicolor/256x256/apps/gnome-power-manager.png" "Battery at $capacity%" "Battery percent is too low. Connect AC Adapter." && play /home/amin/Programs/lowbat.mp3
    fi
echo "Battery has $capacity% capacity"
}
چند نکته در مورد این اسکریپت:
برای مشخص کردن درصد باتری از acpi استفاده شده. و برای پخش صدا از sox و برای نمایش نوتیفیکیشن از notify-osd. بنابراین هر کدوم رو که ندارید نصب کنید.
در خط دوم اسکریپت (رنگ زرد) برای اینکه cron بتونه پیامهای notify-osd رو اجرا بکنه،‌ باید یه همچین چیزی در اسکریپت باشه. عدد 1000 همون user id نام کاربری شماست که باید با دستور echo $UID ببینید چنده. که معمولا اگه اولین کاربری باشید که در لینوکستون ساختید 1000 هست.
خطوط نارنجی هم مشخص کننده آدرس فایلهاست (آیکن و صدای آلارم).
محتوای پیام رو هم که خودتون میتونید ویرایش کنید. مقدار 15 هم که با رنگ سبز مشخص شده همون درصدی است که تعیین کردیم که اگر پایین تر از اون بود هشدار داده بشه. به دلخواه خودتون میتونید مقدارش رو مشخص کنید.
اسکریپت بالا رو جایی ذخیره کنید و اون رو با روشی که بلد هستید به cron بسپارید. بازه های زمانی ۶ دقیقه فکر میکنم مناسب باشه.

ذخیره و بازآوری شورت‌کات ها در گنوم

اگر مثل من علاقه مند به تغییر کیبورد شورتکات های پیشفرض در دسکتاپ گنوم داشته باشید، یا خیلی شورتکات های جدید خودتون ایجاد کرده باشید، خیلی سخته که این همه تنظیمات رو بصورت حتی اتفاقی از دست بدید. شاید مجبور شده باشید سیستم جدیدی نصب کنید، اونوقت تک تک این شورتکات ها رو باید دوباره تنظیم کنید.
اما نه! لازم به این کار نیست. با یک اسکریپت perl به راحتی میتونید از شورتکات های گنوم بکاپ بگیرید و در مواقع لزوم همه اونها رو به یکباره برگردونید. منبع این اسکریپت در اینجاست. اما محض احتیاط اگر لینک منبع از بین رفت، اسکریپت رو در ادامه مطلب میذارم. روش کار هم به این شکل هست که این اسکریپت رو در یک فایل با اسم دلخواه و پسوند pl ذخیره میکنید. مثلا keybindigs.pl و بعد اون رو مشابه دستور زیر اجرا میکنید:
برای گرفتن بکاپ:
/path/to/keybindigs.pl -e ~/keybindings

و برای بازگردوندن بکاپ:
/path/to/keybindigs.pl -i ~/keybindings




فایلی به نام keybindings در فولدر home کاربریتون ایجاد میشه که حاوی این تنظیمات هست.
این اسکریپت در گنوم ۳.۲۰.۲ تست شده. 

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

چند وقت پیش در مورد اینکه چطوری یه تیکه از فیلمی رو بوسیله ffmpeg جدا کنیم نوشته بودم. اینجا بخونید.
به یاد سپردن این دستورات طویل ffmpeg کار راحتی نیست! بنابراین اومدم با توجه به اسکریپتی که یکی از دوستان در انجمن فارسی کاربران آرچ برای کمک به من نوشته بود (در مورد واترمارک کردن فیلمها) یه اسکریپت برای این کار تهیه کردم:
#!/bin/bash

path_of_first_file=$(dirname "$1")
name_of_first_file=$(basename "$1")
startpoint=$2
duration=$3

new_name="$(echo "$name_of_first_file.mp4")"
new_output=$(echo "$path_of_first_file/$new_name")

ffmpeg -loglevel panic -i "$1"  -vcodec copy -acodec copy -ss "$2" -t "$3"  "$new_output"

echo
echo "New video saved in: " "$path_of_first_file"\/$new_name

وقتی این اسکریپت رو جایی ذخیره کنید و بهش مجوز اجرایی بدید، و بعد یک alias براش تعریف کنید، (مثلا vidcut) به راحتی با دستوری مشابه این میتونید تکه ی دلخواهتون رو از فیلم جدا کنید:
vidcut /path/to/video.mp4 00:12:30 00:03:08
قسمت نارنجی که واضحه، مسیر فایل ویدیویی هست. یعنی از  دقیقه ۱۲ و ثانیه ۳۰ ( قسمت سبز) شروع کن و به مدت سه دقیقه و هشت ثانیه فیلم رو کات کن (قسمت صورتی). تکه کات شده با نام جدید و با پسوند mp4 در همون محل فایل اصلی ذخیره میشه.

یک بوت کاملا ساکت داشته باشیم

وقتی در لینوکس از طریق GRUB بوت میکنیم، حتی اگه چیزی مثل plymouth نصب باشه و هنگام بوت انیمیشن نشون بده، قبل از شروع بوت انیمیشن باز هم تعدادی پیام روی صفحه نشون داده میشه. برای اینکه جلوی نمایش این پیام ها رو هم بگیریم و حتی یک کاراکتر هم نشون داده نشه میتونیم کارهای زیر رو انجام بدیم:

یکی از مراحل در ویکی آرچ توضیح داده شده.
فایل پیشفرض گراب رو با ادیتور دلخواهتون (در اینجا gedit) باز کنید:
sudo gedit /etc/default/grub
و در قسمت GRUB_CMDLINE_LINUX_DEFAULT این مقادیر رو وارد کنید، به صورتی که اینجوری بشه:
GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=3 rd.systemd.show_status=false rd.udev.log-priority=3 splash"
البته واضحه که اگر مقادیر دیگه ای هم در این خط وجود داره نباید پاک کنید. مهم اینه که quiet loglevel=3 rd.systemd.show_status=false rd.udev.log-priority=3 splash وجود داشته باشه. فایل رو ذخیره کنید و ببندید.

حالا این فایل رو باز کنید:
sudo gedit /etc/grub.d/10_linux

در این فایل دنبال دو تا خط زیر رو سرچ کنید (دو تا خط مشابه هستند) و حذف کنید. و بعد فایل رو ذخیره کنید و ببندید.
echo '$(echo "$message" | grub_quote)'


حالا باید fsck رو به systemd بسپاریم تا پیامی حین بوت نشون نده. برای اینکار، طبق همون ویکی، فایل mkinitcpio.conf رو باز میکنیم:
sudo gedit /etc/mkinitcpio.conf
در قسمت HOOKS باید کلمه fsck رو حذف کنید. فایل رو ذخیره کنید و ببندید. حالا باید یه تعییراتی انجام بدیم:
sudo cp /usr/lib/systemd/system/systemd-fsck@.service /etc/systemd/system/
و بعد:
sudo cp /usr/lib/systemd/system/systemd-fsck-root.service /etc/systemd/system/
حالا باید یکی یکی این فایلها رو باز کنیم:
sudo gedit /etc/systemd/system/systemd-fsck@.service
sudo gedit /etc/systemd/system/systemd-fsck-root.service
و این عبارت رو به آخر هر کدوم اضافه کنیم و ذخیره کنیم:
StandardOutput=null
StandardError=journal+console

به طوری که انتهای محتوای این فایل ها به این صورت بشه:
(...)
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/systemd/systemd-fsck
TimeoutSec=0
StandardOutput=null
StandardError=journal+console


حالا این دستوها رو یکی یکی انجام میدیم تا تاثیر تغییراتی که دادیم در بوت اعمال بشه:
sudo mkinitcpio -p linux
sudo update-grub

البته اگه دستور اول عمل نکرد و پیام خطا داد، باید اول شماره کرنل لینوکس رو پیدا کنید:
uname -r

مثلا اگه شماره کرنل لینوکس شما 4.7.3 باشه، باید بجای linux بنویسید linux47 و اگر مثلا باشه 4.5.2 باید بنویسید linux45
با این کار، موقع بوت هیییییییچ پیام متنی نشون داده نمیشه. البته این رو در مورد مانجارو استفاده کردم، ممکنه در توزیع های دیگه مسیر فایلها فرق داشته باشه. با یه سرچ ساده میتونید مسیر فایلها رو توی توزیع خودتون پیدا کنید.

اصلاح زیرنویس فارسی در Mplayer

نمیدونم با کدوم آپدیت زیرنویس فارسی در Gnome Mplayer اشتباه نشون داده میشد. یعنی تمام حروف از چپ به راست بودند. مثلا برای سلام مینوشت م‌ا‌ل‌س.
با کمی جست و جو، مشکل با این روش حل شد:

توی تنظیمات Gnome Mplayer ، این عبارت رو در قسمتی که در عکس زیر میبینید وارد میکنیم:
-noflip-hebrew



و در مورد Encoding زیرنویس ها هم که زیاد صحبت شده توی وبلاگ...

نمایش ترجمه در نوتیفیکیشن!

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


برای اینکار این اسکریپت رو در یک فایلی ذخیره کنید:
مثلا gedit ~/Programs/notitrans

با این محتوی:

#!/usr/bin/env bash

####just displays the translation in notify-osd
#notify-send --icon=info "$(xsel -o)" "$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=$(xsel -o | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"

####displays the translation in Zenity
#text="$(xsel -o)"
#translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?#client=gtx&sl=auto&tl=en&dt=t&q=$(echo $text | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"
#echo -e "Original text:" "$text"'\n' > /tmp/notitrans
#echo "Translation:" "$translate" >> /tmp/notitrans
#zenity --text-info --title="Translation" --filename=/tmp/notitrans

####displays the translation in notify-osd and copy to clipboard
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=$(echo $text | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"
echo "$translate" | xclip -selection clipboard
notify-send --icon=info "$text" "$translate"
و بعد به اون مجوز اجرایی بدید:
chmod +x ~/Programs/notitrans
حالا یه کیبورد شورتکات براش تعیین کنید. هر دسکتاپی روش خودش رو برای اینکار داره. در قسمت دستور باید مسیر کامل اسکریپت رو بنویسید.
حالا در هر جایی که باشید اگه واژه یا جمله ای رو انتخاب کنید و شورتکاتی که تعیین کرده بودید بفشارید! معنی اون عبارت در نوتیفیکیشن نشون داده میشه. اما چند نکته:
اول اینکه پر واضحه برای ترجمه به زبانهای دیگه میبایست en رو تغییر بدید. مثلا برای ترجمه از هر زبانی به فرانسه بجای en بذارید fr
دوم اینکه این اسکریپت میشه سه جور باشه. همون طور که در بالا میبینید در خود اسکریپت توضیح داده شده. اولیش ترجمه رو در نوتیفیکیشن نشون میده. دومی در zenity نشون میده و سومی در نوتیفیکیشن نشون میده و بوسیله xclip اون رو در کلیپبورد کپی هم میکنه. بنابراین باید xclip هم نصب داشته باشید. علاوه بر اون xsel هم باید نصب باشه. هرکدوم که مورد نیاز شماست uncomment کنید. یعنی # رو از ابتدای تک تک خطوطش بردارید و بقیه رو comment کنید.

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

برای اینکه یک قسمت از یک فایل ویدیویی رو جدا کنیم خیلی راحت میتونیم از ffmpeg استفاده کنیم. مثلا:
ffmpeg -i /PATH/TO/INPUT.mp4  -vcodec copy -acodec copy -ss 00:02:55 -t 00:01:00 /PATH/TO/OUTPUT.mp4
یعنی از دقیقه ۲ و ثانیه ۵۵ (مقدار سبز) به مدت یک دقیقه (مقدار بنفش)، این تکه از فیلم کات بشه و در فایل مورد نظر ما ذخیره بشه.
به همین راحتی. به همین خوشمزگی.