Gnu Tips

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

طرح بندی مناسب کیبورد سخت افزاری NOKIA N900 برای برنامه نویس ها

سلام

حتماً شما هم با من هم عقیده هستید که تأثیر توانمندی های انجام دهنده کار بیشتر از تأثیر ابزاری هست که استفاده می کنه. امّا ابزار خوب هم با ابزار بد تفاوت های داره!

توی برنامه نویسی هم یکی از این ابزار ها که می شه گفت مهم هست کیبوردی هست که استفاده می شه. البته تأثیرش مستقیم نیست و مثه این می مونه که روی یه صندلی شکسته کد بزنی.

کیبورد سخت افزاری N900 که من استفاده از اون رو به کیبورد مجازی ترجیم میدم یه کیبورد سه ردیفه هست که ردیف های عمودی اون هم درست در راستای هم قرار دارن (برخلاف حالت کیبوردهای PC ها). گذشته از این برخی کاراکترهای مورد نیاز یا نیستن یا دسترسی بهشون یه خورده سخت هست. همه این موارد باعث میشه هنگام کد زدن یه خورده آدم احساس ناراحتی بکنه. خب یه گیک ناراحت مثه یه تفنگ پر می مونه که دنبال یه نشونه خوب برای خالی کردن خودش می گرده. این شد که منم تصمیم گرفتم کیبورد رو بر اساس راحتی خودم اصلاح کنم. (سؤال: مگه می شه؟) بله که می شه، چرا که نشه. (خودتون جریان گنو/لینوکس و ابزار خوب و … رو یاد آوری کنید برا خودتون.)

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

کیبورد رو من چندین بار بانگاشت کردم ولی میشه گفت نسخه ی امروزی ورژن یک هست که منتشر می کنم. ویژگی های این بازنگاشت عبارتند از :

  1. هیچ کاراکتری جابجا نشده و همونطوری که روی کیبورد نشون میده می تونید استفاده کنید. و فقط چند کاراکتر اضافه شده.
  2. کلید های F1 تا F12 رو می تونید با فشار دادن همزمان کلید های Fn و Shift به همراه شماره مورد نظر داشته باشید.
  3. Tab رو می تونید با فشردن همزمان کلید Fn با دکمه ی BackSpace تایپ کنید.
  4. Escape رو می تونید با فشردن همزمان کلید Fn و دکمه ی Enter داشته باشید.
  5. دکمه های Page Up و Page Down رو می تونید با فشردن کلید Fn به همراه دکمه های UP و DOWN داشته باشید.
  6. دکمه های Home و End رو می تونید با فشردن کلید Fn به همراه دکمه های Left و Right داشته باشید.
  7. ترکیبات Shift+Fn با دکمه های z, x, و s خالی هستن.
  8. بقیه کاراکتر ها از الگوی زیر پیروی میکنن:

NOKIA N900 Hardware Keyboard Layout for Programmers

NOKIA N900 Hardware Keyboard Layout for Programmers.

و امّا می تونید این بازنگاشت رو از صفحه github اون دریافت و استفاده کنید. :)

لگو بازی با گنو/لینوکس: محافظت از عکس های گرفته شده با گوشی (NOKIA N900)

سلام
از وقتی اوّلین گوشی تلفن همراه به دوربین مجهز شد تشنگان تکنولوژی با عطش سیری ناپذیرشون باعث رواج هر چه بیشتر این قسمت روی تلفن های همراه شدند به طوری کمتر گوشی تلفن همراهی می تونید پیدا کنید که دوربین نداشته باشه این عطش تا حدی بود که کیفیت دوربین به یکی از ملاکهای سنجش گوشی ها تبدیل شد. خب طبیعی هم هست که هر ابزار مفیدی یک جنبه ی بد هم داره. مثلاً همین عکس هایی که توی جمع های خانوادگی، دوستانه، کاری و … گرفته می شه امکان داره با گم یا دزدیده شدن گوشی تلفن همراه دردسر ساز باشه و حریم خصوصی افراد رو نقض کنه. برای جلوگیری از این امر هر کسی یک راهی برای خودش می سازه. مثلاً هستن کسانی که از دوربین تلفن همراهشون استفاده نمی کنن یا افرادی که بعد از گم یا دزدیده شدن تلفنشون به فکر می افتن یا کسانی که با استفاده از برنامه هایی که برای مدل گوشی اونها منتشر شده هر چند روز یک بار عکس های جدید گرفته شده رو پنهان می کنن تا در اوّلین فرصت از روی گوشی بردارن، هر چند اعتماد به فردی که نمی شناسیش در برخی اوقات خیلی سخته.
من هم دوست ندارم عکس هایی که می گیرم در دسترس همه قرار داشته باشه. پس یه مسئله تعریف می کنم:
مسئله: چه کاری می تونم بکنم تا عکس هام رو کسی بدون اجازه ی من نبینه؟

دو تا راه حل دارم: راه حل اوّل و راه حل دوّم. ( :))‌ )

راه حل اوّل: می دونم هر عکسی که در حافظه ی داخلی یا خارجی N900 ذخیره می شه در قسمت Photos اون قابل مشاهده هست، این کار توسط یه برنامه ای به اسم tracker داخل گوشی انجام میشه. من میتونم با ویرایش فایل کانفیگ اون ورود این برنامه به پوشه ای که عکس های دوربین توش ذخیره می شن رو منع کنم تا در قسمت Photos دیده نشن. خب راه حل چندان خوبی نیست به دو دلیل. اوّل اینکه عکس ها همچنان از طریق فایل منیجر فابل دسترس هستن. دوّم اینکه من اعتمادی به این tracker ندارم. یعنی زیاد اطمینان بهش ندارم که کی اجرا می شه و کی نمیشه! هر چند همون دلیل اوّل کافی بود تا من روی این راه حل خط بکشم. پس راه حل اوّل.

راه حل دوّم: می دونم در سیستم گنو/لینوکس هر فایل یا پوشه ای که اسمش با نقطه (. – dot) شروع بشه در فایل منیجر نشون داده نمی شه حتی هنگام لیست گیری فایل ها تو ترمینال برای دیدنشون باید از آپشن های a یا A (با هم فرق دارن) استفاده کنیم. خب tracker گوشی هم به فایل ها و پوشه های مخفی دسترسی نداره. پس من میتونم یه اسکریپت بنویسم که به همین روش عکس هام رو مخفی کنه. حالا فقط یه مسئله می مونه، اونم اجرای دستی اسکریپت هست. این مشکل رو چند روز پیش حل کردیم. یادتون نیست؟ «نصب fcron در نوکیا N900 – پیشنیاز اسکریپت های آینده.»

به نظر راه حل قابل اجرا و خوبی میاد پس میرم تو نخش.

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

 در حافظه ی داخلی یا خارجی ذخیره می شن. اسم هر عکس تشکیل شده از تاریخ گرفتن عکس و شماره عکس گرفته شده. یه چیزی مثه این:

هر چند فکر نمی کنم تا این حد لازم باشه. یعنی لازم نیست تک تک عکس ها رو با تغییر نام مخفی کنم، کافیه عکس ها رو به یه پوشه ی مخفی انتقال بدم :) (مثه شنل نامرئی کننده ی هری پاتر D: )

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

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

این کار رو می تونم به روش های مختلفی انجام بدم ولی به نظر راحتترین کار این باشه که تعداد فایلهای داخل این مسیرها رو بشمارم و هر کدوم که مقداری غیر از صفر بود یعنی فایلی داخلش هست که باید مخفی بشه. این کار رو هم می تونم با شمارش تعداد خط های دستور ls انجام بدم پس به دستور wc با آپشن l  نیاز داریم (می شه گفت wc کوتاه شده ی عبارت Word Count هست که کارش شمارش تعداد کلمات هست که با آپشن l یه تغییر کاربری کوچیک می ده و تعداد خطوط مش شمره.) که ورودیش از طریق پایپ از ls می گیره. به شکل زیر:

درسته که این دستور جواب گوی نیاز ما بود ولی خیلی تمیز کار نمی کنه چون دستور ls در برخی موارد در هر خط چند فایل رو نشون میده و نتیجه دستور ما تعداد درست رو نشون نمی ده. برای حل مشکل دستور ls یه آپشن به اسم 1 داره که به هر ls می گه هر فایل/پوشه رو در یک سطر بنویسم:

در نهایت اسکریپت به این شکل در میاد:

فکر نمی کنم لازم به توضیح بیشتر در مورد اسکریپت باشه مخصوصاً سطرهایی که رنگیشون کردم ;)

خب تا اینجا فقط اسکریپت رو نوشتم و هنوز لازم هست که اسکریپت رو دستی اجرا کنم. پس job اون رو به Fcron اضافه می کنم تا به صورت خودکار اجرا بشه. چیزی که نوشتم این بود:

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

اسکریپت جای آپیدتهای خیلی خوبی داره. مثلاً می تونیم کاری کنیم که علاوه بر مخفی کردن انکریپت هم بکنه! یا مثلاً به جای این که هر ساعت وجود عکس رو چک بکنه وقتی که پوشش لنز باز و بسته شد کارش رو انجام بده. البته برای این مورد کار زیادی باید انجام بدم چون هنوز با dbus به یک راه حل مصالمت آمیز نرسیدیم!

خوش باشید ;)

 

 

لگو بازی با گنو/لینوکس:‌ تلفظ کامل یک جمله

سلام

خب تقریباً یک ماه پیش بود که پست «لگو بازی با گنو/لینوکس: تلفظ لغات در NOKIA N900.» رو ارسال کردم و یاد گرفتیم که چطور این کار رو انجام بدیم. ولی خب یه چند تا راه برای گسترش و بهتر کردنش وجود داره و توی این پست می خوایم اینا رو بررسی کنیم.

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

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

خب حالا نظرم عوض شده (اگر اشتباه نکنم این مورد رو شاهین توی یه گفتگوی اینترنتی برام یادآوری کرد. ممنون ازش :)‌ ) و می خوام اگر فایل تلفظی برای کلمه ای وجود نداشت espeak اون رو تلفظ کنه پس فقط کافیه قسمت else دستور if رو تغییر بدم و به جای چاپ متن دستور espeak رو با ورودی همون کلمه (آرگومان) بنویسم. پس فقط همون خط رو عوض  می کنم و اسکریپت به این شکل میشه:

خب تا این  جا به جز یه مورد همه چی خوبه, اون یه مورد هم این هست که من چرا آخر دستور نوشتم

دستور espeak هنگام کار خروجی هایی داره (error/output)  که برای ما لازم نیستن و فقط ترمینال رو شلوغ می کنن و من با اضافه کردن این دستور خواستم همه ی standard streams رو یک جا به فایل

 ارسال کردم. برای اینکه با standard streams آشنا بشین می تونید به اینجا و اینجا مراجعه کنید.

‏‫‫‫‫دوّمین مورد:این مورد هم با دیدن نظر شاهین در پست قبل (که در بالا لینک دادم) به ذهنم رسید. (یعنی اوّلش فکر کردم منظورش این هست ولی بعداً باهاش صحبت کردم و دیدم این نبود:D ) یعنی بتونیم کل یه جمله رو تلفظ کنیم. کار سختی نیست ما که هر کلمه ای رو تونستیم با آخرین آپدیت (اسکریپت بالا) تلفظ کنیم هر جمله هم از تعدادی کلمه تشکیل شده که بینشون یک فاصله قرار گرفته پس فقط کافیه کلمات یک جمله رو هم یکی یکی و پشت سر هم تلفظ کنیم. تنها مشکل سر راهمون این هست که بتونیم کلمات یک جمله رو بدست بیاریم، لابد الان تو فکرتون هست که یه برنامه بنویسم و که همه ی کاراکترهای ورودی رو بررسی کنه تا اگر فاصله (space) بود اون رو به سبب بک کلمه بودن جدا کنه!! من می گم این کار لازم نیست خوبی شل اسکریپت هم اینه که اگر کل جمله رو از ورودی به اسکریپت بدیم هر کلمه یک آرگومان حساب میشه (البته دلیل اصلیش IFS هست!!) یعنی جدا از بقیه. و خب من می تونم تمامی آرگومان ها رو توی یک آرایه ذخیره کنم و یکی یکی تلفظشون کنم. (البته من همین اسکریپت رو تغییر ‫‏میدم.) برای ایجاد آرایه مثل تعریف متغیرها عمل می کنیم با این تفاوت که آپشن a رو به دستور declare اضافه می کنیم تا متوجه بشه که این متغیر یه آرایه هست.

 خب میدونیم که عبارت

 به همه ی آرگومان ها اشاره می کنه پس من اگر آرایه ای رو که تعریف کردم به شکل زیر مقدار دهی کنم هر آرگومان داخل یکی از خانه های آرایه قرار می گیره (و دنبال کردن خانه های آرایه به راحتی با حلقه امکان پذیره):

گفتیم حلقه! می خوام از حلقه ی for استفاده کنم که شمارندش از ۱ شروع می شه و تا… و تا … راستی حلقه تا کجا باید ادامه پیدا کنه؟ خب می دونیم که تعداد کلمات جمله ثابت نیست و این رو می دونیم که همه ی کلمات داخل آرایه قرار گرفتن پس میشه طول آرایه رو بررسی کرد یا مثلاً چون گفتنم هر کلمه یک آرگومان حساب شده پس تعداد آرگومانها همون تعداد کلمات خواهد بود. آره این راححتره. تعداد آرگومان رو همیشه می شه از طریق مقدار

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

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

اجراش می کنیم و به به . موقع امتحان جملات و لذت بردن از دستاوردمون Oooops! یه مشکل! وقتی کلمه ای رو با یک با بیشتر حرف بزرگ تایپ می کنیم کلمه از طریق espeak تلفظ می شه! مشکل اینجاست که یادمون رفته بود که گنو/لینوکس case sensitive هست. یعنی اینکه به حروف کوچک و بزرگ حساس هست یعنی براش hello با Hello و … فرق داره! یعنی باید کل جمله رو با حروف کوچک بنویسیم ولی خیلی بده کاربر رو محدود کنیم و بهش بگین این کارو بکن یا نکن ناسلامتی داریم از آزادی حرف می زنیم!! پس باید بزاریم کاربر جلو ترمینال وقتی داری با اسکریپت کار می کنه جولان بده و ما خودمون ورودی رو به شکل درست تبدیل کنیم. پس یه صورت مسئله ی جدید می نویسیم: «چطوری ورودی رو به حروف کوچک تبدیل کنیم؟» جوابش سخت نیست، یه دستوری داریم به اسم tr که می تونه کار مورد نظر ما رو انجام بده. (یه نگاهی به man اش بندازین!)  شکلش به این صورت هست:

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

فکر میکنم به اندازه ی کافی گویا باشه تا نیازی به توضیح نداشته باشه.

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

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

نصب fcron در نوکیا N900 – پیشنیاز اسکریپت های آینده.

سلام

یه مدت بود نبودم به دلیل گرفتاری ها ولی خب بی کار نبودم.

بحث امروزمون هم در مورد نصب fcron در tablet phone نوکیا N900 هست. حالا چرا من گیر دادم به گوشیم بحث مفصله اگر خیلی نگرانید یادم بندازید بعداً توضیح می دم. درمورد اینکه چرا fcron رو نصب می کنم چون لازم دارم که یه تعداد از اسکریپت هام سر یه وقت معین اجرا بشن و در پست های آینده بیشتر در موردش بحث خواهیم کرد. بله می دونم توی پست قبلی هم به پست های بعدی ارجاع داده بودم و باید بگم که اون پروژه گسترش پیدا کرده و هنوز کار داره و بعد از اتمام حتماً پست معرفی و … می زنم.

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

۱. این هست که پیش نیاز های اون رو نصب می کنیم. بسته های که من بهشون نیاز پیدا کردم اینها بودن:

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

۲. سورس کد رو از سایت رسمی برنامه دانلود می کنیم. این کار رو از این آدرس انجام میدیم. از قسمت download بسته fcron-3.0.6.src.tar.gz رو دانلود کرده و در جایی از گوشی ذخیره کنیم.

۳. محتویات فایل رو استخراج می کنیم. چون فایل tar.gz هست به این شکل عمل می کنیم:

حالا باید پوشه این به اسم fcron-3.0.6 در همون مسیر داشته باشیم.

نکته: برای انجام مراحل بعد باید این پوشه در مسیری قرار داشته باشد که امکان اجرای برنامه روی اون وجود داشته باشه. یعنی باید مسیری غیر از /home/user/MyDocs/ باشد. چون این پارتیشن از نوع fat هست و در این نوع پارتیشن ها امکان تغییر پرمیشن و اجرای برنامه وجود نداره. من برای انجام این کار کارت حافظه ی جانبی رو به شکل ext2 قالب بندی (format) کردم و این گونه کارهام رو روی اون انجام می دم. اگر امکان همچین کاری برای شما وجود نداره می تونید از خود مسیر /home/user/ استفاده کنید.

۴. پرمیشن فایل configure و تمام فایلهای موجود در مسیر scripts رو تغییر می دیم و دسترسی اجرایی بهشون می دیم:

۵. دستور configure رو اجرا می کنیم.

۶. دستور make و در ادامه دستور make install رو با سطح کاربری root اجرا می کنیم.

۷. حالا fcron کامل نصب شده، کاربرش اضافه شده و کاری که ما باید انجام بدیم این هست که کاربر و گروه fcron رو به مسیر /var/spool/fcron/  اختصاص بدیم:

در این لحظه کار نصب تموم شد و باید اسکریپت هامون سر ساعت اجرا بشن. امّا نه اجرا نمی شن!

[بعد از مدتی] مشکل این هست که با دستور

خود fcron اجرا نمی شه. امّا به چه دلیل؟ [بعد از چند دقیقه] آها دلیلش این هست که داخل این فایل مسیر دستور fcron اشتباه وارد شده و باید دستی ویرایش کنیم. اگر شما هم این مشکل رو دارین به این شکل حل می کنیم. ابتدا خروجی دستور زیر رو پیدا می کنیم:

فایل

رو ویرایش کرده و در خط ۱۵ مقدار متغیر DAEMON رو به خروجی دستور قبل تغییر می دیم، تغییرات رو ذخیره می کنیم. در این حالت وقتی دستور

رو اجرا کردیم باید fcron اجرا بشه یعنی خروجی دستور

باید چیزی شبیه به این باشه:

تبریک می گم نصب تمام شد. :)