Gnu Tips

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

الگوریتم کمک گرفتن در مورد آرچ‌لینوکس

جوامع نرم‌افزار‌های آزاد و مخصوصاً گنو/لینوکس مصداق بارزی از همکاری عمومیه، همه‌ی افراد حاضر در این اجتماعات و گروه‌ها پیشرفت خودشون رو مدیون کمک‌های بی‌چشم داشت بقیه افراد این جامعه هستن. و به نوعی می‌شه گفت این قشر با وجود کمک‌های خودشون سر پا هستن. گذشته از این، عادات خیلی جالبی می‌شه در این اجتماعات دید، مثلاً ممکنه با مشکلی مواجه بشیم که هیچ کس نتونه کمکی بکنه ولی قطعاً خیلیها به نحوه‌ی حل مشکل ما علاقه‌مند خواهند بود.  درسته برای هر مشکلی در هر زمینه‌ای از گنو/لینوکس کسی پیدا می‌شه که برای حل مشکل کمک حال ما باشه ولی برای گرفتن نتیجه‌ی درست تنها سؤال پرسیدن جواب نمی‌ده. متأسفانه در مدرسه به ما یاد داده شده «پرسیدن عیب نیست، ندانستن عیب است» و هیچ کس نگفته که یه جاهایی پرسیدن خودش بزرگترین عیبه. جوامع نرم‌افزار‌های آزاد و به خصوص جوامع گنو/لینوکسی هم جز همین موارد هستن. هیچ کسی دوست نداره وقتش رو با یک سؤال ناشیانه، ناقص یا تکراری تلف کنه ولی در عوض بیشتر افراد دوست دارن حداقل یه دور سؤال جالب رو مطالعه کنن.

کامیونیتی آرچ‌لینوکس به عنوان یکی از فعال‌ترین اجتماعات گنو/لینوکس کارهای خیلی جالبی انجام می‌ده. چند روز پیش توی ویکی آرچ‌لینوکس یه تصویری دیدم که نحوه‌ی برخورد با مشکل و روال تلاش برای حل کردن اون رو به شکل الگوریتم کشیده بود. برای خودم ذخیرش کردم تا هر از گاهی که مشکلات یه خورده زیادی بهم فشار میارن قبل از سؤال پرسیدن یه دور مرورش کنم تا خدای نکرده سؤال ضعیف نپرسم یا وقت کسی رو با یه سؤال چیپ نگیریم. فک کردم به اشتراک گذاشتنش هم خوب باشه. روال به زبان انگلیسی هست ولی ساده و قابل فهمه و نیازی به ترجمه نمی‌بینم. برای رعایت حال دوستانی که اینترنت حجمی یا سرعت پایین دارن عکس رو به صورت بند انگشتی می‌زارم ولی می‌تونید با کلیک روی اون عکس رو در اندازه‌ی واقعی ببینید.

Arch Linux Help Guide

Arch Linux Help Guide

اگر می‌بینید که جایی از روال با چیزی که شما رفتار کردین یا فکر می‌کنید درسته متفاوته پیشنهاد می‌کنم یه نسخه برای خودتون ذخیره داشته باشید. :)

تغییر نام Interface شبکه

زمانی که کرنل لینوکس بوت می‌شه، به هر کارت شبکه بر حسب ترتیبی که اونها رو پیدا می‌کنه یک اسم اختصاص می‌ده (eth0, wlan0 و …). ترتیب شناسایی interface‌ها در کرنل‌های مختلف متفاوت هست بنابراین ممکنه اسامی اونها در ورژن‌های متفاوت تغییر کنه، این کار ممکنه مشکلات زیادی ایجاد کنه و حتی مجبور بشیم جای کابل‌ها رو عوض کنیم ولی راه درست‌تر این هست که ما اسم اینترفیس‌ها رو ثابت نگه داریم یا حتی تغییر بدیم. برای این کار از دستور nameif استفاده می‌کنیم. کار این دستور همین‌طور که گفتم تغییر نام interface‌های شبکه بر اساس آدرس mac‌ اون هست. nameif این کار رو توسط فایلی به اسم mactab که در مسیر etc/‌ قرار داره انجام می‌ده، به طوری که نام جدید به وسیله‌ی آدرس سخت‌افزاری (mac address) برای هر دیوایس مشخص می‌شه. یعنی هر خط این فایل برای یک دیوایس هست که شامل دو فیلد هست، فیلد اوّل نام جدید و فیلد دوّم آدرس mac دیوایس مورد نظر هست. برای مثال من برای ثابت نگه داشتن نام کارت وایرلس لپتاپم از این mactab استفاده می‌کنم:

تا اینجای کار مشکلی وجود نداره ولی این نام فقط تا راه‌اندازی مجدد دوام داره بنابراین بعد از هر راه‌اندازی من نیاز دارم که این دستور رو دوباره اجرا کنم. پس بهتره موقع راه‌اندازی سیستم خودش اجرا بشه. در سیستم‌هایی که از init استفاده می‌کنن میشه به راحتی از فایل rc.local استفاده کرد ولی برای من که آرچم از systemd استفاده می‌کنه بهتره یه سرویس برای جایگزینی این فایل درست کنم. برای این کار چند قدم کافیه:

             قدم اوّل اینه که من فایلم رو با قابلیت اجرا شدن ایجاد کنم و دستوراتی رو که می‌خوام اجرا بشن رو توش بنویسم. پس فایل usr/local/sbin/rc.local/ رو با محتویات زیر ایجاد می‌کنم:

و سطح دسترسیش رو تغییر می‌دم که بتونه اجرا بشه:

            قدم دوّم این هست که یک سرویس برای این فایل بنویسم. پس فایل /etc/systemd/system/rc-local.servis رو با محتویات زیر ایجاد می‌کنم:

            قدم سوّم و قدم نهایی این هست که این سرویس رو فعال کنم تا موقع راه‌اندازی سیستم اجرا بشه:

 از این به بعد وقتی سیستم رو روشن می‌کنم systemd سرویس rc-local رو اجرا می‌کنه و باعث می‌شه دستور nameif اجرا بشه و چون من فایل mactab رو دارم، اسم کارت وایرلسم از هر چیزی که باشه یه wlan0 تغییر پیدا می‌کنه که البته کارت وایرلس من رو هم بر حسب آدرس macش پیدا می‌کنه.

لگو بازی با گنو/لینوکس: لیست دانلود در سه سوت-۲

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

خب توی سایت مکتب‌خونه برای هر مبحث یه صفحه‌ای وجود داره که لیست دروس اون بحث رو نوشته. لینک همه‌ی دروس یکیه با این تفاوت که شماره‌ی هر درس آخر لینک بعد از یه خط تیره نوشته شده.  یعنی اگه درس دینامیک ماشین استاد حسن ظهور مد نظرم باشه لینک درس اوّل می‌شه این:

و لینک درس دوّمشون می‌شه این:

و الی آخر.

البته ناگفته نماند که لینک دانلود هر ویدئو هم توی همون صفحه هست. تعداد درس هر مبحث هم که معلومه. خب پس ایده‌ی کلی این می‌شه که من می‌تونم به راحتی همه‌ی صفحات مربوط به دروس رو دانلود کنم و بعد لینک دانلود رو بکشم بیرون. برای دانلود صفحات کار‌های زیادی می‌شه کرد دوتاشون به صورت زیر هستن.

اوّلی استفاده از حلقه‌ی for به شکل زیر هست:

دوّمی خیلی سر راستره به این شکل:

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

و دوّمی:

و … .

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

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

 

لگو بازی با گنو/لینوکس: لیست دانلود در سه سوت

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

سوت اوّل: سورس صفحه‌ای رو که لینک‌ها رو ارائه می‌ده رو پیدا به شکل یه فایل متنی ذخیره می‌کنم و اسمش رو می‌زارم dirvers-source.txt. محتویات اون شبیه به خطوط زیر هستن:

که همه‌ی لینک‌های مورد نظر شامل کلمه‌ی exe هستن.

سوت دوّم: با دستور زیر لینک‌ها رو از بین عبارت‌های دیگه می‌کشم بیرون و توی فایل متنی دیگه‌ای به اسم links.txt ذخیره می‌کنم.

خروجی این دستور به این شکل هست:

 

قسمت اوّل که معلومه کلیه خطوطی که کلمه‌ی exe رو شامل می‌شن رو پیدا می‌کنم به طوریکه با آپشن i به grep گفتم که از بزرگی و کوچکی حروف صرف نظر کنه.

قسمت دوّم اینکه همه‌ی اون خطوطی از قسمت اوّل رو که شامل کلمه‌ی file هستن رو با استفاده از آپشن v دستور grep نادیده می‌گیرم. خروجی رو به دستور cut انتقال می‌دم.

در قسمت سوّم با استفاده از آپشن d جداکننده‌ی مورد استفاده‌ی دستور cut رو تغییر می‌دم و برابر جفت کوتیشن (quotation mark – “)  می‌زارم و با استفاده از آپشن f بهش می‌گم که فیلد دوّم رو برگردونه.  و در نهایت خروجی رو به فایل متنی مورد نظر با اسم links.txt ارسال می‌کنم.

سوت سوّم و در نهایت با استفاده از دستور wget و آپشن‌های c و i شروع به دانلود می‌کمیم.