چند روز پیش مطلبی در لینوکس ریویو منتشر کردیم با این عنوان: «ایمکس را در ده سال یاد بگیریم». با دیدن بازخوردهای مطلب و پرسیده شدن این سوال که اصلا چرا نیاز داریم با وجود IDEهایی نظیر Codeblocks از ایمکس استفاده کنیم؟ (و اشراف کامل به این بحث که ایمکس اصلا یک IDE نیست و در عین حال همان چیزی است که شما میخواهید) دوباره بحث قدیمیای به یادم آمد که ترجیح میدهم برای آخرین بار آن را در قالب این متن بیان کنم (تا خیال خودم را از این بابت راحت کرده باشم ;-))
دوباره همان بحث خسته کنندهی لینوکس بهتر است یا ویندوز در اینجا هم صدق میکند، اما بعضی ممکن است مایی که دوست داریم در عمق پیچیدگیهای ابزارهایمان سادگیاش را کشف کنیم به مخترعین دوبارهی چرخ متهم کنند! صبر کنید دیدمان را یک مرحله عقبتر ببریم. و سپس با طرح چند مساله ابزارهای دم دستمان را به چالش بکشیم.
قرار است ما از دید فردی به مساله نگاه کنیم که معتقد است دنیای کامپیوتر، دنیای پر سرعتی است و مسائلی که با آن روبرو میشود، با توجه به گذشت زمان در پیچیدگیشان و کیفیتشان بسیار تغییر پذیرند. پس با این حساب باید ابزارهایی را برای حل مسائلمان انتخاب کنیم که این قابلیت انعطاف را به ما بدهند تا در کمترین زمان ممکن امکان دسترسی به محیط لازم برای حل مساله جدید، آن هم در هر مکان و هر زمان را در اختیار داشته باشیم. حالا ممکن است این سوال پیش بیاید که آیا به هر قیمتی (مانند کنار گذاشتن تمامی دانستههایی که با ۱۰ سال صرف وقت پای ویندوز به دست آوردهاید تا به لینوکس مهاجرت کنید) باید چنین ابزارهایی را برگزید؟ جواب من قاطعانه «بله» است! حداقل به نظر من فردی میتواند در زمینهی کاریاش موفق باشد که قدرت ریسک کردن داشته باشد.
همین الان هم دوستان نزدیکم به من خرده میگیرند که چرا وقتی همه در اطرافم به قولی ویندوزیاند از لینوکس استفاده میکنم؟ چرا وقتی C# اینقدر آسان است و پولساز (حداقل در جامعهی اطراف من) باز هم آن را انتخاب نمیکنم؟ جواب ساده است، این که شاید من دید متفاوتی نسبت به آنها دارم. ببینید نمیخواهم بحث را طولانی کنم، ولی همین الان تنها و تنها یک سوپر کامپیوتر در دنیا از ۵۰۰ تای برترشان ویندوزی است (حالا درست که ما به آنها دسترسی نداریم و من کاربر هرگز چنان اعمال پیچیدهای را انجام نخواهم داد). این جدای از نشان دادن قدرت لینوکس قابلیت انعطاف آن را نشانمان میدهد. این همه از انعطاف صحبت کردیم، بگذارید با ذکر چند مساله منظورم را از این عبارت بیشتر توضیح بدهم:
ابزارهای ساده، کوچک ولی قدرتمند:
سه قانون از زیباترین قوانینی که به نظرم از فلسفهی یونیکس به گنو/لینوکس منتقل شده، اینها هستند:
- برنامهای بنویس که یک کار انجام دهد و آن را درست انجام دهد.
- برنامهها را طوری بنویس که بتوان آنها را با هم ترکیب کرد.
- همه چیز را به صورت فایل بنویس!
حتما دیدهاید کاربرانی را که با لینوکس کار میکنند و شدیدا به آن پایبندند، ولی هنوز از خط فرمان آن میترسند. خط فرمان ممکن است ظاهری سرد را ارائه کند که بسیاری از برنامه نویسان فعلی ترجیح دهند از آن دوری کنند. ولی من میخواهم مسالهای را در خط فرمان در عرض چند دقیقه حل کنم آن هم بدون دانش برنامه نویسی، که یک برنامه نویس قهار ترسان از خط فرمان باید در حدود چند ساعتی وقت صرف آن کند. حالا با هم ببینیم که این مساله چیست:
صفحهای حاوی دویست لینک به صفحات داخلیتر داریم که در هر کدام از این دویست صفحه یک لینک ویدئوی یوتیوب موجود است که من قصد دانلود تمام این ویدئوها را دارم. (دلیل طرح این مساله این است که خودم با آن دست و پنجه نرم کردهام)
خوب کار آسان این است که یک دانلودر یوتیوب داشته باشم، که خوب من الان نمونهای مناسب این کار نمیشناسم (youtube-dl هست ولی خوب مشکل اینجاست که تنها جایی که آرشیو ویدئوهای مورد نظرم مرتب شده در این صفحات مورد هدف است نه در صفحهی یوتوب مربوطه) و کار سخت این که تک تک لینکها را به صورت دستی از صفحات استخراج کنم و در فایلی قرار دهم و این را به youtube-dl بدهم!
همانطور که میبینید کاری باور نکردنی و سخت خواهد بود، اینجاست که ابزارهای خط فرمانی که در ظاهر سخت هستند، مسالهای با این پیچیدگی را برایمان آسان میکنن (از این پیچیدهتر هم همینقدر آسان میکنند البته ;-)). پس اول تمامی صفحات حاوی لینک را با wget به صورت زیر دانلود میکنیم:
wget -rl 2 http://ADDRESS
و در پوشهی حاوی صفحات استخراج شده با دستور زیر لینکها را استخراج کرده و در فایلی ذخیره میکنم تا توسط youtube-dl قابل خواندن باشد:
grep -ohE "http://www.youtube.com/watch\\?v=[[:alnum:](-|_)]{11}" * | uniq > list
حالا یک فایل به اسم list آن هم در عرض کمتر از یک دقیقه ساختهام که حاوی لینک مربوط به ویدئوهای مورد نظرم است و میتوانم با فراخوانی youtube-dl یا یک لیچر دیگر همه را دانلود کنم! (برای کسب اطلاعات بیشتر در این زمینه میتوانید به این لینک رجوع کنید)
مسالههایی از این دست که به راحتی در خط فرمان قابل حل شدن هستند کم نیستند. برای دیدن نمونههایی از این دست میتوانید به لینکهای زیر رجوع کنید:
۱- وبلاگ کیبرد آزاد: چرا به گنو/لینوکس عشق می ورزم: خاطرات یک هکر
۲- وبلاگ کیبرد آزاد: چرا گنو/لینوکس رو دوست دارم: انتقال کلی کتاب به پوشه هم نامشون
۳- وبلاگ کیبرد آزاد: چرا گنو/لینوکس رو دوست دارم: ساخت انیمیشن با لینوکس
۴- وبلاگ شاهینسم: عشق لینوکسی (۱): چسباندن چند فایل PDF
تا اینجای کار دیدیم که این خط فرمان زشت، پیچیده، سیاه! تا چه حد میتواند سلاح مناسبی برای حل مشکلات روزمرهمان باشد. حالا کمی جلوتر میرویم:
با وجود IDEهایی با این همه قابلیت، چرا ویرایشگرهای متنیای مانند Emacs؟
بگذارید اینطور به مساله نگاه کنیم که ما یک برنامه نویس C++ با تجربههای اسکریپت نویسی در پایتون و بش و البته علاقهمند به طراحی صفحات وب با HTML و CSS هستیم. گاهی هم ممکن است به PHP برنامههایی برای سایتمان بنویسیم. تمامی مطالب اسنادمان هم در محیط LaTeX تایپ میکنیم. علاقهی زیادی هم به تعامل با دیگر علاقمندان لینوکس در شبکههای IRC داریم. هر روز هم باید به تعداد زیادی ایمیل جواب بدهیم. کسی برنامهی همه کارهای سراغ دارد که بتوانیم با خیال راحت و تنها یک بار کانفیگ، تمام این کارها (و صد البته بیشتر و بیشتر) را برایمان انجام دهد و کمتر وقتمان را برای آشنایی با محیط جدیدش هدر دهد؟
جواب من یک کلمهی آشناست: Emacs. ایمکس در نگاه اول ممکن است یک ادیتور ساده بیاید. ولی این تعریف بزرگترین توهینی است که میتوان به این برنامهی عظیم کرد. ایمکس آنقدر خوب است که میتواند دقیقا همان چیزی باشد که شما در هر لحظه نیاز دارید ;-)
مگر سرعت تعامل ما با کامپیوتر چقدر مهم است وقتی کامپیوترمان قادر است میلیونها بیت در ثانیه محاسبه کند؟
زمانی من هم همینطور فکر میکردم. ولی اگر در جنگی شرکت کنید و شما و حریفتان هر دو سلاحهای یکسان و قابلیتهای عملیاتی یکسان داشته باشید، کدام عامل است که پیروز میدان را معین میکند؟ طبیعتا جواب این سوال سرعت عمل خواهد بود. این موضوع حتی اینقدر مهم بوده که هکرها به چیدمان صفحهکلیدهای فعلی (QWERTY) خرده بگیرند که چرا وقتشان را در پیمایش انگشتهایشان روی صفحه تلف میکند؟ و راهحلی نظیر Colemak را ارائه کنند!
حتما خودتان هم این موضوع را تجربه کردهاید که برای مثال در حال تایپ یک متن هستید و در گرما گرم کارتان پیغامی روی صفحه ظاهر میشود، و باید دستتان را از روی کیبورد برداشته و با ماوس ترتیب پیغام ظاهر شده را بدهید و دوباره به روی کیبورد برگردید. آیا آرزو نمیکردید که میتوانستید در همان حال که تایپ میکنید، قابلیت کنترل پنجرههایتان را داشته باشید؟ این دقیقا همان قابلیتی است که مدیرپنجرههایی مثل Awesome برایشان ساخته شدهاند.
تایپ دستورات طولانی مدت هم ممکن است برای کشته مردگان ترمینال بسیار خسته کننده باشد. Bash پوستهی محبوب لینوکس قابلیتهایی برای کاهش کاراکترهای تایپ شده مثل استفاده از Tab دارد. ولی منصفانه به قضیه نگاه کنید. باز هم ما برای استفاده از Tab باید به بزرگی و کوچکی حروف توجه کرده باشیم. و گاهی حتی ممکن است نتوانیم Tab را به خاطر شباهت دستور مورد نظرمان با دستور دیگر در الفبا به کار ببریم. در مورد پارامترهای فرمانمان چطور؟ آیا در Bash باز هم میتوان از Tab استفاده کرد؟ اگر شما هم از این چنین رفتاری که Bash در برابر خواستههایتان انجام میدهد خسته شدهاید، پیشنهاد میکنم ZSH را امتحان کنید. و برای فرار از دست تنظیمان اولیهاش و رسیدن به نتیجهی مطلوب در کمترین زمان ممکن، پیشنهاد میکنم ذرهای از Oh-My-ZSH بچشید ;-)
مگر نرمافزارهای اداری مانند libre office و Open office چه عیبی دارند که باید مشقت استفاده از LaTeX را تحمل کنم؟
جایی خواندم که: «هر کسی که برای اولین بار مجبور به استفاده از LaTeX میشود با خود میگوید، عمرا اگر دوباره از این برنامهی لعنتی استفاده کنم. ولی پس از آن، دیگر به جز با LaTeX سندی را آماده نمیکند.» این حقیقتی است که خودم به شخصه تجربهاش کردهام. باز هم میخواهیم به قضیه منصفانهتر نگاه کنیم. شما در Libre Office (یا هر نرمافزار اداری دیگری) به راحتی میتوانید ظاهر متنتان را زیبا کنید. حاشیههای آنچنانی، فونتهای فوقالعاده زیبا و … . اما مگر قرار است متن آماده شدهتان را در نمایشگاه آویزان کنید؟
اگر شما هم به خوانا بودن متنتان به صورتی که چشم خواننده را خسته نکند. ساختارش (فصلها، صفحهها، بخشها، عنواین و …) منظم باشد و قابلیت ارائه به هر شکل (کاغذی، الکترونیکی) را دارا باشد اهمیت میدهید و نمیخواهید وقتتان را در منوهای تو در توی نرمافزار اداریتان هدر دهید، کافیست از LaTeX استفاده کنید. در این صورت تنها کافیست متنتان را تایپ کنید و بگویید برای مثال میخواهم فلان بخش، یک بخش جدا باشد. فلانجا لیست شمارهای باشد، فلان عکس با فلان توضیح زیرش باشد. همین، LaTeX پس از آن آماده است که بهترین حروفچینی ممکن را برایتان انجام دهد.
اسکریپت نویسی و جلوگیری از انجام کارهای تکراری (به خاطر تنبلی ;-))
در پایان ترجیح میدهم توجهتان را به نمودار زیر جلب کنم (متن کامل مربوط به این نمودار را میتوانید در وبلاگ Iclub بخوانید)
همانطور که میبینید در این نمودار رفتار افراد گیگ و غیر گیک به تصویر کشیده شده. رفتاری که طی آن افراد گیک پس انجام کاری تکراری برای مدتی، تصمیم به نوشتن اسکریپتی برای انجامش میگیرند که ممکن است وقت بیشتری را نسبت به روش افراد غیر گیک (ادامهی همان کار تکراری) از آنها بگیرد. اما سر انجام با اجرای اسکریپت، حد زیادی از اتلاف وقت جبران میشود و کارایی روش افراد گیک خودنمایی میکند.
الان همهی ما مجبور به استفاده از این نرمافزارهایی که معرفی شد هستیم؟
طبیعتا نه! هر کسی باید راه خودش را انتخاب کند. هر کسی مشکلات خودش و موقعیتهای خودش را دارد. هر کسی سلیقهی متفاوتی دارد و نسبت به چیز خاصی احساس راحتی میکند. منظور من از نوشتن این متن، تنها و تنها رساندن یک پیام ساده بود. این که اگر ما علاقه به کار کردن در ترمینال، کار با نرمافزارهای ترمینالی، کار با گنو/لینوکس، برنامه نویسی به یک زبان غیر عرف، مستندسازی با ابزارهای TeX و … داریم، اینها نه دلیل بر این است که عقدهی خودنمایی داریم و نه آنقدر کمهوشیم که بخواهیم دوباره چرخ اختراع کنیم. دیدی که ما به ابزارهای دم دستمان داریم، کاری که ما میخواهیم داناییمان برایمان انجام دهد و شیوهی مواجههی ما با مشکلاتمان چنین روشی را میپسندد.
ما از یادگرفتن چیزهای زیاد نمیترسیم و حتی از این که وقتمان را پای یادگرفتن چیزی مثل گنو/لینوکس که تمامی دانستههای قبلیمان را برای رفتن به سویش باید کنار بگذاریم مصرف کنیم. ترس ما بیشتر از این است که با مشکلی روبرو شویم که هیچ روش و ابزاری که به درد حل آن بخورد در دسترس نداشته باشیم. این روش ما است.
4 دیدگاه برای این نوشته:
- ناشناس:
۰۳ بهمن ۱۳۹۰
سلام. من متاسفانه با نوشته شما اصلا موافق نیستم. من مدتهای طولانیه که از لیتک استفاده می کنم. اما هنوز هم وقتی قرار به تایپ یه متن چندین صفحه ای باشه (که اتفاقا از تایپ یه مقاله یا پایان نامه خیلی بیشتر اتفاق میفته) اپن آفیس یا لیبرآفیس رو ترجیح میدم و ازش استفاده می کنم. من مدتهاست با دنیای لینوکس آشنا هستم ولی هنوز هم معتقدم در خیلی زمینه ها ویندوز واقعا رفتار بهتری داره. و هنوز هم از ویندوز استفاده می کنم. در مورد codeblocks و Emacs هم معتقدم اتفاقا codeblocks بیشتر به مورد 1 از فلسفه یونیکس می خوره تا Emacs. با عرض معذرت این یه انتقاد دوستانه س اما من فکر می کنم اون گروهی از آدمها که اصطلاحا بهشون میگم Geek کمی از جهان واقعی فاصله شون زیاده. من معتقدم توی نموداری که اون بالاس، اون نقطه تقاطع آخری که نمودار آبی به بالای قرمز انتقال پیدا می کنه اونقدر کم در کارهای روزمره اتفاق میفته که اگه به طور میانگین همه دفعات رو با هم جمع بزنین حتی برای خود شما هم راه حلهای یه کاربر معمولی به صرفه تره. - Pyruzan:
۰۳ بهمن ۱۳۹۰
درود به همهی دوستان
شاهین جان ممنون بابت مطلب جالب و متفاوتی که نوشتی.
نکتهای که اینجا مطرحه اینه که مخاطب این متن کیه؟ مسلما نمیتونه کاربرای عادی باشه و حداقل شامل کاربرانی که با اسکریپتنویسی آشنایی دارن و برنامهنویسها میشه. چون زمانی رو که یه کاربر عادی باید صرف کنه تا به اون درجه از دانش برسه که بخواد از مزایای خط فرمان (شامل انواع دستورات مفید، نحوهی کاربرد اونها و همچنین اسکریپتنویسی) به خوبی بهره ببره خودش مقدار بسیار قابل توجهیه. به نظرم مطلب به این نکته توجه نکرده.
دوستان برنامهنویس هم با هر IDE یا محیطی که راحتترن کار میکنن و این مسئله بیشتر سلیقهایه، ولی لازم بود یه شفافسازی در مورد قدرت ابزارهای به ظاهر ساده بشه تا کسی که میخواد انتخاب کنه با آگاهی این کار رو بکنه :) - mastershot:
۰۴ بهمن ۱۳۹۰
دوست من بحث این نیست که یکی موافق باشه و یکی مخالف.
شما دقیق و با دقت نگاه که کنید. دقیقا مثل این قضیه است که ۹۰٪ مردم از ویندوز به عنوان سیستم عامل پیش فرض استفاده می کنند (که افتخار می کنم جزو اون دسته نیستم)
این یه درده بزرگیه که حتی بعضیا فک می کنن سیستم عامل یعنی ویندوز!! (البته درد خیلی قدیمی و تکراریه)ولی آیا شما می تونید روزی رو ببینید که همون ۹۰٪ مردم دنیا کارهاشون رو فقط با ترمینال انجام بدن و GUI عملا براشون بی مصرف و بلا استفاده باشه!؟؟ این اتفاق هیچ وقت و به هیچ وجه نمیوفته.
چون بحث مردم عامه است و مردم عامه تمایل به لقمه ای دارن که قبلا جویده شده و اینا فقط قورتش می دن.
در طرف مقابل ترمینال و LaTex و این قبیل برنامه ها اصلا برا اونا نیست. بهشون هم به هیچ وجه توصیه نمی شه.شاید مثال خیلی تیز و بُرنده ای باشه ولی این مقاله برا افرادی هست که بر خلاف مسیر رودخانه شنا می کنند. چون می دونن که در جهت موافق مسیر رودخانه هم هر ماهی مُرده ای هم می تونه شنا کنه (توو این مثالم اصلا قصد بی حرمتی ندارم. فقط مثالیه که کمی قضیه رو واضح تر نشون بده)
- حسین:
۰۴ بهمن ۱۳۹۰
@Pyruzan شما درست می گید.
اما ما چرا درس می خونیم؟
اگه سختی نکشیم که نمی تونیم به جایی برسیم.
من تصمیم گرفتم Bash رو یاد بگیرم
بعد C++وPythonوEmcasوLatex
چون به نظر من خیلی خوبه که آدم گیک بشه از همه نظر.
کسی که دوست نداره گیک بشه احتمالا همون ویندوز بره بهتره! آخه لقمه هاش بهتر جویده شده!