Gnu Tips

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

روگذری‌بر ماژول‌ها و کرنل‌ها

سلام

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

۱. حجم بالای کرنل هنگام بارگذاری اون در حافظه‌ی اندک باعث بروز مشکل‌های متعددی میشه.
۲. اگر قسمتی از کرنل به مشکل بر بخوره کل کرنل به مشکل بر‌می‌خوره.
۳. اگر لازم باشد قسمتی به/از کرنل اضافه/کم کنیم مجبوریم کرنل رو از سر کامپایل کنیم.
۴. …

به این نوع کرنل، کرنل یکپارچه یا monolithic گفته می‌شه. برای حل این مشکلات معماری ریز هسته یا microkernel شکل گرفت که فقط شامل درخواست‌های سیستمی اولیه و ابتدایی هست که برای همه‌ی سرویس‌های سیستم‌عامل مورد نیازه. بقیه‌ی کارهایی که باید توسط کرنل انجام بشه به شکل ماژول به آن پیوست می‌شن.

کرنل مورد استفاده‌ی لینوکس‌های فعلی رو می‌شه ترکیبی از معماری یکپارچه و ریز هسته دونست.

در این حالت اگر یک ویژگی مورد نیاز نباشه به راحتی می‌شه اون رو از کرنل جدا کرد یا ویژگی جدیدی را با ضمیمه کردن ماژول مربوطه به آن اضافه کرد، بدون نیاز به کامپایل و … .

برای لود کردن یک ماژول بر روی کرنل از دستور insmod استفاده می‌کنیم که نام و مسیر دقیق ماژول را به صورت آرگومان دریافت می‌کنه.

برخی ماژول‌ها برای کار به ماژول‌های دیگه‌ای وابستن به صورتی که باید قبل از لود ماژول در حافظه لود شده باشند. برای پیدا کردن پیشنیاز‌های یک ماژول می‌تونیم از دستور modinfo استفاده کنیم. این دستور اطلاعات مربوط به ماژول مورد نظر را اعم از پیشنیاز‌ها و مسیر ماژول را به نمایش می‌زاره. سر و کله زدن با یک ماژول یک طرف سر و کله زدن با پیشنیاز‌های یک ماژول یه ذره اون‌ورتر. برای همین دستور moprobe ایجاد شده. کار این دستور اضافه یا کم کردن ماژول از کرنله بدون اینکه نیازی به دونستن پیشنیاز‌ها یا مسیر یک ماژول باشه. modprobe این کار رو با استفاده از یک فایل که مسیر و پیشنیاز‌های مربوط به همه‌ی ماژول‌ها رو داخل خودش داره انجام می‌ده. اسم این فایل modules.dep هست و در مسیر زیر قرار داره:

نکته: یه جای عبارت kernel-release خروجی دستور

رو وارد کنید.

بعد از هر نصب یا پاک کردن ماژولی نیاز هست که این فایل آپدیت بشه و بهتره که با دستور depmod که مخصوص ایجاد این فایله این کار انجام بشه نه با ویرایش دستی.

 

آشنایی با دستور tee

tee how it works

tee command

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

<                انتقال خروجی استاندارد به فایل.

&<               انتقال خروجی استاندارد و خروجی خطا به فایل.

<<               اضافه کردن خروجی استاندارد به انتهای فایل.

&<<               اضافه کردن خروجی استاندارد و خروجی خطا به فایل.

>               انتقال ورودی استاندارد به دستور.

|                انتقال خروجی استاندارد به دستور.

برخی اوقات لازمه که خروجی دستوری را علاوه بر انتقال به فایل مشاهده هم بکنیم، برای این کار مجبوری دستور را دوباره اجرا کرده و در یکی از آنها خروجی را به فایل انتقال دهیم. یک راه‌حل ساده‌ی دیگر استفاده از دستور tee است. طبق فایل منوآل دستور، کار این دستور گرفتن خروجی استاندارد و انتقال همزمان آن به خروجی استاندارد و فایل مورد نظر است. نحوه‌ی استفاده از این دستور به این شکل است که خروجی دستور مورد نظر را با استفاده از pipe (|) به دستور tee که اسم فایل به عنوان آرگومان برای آن مشخص شده است منتقل می‌شود. برای مثال:

حال اگر لازم باشد خروجی دستور دیگری را به انتهای فایل موجود اضافه کرده و ضمن این کار خروجی را در خروجی استاندارد نیز مشاهده کرد، باز می‌توان از دستور tee استفاده کرد. برای این کار دستور را به همراه آپشن a به کار می‌گیریم. برای مثال اگر فایل tmp.txt حاوی خروجی دستور ls باشد با اجرای دستور زیر خروجی آن به انتهای فایل اضافه شده و به محتویات قبلی آن آسیبی نمی‌رسد.

نکته:  می‌توان خروجی را با استفاده از فرم زیر همزمان به چند فایل انتقال داد:

منابع:

  1. http://en.wikipedia.org/wiki/Tee_%28command%29
  2. man tee
  3. http://linux.101hacks.com/unix/tee-command-examples/

بازی جذاب Pentago

سلام

بازی پنتاگو

پنتاگو

 اگر شما هم مشتری پروپاقرص بازی‌های فکری و استراتژی هستین پیشنهاد می‌کنم بازی Pentago رو از دست ندین. بازی دو نفره فوق‌العاده شیرین و جذابی هست. این بازی برای اوّلین بار توسط کمپانی Mindtwister ارائه شده که شامل چهار مربع هست که هر کدوم از اون‌ها شامل نه (۹) مکان برای گذاشتن مهره‌ها هستن به علاوه‌ی اینکه هر مربع می‌تونه حول مرکز خودش بچرخه. هر بازیکن اجازه داره در هر مرحله یک مهره بزاره و یکی از مربع‌ها رو به دلخواه خودش ۹۰ در هر سمتی که می‌خواد بچرخونه. اوّلین بازیکنی که بتونه  پنج مهره‌ی خودش رو پشت سرهم در حالت افقی، عمودی یا مورب بچینه برنده هست. یه جورایی شبیه بازی دوز قدیمی خودمون هست ولی چرخش مربع‌ها و تعداد بیشتر مهره برای برنده شدن بازی رو خیلی جذابتر کرده. امروز ۲۰ دست بازی کردم که ۱۰ بارش رو بردم و خب طبیعی هست که ۱۰ بارش رو هم باختم :D اگر رقیب خیلی سطحش پایین نباشه بازی خیلی شیرین می‌شه :)

اگر دوست دارین می‌تونید بازی رو به صورت آنلاین تک‌نفره و دونفره در ایــن آدرس بازی کنید.

امّا این چند نکته رو از من به عنوان کسی که بازی کرده خیلی باخته و برده آویزون گوشتون بکنید تا برای بازیهاتون بتونید از پس حریف‌هاتون بر بیایید:

  •     در اولین فرصت سعی کنید خانه‌های وسطی هر مربع رو تصرف کنید. این خانه‌ها از نظر استراتژیکی خیلی مهم هستن درسته شاید بتونید بدون اونها بازی رو ببرید ولی اگر حریفتون یه خورده قدر باشه به راحتی می‌تونه با استفاده از این مکان‌ها بزاردتون لای منگنه :D
  •     هیچ وقت در طول بازی در مورد اشتباهات رقیبتون صحبت نکنید به ظاهر شاید دیگه کار از کار گذشته باشه و دیگه گفتنش فقط یه سرکوفت برای رقیب باشه ولی در واقع چشم حریف بازتر می‌شه و چه بسا در همون لحظه بتونه از طریق همون اشتباه درجا برنده بشه (یکی از بازی‌ها رو روی همین اشتباه باختم :( )
  •     تا حد ممکن سعی کنید حداقل از دو مسیر مهره‌هاتون رو به تعداد پنج نزدیک کنید تا وقتی که حریف متوجه قصدتون شد بتونید از یه مسیر دیگه برنده بشید. البته برای این کار مکان‌های میانی مربعات بهترین گزینه هستن ;) (نمی‌دونید وقتی رقیب با این واقعیت روبرو می‌شه چه حالی به آدم دست می‌ده :D )
  •     زود قضاوت نکنید! تا وقتی که مطمئن نشدین با یک و فقط یک حرکت می‌تونید برنده بشید در این مورد اظهار نظر نکنید چون ممکنه رقیبتون بتونه بازی رو به نفع خودش تغییر بده. (امروز بر اساس همین اشتباه رقیبم تونستم بازی رو که فکر می‌کرد برنده رو برنده بشم :D )

فعلاً همینا :)

در ضمن برای این بازی رقیب می‌خوام :D

گیک بازی سر تبریک سال نو :)

سلام

نمی‌دونم بشه بهش گفت گیک بازی یا باید اسمش رو بزاریم تنبلی :D ولی این تبریک گفتن سال نو با پیامک هم یه جوری دردسرهای خاص خودش رو داره. البته خدا رو شکر گوشیمون از این به اصطلاح هوشمندهای بی‌عقل نیست و می‌تونستم یه پیام رو نوشته و فرستنده‌هاش رو مشخص کنم ولی گفتیم یه کاری هم آخر/اوّل سالی کرده باشیم واسه همین خواستم این روال رو اتوماتیک کنم. ابزار‌های خوبی برای این کار داریم یه گجت که یه نسخه از گنو/لینوکس رو اجرا می‌کنه یه خورده وقت و یه برنامه برای ارسال پیامک/sms از ترمینال به اسم smssend .

با یه نگاه به نحوه‌ی استفاده از smssend خیلی راحت میشه یه طرح راحت و خوب میشه برای اجرایی کردن کارمون پیدا کرد:

 خب پیغام مورد نظر با آپشن m میزاریم لای دوتا کوتیشن. و کافیه شماره‌ی دریافت کننده رو یکی یکی بزار جلوی آپشن n. راه‌های زیادی برای این قسمت وارد کردن شماره میشه پیدا کرد ولی به نظرم راحتترینش این هست که شماره‌ها رو بزاریم توی یه فایل و یکی یکی با حلقه‌ی for دستور رو برای اون اجرا کنیم اسکریپت خیلی راحت و سر راسته:

من خواستم پیغام رو هم توی یه فایل ذخیره کنم و از اون تو فراخوانیش کنم. :) (قرتی بازی که شاخ و دم نداره :)) )

فایل nums.txt یه فایل متنی هست که هر خطش یه شماره هست که ساختنش یه خورده سخته ولی  ارزش ساختنش رو داره به نظرم. امّا اگه خیلی خوشتون نمیاد که همچین فایلی داشته باشید و دوست دارین که اسم و شماره با هم باشه تا بتونید راحت کم و زیاد کنید می‌تونید این کار رو بکنید، اوّل اسم و با یک فاصله شماره رو بنویسیم. یعنی اینطوری:

خب دقت کنید که من بین اسم‌ها هم فاصله گذاشتم، یعنی هیچ ضرورتی نداره که حتما اوّل اسم بعداً شماره باشه بلکه ضرورت اینه که:

  1. فیلد آخر شماره باشه.
  2. فیلد‌ها با خط فاصله از هم جدا شن.

در این صورت من فقط برای قسمت cat خروجی رو از یه فیــــلتر awk رد می‌کنم تا فیلد آخر که شماره باشه به دستور وارد بشه. یعنی اسکریپت می‌شه این:

خیلی شیک و مجلسی :D

دلم می‌خواست با پایتون بنویسم کدش رو ولی وقت کافی برای سر و کله زدن باهاش رو نداشتم واسه همین با بش سر و تهش رو هم آوردم. :D البته بعداً شاید اجراییش کردم با پایتون ;)

سال خیلی خوبی برای همه آرزو میکنم :)