Gnu Tips

وبلاگ شخصی وحید معانی

لگو بازی با گنو/لینوکس: کنترل سطح صدای N900 در ترمینال

 

سلام

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

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

هدف: کنترل سطح صدای گوشی (N900) از طریق ترمینال.

چرا: دلیل اصلیش در پستهای آینده ( ;) ) معلوم خواهد شد و فعلاً باید صبر کنید. یه دلیل دیگه می تونه این باشه که دوست ندارم وقتی دارم با ترمینال کار می کنم برای کم و زیاد کردن صدا سوئیچ کنم بیرون و بعد برگردم و دلیل دیگه میتونه این باشه که می خوام و به قول جادی یه ابزار خوب هم دارم: گنو/لینوکس پس می تونم. :)

خوب برای این کار من می گردم ببینم اصلاً می تونم چیزی در مورد این موضوع پیدا کنم که بتونم برای شروع کمکم کنه. [بعد مدتی جستجو]. بله نتایج امیدوار کننده بود. راه حل DBus هست. DBus رو جادی این جوری توضیح میده:

یک مفهوم بسیار جذاب و کاربردی توی گنو/لینوکس ها که توسط ردهت توسعه پیدا کرده و الان همه ازش استفاده می کنن. ایده کار اینه: هر برنامه ای که اجرا می شه اگر بخواد به بقیه هم سرویس بده خودش رو روی دی.باس (اتوبوس دسکتاپ) رجیستر می کنه و اعلام می کنه که یکسری سرویس داده و یکسری قابلیت. بعد بقیه برنامه ها می تونن به همین خط اتوبوس (دی.باس) وصل بشن و از برنامه های متنوع درخواست کارهایی که دارن رو بدن.

یه سری از برنامه هایی که روی گوشی وجود دارن سرویس هاشون رو روی DBus هم ارائه می دن برای دونستن اینها و نحوه ی استفادشون به Jebba/DBus و Phoen_Control رجوع کنید.

توی هر دو لینک به همراه کلی مطلب جذاب دیگه نحوه ی کنترل سطح صدا رو این جوری توضیح دادن که برای دونستن سطح صدای فعلی از این دستور که خروجیش با awk فـیلتر شده استفاده می کنیم:

و  برای تغییر سطح صدای فعلی هم از این دستور:

استفاده می کنیم و به جای عدد ۵۰ آخر سطح دلخواهمون رو وارد می کنیم. ولی منم مثه شما نه می تونم و نه دوست دارن دستورات به این بلندی رو حفظ کنم. پس تصمیم رو می گیرم تا هر دوی اینها رو به شکل یه دستور مفیدتر در بیارم در نتیجه می رم سراغ ایجاد یه شل اسکریپت.

خوب من می خوام اسکریپت رو اجرا کنم و مقدار صدایی رو که می خوام اضافه یا کم کنم رو به عنوان پارامتر بهش بدم و خودش تنظیم کنه. مثلاً من وقتی به عنوان پارامتر نوشتم +۲۰ اون سطح صدا رو ۲۰ تا اضافه کنه یا برای -۱۵ سطح صدا رو ۱۵ تا کم کنه.

برای اینکار باید اسکریپت با استفاده از دستور اوّلی سطح صدا رو پیدا کنه و مقدار اون رو با مقدار پارامتر ورودی جمع/تفریق بزنه و اون رو برای سطح صداست کنه. پس اسکریپت رو این جوری می نویسم:

خب تا اینجا من یه متغیر از نوع اعداد صحیح به نام vol تعریف کردم و در خط سوّم سطح صدای فعلی رو درونش ذخیره کردم. یعنی دستوری که بین دو کاراکتر گراو قرار می گیره اجرا می شه و خروجیش درون منغیر vol ذخیره می شه . در ادامه مقدار اون رو قرار دادم

خب من باید کاراکتر اوّل آرگومان بررسی می کردم تا اگر مثبت هست بنویسم

و اگر منفی هست بنویسم vol=$vol-$1 تازه باید کاراکتر اوّل رو هم ازش جدا می کردم یا کاراکتر و مقدار رو جدا از هم به عنوان پارامترهای جداگانه بنویسم. ولی من به جای اینها می نویسم

که مقدار پارامتر اوّل رو همونجوری که وارد کردم قرار بده و عبارت رو کامل کنه. برای مثال اگر پارامتر رو بزارم +۲۵ عبارت به شکل

و اگر بزارم  -۱۶ عبارت به شکل

در میاد. :)

بعد از بدست آوردن سطح صدای جدید باید با دستوری که بالا بهش اشاره کردیم  اون رو اعمال کنیم پس متغیر vol رو به جای عددی که باید سطح صدا رو مشخص می کنه بزاریم:

این دستور رو هم می زاریم بعد از دستورات قبلی.

تا اینجا تقریباً حله ولی یه مشکل جدید پیش میاد اگر سطح صدای فعلی باید ۷۰ و من بخوام ۵۰ تا دیگه افزایش بدم (با فرض اینکه من سطح فعلی رو نمی دونم) ماکزیمم سطح صدا که همون ۱۰۰ هست اعمال میشه البته تا اینجا مشکلی نیست مشکل وقتی هست که سطح صدا باشه ۳۰ و من بدونه اطلاع از این موضوع بخوام سطح صدا رو ۵۰ تا کم کنم! نخیر اشتباه حدس زدین سطح صدا در یک آن میره روی ۱۰۰ یعنی فاجعه رخ می ده. برای حل این مشکل من می خوام قبل از اعمال سطح صدا اون رو بررسی کنم و اگر منفی بود اون بزارم صفر و اگر بیشتر از ۱۰۰ بود اون رو بزارم ۹۹ تا مثلاً به اسپسکر ها آسیب نزنه. پس ساده هست باید با دوتا دستور if این شرط ها رو بررسی کنم. می نویسم:

من این روش رو debug کردم و در کمال تعجب خطای زیر رو دیدم:

و در یک آن به خطای مفتضح خودم پی بردم و فوری طلب آمرزش کردم. اگر تا چند خط  قبل شما هم مثه من فکر می کردین پیشنهاد می کنم شما هم توبه کنید. توی bash ما از کاراکتر های < و > برای انتقال خروجی و وردی استفاده می کنیم و با دستوری که من نوشتم انگار خواستم $vol از فایلی به اسم صفر ورودی بگیره (!!!) و چون همچین فایلی وجود نداره طبیعی هست که خطا بر می گرده. خب حالا چی کار کنیم برای این مقایسه ها؟ دست به دامن گوگل می شیم و به جدول زیر می رسیم:

و دستور if رو به شکل زیر تصحیح می کنیم:

بله این مشکل هم حل شد و در نهایت با جمع بندی مطالب بالا اسکریپت به شکل زیر در میاد:

توی صفحات مروبط به dbus که بالا لینک دادم دستورات خیلی جالب دیگه ای هم هست که در آینده به اونها هم می رسیم ;)

 

منابع:

لگو بازی با گنو/لینوکس: تلفظ لغات در NOKIA N900.

سلام

زمانی که N900 رو خریدم توی لیست برنامه های که روش نصب کردم دیکشنری هم بود. معروف ترین دیکشنری ها که من دیدم (شایدم دیکشنری دیگه ای وجود نداشته) Mstardict و Qstardict بودن. اوّلا از Qstardict استفاده می کردم ولی چون نمی تونست دیکشنری Oxford Talking رو نشون بده تصمیم گرفتم Mstardict رو نصب کنم. این یکی نسبت به قبلی بهتره ولی هنوز ناقصه. نقصشم این هست که نمی تونه کلمه رو به شکل انسانی تلفظ کنه. من دوست داشتم تلفظ کلمه ای رو که دنبالش می گردم رو به شکل انسانی بشنوم. این عادت بد رو شاید از زمانی که روی سیستم xstardict نصب کرده بودم دارم. xstardict (اگر اسمش درست یادم باشه) یه دیکشنری آزاد بود که تلفظ های انسانی رو به شکل یک بسته توی سایتش گذاشته بود و تنها کاری که باید می کردیم این بود که بعد از دانلود اون رو توی به مسیر خاص اکسترکت می کردیم تا برنامه بتونه خودش از اونها استفاده کنه. امّا متأسفانه بعد ها این پروژه از روی sourceforge پاک شد ولی خوشبختانه من هنوز فایلهای تلفظ برنامه رو روی کامپیوتر داشتم. پس تصمیم گرفتم طی یه حرکت گیک وارانه یه script برای خودم دست و پا کنم تا بتونه کلمه رو از ورودی بگیره و در صورتی که براش تلفظی وجود داشت اون رو پخش کنه.

قدم اوّل این بود که یه سری یه پوشه تلفظ ها بندازم و ببینم ساختارش به چه شکله. نتیجه خوشحال کننده بود:

مسیر حاوی فایلهای تلفظ

نتیجه اوّل این هست که فایل تلفظ هر کلمه همنام خود کلمه هست و کلماتی که با حرف مشابه شروع می شن هم درون یه پوشه جدا گانه قرار دارن مثلاً‌ کلمات abacus و abandon درون یه پوشه به اسم a قرار دارن و کلماتی مثل car و carwash درون یه پوشه یه اسم c. پس برای اینکه من بدونم برای کلمه ی مورد نظر من تلفظ هست کافی پوشه ای که به اسم حرف اوّل کلمه هست رو بگردم.  و نتیجه دوّم این هست که همه فایلهای صوتی در قالب wav هستن.

قدم دوّم این هست که با استفاده از نتایج بالا بتونم فایل تلفظ اون رو در صورت وجود پیدا کنم. برای این کار بعد از گرفتن کلمه از ورودی باید بتونم حرف اوّل اون رو برای رفتن به داخل پوشه ای که فایل تلفظ در صورت وجود داخل اون هست پیدا کنم. برای این کار من از دستور cut و فیلتر کردن اوّلین کاراکتر استفاده می کنم:

فقط کافی هست خروجی این دستور رو داخل یه متغیر ذخیره کنم.

و به جای کلمه word وروری رو بزارم یعنی 1$.  با این حساب  آدرس

به فایل تلفظ کلمه ی مورد نظر من اشاره می کنه. پس قدم سوم اینه که اون رو با یه پخش کننده ی فایلهای صوتی پخشش کنم. من aplay رو انتخاب می کنم. و دستورش رو یه شکل زیر می نویسم:

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

خب تا اینجا هدف ما برآورده شد ولی یه خورده بهتر ترش می کنم. مثلاً اگر تلفظی وجود نداشت می خوام این مسئله رو با من در میون بزاره. برای این کار از دستور if استفاده می کنم تا به طور مستقیم وجود فایل رو بررسی کنه اگر وجود داشت پخش بشه و اگر وجود نداشت یه متن ساده که حاکی از وجود نداشتن فایل تلفظ برای کلمه ی مورد نظر هست رو نشون بده. نتیجه می شه چیزی شبیه به این:

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

تغییرات دیگه ای که من توی کد دادم این هست که ورودی اوّل رو گرفتم تعداد تکرار مورد نظر و ورودی دوّم رو گرفتم کلمه ی مورد نظر. اینجوری برای درخواست های متعدد فقط کلمه رو جایگزین میکنم و لازم نیست کل دستور رو دوباره بنویسم.

من کد رو توی یه فایل bash به اسم say در مسیر /bin/ گذاشتم و دسترسی لازم رو بهش دادم تا هر بار که لازمش دارم چیزی شبیه به دستور زیر رو بزنم:

در این صورت خروجی علاوه بر تکرار ۳باره تلفظ کلمه ی word به شکل زیر خواهد بود:

فایلهای تلفظ رو آپلود کردم روی 4Shared چون هاست خودم فضای چندانی نداره. می تویند از این لینک دریافت استفاده کنید.

google یا لخخلمث ؟

لخخلمث یا googleاین دنت دلیل این پست شد. چون من چند روز پیش این مشکل رو برای خودم تقریباً حل کرده بودم گفتم بهتره توی یک پست منتشر بشه تا شاید برای دوستان هم مفید باشه :)

شرح مشکل: من برای جستجو توی موتور های جستجویی که خود مرورگر (firefox) ساپورت می کنه از keyword ها استفاده می کنم. یعنی به جای اینکه مثلاً‌ گوگل رو باز کنم و توش جستجو کنم keywordی که براش تعریف کردم (برای گوگل google) رو توی آدرس بار می زنم و در ادامش عبارتی که می خوام جستجو کنم. مثلاً می شه:

برای تعریف keyword روی آیکون موتور جستجو توی search bar کلیک کنید و  گزینه ی manage search engines رو از آخر منو انتخاب کنید. در پنجره باز شده موتور مورد نظر رو انتخاب کرده و با استفاده از گزینه edit keyword کلید واژه دلخواهتون رو وارد کنید.

امّا قطعاً شما هم تا به حال بعد از تایپ کلمه مورد نظر متوجه شدین که کیبوردتون روی یه زبان دیگه بوده و باید از اوّل تایپ کنید. مثلاً به جای google بزنید لخخلمث !

راه حل: من موتور گوگل رو دوباره وارد موتورهای مرورگر کردم و اینبار کلیدواژش رو لخخلمث زدم و اگر در تصویر قبلی دقت کنید دوتا موتور گوگل می بینید. حالا من فقط توی آدرس بار می زنم google و برام فرقی نداره که کیبورد روی فارسی باشه یا انگلیسی:

مثلاً می تونم بزنم:

 ولی حالا چطور گوگل رو دوباره وارد لیست موتورها بکنیم. برای اینکار کافی هست افزونه ی «Add to Search Bar» رو از سایت فایرفاکس نصب کنید. بعد از فعال کردن به سایت گوگل رفته و توی search bar کلیک راست کرده و گزینه ی «Add to search bar» رو انتخاب بکنید.

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

پی نوشت: البته این راه حل فقط برای حل مشکل google و لخخلمث هست و بعد از این قسمت شما باید دقت کنید تا عبارت مورد جستجو رو درست وارد کنید.

قطعاً راه حل های دیگه و شاید بهتر هم وجود دارن مثلاً توی این لینک صادق راه حلی ارائه کرده ولی خب این راهی بود که من رفتم و تقریباً راضیم کرده. اگر شما هم راه حلی دارین درمیون بزارید :) .

نصب و فعال سازی افزونه های gnome3 به صورت آنلاین

سلام

کاربرانی که گنوم دارن مخصوصاً نسخه ی ۳ حتماً می دونن که افزونه هایی برای کارکرد بهتر گنوم وجود دارن که می شه نصب و استفادشون کرد ولی احتمالاً تعداد کمتری از اونها می دونن که می شه این افزونه ها رو از سات extensions.gnome.org بدون نیاز به دست به ترمینال شدن نصب، فعال یا غیر فعال کرد. البته این امکان از نسخه ی ۳.۲ گنوم بهش اصافه شده. خب لابد الان یه نگاهی بهش انداختین.

اوّلین بخش که توی سایت نظر آدم رو جلب می کنه بخش افزونه های نصب شده (installed extensions) روی سیستم هست که بلاشک افزونه هایی وجود دارن که شما از نصب اونها روی سیستم خبر نداشتین و فقط استفادشون میکردین، خب از این قسمت میتونید اونها رو فعال، غیر فعال کنید با تنظیماتشون رو تغییر بدین.

دوّمین بخش جذاب هم قسمت افزونه ها هست که می تونید افزونه های جدید رو کشف کنید. وقتی روی افزونه ای کلیک می کنید صفحه ی مختص اون باز میشه و کنار اسمش یک دکمه دو حالته (ON/OFF) ظاهر می شه. 

اگر این دکمه در حالت ON بود یعنی افزونه روی سیستم شما فعال هست و اگر OFF باشه یعنی یا افزونه کلاً نصب نیست یا نصب هست و فعال نیست. در حالت اوّل با تغییر حالتش به ON پیغامی ظاهر می شه و تأییده ی دانلود و نصب افزونه رو می پرسه اگر گزینه ی نصب رو انتخاب کنید بسته به حجم افزونه بعد مدتی افزونه نصب و روی سیستم فعال می شه و می تونید اسم وتنظیمات اون (در صورت وجود) رو در صفحه افزونه های نصب شده ببینید. در حالت دوّم با تغییر وضعیت دکمه افزونه فعال و آماده استفاده می شه.

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

  1. به خاطر اینکه روش استفاده از سایت مثله یک آموزش قدم به قدم توضیح داده نشده.
  2. به خاطر اینکه متأسفانه کاربران ایرانی استفاده از رهنماهای منتشر شده رو یاد نگرفتن که البته بخشیش به خاطر مشکل آشنایی با زبان انگلیسی هست.

بگذریم من اینجا توضیح میدم. اوّل اینکه مطمئن بشین نسخه ای از گنوم که دارین استفاده می کنید ۳.۲ یا بالاتر هست. برای این کار می تونید به بسته های نصب شده روی سیستم یه نگاهی بکنید. مثلاً من برای ubuntu از دستور dpkg و grep استفاده می کنم:

 یا مثلاً با دستور زیر:

اگر مشکل حل نشد مطمئن بشین که افزونه ی «GNOME Shell Integration» روی مرورگرتون نصب هست. اگر از وجود اون هم مطمئن هستید (شدین) و هنوز مشکلتون حل نشده قدم آخر این هست که تنظیمات پراکسی سیستم و مرورگرتون رو چک کنید. این دو گزینه باید مثل هم تنظیم شده باشن. پیشنهاد می کنم اگر دلیل خاصی ندارین از هر دو قسمت تنظیمات پروکسی رو غیر فعال کنید. با این کار مشکلتون حل خواهد شد ولی اگر با انجام هر سه ی این قدمها هنوز مشکل دارین و مطمئن هستید که نیازی به چک کردن دوباره تنظیمات نیست مشکلتون رو به عنوان باگ گزارش بدین تا حل بشه. :)

در آخر یه افزونه ی خوب معرفی می کنم به اسم «Persian Calendar» که کاری از امید هست.Persian Calendar by omid

این افزونه محسنات زیادی از جمله شامل بود رویداد های رسمی تقویم داره. بقیه مشخصات و ویژگیهاش رو در صفحه ی افزونه ببینید.

پی نوشت: اگر به نظرات زیر افزونه توجه کنید مشکل نصب نشدن افزونه رو در میان نظرات خواهید دید. ;)