لگو بازی با گنو/لینوکس: محافظت از عکس های گرفته شده با گوشی (NOKIA N900)
توسط: vahit
سلام
از وقتی اوّلین گوشی تلفن همراه به دوربین مجهز شد تشنگان تکنولوژی با عطش سیری ناپذیرشون باعث رواج هر چه بیشتر این قسمت روی تلفن های همراه شدند به طوری کمتر گوشی تلفن همراهی می تونید پیدا کنید که دوربین نداشته باشه این عطش تا حدی بود که کیفیت دوربین به یکی از ملاکهای سنجش گوشی ها تبدیل شد. خب طبیعی هم هست که هر ابزار مفیدی یک جنبه ی بد هم داره. مثلاً همین عکس هایی که توی جمع های خانوادگی، دوستانه، کاری و … گرفته می شه امکان داره با گم یا دزدیده شدن گوشی تلفن همراه دردسر ساز باشه و حریم خصوصی افراد رو نقض کنه. برای جلوگیری از این امر هر کسی یک راهی برای خودش می سازه. مثلاً هستن کسانی که از دوربین تلفن همراهشون استفاده نمی کنن یا افرادی که بعد از گم یا دزدیده شدن تلفنشون به فکر می افتن یا کسانی که با استفاده از برنامه هایی که برای مدل گوشی اونها منتشر شده هر چند روز یک بار عکس های جدید گرفته شده رو پنهان می کنن تا در اوّلین فرصت از روی گوشی بردارن، هر چند اعتماد به فردی که نمی شناسیش در برخی اوقات خیلی سخته.
من هم دوست ندارم عکس هایی که می گیرم در دسترس همه قرار داشته باشه. پس یه مسئله تعریف می کنم:
مسئله: چه کاری می تونم بکنم تا عکس هام رو کسی بدون اجازه ی من نبینه؟
دو تا راه حل دارم: راه حل اوّل و راه حل دوّم. ( :)) )
راه حل اوّل: می دونم هر عکسی که در حافظه ی داخلی یا خارجی N900 ذخیره می شه در قسمت Photos اون قابل مشاهده هست، این کار توسط یه برنامه ای به اسم tracker داخل گوشی انجام میشه. من میتونم با ویرایش فایل کانفیگ اون ورود این برنامه به پوشه ای که عکس های دوربین توش ذخیره می شن رو منع کنم تا در قسمت Photos دیده نشن. خب راه حل چندان خوبی نیست به دو دلیل. اوّل اینکه عکس ها همچنان از طریق فایل منیجر فابل دسترس هستن. دوّم اینکه من اعتمادی به این tracker ندارم. یعنی زیاد اطمینان بهش ندارم که کی اجرا می شه و کی نمیشه! هر چند همون دلیل اوّل کافی بود تا من روی این راه حل خط بکشم. پس راه حل اوّل.
راه حل دوّم: می دونم در سیستم گنو/لینوکس هر فایل یا پوشه ای که اسمش با نقطه (. – dot) شروع بشه در فایل منیجر نشون داده نمی شه حتی هنگام لیست گیری فایل ها تو ترمینال برای دیدنشون باید از آپشن های a یا A (با هم فرق دارن) استفاده کنیم. خب tracker گوشی هم به فایل ها و پوشه های مخفی دسترسی نداره. پس من میتونم یه اسکریپت بنویسم که به همین روش عکس هام رو مخفی کنه. حالا فقط یه مسئله می مونه، اونم اجرای دستی اسکریپت هست. این مشکل رو چند روز پیش حل کردیم. یادتون نیست؟ «نصب fcron در نوکیا N900 – پیشنیاز اسکریپت های آینده.»
به نظر راه حل قابل اجرا و خوبی میاد پس میرم تو نخش.
خب می دونم که عکس های گرفته شده با دوربین در پوشه ای به اسم
1 |
.dcim |
در حافظه ی داخلی یا خارجی ذخیره می شن. اسم هر عکس تشکیل شده از تاریخ گرفتن عکس و شماره عکس گرفته شده. یه چیزی مثه این:
1 |
20120921_002.jpg |
هر چند فکر نمی کنم تا این حد لازم باشه. یعنی لازم نیست تک تک عکس ها رو با تغییر نام مخفی کنم، کافیه عکس ها رو به یه پوشه ی مخفی انتقال بدم :) (مثه شنل نامرئی کننده ی هری پاتر D: )
خب پس من لازم دارم یه پوشه ی مخفی داشته باشم که عکس ها رو اونجا مخفی کنم. این پوشه می تونه هر جایی که من می خوام باشه. حافظه ی داخلی یا خارجی (هر کدوم مزایا و معایب خودشون رو دارن).
تا اینجا مشکلی نداریم و می تونیم به راحتی با دستور mv محتویات یک پوشه رو به پوشه ی دیگری انتقال بدیم ولی مسئله اینه که من دوست دارم وقتی عکسی ندارم دیگه هیچ تلاشی برای انتقال فایل های نداشتم انجام نگیره پس لازم هست چک کنم ببینم فایل داخل مسیر های زیر که مسیر پیش فرض ذخیره عکس های دوربین هستن وجود داره یا نه:
1 2 |
/home/user/MyDocs/.dcim /media/mmc1/.dcim |
این کار رو می تونم به روش های مختلفی انجام بدم ولی به نظر راحتترین کار این باشه که تعداد فایلهای داخل این مسیرها رو بشمارم و هر کدوم که مقداری غیر از صفر بود یعنی فایلی داخلش هست که باید مخفی بشه. این کار رو هم می تونم با شمارش تعداد خط های دستور ls انجام بدم پس به دستور wc با آپشن l نیاز داریم (می شه گفت wc کوتاه شده ی عبارت Word Count هست که کارش شمارش تعداد کلمات هست که با آپشن l یه تغییر کاربری کوچیک می ده و تعداد خطوط مش شمره.) که ورودیش از طریق پایپ از ls می گیره. به شکل زیر:
1 |
ls | wc -l |
درسته که این دستور جواب گوی نیاز ما بود ولی خیلی تمیز کار نمی کنه چون دستور ls در برخی موارد در هر خط چند فایل رو نشون میده و نتیجه دستور ما تعداد درست رو نشون نمی ده. برای حل مشکل دستور ls یه آپشن به اسم 1 داره که به هر ls می گه هر فایل/پوشه رو در یک سطر بنویسم:
1 |
ls -1 | wc -l |
در نهایت اسکریپت به این شکل در میاد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/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 اضافه می کنم تا به صورت خودکار اجرا بشه. چیزی که نوشتم این بود:
1 |
0 * * * * /bin/camera |
چون دوست دارم سر هر ساعت اجرا بشه و وظیفه ی خطیرش رو انجام بده. البته این قسمت یکی از نقاط قوت اسکریپت من می شه چون فکر نمی کنم برنامه ای تا این حد آزادی به کاربر بده و اجازه بده زمان اجراش رو کنترل کنه :)
اسکریپت جای آپیدتهای خیلی خوبی داره. مثلاً می تونیم کاری کنیم که علاوه بر مخفی کردن انکریپت هم بکنه! یا مثلاً به جای این که هر ساعت وجود عکس رو چک بکنه وقتی که پوشش لنز باز و بسته شد کارش رو انجام بده. البته برای این مورد کار زیادی باید انجام بدم چون هنوز با dbus به یک راه حل مصالمت آمیز نرسیدیم!
خوش باشید ;)
ایده جالبیه! حیف که من گوشی ندارم که باهاش بشه از این کارا کرد. ولی عوضش عقدمو تو کامپیوترم خالی میکنم! نصف فایلای استارتآپم فقط اسکریپتهایی هستن که از سر تنبلی ساخته شدن!
[…] […]