مهم‌ترین اشتباهات رایج در محیط خط فرمان

سلام :)

خط فرمان (Command Line) یکی از قدرتمندترین بخش‌های سیستم عامل های شبه یونیکس (Unix-like) و یونیکسی (Unix) است. مانند بسیاری از ابزارهای دیگر، در صورت استفاده نادرست از آن ممکن است که صدمات جبران ناپذیری به سیستم و در حالت کلی به سطح کاری شما وارد نماید. این مقاله قصد دارد تا با معرفی مهم‌ترین این اشتباهات، شما را از انجام دادن غیرعمدی آنها آگاه سازد. در انتهای مقاله نیز راه حل هایی جهت رفع ایرادات احتمالی معرفی است.

دستور userdel

این دستور به صورت پیش فرض فقط کاربر را حذف می کند و اثری بر روی فایل‌های کاربر ندارد. ولی در صورتی که در فایل تنظیمات /etc/deluser.conf حذف فایل‌ها نیز فعال شده باشد، با حذف کاربر، تمامی اطلاعات مربوط به آن نیز حذف می شود و ممکن است فایل های موجود در دایرکتوری وی مهم و ضروری باشد. این قضیه بیشتر بر روی سرورها و هنگام عوض شدن مدیرسیستم (SysAdmin) بروز پیدا می کند. پس قبل از پاک کردن کاربر از تنظیمات فایل /etc/deluser.conf و نیز مهم نبودن فایل‌های کاربر مورد حذف مطمئن شوید.

خراب کردن محتوای فایل با استفاده نادرست از > و >>

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

استفاده نادرست از پارامتر c به جای x

در صورتی که شما قصد استخراج کردن محتوای یک فایل فشرده را با دستور tar داشته باشید، باید از این دستور مانند زیر استفاده نمایید:

tar -zxvf FILE.tar.gz DICRECTORY

حال اگر به جای x اشتباها از c استفاده نمایید، بدون هیچ اخطاری محتوای DIRECTORY جایگزین محتوای فعلی فایل بایگانی شما می شود!

اشتباهی گرفتن خط فرمان‌ها

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

استفاده از * در دستور rm

دستور rm برای حذف فایل و دایرکتوری‌ها استفاده می‌شود. همچنین * نشان دهنده تمامی این عناصر است. گاهی اوقات ممکن است که این دو با یکدیگر و به صورت اشتباه استفاده شوند. در زیر نمونه‌هایی از این اشتباهات ارائه شده اند.
وجود فاصله بین * و آدرس دایکتوری مورد نظر بار حذف:

rm /foo/ *

استفاده از .* و پارامتر -R:

rm -R .*

اشتباه دستور با در این مورد است که در دایرکتوری جایی .. به دایکتوری پدر (parent) اشاره دارد و استفاده همزمان از .* و پارامتر -R باعث می‌شود که دستور rm از پایین به بالا (درون به بیرون) تمامی اطلاعات شما را حذف نماید!

استفاده نادرست از / و . و .. در آدرس‌دهی به پارامترهای دستورات

اگر با خط فرمان و آدرس دهی فایل‌ها آشنا باشید می دانید که / به دایرکتوری ریشه و . به دایرکتوری جاری و .. به دایرکتوری پدر (parent) اشاره دارند. برای عوض کردن دسترسی دایرکتوری جاری در صورتی که در همان دایکتوری باشید باید دستوری مانند زیر را وارد نمایید:

chmod -R 755 ./

حال فرض کنید که لازم است از sudo استفاده نمایید و دستور را اشتباها به یکی از صورت‌های زیر وارد کنید. به عدم وجود . قبل از / و فاصله بین . و / دقت نمایید:

sudo chmod -R 755 /
sudo chmod -R 755 . /

آدرس دهی اشتباه سخت افزار در دستور dd

دستور dd برای رونوشت برداشتن (کپی) از اطلاعات در سطح پایین استفاده می‌شود. به عنوان مثال برای رونوشت برداشتن از یک فایل و ذخیره آن باید از دستوری مشابه دستور زیر استفاده نمایید:

dd if=big_null_file of=/dev/sdb

که به نظر شما /dev/sdb آدرس سخت افزار مورد نظر مانند فلش مموری است، حال اگر /dev/sdb آدرس دومین هارد شما باشد، تمامی اطلاعات آن از دست رفته و شما فقط یک big_null_file دارید!

برای جلوگیری از این صدمات چکار کنیم؟

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

  • همیشه و در همه حال از تمامی اطلاعات خود نسخه پشتیبان داشته باشد. اگر توانستید نسخه پشتیبان را به صورت های مختلف مانند هارد اکسترنال، دی وی دی، بر روی وب و … به طور همزمان نگهداری نمایید.
  • قبل از اجرای دستورات اساسی مانند rm، mv و chmod حتما یکبار دیگر آن را بازخوانی نمایید.
  • دستور rm را همیشه با پارامتر -i اجرا نمایید.
  • به جای حذف مستقیم اطلاعات توسط rm آن ها را به سطل آشغال منتقل نمایید. برای انجام اینکار در اوبونتو مقاله Make “rm” Move Files To Trash Instead Of Completely Removing Them را مطالعه نمایید. روش های مشابهی نیز در سایر سیستم عامل ها وجود دارد.

منابع و اطلاعات بیشتر

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

معرفی و آموزش پیاده‌سازی Apache Lucene

سلام،

Apache Lucene

حدود یک سال و نیم قبل در مطلبی به معرفی خزنده‌های وب (Web crawlers) و آموزش راه اندازی یک خزنده وب ساده به زبان جاوا پرداختم. در طول این مدت افراد بسیاری در مورد خزنده‌های وب با من تماس گرفتند و سوالات مختلفی در مورد این خزنده‌ها داشتند. در این مطلب به معرفی و آموزش Apache Lucene که به منظور جستجو فایل‌های متین استفاده می شود، می پردازم. همچنین در آینده به بررسی ۳ محصول Hadoop, Apache Solr و Apache Nutch خواهم پرداخت.

Apache Lucene

آپاچی لوسن کتابخانه ای برای راه اندازی موتورهای جستجوی متن می باشد. این کتابخانه آزاد بوده و تحت لایسنس Apache Licene 2.0 منتشر می شود. این کتابخانه به زبان جاوا (Java) نوشته شده و سپس به زبان های Delphi, Perl, C#, C++, Python, Ruby, و PHP پیاده سازی (پورت) شده است.
این کتابخانه این امکان را برای شما فراهم می آورد تا هر نوع موتور جستجوی متنی مانند موتور جستوی وب، لوکال (محلی) ویا فقط ویژه یک وب سایت را ایجاد نمایید. در نظر داشته باشید که Apache Lucene فقط برای جستجو استفاده می‌شود و برای جمع‌آوری اطلاعات و تحلیل آن‌ها نیاز به ابزارهای دیگری مانند Solr و Nutch دارید.
برای دریافت این کتابخانه به صفحه دانلود آپاچی لوسن مراجعه نمایید. همچنین می توانید نسخه فعلی (۳.۶.۰) را از آدرس زیر دریافت نمایید:
دانلود کتابخانه آپاچی لوسن نسخه ۳.۶.۰

استفاده از کتابخانه Apache Lucene

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

مرحله اول: ایندکس کردن اطلاعات

قبل از هر چیز شما باید اطلاعاتی را که قصد جستجو در آن‌ها را دارید ایندکس نمایید. ایندکس کردن اطلاعات فواید زیادی دارد که یکی از مهم‌ترین آن‌ها مرتب‌سازی و افزایش سرعت جستجو است.
ایندکس اطلاعات در لوسن توسط دو کلاس Document و Field صورت می پذیرد. Document سند شما و Field اطلاعات مرتبط با سند مانند عنوان، محتوا و… است. این وظیفه شماست که اطلاعات خود از جمله رشته‌ها، انواع فایل‌ها، اطلاعات ذخیره شده در پایگاه داده و… را به کلاس Document تبدیل و ایندکس نمایید. در زیر تعامل Index, Document و Field را مشاهده می کنید:

 Index 
Document 1

Field A (name/value)

Field B (name/value)
Document 2

Field A (name/value)

Field B (name/value)

بعد از آماده سازی Document باید توسط کلاس IndexWriter، ایندکس را ذخیره می کنیم. پارامتر اول در فراخوانی IndexWriter دایکتوری ذخیره‌سازی ایندکس را مشاهده می‌کند.
با کدهای زیر چند عبارت را در حافظه دسترسی تصادفی (RAM) ذخیره کردیم:

Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);

IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action");
addDoc(w, "Lucene for Dummies");
addDoc(w, "Managing Gigabytes");
addDoc(w, "The Art of Computer Science");
w.close();

متد addDoc رشته‌ها را به ایندکس اضافه می کند:

private static void addDoc(IndexWriter w, String value) throws IOException {
    Document doc = new Document();
    doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
    w.addDocument(doc);
  }
}

مرحله دوم: ایجاد کوئری (Query)

در این برنامه ما عبارت مورد نظر برای جستجو را از ورودی (stdin) دریافت می‌کنیم:

String querystr = args.length > 0 ? args[0] : "lucene";
Query q = new QueryParser(Version.LUCENE_36, "title", analyzer).parse(querystr);

مرحله سوم: انجام جستجو

در این مرحله کوئری (جستار؟) ساخته شده را بر روی ایندکس جستجو می کنیم. همچنین از کلاس TopScoreDocCollector برای بدست آوردن ۱۰ نتیجه مرتبط‌تر استفاده کرده ایم:

int hitsPerPage = 10;
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

مرحله چهارم: مشاهده نتایج

در انتها نتایج بدست آمده را نمایش می‌دهیم:

System.out.println("Found " + hits.length + " hits.");
for(int i=0;i<hits.length;++i) {
    int docId = hits[i].doc;
    Document d = searcher.doc(docId);
    System.out.println((i + 1) + ". " + d.get("title"));
}

همین!

کلاس HelloLucene

در زیر کلاس HelloLucene را یکجا مشاهده می فرمایید:

import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class HelloLucene {
    public static void main(String[] args) throws IOException, ParseException {
        // 0. Specify the analyzer for tokenizing text.
        //    The same analyzer should be used for indexing and searching
        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);

        // 1. create the index
        Directory index = new RAMDirectory();

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);

        IndexWriter w = new IndexWriter(index, config);
        addDoc(w, "Lucene in Action");
        addDoc(w, "Lucene for Dummies");
        addDoc(w, "Managing Gigabytes");
        addDoc(w, "The Art of Computer Science");
        w.close();

        // 2. query
        String queryStr = args.length > 0 ? args[0] : "lucene";

        // the "title" arg specifies the default field to use
        // when no field is explicitly specified in the query.
        Query q = new QueryParser(Version.LUCENE_35, "title", analyzer).parse(queryStr);

        // 3. search
        int hitsPerPage = 10;
        IndexReader reader = IndexReader.open(index);
        IndexSearcher searcher = new IndexSearcher(reader);
        TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
        searcher.search(q, collector);
        ScoreDoc[] hits = collector.topDocs().scoreDocs;

        // 4. display results
        System.out.println("Found " + hits.length + " hits.");
        for (int i = 0; i < hits.length; ++i) {
            int docId = hits[i].doc;
            Document d = searcher.doc(docId);
            System.out.println((i + 1) + ". " + d.get("title"));
        }

        // searcher can only be closed when there
        // is no need to access the documents any more.
        searcher.close();
    }

    private static void addDoc(IndexWriter w, String value) throws IOException {
        Document doc = new Document();
        doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
        w.addDocument(doc);
    }
}

منابع

شاد و پیروز باشید :)

نظارت همزمان بر چند فایل و دستور (MultiTail)

سلام،

بعد از مدت‌ها دوباره مطلبی در مورد برنامه‌های مفید موجود در لینوکس (و یونیکس) آماده کردم. در این مطلب به معرفی دستورات head، tail و نرم‌افزار MultiTail که برای نظارت (مونیتورینگ) دستورات و فایل‌ها به کار گرفته می شوند، پرداخته ام.

دستور head

این دستور برای بدست آوردن اطلاعات ابتدایی (خطوط) بالایی فایل و خروجی های پایپ شده کاربرد دارد. دستور head به صورت پیش فرض ۱۰ خط از اطلاعات را نمایش می دهد. نحوه استفاده از این دستور به صورت زیر است:

head [options] <file_name>

و یا:

command | head

مانند:

ls -tl | head -n5
total 72
drwxr-xr-x+ 12 saeid  staff    408 Jan 15 21:22 Desktop
drwx------+  9 saeid  staff    306 Jan 15 11:23 Downloads
drwx------@ 59 saeid  staff   2006 Jan 11 23:05 Library
drwxr--r--+ 23 saeid  staff    782 Jan  4 18:52 Documents

دستور tail

این دستور کاملا شبیه به دستور head است با این تفاوت که به جای خطوط ابتدایی، اطلاعات خطوط انتهایی را نمایش می دهد. مانند:

man ls | tail -n15
SEE ALSO
     chflags(1), chmod(1), sort(1), xterm(1), compat(5), termcap(5),
     symlink(7), sticky(8)

STANDARDS
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

HISTORY
     An ls command appeared in Version 1 AT&T UNIX.

BUGS
     To maintain backward compatibility, the relationships between the many
     options are quite complex.

BSD                              May 19, 2002                              BSD

پارامتر -f دستور tail

پارامتر -f دستور tail باعث می شود که این دستور به صورت زنده (live) باقی مانده و اطلاعات اضافه شده به فایل را در لحظه نشان دهد. این پارامتر بیشتر در بررسی فایل های لاگ استفاده می‌شود. مانند:

tail -f -n5 /var/log/apache2/access_log
127.0.0.1 - - [15/Jan/2012:22:30:12 +0330] "GET /~saeid/ HTTP/1.1" 200 -
127.0.0.1 - - [15/Jan/2012:22:30:27 +0330] "GET /~saeid/phpinfo.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524
127.0.0.1 - - [15/Jan/2012:22:30:26 +0330] "GET /~saeid/phpinfo HTTP/1.1" 200 78141
127.0.0.1 - - [15/Jan/2012:22:31:11 +0330] "GET /~saeid/phpinfo HTTP/1.1" 200 78412
127.0.0.1 - - [15/Jan/2012:22:31:11 +0330] "GET /~saeid/phpinfo.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524
127.0.0.1 - - [15/Jan/2012:22:31:11 +0330] "GET /~saeid/phpinfo.php?=SUHO8567F54-D428-14d2-A769-00DA302A5F18 HTTP/1.1" 200 2813

* برای خروج از tail -f از ترکیب Ctrl+C استفاده نمایید.

نرم‌افزار MultiTail

این بسته نرم‌افزاری در محیط خط فرمان اجرا شده و به منظور نظارت دستورات و فایل‌ها مورد استفاده قرار می گیرد. مهم‌ترین مزیت MultiTail امکان بررسی هم‌زمان چند فایل و دستور در یک ترمینال است.

نصب MultiTail

برای نصب در اوبونتو/دبیان دستورات زیر را در خط فرمان اجرا نمایید:

sudo apt-get update; sudo apt-get install multitail

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

sudo port install multitail

نحوه استفاده از MultiTail

برنامه MultiTail بسیار انعطاف‌پذیر بوده و قابلیت‌های بسیاری دارد. به عنوان دستور زیر را در نظر بگیرید:

multitail -l 'ping google.com' -l 'ping zebardast.ir'

تصویر زیر خروجی این دستور را نشان می دهد:

نمایش دو دستور Ping در MultiTail

* برای خروج از MultiTail از ترکیب Ctrl+C استفاده نمایید.

حال در کنار این دو Ping یک فایل را نیز به صورت زنده (live) بررسی می کنیم:

multitail -l 'ping google.com' -l 'ping zebardast.ir' /var/log/apache2/access_log

خروجی دستور بالا:

نمایش دو دستور Ping و لاگ آپاچی در MultiTail

همچنین می توانیم به جای نمایش جدا از هم اطلاعات، آن‌ها را ترکیب کرده و با هم نمایش دهیم. در زیر خروجی دو دستور پینگ را در یک ترمینال نشان داده ایم:

multitail -l 'ping google.com' -L 'ping zebardast.ir'
PING zebardast.ir (79.175.162.75): 56 data bytes
PING google.com (173.194.69.105): 56 data bytes
64 bytes from 79.175.162.75: icmp_seq=0 ttl=54 time=87.961 ms
64 bytes from 173.194.69.105: icmp_seq=0 ttl=41 time=456.322 ms
64 bytes from 79.175.162.75: icmp_seq=1 ttl=54 time=97.724 ms
64 bytes from 173.194.69.105: icmp_seq=1 ttl=41 time=416.464 ms
64 bytes from 79.175.162.75: icmp_seq=2 ttl=54 time=96.657 ms

از جمله ویژگی‌های MultiTail امکان فیلتر کردن نتایج است. دستور زیر همانند دستور قبلی می باشد با این تفاوت که عبارت 64 bytes from را از خروجی دستور دوم حذف می کند:

multitail -l 'ping google.com' -ke "64 bytes from" -L 'ping zebardast.ir'
PING google.com (173.194.69.105): 56 data bytes
PING zebardast.ir (79.175.162.75): 56 data bytes
64 bytes from 173.194.69.105: icmp_seq=0 ttl=41 time=463.806 ms
 79.175.162.75: icmp_seq=0 ttl=54 time=45.223 ms
64 bytes from 173.194.69.105: icmp_seq=1 ttl=41 time=442.254 ms
 79.175.162.75: icmp_seq=1 ttl=54 time=84.238 ms
64 bytes from 173.194.69.105: icmp_seq=2 ttl=41 time=442.263 ms
 79.175.162.75: icmp_seq=2 ttl=54 time=98.428 ms
64 bytes from 173.194.69.105: icmp_seq=3 ttl=41 time=400.113 ms
 79.175.162.75: icmp_seq=3 ttl=54 time=81.723 ms

پیشنهاد می‌کنم برای مشاهده مثال‌های بیشتر به صفحه Example سایت MultiTail مراجعه کنید.

پیوندها

شاد و پیروز باشید :)

مدل های درآمدزایی نرم افزارهای آزاد، کنفرانس زنجان


سلام

دو روز گذشته، پنجشنبه و جمعه ۱۷ و ۱۸ شهریور ۹۰، دومین کنفرانس تخصصی نرم افزار های آزاد و متن باز بود. در این دو روز حدود ۲۰ مقاله ارائه شدند. با اینکه کمبودهایی در ارائه ها دیده می شد، با این حال این مراسم سطح قابل قبولی داشت. مهم ترین نکته این کنفرانس همت بچه های زنجان و مسئولین فهیم این استان بود که از همه آنها بسیار بسیار تشکر می کنم.

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

• ممکن است به دلیل فیلتر بودن سایت slideshare.net اسلاید در دسترس شما نباشد.
دانلود نسخه PDF ارائه Free Software / Open Source Business Models – 2.3 MB

همایش روز آزادی نرم‌افزار اصفهان

با نزدیک شدن به روز آزادی نرم‌افزار، مانند سال‌هالی گذشته اصفهان لاگ مراسمی را برگزار خواهد کرد. به نقل از سایت اصفهان لاگ:

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

زمان: پنج شنبه ۲۴ شهریور ماه ۱۳۹۰ ساعت ۱۴:۳۰
مکان: اصفهان – خیابان باغ گلدسته – سالن اجتماعات کتابخانه ی مرکزی شهرداری اصفهان
*خیلی دوست داشتم که برای اولین بار در این جشن باشم :(

مدل های درآمدزایی نرم افزارهای آزاد

مقدمه
با وجود اینکه امروزه نرم‌افزارهای آزاد بسیاری فراگیر شده اند، هنوز نحوه کسب درآمد این نرم‌افزارها برای بسیاری مبهم است. همیشه سؤالاتی مطرح می‌شود که پاسخ آن‌ها مفهوم نیست. چطور با نوشتن یک نرم‌افزار آزاد می‌توان کسب درآمد کرد؟ آیا امکان کسب درآمد بعد از انتشار سورس نرم‌افزار وجود دارد؟ آیا می‌توان نرم افزاری را فروخت که سورس آن برای همگان در دسترس است؟
برای پاسخ به این سؤالات باید با دید وسیع‌تری به مقوله ایجاد، انتشار، توسعه و پشتیبانی نرم‌افزار نگاه کرد. کسب درآمد از طریق فروش لایسنس تنها یک روش کسب درآمد از نرم‌افزار می باشد. به طور کلی هزینه تولید، نگهداری و توسعه نرم‌افزارهای آزاد به مراتب کمتر از نرم‌افزارهای اختصاصی می باشد. توضیح بیشتر در این رابطه خود نیاز به مقاله‌ای جامع و کامل دارد.
یکی از مهمترین دلایل شکل‌گیری نرم افزارهای اختصاصی (Proprietary software) بحث کسب درآمد از آن‌ها بوده است. متأسفانه بسیاری بر این باورند که در دسترسی قرار دادن کد منبع مانع از ایجاد رقابت بین شرکت های نرم افزاری می شود و با این استدلال به این نتیجه می‌رسند که نرم افزارهای آزاد قابلیت درآمدزایی و رقابت تجاری با نرم افزارهای اختصاصی را ندارند. این درحالیست که شرکت های فعال در زمینه نرم‌افزارهای آزاد به مدل های تجاری موفقی دست پیدا کرده اند.
این مقاله به تفصیل مدل های درآمدزایی نرم افزارهای آزاد را بررسی خواهد کرد.

مدل های تجاری نرم افزارهای آزاد
غالباً مهمترین هدف از انجام یک کار، کسب در‌آمد از آن می باشد. با توجه به در دسترس بودن کد منبع نرم‌افزارهای آزاد، نحوه کسب درآمد از آن همیشه بحث برانگیز بود است. درحال حاضر مدل های تجاری مختلفی به منظور درآمدزایی نرم‌افزارهای آزاد پیش‌بینی شده است.
با درنظرگرفتن نحوه تولید نرم‌افزار آزاد، مدل های تجاری مختلفی برای آن طرح ریزی شده است. این مدل‌ها رویکردی اجباری ویا اختیاری دارند. به عنوان مثال donation یک مدل اختیاری بوده و خرید لایسنس نسخه های تجاری گنو/لینوکس مانند Red Hat Enterprise اجباری می باشد.

دو لایسنس بودن (Dual Licensing)
در این مدل تجاری، سورس نرم‌افزار به صورت یکسان تحت دو لایسنس منتشر می‌شود که یکی از این لایسنس ها GPL است. دلیل استفاده از این مدل را می‌توان به کار بردن نرم‌افزارها و کدهای نرم افزاری آزاد برای ایجاد و توسعه آن دانست. در نتیجه هزینه تولید نرم‌افزار به مراتب کمتر می شود. کاهش هزینه‌ها باعث استفاده بیشتر از نرم افزارهای آزاد شده و حمایت از این‌گونه نرم‌افزارها را افزایش می دهد.
نکته مثبت این مدل محفوظ ماندن سورس اصلی برنامه تحت لایسنس شرکت سازنده می باشد. با این حال نکته منفی این مدل، اجبار مشارکت کنندگان برای قبول هر دو لایسنس است که منجر به کاهش تعداد مشارکت کنندگان شده و بیشتر مشارکت ها را به رفع ایراد (Bug fixes) و تغییرات جزیی محدود می کند.
به عنوان مثال شرکتی قصد تولید برنامه به منظور مدیریت پایگاه داده MySQL دارد. با توجه به لایسنس MySQL که GPL می باشد، این شرکت نیز باید نرم‌افزار خود را تحت این لایسنس منتشر نماید. در صورتی که این شرکت قصد محفوظ نگه داشتن سورس برنامه خود را داشته باشد، نیاز به استفاده از یک لایسنس اختصاصی در کنار لایسنس GPL دارد.

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

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

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

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

سفارشی سازی، تحقیق و توسعه (R&D)
شرکت هایی به منظور سفارشی سازی و توسعه نرم‌افزارهای آزاد وجود دارند. هدف این شرکت ها ساخت یک نرم‌افزار ویا سفارشی سازی یک بسته نرم افزاری آزاد با توجه به نیازهای مشتری می باشد. در نهایت نرم‌افزار ساخته شده توسط این‌گونه شرکت به صورت آزاد منتشر می شود. یک نمونه عالی از این نوع توسعه، نرم‌افزار اکلیپس (Eclipse) می باشد. این نرم‌افزار ابتدا توسط شرکت آی بی ام (IBM) ساخته شد و بعدها مدیریت و توسعه آن بر عهده Eclipse Foundation قرار گرفت. با توجه به امکانات و مشخصات اکلیپس، بسیاری از شرکت ها این نرم‌افزار را به عنوان زیرساخت نرم‌افزار خود در نظر گرفته اند. این کار هزینه توسعه زیرساخت را برای این شرکت ها بسیار پایین آورده است. در نتیجه بسیاری از شرکت ها، دانشگاه‌ها به توسعه آن کمک می کنند. نحوه همیاری آن‌ها به صورت‌های مختلفی از مدلهای ذکر شده این مقاله می باشد. بر اساس آخرین گزارش‌ها ۲۵٪ توسعه دهندگان سورس کد از شرکت IBM به همراه پرداخت ۲۲٪ هزینه‌های مربوط به توسعه می باشند. همچنین شرکت‌های بزرگی از جمله اوراکل، بورلند بین ۱٪ تا ۷٪ هزینه‌ها مربوط به توسعه و نگهداری اکلیپس را بر عهده گرفته اند.
نمونه مشابه دیگری از این مدل توسعه هسته لینوکس می باشد.

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

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

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

مدل تجاری Partnership
این مدل شامل عقد قراردادهایی بین توسعه دهندگان نرم‌افزارهای آزاد و سایر شرکت های می باشد. مانند عقد قرارداد شرکت گوگل با شرکت موزیلا جهت پیش‌فرض بودن موتور جستجو گوگل در مرورگر فایرفاکس. مبلغ این قرارداد در سال ۲۰۰۶ ۷۲میلیون دلار بوده است.

Donation
در این مدل جامعه کاربری و یا شرکت های تجاری به منظور حمایت از نرم‌افزارهای آزاد و توسعه دهندگان این نرم افزارها، هزینه ای را به عنوان donation (کمک مالی) به توسعه‌دهنده اهدا می کنند. این مدل در بسیار از کشورها مرسوم می‌باشد.

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

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

نبود و یا عدم اجرای قوانین
مهم‌ترین مشکل توسعه نرم‌افزارهای آزاد ویا اختصاصی در داخل کشور نبود ویا عدم اجرای قوانین است. عدم وجود و یا اجرا نشدن قوانین مربوط به Copyright در داخل ایران رقابت را از بین برده است. چه رقابت نرم افزارهای اختصاصی با یکدیگر و چه رقابت آن‌ها با نرم افزاری های آزاد. همه روزه ما شاهد فروش بسته های نرم‌افزاری با عناوین گوناگون با قیمت بسیار نازل در داخل کشور هستیم. به عنوان مثال مجموعه بسته های King که چندین هزار نرم‌افزار اختصاصی و آزاد را در خود جای داده‌اند با قیمتی حدود ۲۰,۰۰۰ تومان به فروش می‌روند. در حالی که هزینه فروش همین بسته ها در خارج از کشور بیش از چند صد هزار دلار است. البته هیچکدام از این نرم‌افزار ها دارای پشتیبانی در داخل کشور نمی باشند لازم است. با وجود این موضوع را نمی توان دلیلی برای عدم اجرای Copyright به شمار آورد.

تحریم
همانند سایر صنایع، صنعت نرم افزاری نیز زیان های فراوانی از تحریم دیده است. عدم پشتیبانی از کاربرانی ایرانی باعث محدودیت‌ها بسیاری شده است. به عنوان مثال بسیاری از سایت‌های حامی نرم افزارهای آزاد از جمله Google، Source Forge، IBM و… محدودیت‌هایی را برای کاربران ایرانی اعمال می کنند. از طرفی انتقال وجه برای خرید ویا فروش نرم‌افزار به صورت بین‌المللی برای کاربران و توسعه دهندگان ایرانی وجود ندارد.

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

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

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

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


امیدوارم که در سال‌های بعد هم همایش زنجان برگزار شود و صد البته امیدوارم که چنین همایش هایی در سایر نقاط کشور نیز برگزار گردد.

شاد و پیروز باشید :)

معرفی نقشه ذهنی و آموزش نرم افزار FreeMind

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

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

نقشه ذهنی کشیده شده با دست

این روش نگارش باعث می شود که افراد به سرعت یک ایده را گسترش داده و موضوعات مرتب با آن را در کنار هم گردآوری کنند. مهم ترین ویژگی و فایده نقشه ذهنی درک ساده و سریع موضوع اصلی است.

نرم افزار FreeMind

FreeMind (فری مایند) نرم افزاری برای کشیدن نقشه ذهنی می باشد که به زبان جاوا و تحت مجوز GPL (متن باز و آزاد) منتشر شده است. این نرم افزار بر روی سیستم عامل های ویندوز، لینوکس و مک (Mac OS X) با استفاده از JVM (ماشین مجازی جاوا) اجرا می شود.
برخی از ویژگی های این نرم افزار

  • ذخیره سازی اطلاعات در قالب XML با فرمت .mm
  • خروجی نقشه ذهنی با فرمت‌های HTM، PDF، Flash و…
  • خروجی نقشه ذهنی با فرمت‌های تصویری PNG, JPEG و SVG
  • برچسب زدن گره ها با استفاده از آیکون
  • کشیدن ابر دور چندین گره خاص برای دسته بندی کردن آن‌ها
  • فرمت کردن خودکار نقشه ذهنی با توجه به سطح گره‌ها
  • جستجو در قسمت‌های مختلف نقشه ذهنی
  • ایجاد لینک به فایل و صفحات وب در گره‌ها
  • امکان خنثی کردن کارهای انجام شده (undo)
  • امکان Drag’n Drop (دراگ و دراپ کردن) برای کپی برداری از گره‌ها
  • حالت فایل (File mode) برای دیدن فایل‌ها و دایرکتوری‌های موجود در سیستم به صورت نقشه ذهنی
  • امکان کشیدن نقشه ذهنی بدون استفاده از ماوس
  • امکان کشیدن نقشه ذهنی رمزگزاری شده برای حفاظت بیشتر
  • پشتیبانی از تب (Tab) برای بازکردن چندین نقشه ذهنی در یک پنجره

نیازمندی‌های نصب
• نسخه ۱.۴ یا جدیدتر JRE
• ۱۳ مگابایت فضای خالی بر روی دیسک سخت (هارد دیسک) به منظور نصب FreeMind و پلاگین های پیش فرض آن
• ۵۱۲ مگابایت RAMالبته برای کشیدن نقشه های ذهنی بزرگ تر نیاز به رم بیشتری دارید.

نصب JRE
برای نصب JRE آخرین نسخه آن را از صفحه Java SE Downloads دریافت کنید. با توجه به تحریم ایران و عدم دسترسی به دریافت فایل از سایت اوراکل، کاربران داخل ایران می توانند نسخه های مورد نیاز خود را از لینک های زیر دریافت نمایند:

کاربران ویندوز
JRE 1.6.0.24 (32-bit)
JRE 1.6.0.24 (64-bit)

کاربران لینوکس
در بیشتر مخازن نرم افزاری توزیع های گنو/لینوکس این بسته وجود دارد. به عنوان مثال کاربران اوبونتو ۱۰.۱۰ می توانند با استفاده از دستور زیر ماشین مجازی جاوا را نصب نمایند:

sudo apt-get install sun-java6-jre

نصب FreeMind
نخست نسخه مخصوص سیستم عامل خود را از صفحه دانلود سایت FreeMind دریافت کنید. در زیر لینک‌هایی برای دریافت سریع نسخه ۰.۹ این نرم افزار آمده است:
دریافت برای ویندوز
دریافت برای Mac OS X
دریافت برای گنو/لینوکس توزیع دبیان و سایر توزیع های DEB-based مانند اوبونتو
دریافت برای گنو/لینوکس توزیع سوزه و سایر توزیع های RPM-based مانند فدورا
نکته: FreeMind در بسیاری از مخازن توزیع های گنو/لینوکس وجود دارد. توضیحات بیشتر در مورد نصب در لینوکس.

شروع به کار با FreeMind
قبل از هر چیز باید موضوعی را که قصد دارید در مورد آن نقشه ذهنی بکشید را انتخاب کنید. به عنوان مثال در این بخش ما موضوع Computer programming را انتخاب کرده ایم. هدف اصلی جمع کردن موضوعات کلی مرتبط با آن می باشد. در زیر مراحل ایجاد و کامل کردن یک نقشه ذهنی در این باره را با هم دنبال می کنیم.
۱- ایجاد یک نقشه ذهنی: از منو File گزینه New را انتخاب کنید.

ایجاد یک نقشه جدید ذهنی در FreeMind

۲- تغییر موضوع پیش فرض به Computer programming: کافیست بر روی `New Mindmap` کلیک کرده و موضوع را به Computer programming تغییر دهید. بعد از تغییر کلید Enter را وارد کنید.

تغییر نام پیش فرض نقشه ذهنی

۳- گسترش موضوعات حول محصور اصلی: با انتخاب گزینه `New Child Node` از منو `Insert` یا فشردن دکمه `insert` یک گره جدید ایجاد کرده و محتوای آن را به دلخواه پر کنید.

ایجاد گره در نقشه ذهنی

۴- با انتخاب گزینه `Automatic Layout` از منو `Format` می توانید ظاهر نقشه ذهنی را خودکار تنظیم و زیباتر کنید.

فعال سازی Automatic Layout

۵- مرحله ۳ را بر روی گره‌ها و موضوع اصلی آن قدر ادامه دهید تا نقشه ذهنی‌تان را کامل کنید:

گسترش نقشه ذهنی – ۱

گسترش نقشه ذهنی – ۲

گسترش نقشه ذهنی – ۳

گسترش نقشه ذهنی – ۴

گسترش نقشه ذهنی – ۵

۶- شخصی سازی نقشه ذهنی: شما می توانید گره های مختلف را با کشیدن جابجا کنید. همچنین می توانید آیکون های مختلف را به گره ها اضافه کنید.

شخصی سازی نقشه ذهنی – ۱

شخصی سازی نقشه ذهنی – ۲

شخصی سازی نقشه ذهنی – ۳

۷- برای ذخیره کردن نقشه ذهنی کافیست گزینه Save را از منو File انتخاب کنید.

ذخیره کردن نقشه ذهنی

۸- برای گرفتن خروجی (Export) از نقشه ذهنی، فرمت مورد نظر را از گزینه export در منو فایل انتخاب نمایید.

گرفتن خروجی از نقشه ذهنی

خروجی تصویری با فرمت PNG از نقشه ذهنی Computer programming

* شما می توانید نقشه ذهنی Computer programming را دریافت کنید.

کلیدهای میانبر
یکی از ویژگی هایی که باعث می شود کشیدن نقشه ذهنی منجر به طوفان فکری شود، سرعت توسعه گره ها و در نتیجه موضوعات در آن است. به همین جهت استفاده از کلید های میانبر برای افزایش سرعت عمل در نگارش نقشه ذهنی بسیار موثر است. تصویر زیر کلیدهای میانبر نرم افزار FreeMind را نشان می دهد:

کلیدهای میانبر نرم افزار FreeMind

پیوندها

موفق باشید 8-)