یکشنبه، دی ۳۰، ۱۳۸۶

رونین

احتمالا فیلم رونین را دیده‌اید. فیلم با شرح معنی کلمه‌ی رونین آغاز می‌شود:

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

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

در تعریف رونین، به جای سامورائی بگذارید انسان‌ (هر انسانی) و به جای ارباب بگذارید اعتقادات، عقاید، ارزش‌ها. وقتی اعتقادات یک فرد بمیرند، آن فرد دیگر اربابی ندارد؛ نه از شکستن می‌ترسد، نه از شکسته شدن؛ نه از تحقیر کردن می‌ترسد، و نه از تحقیر شدن؛ طرف ناحق را می‌گیرد اگر سود بیشتری به او برساند؛ برای منافع‌اش دست به هر کاری می‌زند؛ رونین می‌شود.

مدتی است آثار رونین شدن را در خودم می‌بینم. من از رونین بودن می‌ترسم...

دوشنبه، دی ۱۷، ۱۳۸۶

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

اگر فایلی داشته باشید که در هر سطر آن یک مقدار ذخیره شده باشد، با حلقه‌ی for زیر می‌توان هر سطر را خواند، اما این مشکل وجود دارد که متغیر line یک کاراکتر نیولاین در انتها خواهد داشت که برای ما نامطلوب است.

Initial Wrong Script
  1:   #! /bin/bash
  2:   
  3:   for line in `cat input.txt`; do
  4:       echo "<tag>${line}</tag>"
  5:   done

برای رفع این مشکل می‌توان یا از هر متغیر نیولاین را حذف کرد:

Removing new-line from variable
  1:   #! /bin/bash
  2:   
  3:   for line in `cat input.txt`; do
  4:       line=`echo $line | awk '{ str1=str1 $0 }END{ print str1 }'`
  5:       echo "<tag>${line}</tag>"
  6:   done

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

Replacing new-line with space in a new file
  1:   #! /bin/bash
  2:   
  3:   for line in `cat input.txt | awk '{ str1=str1 $0 " " }END{ print str1 }'`; do
  4:       echo "<tag>${line}</tag>"
  5:   done

به تفاوت در پارامترهای awk در دو روش فوق توجه کنید.

یکشنبه، دی ۱۶، ۱۳۸۶

یک مثال ساده برای درک بهتر پایپ

یک اسکریپت ساده که در یک حلقه منتظر ورودی کاربر است، و یک پیغام سلام چاپ می‌کند. عملیات ورود با EOF یا Ctrl+D در UNIX و Ctrl+Z در DOS خاتمه می‌یابد.

sayhello.sh
  1:   #! /bin/bash
  2:   
  3:   while read name; do
  4:       echo Hello $name
  5:   done

نمونه‌ی خروجی:

Output
$ ./sayhello.sh
Amir
Hello Amir
Kamran
Hello Kamran
[Ctrl+D]
$

یک فایل می‌سازیم که در آن در هر خط یک نام قرار دارد. با دستور cat‌ می‌توان محتویات فایل را به stdout فرستاد.

Creating names.txt
$ echo -e "Ali\nHasan\nAkbar\nAsghar" > names.txt
$ cat names.txt
Ali
Hasan
Akbar
Asghar
$

با استفاده از پایپ خروجی cat را به ورودی اسکریپتی که قبلا نوشتیم می‌فرستیم.

using pipe
$ cat names.txt | ./sayhello.sh
Hello Ali
Hello Hasan
Hello Akbar
Hello Asghar
$

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

این پست نیز در همین رابطه بود.

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

شنبه، دی ۱۵، ۱۳۸۶

بمب‌های مهاجر (لینک)

http://blog.maryammomeni.com/2008/01/post_495.html