لینوکس و من

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

نویسنده : امین | تاریخ: 1395/07/18

در دسکتاپ گنوم، وقتی باتری لپتاپ به مقدار مشخصی برسه، نوتیفیکیشن هشدار داده میشه. اما این نوتیفیکیشن صدا نداره. یکی از دوستان پرسیده بود که چطور میشه کاری کرد که وقتی باتری به درصد خاصی میرسه نوتیفیکیشن همراه با آلارم پخش بشه؟
دو راه برای اینکار هست. یکی اینکه از 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 بسپارید. بازه های زمانی ۶ دقیقه فکر میکنم مناسب باشه.

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

نویسنده : امین | تاریخ: 1395/07/7

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

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




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

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

نویسنده : امین | تاریخ: 1395/07/5

چند وقت پیش در مورد اینکه چطوری یه تیکه از فیلمی رو بوسیله 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 در همون محل فایل اصلی ذخیره میشه.

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

نویسنده : امین | تاریخ: 1395/07/4

وقتی در لینوکس از طریق 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

نویسنده : امین | تاریخ: 1395/06/30

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

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



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

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

نویسنده : امین | تاریخ: 1395/06/19

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


برای اینکار این اسکریپت رو در یک فایلی ذخیره کنید:
مثلا 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

نویسنده : امین | تاریخ: 1395/06/12

برای اینکه یک قسمت از یک فایل ویدیویی رو جدا کنیم خیلی راحت میتونیم از ffmpeg استفاده کنیم. مثلا:

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

از بین بردن نویز صدای هدفون در درایورهای اینتل

نویسنده : امین | تاریخ: 1395/06/8

اینجا در مانجارو وقتی سیستم حالت suspend به resume میاد یک نویز عجیب و بد توی هدفون شنیده میشه. برای اینکه این نویز برطرف شه باید ماژول صدا رو یکبار حذف و دوباره بارگذاری کنیم.
ماژول صدای درایور اینتل snd_hda_intel است. با این دستور این ماژول غیرفعال میشه:
sudo rmmod -f snd_hda_intel

حالا با این دستور میبایست مدل درایور اینتلی که دستگاه شما داره مشخص کنیم:
aplay --list-devices

که یه سری توضیحات میاره و عددی شبیه به ALC668 مد نظر ماست. حالا با این دستور ماژول مجددا به شکل صحیح بارگذاری میشه:
sudo modprobe snd_hda_intel ALC668

اما انجام دادن این پروسه بعد از هر resume باید خودکار انجام بشه. بنابراین میایم یه اسکریپت در مسیر /usr/local/bin/ میسازیم:
sudo nano /usr/local/bin/snd_hda_intel-resume

با این محتوی:

#!/bin/bash
rmmod -f snd_hda_intel && sleep 2 && modprobe snd_hda_intel ALC668


و به اون مجوز اجرایی میدیم. (با chmod +x). اما میتونیم این رو تبدیل به یک سرویس systemd بکنیم که بعد از هر resume بصورت خودکار شروع بشه و ما هیچ دخالتی نداشته باشیم:
sudo nano /etc/systemd/system/snd_hda_intel-resume.service

با این محتوی:

[Unit]
Description=Reloading intel sound module after suspend
After=suspend.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/snd_hda_intel-resume

[Install]
WantedBy=suspend.target
و بعد برای فعال کردن این سرویس:
sudo systemctl enable snd_hda_intel-resume.service

نحوه غیرفعال کردن Guest Account در اوبونتو

نویسنده : امیرعلی | تاریخ: 1395/06/3

حتماً تا به حال به Guest Account در اوبونتو برخوردید و به هر دلیلی فکر کردید که چه خوب می‌شد اگر میتونستم غیرفعالش کنمخوب این همون چیزیه که امروز میخوایم راجع بهش صحبت کنیمبرای غیرفعال کردن اکانت مهمان کافیه فرمان زیر رو در ترمینال وارد کنید:

 sudo gedit /etc/lightdm/lightdm.conf

و خط های زیر رو بهش اضافه کنید:

[SeatDefaults]
user-session=ubuntu 
allow-guest=false

و بعد از ذخیره سازی تغییرات، سرویس lightdm رو ریستارت کنید:

 sudo lightdm restart

حالا حساب مهمان شما غیرفعال شده است و شما میتوانید با زدن Super + L (رفتن به صفحه ی ورود به اکانت) این رو مشاهده کنید.

فعال/غیر فعال کردن تاچ اسکرین در مانجارو

نویسنده : امین | تاریخ: 1395/05/31

سلام!
اگر از لپتاپ هایی استفاده میکنید که مانیتور اونها تاچ هست و گاهی فعال بودن این تاچ باعث دردسر میشه، میتونید به راحتی هر چه تمام فعال یا غیر فعالش کنین! احتمالا غیر فعال بودنش باعث مصرف کمتر باتری هم خواهد شد.

در مانجارو xinput برای مدیریت ورودی های کامپیوتر نصب شده. مثل وبکم، کیبور، ماوس، تاچ پد و ... با اجرای xinput لیستی از این موارد رو میبینید:

[amin@ASUS ~]$ xinput
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Elan Touchpad                               id=12    [slave  pointer  (2)]
⎜   ↳ USBest Technology SiS HID Touch Controller    id=10    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 HD UVC WebCam                        id=11    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=13    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard
همون طور که میبینید تاچ اسکرین لپتاپ با ID شماره 10 مشخص شده که یک چیز ثابتی هست.
حالا با این دستور ها میتونید به راحتی هر کدوم از این ها رو فعال یا غیر فعال کنید:

xinput disable 10
xinput enable 10



اما میشه این عمل رو به یک شورتکات کیبورد نسبت داد. و بصورت toggle درآورد. یعنی با فشردن شورتکات (یا اجرای دستور) چک کنه ببینه اگر تاچ فعاله، غیر فعالش کنه. و اگر غیر فعاله، فعالش کنه.
برای اینکار این رو اجرا کنید تا خرجی شبیه این بگیرید:

[amin@ASUS ~]$ xinput --list-props 10
Device 'USBest Technology SiS HID Touch Controller':
    Device Enabled (138):    0
    Coordinate Transformation Matrix (140):    1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    libinput Calibration Matrix (278):    1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    libinput Calibration Matrix Default (279):    1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    libinput Send Events Modes Available (260):    1, 0
    libinput Send Events Mode Enabled (261):    0, 0
    libinput Send Events Mode Enabled Default (262):    0, 0
    Device Node (263):    "/dev/input/event12"
    Device Product ID (264):    1111, 4300
    libinput Horizonal Scroll Enabled (265):    0
عبارت  Device Enabled (138):    0 مشخص میکنه که اون دیوایس فعاله یا غیر فعال. 0 یعنی غیر فعال. ما از همین در یک اسکریپت استفاده میکنیم:

#!/bin/bash
if [[ $(xinput --list-props 10) == @(*Device Enabled \(138\):    0*) ]]; then
xinput enable 10
else
xinput disable 10
fi
با ذخیره این اسکریپت در یک فایل میتونیم با یک دستور دیوایس مورد نظرمون که اینجا تاچ اسکرین بود فعال و غیر فعال کنیم. و مثلا اون رو با شورت کات Super+F8 اجرا کنیم.

ویرایش جدید:
برای اینکه این اتفاق در حین بوت انجام بشه، باید سراغ systemd بریم. اما چون برای xinput باید Display رو مشخص کنیم باید timer در systemd تعریف کنیم. چون حین بوت هنوز display مشخص نشده. خلاصه... محض یاد آوری خودم..

sudo nano /etc/systemd/system/disable-touch.service

با این محنوی:

[Unit]
Description=Disable Monitor Touch Screen by xinput

[Service]
Type=oneshot
User=amin
Environment=DISPLAY=:0
ExecStart=/usr/bin/xinput disable 10
بجای amin نام کاربری خودتون. و بعد:
sudo nano /etc/systemd/system/disable-touch.timer

با این محتوی:

[Unit]
Description=Runs disable-touch 1min after boot

[Timer]
# Time to wait after booting before activation
OnBootSec=1min
Unit=disable-touch.service

[Install]
WantedBy=multi-user.target
و حالا :
sudo systemctl enable disable-touch.timer

1 2 3 4 5 6 7 ...