رفتن به نوشته‌ها

نویسنده: ali

افزودن قابلیت تلفظ کلمات با استفاده از تلفظ مترجم گوگل به GoldenDict

احتمالا مطالب زیادی درباره افزودن قابلیت تلفظ ماشینی به دیکشنری GoldenDict قبلا دیده اید. چه در وبلاگ هم قطاران لینوکسی چه در فروم های بچه های اوبونتو و … . یکی از روشهای تلفظ، دانلود فایل و معرفی آن به نرم‌افزار برای تلفظ است . یکی از روشهای مرسوم استفاده از یک برنامه تلفظ ماشینی مانند زیر است :

sudo apt-get install espeak

برنامه speak که یک برنامه تلفظ لغات به صورت ماشینی(Text to Speech) است را به سیستم لینوکسی شما اضافه میکند، با انجام مراحل زیر میتوان از قابلیت تلفظ این برنامه در دیکشنری خود استفاده کرد .

برنامه GoldenDict را باز کنید و کلید F3 را بزنید تا پنجره Dictionaries باز شود .یا منوی Edit/Dictionaries را انتخاب کنید .

سپس در تب Sources تب programs را انتخاب کنید .

سپس دکمه Add را بزنید و Audio را انتخاب کنید . برای قسمت نام espeak را بنویسید و espeak -v en %GDWORD% برای قسمت Command Line وارد کنید.

با زدن ok این قسمت را بسته و برنامه را میبندیم و دوباره راه اندازی میکنیم.

در صورتیکه علاقمند به استفاده از تلفظ برنامه google Translate برای برنامه خود هستید . ابتدا برنامه زیر را برای پخش صوت در لینوکس خود نصب کنید . مثلا برای اوبونتو :

sudo apt install mpg123

سپس دربرنامه GoldenDict دکمه F3 را بزنید و در تب Sources و تب Programs به جای کامند برنامه speak از Command زیر در Command Line استفاده کنید :

bash -c "p=$(echo "%GDWORD%" |sed 's/ /+/g'); wget -q -U Mozilla -O - translate.google.com.vn/translate_tts?ie=UTF-8\&q=$p\&tl=en\&client=tw-ob | mpg123 -"
1 نظر

افزودن قابلیت CodeHighlighter به LibreOffice writer

در صورتیکه بخواهید به متن یکی از اسناد آفیس خود کدی به یکی از زبانهای برنامه نویسی اضافه کنید میتوانید از افزونه Code Highlighter استفاده کنید، این افزونه قابلیت های لایت کردن ۱۵۰ زبان برنامه نویسی مختلف را دارد و میتواند به سادگی با برنامه های writer، Calc و Impress کار کند . برای دانلود از سایت extensions.libreoffice.org استفاده کنید .

این برنامه برای نصب به بسته های زیر احتیاج دارد :

sudo apt install libreoffice-script-provider-python python3-pip
sudo pip3 install pygments

در انتها از منوی tools و قسمت Highlight code میتوان متن نوشته شده را هایلایت کرد.

خارج شدن از نظر

آچار فرانسه من : Eclipse IDE

در صورتیکه علاقمند به یک محیط مجتمع برای توسعه همه برنامه های خود باشید حتما نام Eclipse را شنیده اید. یک محیط مجتمع مبتنی بر جاوا که قابلیت اضافه کردن پکیج هایی برای اضافه کردن زبان مورد نظر شما و شخصی سازی توسط شما را دارد.

برای نصب Eclipse در Ubuntu از دستورات زیر استفاده میکنیم:

$sudo apt install default-jre
$sudo apt install --classic eclipse

بعد از نصب Eclipse میتوان با استفاده از نصب پکیج های زبانهای مختلف ، Eclipse را برای آنها Config نمود، برای نصب CDT (C/C++ Development Tooling) به صورت زیر عمل میکنیم:

نصب CDT

از منوی Help به قسمت install new software… میرویم.در قسمت Work with آدرس زیر را وارد میکنیم :

Kepler - http://download.eclipse.org/releases/kepler

بعد از این مرحله پکیج های برنامه نویسی موردنظر خود را با تیک زدن اضافه میکنیم.

نصب پکیج Python

برای نصب پکیج های پایتون باید بسته زیر را در قسمت Work with بنویسیم:

http://pydev.org/updates

توجه کنید که تنها بسته pyDev را نصب میکنیم و از نصب pyDev Mylyn صرف نظر میکنیم.

برای شناساندن مفسر پایتون به Eclipse از مسیر زیر محل قرار گرفتن مفسر (/usr/bin/python3) را اعلام میکنیم:

window => Preferences => pyDev => interpreters =>python interpreters

نصب پکیج برنامه نویسی AVR

برای نصب پکیج AVR آدرس زیر را به مسیر Work with در …Install new software اضافه میکنیم:

http://avr-eclipse.sourceforge.net/updatesite

تمامی پکیج های فوق به همراه تعداد بسیار زیادی پکیج های کاربردی از قسمت MarketPlace در منوی Help در دسترس است و قابلیت نصب از مسیر MarketPlace را نیز دارد.

خارج شدن از نظر

virtualenv چرا و چگونه ؟

برای ساخت یک محیط ایزوله و جدا برای پروژه ی در دست ساخت در زبان پایتون از virtualenv استفاده میکنیم. دلیل این امر عدم تاثیر پذیری پایتون و ماژولها و کتابخانه های نصب شده از تغییرات در سیستم و انتخاب نسخه مورد نظر ما برای پایتون و پکیج های آن است. بعنوان مثال مسیر نصب در pip یک مسیر مشخص است که هر کتابخانه و ماژول جدید در این مسیر نصب میشود و به مرور زمان با نصب کتابخانه‌های جدیدتر ممکن است بعضی پکیج ها دچار تغییراتی شوند که در کار توسعه پروژه فعلی ما ایجاد اختلال کنند. به همین منظور استفاده از محیط ایزوله برای جداسازی پایتون و ماژولهای مورد نیاز از مسیر سیستم کاملا معقول و لازم است . با استفاده از پکیج virtualenv میتوان یک محیط ایزوله برای این منظور ساخت :

sudo apt-get update
sudo apt-get install build-essential libssl-dev libffi-dev python-dev
sudo apt install python3-pip
sudo pip3 instal virtualenv

بعد از نصب virtualenv در مسیر پروژه یک محیط ایزوله بصورت زیر میسازیم:

$cd new-project
virtualenv -p python3 env

در صورتیکه برروی سیستم خود نسخه های متفاوتی از پایتون نصب شده باشد، با استفاده از سوئیچ زیر میتوان نسخه متفاوتی از پایتون سیستم مادر را در virtualenv نصب کرد:

virtualenv -p python3 env --python="pythonx.y"

که pythonx.y پایتون نسخه x.y میباشد، مثلا پایتون نسخه ۳.۶ یا ۲.۷ یا …

در مسیر new-project در فولدر env یک پایتون جدید برپا میکند.برای فعال سازی پایتون جدید باید به مسیر زیر رفته و آن را فعال کنیم:

$cd env/bin
$source activate

بعد از این عمل اعلان ترمینال تغییر کرده و نام محیط ایزوله قبل از مسیر جاری قرار میگیرد:

ali@ali-pc:~/Documents/ML/virtualEnv/env/bin$ source activate
(env) ali@ali-pc:~/Documents/ML/virtualEnv/env/bin$

برای اطمینان از نصب صحیح میتوانیم نسخه پایتون مورد استفاده را بدست بیاوریم :

$python --version
Python 3.7.5

$which python
/home/ali/Documents/ML/virtualEnv/env/bin/python3

بعد از نوشتن کد مورد نظر و اتمام کار با استفاده از دستور deactivate از محیط virtual environment خارج میشویم .اعلان (env) نیز پاک خواهد شد:

ali@ali-pc:~/Documents/ML/virtualEnv/env/bin$ source activate
(env) ali@ali-pc:~/Documents/ML/virtualEnv/env/bin$ which python3
/home/ali/Documents/ML/virtualEnv/env/bin/python3
(env) ali@ali-pc:~/Documents/ML/virtualEnv/env/bin$ deactivate 
ali@ali-pc:~/Documents/ML/virtualEnv/env/bin$ which python3
/usr/bin/python3

خارج شدن از نظر

پایتون برای Machine Learning

به دلایل کاری باید از کتابخانه TensorFlow برای توسعه یک سیستم شناسایی تصویر استفاده کنم، سعی میکنم تجربیاتم در این زمینه و مطالب آموزشی درباره پردازش تصویر و Machine Learning رو هم مطالب قبلی درباره تجربیات شخصی استفاده از لینوکس اضافه کنم . البته هنوز از پلاتفرم لینوکس استفاده خواهم کرد و متاسفانه بدلیل به روز بودن آرچ لینوکس و نسخه پایتون ۳٫۸ در این توزیع، کتابخانه های ML قابل راه اندازی و استفاده نیستند . (در حال حاضر = نوروز ۱۳۹۹) از یک توزیع لوبونتو استفاده میکنم که بسیار سبک هست و با سیستم قدیمی من سازگارتره.

خب بهتره درباره پایتون صحبت کنم ، قصد دارم کتابخانه های مورد استفاده در پروژه ام رو معرفی کنم . احتمالا در آینده این لیست تغییر خواهد کرد و مواردی اضافه خواهند شد:

کتابخانه numpy:

کتابخانه numpy یک بسته جهت پردازش ها و محاسبات علمی در پایتون است. توانایی تولید و کار با آرایه های چند بعدی ،توابع و توانایی کار در فضای جبر خطی،تبدیلات فوریه و تولید اعداد رندم از جمله توانایی های آن است .

کتابخانه PIL:

کتابخانه Python Image Library که به اختصار PIL گفته میشود، یک کتابخانه جهت باز کردن انواع تصاویر و دستکاری و ذخیره سازی آنها میباشد.

کتابخانه matplotlib:

کتابخانه matplotlib برای نمایش تصاویر ،گراف ها × نمودار ها و …. بکار میرود.

کتابخانه glob:

ماژول glob تمام فایل های با فورمت مورد نظر مارا لیست میکند. مثلا :

>>> import glob
>>> glob.glob('/home/user', '*')

تمام فایلهای مسیر home/user/ را برمیگرداند.

کتابخانه TensorFlow:

کتابخانه TensorFlow برای انجام محاسبات یادگیری ماشین کارامد توسعه یافته است.این کتابخانه قابلیت استفاده از GPU به جای CPU برای بهبود کارایی خود را داراست .

خارج شدن از نظر

دوره Raspberry pi

ویرایش بهار ۹۹:

قبلا چند مطلب درباره Raspberry PI در سایت نوشته بودم،بعد از راه اندازی مجدد سایت و آپلود مطالب قبلی تصمیم گرفتم مطالب قبلی در قالب یک پست انتشار داده شود . با توجه به تصمیمم برای ضبط دوره آموزشی RPI مطالب جدید و ویدیو های جدید نیز به تدریج اضافه خواهند شد.

فعال سازی SSH بصورت پیش فرض در رزبری‌پای:

در حالت عادی SSH در سیستم عامل رزبیان فعال نیست و باید ابتدا برد رزبری‌پای را به یک مانیتور وصل کنید و با استفاده از کیبور و موس USB سیستم را بوت کرده و با دستور raspi-config اقدام به فعال کردن SSH کنید. برای دور زدن این مراحل میتوانید بعد از عملیان رایت ایمیج بر روی SD-card به پارتیشن /etc/ بروید و فایل rc.local را به صورت زیر ویرایش کنید:
در بالای خط انتهایی (یعنی exit 0) دستور زیر را وارد کنید تا در هر بار روشن شدن برد رزبری‌پای ، SSH هم روشن شود:

systemctl start ssh #run SSH on each startup

wifi در RaspberryPi3:

نسخه سوم برد RPi علاوه برا ارتقاء سخت افزاری قابل توجه, به امکانات ارتباطی وای فای و بلوتوث هم مجهز شده که در نظر دارم وای فای رو راه اندازی کنم و به صورت بی سیم با برد ارتباط SSH برقرار کنم .
مراحل کار ساده و سر راست هستند, پیدا کردن شبکه, ویرایش یک فایل حاوی اسم شبکه و رمز عبور و در انتها هم راه اندازی مجدد برد RPi .
در ابتدا برای پیدا کردن شبکه های بی سیم از دستور زیر استفاده میکنیم:

sudo iwlist wlan0 scan

اطلاعات مختلفی از شبکه های وای فای اطراف با ریز جزئیات برای شما به نمایش گذاشته خواهد شد, در میان شبکه های مختلف به دنبال کلمه ESSID باشید . نام شبکه جلوی این کلمه درج خواهد شد , مثلا:

pi@raspberrypi:~ $ sudo iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 10:10:10:10:10:10
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    Quality=26/70  Signal level=-84 dBm
                    Encryption key:on
                    ESSID:"mohamad"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                              ۲۴ Mb/s; 36 Mb/s; 54 Mb/s
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
                    Mode:Master
                    Extra:tsf=0000000000000000

که مشخصا اسم شبکه در اینجا mohamad است.
در مرحله بعد برای ویرایش فایل متنی و اضافه کردن نام شبکه و رمز عبور از دستورات زیر استفاده میکنیم:

	
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

در فایل باز شده قسمت های زیر در صورت وجود ویرایش میشوند و اگر موجود نباشند اضافه میشوند:

network={
ssid="SSID"
psk="WIFI PASSWORD"
}

منظور از SSID نام شبکه . مثلا در اینجا mohamad و منظور از WIFI PASSWORD همان رمز عبور وای فای است.
با زدن کلید های ترکیبی CTRL+X از برنامه nano خارج میشویم.

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

https://www.youtube.com/watch?v=E1VFhmwNjiUsudo ifdown wlan0
sudo ifup wlan0
خارج شدن از نظر

Code::Blocks محیط توسعه ای برای تمامی فصول!

محیط توسعه یکپارچه (IDE) Code::Blocks یک Ide خوش دست و مولتی پلتفرم است. من مدتها برای نوشتن برنامه های خودم به زبان ++C/C و استفاده از کتابخانه OpenCV از ادیتورهای متن لینوکس مثل Vim یا nano استفاده میکردم. با اینکه در صفحه انتخاب نوع پروژه در کدبلاکس اسم OpenCV دیده میشه اما هیچ وقت به سراغش نرفته بودم.
قصد دارم نوشتن یک برنامه به زبان ++C و استفاده از کتابخانه OpenCV در کدبلاکس را شرح مختصر بدهم.
ابتدانوع پروژه را OpenCV انتخاب کرده و مراحل ساخت پروژه جدید را به اتمام میرسانیم. ابتدا یک پروژه جدید میسازیم:

کد پیش فرض نمایش یک عکس در فایل main.cpp قرار میگیرد و عکس مربوطه به پروژه پیوست میشود.
برای معرفی کتابخانه OpenCV به کامپایلر (در اینجا GCC) مراحل زیر را انجام میدهیم:
از منوی Project قسمت Build Option را انتخاب میکنیم.
در سربرگ Compiler Settings به صفحه Other compiler option میرویم و عبارت زیر را اضافه میکنیم:

`pkg-config --cflags opencv`

در سربرگ Linker settings به Other linker option عبارت زیر را اضافه میکنیم:

`pkg-config --libs opencv`

در صورتیکه مراحل را به درستی انجام داده باشید. با Build کردن و Run کردن برنامه عکس پیوست شده به برنامه نمایش داده خواهد شد.
موفق باشید.

خارج شدن از نظر

استفاده از کتابخانه OpenCV در Qt

داشتم این مطلب رو بصورت جدا برای خودم مینوشتم که دستورات رو فراموش نکنم، گفتم چه خوبه که بصورت عمومی منتشرش کنم، شاید گره ای از کار کسی باز کرد. البته همچنان نوشتن ادامه Ncurses و Shell Script در دستوره کاره !
قبلا کتابخانه OpenCV را معرفی کرده بودم، خیلی ها علاقمندند از کتابخانه‌های Qt و OpenCV بصورت توامان استفاده کنند، که با اعمال تغییرات ساده ای در فایل pro. در پروژه ای که می‌سازیم میتوانیم OpenCV را به Qt بشناسانیم!
برای ایجاد یک پروژه جدید در Qt بصورت زیر عمل می‌کنیم :
از منوی فایل گزینه New Project را می‌زنیم و سپس Qt Widgets Application را انتخاب می‌کنیم و بقیه موارد را به صورت پیش فرض رها می‌کنیم.
با استفاده از دستور

pkg-config --cflags opencv

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

-I/usr/include/opencv

در فایل pro. در پروژه برنامه ما، دستور زیر را وارد می‌کنیم:

INCLUDEPATH += /usr/include/opencv

توجه کنید که قسمت سمت راست دستور بالا از pkg-config -‌-cflags opencv بدست می‌آید ( البته بدون کاراکتر I در ابتدای مسیر )
یک بار دیگر از ترمینال استفاده کرده و آدرس کتابخانه‌های OpenCV را بدست می‌آوریم:

pkg-config --libs opencv

که احتمالا چیزی شبیه به

-L/lib64 -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -ltbb -lGL -lGLU -lrt -lpthread -lm -ldl

خواهد بود.
در فایل pro. در یک خط جدید دستور زیر را وارد می‌کنیم:

LIBS += -L/lib64 -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -ltbb -lGL -lGLU -lrt -lpthread -lm -ldl

البته با توجه به پروژه خود تنها کتابخانه‌های مورد نیاز خود را اضافه می‌کنیم.
در انتها برای آزمایش کارکرد صحیح یک برنامه ساده بصورت زیر در فایل mainwindow.cpp می‌نویسیم:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->;setupUi(this);
    cv::Mat inputImage = cv::imread("/home/ali/Picture/lfs-puzzle.jpg");
    cv::imshow("Display Image", inputImage);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

بدیهیست آدرس عکس مورد نظر برای نمایش باید آدرس معتبری باشد .

این ترجمه آزادی بود از نوشته Rodrigo Berriel در این باره .

خارج شدن از نظر

text base user interface در لینوکس

مدتها این موضوع معلق بود تا اینکه فرصت کنم و تکمیلش کنم . تصمیم گرفتم کمی درباره ساخت یک UI بر مبنای text صحبت کنم . چیزی که همه ما از ابتدای برخوردمون با کامپیوتر باهاش درگیر هستیم، اما کاملا بی توجه از کنارش عبور می‌کنیم . در دسترس ترین مثال برای این موضوع، UI مربوط به Bios کامپیوتر ماست .یک UI گرافیکی مبتنی بر متن شامل انواع منوها و متون و صفحات مختلف.
کتابخانه مورد استفاده برای نوشتن یک UI مبتنی بر متن NCurses نام دارد. قصدم معرفی مقدماتی این کتابخانه است، شاید خیلی از دوستان بپرسند چرا Qt نه؟! Qt هم جذابیت بصری بیشتری داشته و هم احتمالا سرعت بیشتری در پیاده سازی ها برای برنامه نویس به ارمغان می‌آورد، من هم منکر این مزیتهای Qt نیستم، اما حجم کتابخانه NCurses نسبت به Qt قابل مقایسه نیست و اینکه من قصدم تکرار مکررات نیست، بلکه پرداختن و معرفی قسمتهایی که در جامعه آی‌تی کمتر بهشون پرداخته شده و معمولا ناشناخته هستند، جزء اهداف من بوده و هست . درباره Qt مطالب خیلی زیادی وجود دارد اما درباره NCurses مطلب زیادی به فارسی نداریم.
نصب کتابخانه NCurses
برای نصب Ncurses در توزیع اوبونتو از دستور

sudo apt-get update
sudo apt-get install ncurses-dev

همچنین فایل سورس در آدرس GNU Operating System موجود است ، میتوان بعد از دانلود مثل تمامی برنامه‌های لینوکسی اقدام به نصب نمود.

tar zxvf ncurses<version>.tar.gz  # unzip and untar the archive
cd ncurses<version>               # cd to the directory
./configure                             # configure the build according to your 
                                        # environment
make                                    # make it
su root                                 # become root
make install                            # install it

کامپایل کردن برنامه‌های شامل کتابخانه ncurses توسط gcc
برای کامپایل یک برنامه نوشته شده در لینوکس از gcc بصورت زیر استفاده می‌کنیم:

gcc -o exe_name program_name.c

که exe_name نام دلخواه ما برای فایل اجرایی و program_name.c نام فایل سورس ما به زبان c است.
در صورتیکه بجز کتابخانه‌های استاندارد موجود به همراه gcc از کتابخانه‌ای که به صورت دستی نصب کرده‌ایم استفاده کنیم، در انتهای دستور فوق باید نام کتابخانه مورد استفاده با پیشوند l- هم نوشته شود، در مثال ما دستور فوق بصورت زیر اصلاح میشود:

gcc -o exe_name program_name.c -lncurses

برای آموزش از Trace کردن برنامه‌های ساده شروع میکنیم:

#include <ncurses.h>
 
int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");    /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */
 
    return 0;
}

برنامه فوق عبارت !!!Hello World را در یک صفحه جدید نمایش میدهد.
تابع ()initscr ترمینال را جهت استفاده ncurses آماده سازی می‌کند. در بعضی پیاده سازی‌ها این آماده سازی شامل ایجاد یک صفحه خالی ترمینال وتخصیص فضای مورد نیاز در حافظه سیستم برای این پنجره می‌شود. برای هرگونه تغییر، ابتدا باید تابع ()initscr فراخوانی شود تا بتوانیم تغییرات مدنظر خود را در صفحه ( این صفحه stdscr نامیده می‌شود) اعمال کنیم.
تابع ()printw همانند تابع معروف ()print عمل میکند بجز اینکه خروجی آن در صفحه stdscr ، در مختصات دلخواه (x,y) چاپ می‌شود.
تابع ()refresh ،عملکرد جالبی را ارائه می‌دهد. تابع printw تعداد زیادی flag را تنظیم کرده و محتویات مورد نظر ما را در بافر خود می‌نویسد. اما بدون استفاده از تابع ()refresh این نوشته ها در صفحه stdscr چاپ نمی‌شوند . برای چاپ باید حتما یکبار تابع ()refresh فراخوانی شود.
این کار باعث بهبود عملکرد و انعطاف پذیری بیشتر برنامه خواهد شد، به این صورت که هر برنامه ممکن است تعداد زیادی آپدیت برای نمایش در صفحه نمایش داشته باشد که همگی در بافر تجمیع شده و با هر بار اجرای تابع ()refresh صفحه نمایش به روزرسانی خواهد شد.
در انتها با فراخوانی تابع ()endwin به کار در مد curses پایان می‌دهیم. به این صورت که ترمینال به صورت عادی برخواهد گشت و فضاهای حافظه گرفته شده آزاد می‌شود.این تابع بعد از اتمام کار در مد curses فراخوانی می‌شود.
ادامه دارد … .
این مطلب ترجمه آزادی از این نوشته در سایت tldp.org بود .

خارج شدن از نظر

کمی shell Script

یکی از راه‌های خوب برای یاد گرفتن یک چیز جدید ( صرف نظر از ماهیت اون چیز ) استفاده از تجربه بقیه و نگاه کردن به کاری هست که قبلا انجام شده، در برنامه نویسی این روش به شکل شدیدتری قابلیت‌های خودش را نشان میدهد، گفته میشود یکی از بهترین روش‌های یاد گرفتن تفکر سیستماتیک و متدهای برنامه نویسی دیدن کدهای خوب و تکرار کدها است . یعنی برنامه را تحلیل کنیم و دوباره بنویسیم. و چیزی که این روز‌ها خیلی پیدا میشود، کدهایی هستند که با زبانهای مختلف نوشته شده‌اند.
من بدلایلی در نظر دارم درباره برنامه‌نویسی در Bash لینوکس کمی صحبت کنم، نه با این عنوان که در برنامه نویسی Shell Script استاد هستم، به هیچ وجه! تنها بدلیل اشتراک گذاری مطالبی که در ادامه می‌آید با دوستانم .
من فرض می‌کنم که خواننده با دستورات ترمینال آشنایی داشته و می‌تواند دستورات را بصورت تکی یا ترکیبی استفاده کند، این مقاله درباره روش نوشتن یک Shell Script و تشریح دستورات کنترلی در Shell Script می‌باشد.
برای اجرای کارها در ترمینال لینوکس از دستورات Shell استفاده می‌شود، در صورتیکه نیاز به اجرای یک عمل روتین یا یک کار تکراری یا یک مجموعه کار پشت سرهم داشته باشیم، یکی از راه حل‌ها برنامه نویسی و یک از ساده‌ترین، قدرتمندترین و در دسترس‌ترین محیط‌ها برای نوشتن یک برنامه در لینوکس استفاده از Shell لینوکس و نوشتن یک Shell Script است. یک Shell Script از مجموعه دستورات Bash (یا هر Shell دیگه ) به همراه توضیحات (Comments) و دستورات کنترلی استفاده می‌کند. یک Shell Script با فرمت sh. ذخیره می‌شود، و با نوشتن دستور

sh foo.sh

اجرا می‌شود. در صورتیکه به Shell Script مجوز اجرایی بدهیم:

chmod +x foo.sh

به راحتی بصورت زیر قابلیت اجرا پیدا میکند:

./foo.sh

در صورتیکه در خط اول از Shebang استفاده کنیم و آدرس مفسر فایل اسکریپت را اعلام کنیم ( همانند روشی که در فایل‌های py. استفاده میشود)،Shell Script ما قابلیت اجرایی خواهد یافت، ابتدا با دستور زیر محل قرارگیری مفسر (Bash) را پیدا میکنیم:

which bash

که احتمالا چیزی شبیه به این خواهد بود:

/usr/bin/bash

سپس این خط را به ابتدای اسکریپت خود اضافه می‌کنیم:

#!/usr/bin/bash

و ادامه برنامه را می‌نویسیم.
مرسوم شده که هر زبان برنامه نویسی جدید با برنامه !Hello World شروع بشود، اما من با این برنامه شروع نمیکنم و فقط تعدادی از دستورات کنترلی را در قالب برنامه‌های ساده مرور می‌کنم.
for LOOP
حلقه کنترلی for برای انجام یک ( مجموعه ) عمل به تعداد مشخص بکار می‌رود، مثلا ما نیاز داریم یک کار را ۱۰ بار تکرار کنیم، یا یک تعداد از دستورات را به تعدادی که کاربر مشخص کرده است انجام دهیم. یا تعداد فایل‌های یک دایرکتوری را شمارش کرده و به تعداد آنها یک عمل را تکرار کنیم . در این‌صورت استفاده از حلقه for ناگزیر خواهد بود :
for … in
برنامه زیر ۴ بار کد بین do و done را اجرا میکند .

for i in 1 2 3 4
    do
        echo "Number $i"
    done

((for ((exp1, exp2, exp3
همان کد بالا با قالب ((for ((exp1, exp2, exp3

for (( i=1; i<=4; i++))
    do
        echo "Number $i"
    done

خروجی کدهای بالا بعد از اجرای اسکریپت:

Number 1
Number 2
Number 3
Number 4

برنامه نمایش اعداد بر روی کنسول

#!/bin/bash
for i in {1..25}
do
    echo $i
done

یا :

#!/bin/bash
for ((i=1;i<=25;i+=1)
do
    echo $i
done

برنامه شمارش اعداد با step برابر با ۵ :

#!/bin/bash
for i in {0..25..5}
do
    echo $i
done

برنامه شمارش معکوس از عدد ۲۵ تا ۱ با step برابر با ۵- :

#!/bin/bash
for i {25..0..-5}
do
    echo $i
done

یک کاربرد جالب و خوب دستور for، قابلیت کارکردن با فایل‌های خاص است، به عنوان مثال کد زیر تمام فایل‌هایی که فرمت sh. دارند را نمایش میدهد:

for file in ~/*.sh
do
    echo $file
done

برای استفاده از شرط باید ابزار لازم برای چک کردن شرط را داشته باشیم، مثلا عملگرهای مقایسه‌ای،(==،<،>،=! و …) برای مقایسه ۲ پارامتر با هم مناسب هستند. برای آشنایی با عملگر ها اینجا و اینجا مطالب خوبی را ارائه کرده است.

برای دریافت داده توسط کاربر از دستور read استفاده میشود، مثلا

read  word

یک ورودی از کاربر دریافت کرده و در متغیر word قرار می‌دهد. برای دسترسی به محتویات word میتوان از دستور

echo $word

استفاده کرد، در نوع داده محدودیتی وجود ندارد، داده میتواند یک عدد، یک رشته یا یک آرایه باشد. در صورتیکه نیاز به کار با آرایه دارید، میتوانید از سوئیچ a- به‌همراه دستور read برای گرفتن مقادیر آرایه از کاربر استفاده کنید. همچنین دستور declare میتواند برای تعریف یک متغیر بکار رود . در صورتیکه این دستور به همراه سوئیچ a- بکار برده شود برای تعریف یک آرایه استفاده می‌شود.
برای دسترسی به المانهای مختلف یک آرایه بصورت زیر عمل میکنیم:

read -a colors
echo "colors : ${colors[0]} , ${colors[1]} , ${colors[2]}"

برای ساخت یک حلقه از دستورات until و while نیز میتوان استفاده کرد .

#!/bin/bash
COUNT=0
# bash until loop
until [ $COUNT -gt 5 ]; do
        echo Value of count is: $COUNT
        let COUNT=COUNT+1
done
!/bin/bash
COUNT=6
bash while loop
while [ $COUNT -gt 0 ]; do
     echo Value of count is: $COUNT
     let COUNT=COUNT-1
 done

برای استفاده از کاراکترهای خاص مثل $ باید این کاراکترها را بین ‘ ‘ قرار داد، برای استفاده از کاراکتر ‘ از ‘\ استفاده میشود.
همچنین کارایی کاراکتر ” نیز مانند ‘ است .

خب ! این پست خیلی کوتاه ( نسبت به مطالب گفته نشده ) تمام شد، بهترین کار آزمایش کدهای ساده بالا و ترکیب این برنامه‌ها با دستورات جدید و ساخت برنامه‌های جدید است.
از ترمینال نترسید. توانایی و قدرتی که ترمینال به کاربر لینوکس میده بی نظیر و شگفت آوره . نوشتن این آموزش توی برنامه ام نبود، چون میدونستم مطالب نگفته‌ی زیادی باقی میمونه . اما به دلایلی برای آشنایی دوستان این رو نوشتم . امیدوارم کمی در پیدا کردن یک دیدگاه مثبت و یک درک صحیح به Shell Script کمک کنه .
برای خوندن مطالب همین مطالب البته کاملتر به linuxconfig یک سر بزنید .( بعضی کد ها از این سایت برداشت شده بودند)،
سایت TutorialsPoint مطالب خوبی در همه زمینه ها و از جمله Shell Scripting داره.
در این سایت هم درس‌های ابتدایی برای شروع هست .

خارج شدن از نظر