Archive for the 'לינוקס' Category

השמשה של USB Phone בלינוקס

יש לכם טלפון USB שעובד בווינדוס עם סקייפ ואין לכם מושג איך להפעיל אותו בלינוקס?
נסו לכתוב בטרמינל (terminal\מסוף\Shell או איך שאתם מעדיפים לקרוא לזה): lsusb, יוצא לכם בפלט את השורה הזו?

$ lsusb
...
Bus 006 Device 006: ID 0851:c080 Macronix International Co., Ltd
...

אז כנראה שיש לכם אותה שפורפרת USB כמו שלי, הנה מדריך איך אפשר להשמיש אותה בלינוקס,

קודם קצת פרטים על השפורפרת:
השפורפרת מזוהה ע"י הלינוקס (דביאן) ככרטיס קול וכהתקן HID
בכל שידור מהשפופרת להתקן במחשב /dev/hidraw0 נשלחים 8 בייט, בלחיצה 8 ובשחרור 8.

ונעבור לקצת פרטים על התוכנות שישמשו אותנו:
udev – לענייננו, תוכנה שמנטרת חיבור חומרה למחשב ומאפשרת פעולות עקב אירועי חומרה.
xdotool – לענייננו, תוכנה המאפשרת שליחת מקשים מתוך סקריפטים,
הערה: xdotool עובדת על גבי שרת הX.
sflphone – תוכנת VoIP.

ועכשיו לסקריפט הBASH שישמש אותנו על מנת לקרוא את המידע מהשפורפרת ולהעביר אותו בצורה שמישה,
את הסקריפט נשמור ב: /home/<user>/bin/USB-phone.sh (כמובן לשנות לתיקיית משתמש שלכם)

#!/bin/bash

export DISPLAY=:0;	# ‫בחירת תצוגה לפעילות‪

function update_wid {
	local tmp=( $(wmctrl -l|grep "SFLphone VoIP Client") );	# ‫בחירה בחלון של SFLphone‪
	[[ -n "${tmp[0]}" ]] && opt="--window ${tmp[0]}" || opt="";	# ‫הגדרת המשתנה opt לצורת העבודה בשביל xdotool‪
	echo "update wid: ${tmp[0]}";
}

update_wid;	# ‫עדכון הגדרת חלון או כללי לxdotool‪
speaker="B0";	# ‫משתנה דו מצבי של הרמקול המובנה בשפופרת‪

cat /dev/hidraw0 |
 while read -n1 in[0]; do
for ((i=1;i<=15;i++)); do
	read -n1 in[$i];
done;	# ‫קריאת 16 בייטים, 8 של  לחיצת כפתור ו8 של שחרור כפתור‪

a="$(printf %d \'"${in[0]}")";	# ‫המרת הבייטים הרלוונטיים למספרים דצימליים‪
b="$(printf %d \'"${in[2]}")";	# ‫^^^‪

if [[ "$a" == "0" ]]; then
	if [[ "$b" -le "38" &&  "$b" -ge "30" ]]; then
		xdotool type $opt $((b-29));	# ‫הספרות 1,2,4,5,6,7,8,9‪
	elif [[ "$b" == "0" ]]; then
		xdotool type $opt 3;	# ‫הספרה 3‪
	elif [[ "$b" == "39" ]]; then
                xdotool type $opt 0;	# ‫הספרה 0‪
        elif [[ "$b" == "81" ]]; then
		xdotool key $opt Down;	# ‫כפתור למטה‪
        elif [[ "$b" == "82" ]]; then
                xdotool key $opt Up;	# ‫כפתור למעלה‪
	fi
elif [[ "$a" == "2" ]]; then
	if [[ "$b" == "37" ]]; then
		xdotool keydown SHIFT; xdotool type $opt "*"; xdotool keyup SHIFT;	# ‫כוכבית‪
	elif [[ "$b" == "0" ]]; then
                xdotool keydown SHIFT; xdotool type $opt "#"; xdotool keyup SHIFT;	# ‫סולמית‪
        fi
elif [[ "$a" == "7" ]]; then
        if [[ "$b" == "0" ]]; then	# ‫כפתור C‪
                xdotool key $opt BackSpace; 
        elif [[ "$b" == "4" ]]; then	# ‫כפתור חיוג‪
                xdotool key $opt Return;	# ‫שליחת אנטר‪
        elif [[ "$b" == "11" ]]; then	# ‫כפתור ניתוק‪
                xdotool key $opt Escape;	# ‫שליחת אסקייפ‪
        elif [[ "$b" == "12" ]]; then	# ‫כפתר פונקציות שמאלי‪
                update_wid;	# ‫עדכון הגדרות שליחה לחלון או שליחה כללית‪
	elif [[ "$b" == "22" ]]; then	# ‫כפתור רמקול‪
                echo -e "\x${speaker}" >> /dev/hidraw0	# ‫שליחת משתנה מצב רמקול עכשיוי לשפופרת‪
		[[ "$speaker" == "B0" ]] &&  speaker="AF" || speaker="B0";	# ‫החלפת משתנה מצב רמקול‪
        fi
fi
done



לאחר מכן נוסיף קובץ בשם: /etc/udev/rules.d/026_usb-phone.rules
בו נגדיר את החוק שיגרום להפעלת הסקריפט בחיבור של ההתקן USB Phone שלנו, יש לשנות את <user> למשתמש שלכם:

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", SYSFS{idProduct}=="c080", SYSFS{idVendor}=="0851", MODE="0600", OWNER="<user>" RUN+="/bin/su <user> - -c '/home/<user>/bin/USB-phone.sh %n'"

הסבר מה כתבנו בעצם:
דבר ראשון החוק בודק התקן שזוהה כhidraw (בדיקת שיוויון בKERNEL ובSUBSYSTEM), ושיהיה לו מזהה התקן ספציפי תואם למה שראינו מקודם בlsusb (בדיקת שיוויון בSYSFS),
ואז מתחילים את הפעולות:

MODE="0600"

הרשאות כתיבה וקריאה לבעלים,

OWNER="<user>"

הפיכת המשתמש שבחרתם לבעלי הקובץ של ההתקן,

RUN+="/bin/su <user> - -c '/home/<user>/bin/USB-phone.sh %n'"

הרצה של הסקריפט כמשתמש הנבחר.
עכשיו ננתק ונחבר את הUSB-Phone, והסקריפט אמור לרוץ, כך שכשתלחצו על ספרה היא תשלח לשרת X (או לתוכנה הספציפית).
אם הוא לא רץ נסו לבצע כroot את הפעולה הזו:

/etc/init.d/udev restart

ואם עדיין לא עובד בבקשה דווחו לי וננסה להבין למה.

הסקריפט מוגדר שבהפעלתו הוא יחפש את החלון שכותרתו "SFLphone VoIP Client", אם החלון נמצא הלחיצות על השפורפרת יישלחו כמקשים לחלון זה,
אם החלון לא נמצא, המקשים יישלחו לחלון עם הפוקוס (כמו לחיצות על המקלדת),
אם אתם רוצים שהסקריפט יישלח את המקשים לחלון ספציפי אחר אז שנו בשורה זו לכותרת הרצוייה לכם:

להתעדכן בחדשות משורת הפקודה (bash)

בהמשך לזה וזה, גם אני בפוסט תגובה.

s="$(curl -s http://www.ynet.co.il/Integration/StoryRss1854.xml|iconv -f windows-1255)"; while [[ "$s" =~ ry\>\<title\>([^<]+) ]]; do s=${s/"${BASH_REMATCH[0]}"}; echo ${BASH_REMATCH[1]}; done|fribidi

באגים ידועים:
מכוער.
לא מקודד סימני HTML.

תלויות:
curl
iconv
fribidi – מומלץ, לא הכרחי.

ביטויים רגולריים (regex) בbash

בעבר חיפשתי בגוגל מידע על ביטויים רגולריים – regex בשפת התכנות bash, התוצאות הציעו הצעות מגוונות איך לעשות את זה: grep ,awk ,sed וכדו'… אבל זה עדיין לא bash.

תוצאות אחרות דיברו על אפשרות בסגנון זה:

‎[[ "$var" =~ regex ]]‎

שאומנם נתן משהו מתוך bash אך לא כ"כ הבנתי איך ניתן להשתמש בזה.

לאחרונה חיפשתי שוב, והנה הפתרון שמצאתי:

כדי להכניס טקסט לתוך ביטוי רגולרי מבצעים

[[ "regex" =~ ^re(.*)x$ ]]‎

פעולה זו כאשר הביטוי הרגולרי נמצא תחזיר true ותיצור משתנה מערך: ‎${BASH_REMATCH[*]}‎, אם הביטוי לא יימצא הפעולה תחזיר false.
במערך זה באינדקס 0 יהיה את תוצאת הביטוי הרגולרי שנמצאה ובשאר המשתנים ההתאמות הפנימיות

דוגמה:

‭[[ "testregexexample" =~ st(r.*ex)([ejg]) ]];
echo ${BASH_REMATCH[@]};

יוציא את הפלט: stregexe regex e

testregexexample – תוצאת הביטוי במלואה, נכנסת לאינדקס 0.
testregexexample – התאמה ראשונה, נכנסת לאינדקס 1.
testregexexample – התאמה שנייה, נכנסת לאינדקס 2.


ולסיום, שאלה: האם BASH לא תומך פה בצורה תקינה בקידוד ISO-8859?
בקידוד זה תוצאות שהינם בתווים עבריים (לא בדקתי תווים לא לטיניים אחרים) לא מופעל עליהם באופן תקין regex:

[[ ‎"אבגדה‎" =~ ^‎אבג‎(.*) ]] && echo "${BASH_REMATCH[@]}"

בקידוד UTF-8 מוחזר: "אבגדה דה" – כמו שצריך להיות
בקידוד ISO-8859-8 מוחזר: "אבג"

[[ "‎אבגדה‎" =~ ^א‎.*‎ה‎ ]] && echo "${BASH_REMATCH[@]}" || echo "false"

בקידוד UTF-8 מוחזר: "אבגדה" – כמו שצריך להיות
בקידוד ISO-8859-8 מוחזר: "false"

ההעדפות שלי

אומנם ממני לא ביקשו, אבל גם אותי הנושא מעניין, אז הנה הפירוט:

  • הפצה: מנדריבה (66%) ודביאן (33%)
  • סביבת עבודה: KDE וopenbox עם lxpanel
  • מעבד תמלילים: אופן אופיס
  • נגן מוזיקה:Amarok וmplayer (לא גרפי)
  • נגן וידאו: vlc
  • שפת תכנות: bash
  • דוא"ל: Gmail
  • דפדפן: פיירפוקס
  • חלוקה למחיצות: Gparted

צימצמתי את הרשימה לדברים שנראה לי יותר נוגעים אלי.