منبع اصلی نوشتار زیر در این لینک قرار دارد

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

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

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

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

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

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

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

.dcim

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

20120921_002.jpg

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

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

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

/home/user/MyDocs/.dcim
/media/mmc1/.dcim

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

ls | wc -l

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

ls -1 | wc -l

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

#!/bin/bash

count1=`ls -l /media/mmc1/DCIM | wc -l`
count2=`ls -l /home/user/MyDocs/DCIM | wc -l`

DIR1=/media/mmc1/DCIM/
DIR2=/home/user/MyDocs/DCIM/
DIR4=/home/user/MyDocs/personalfiles/.dcim
if [ $count1 != 0 ] ; then
`mv $DIR1* $DIR4` ;
say 1 okay
elif [ $count2 != 0 ] ; then
mv $DIR2* $DIR4;
say 1 okay;
else
say 1 nothing;
fi
exit 0

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

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

0 * * * * /bin/camera

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

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

خوش باشید ;)

 

 



برچسب ها : , , , , , ,

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

به اين صفحه امتياز دهيد