رخداد‌ها در جاوا

30 04 2010

Clickیکی از بازدید کننده‌های «سار»، از من خواسته که در مورد ActionListener ها توی جاوا بگم. بهانه‌ی خوبیه برای یک پست. مطالبی رو که می‌گم، عمدتن از کتاب Core Java جلد ۱ و ۲ گرفته شده و تجربه‌ی شخصیم رو کمتر توی اون دخالت می‌دم.

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

توی زبون‌هایی مثل Visual Basic رابطه‌ی بین رخداد و کد مربوط به اون کاملن مشخصه. یک کد برای یک مشخصه‌ی خاص نوشته می‌شه و اون در جایی به نام «روال رخداد» قرار داده می‌شه. کد این رول بعد از رخ دادن رخداد مورد نظر، اجرا می‌شه.

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

جاوا روشی بین روش Visual Basic و C خام رو در پیش می‌گیره که قدرت بیشتر و پیچیدگی کمتری رو داره.

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

همونطور که از زبون‌های شیء گرا مثل جاوا انتظار می‌ره، اطلاعات مربوط به رخداد‌ها، توی یک شیء Event کپسوله می‌شه. توی جاوا تمام شیء های رخداد سرانجام از java.util.EventObject مشتق می‌شن. البته زیر کلاس‌هایی هم برای منظور‌های مختلف مثل WindowEvent و ActionEvent وجود داره. منابع مختلف رخداد می‌تونن انواع مختلفی از اون رو به وجود بیارن. به عنوان مثال یک دکمه شیء ActionEvent رو ارسال می‌کنه در صورتی که یک پنجره شیء WindowEvent رو.

در نهایت مثال زیر یک نمونه از کنترل رخداد برای یک دکمست:

ActionListener listener = . . .;
JButton button = new JButton("Ok");
button.addActionListener(listener);

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

برای پیاده کردن یک واسط ActionListener کلاس شنونده باید یک متد با نام actionPerformed داشته باشکه که یک شیء ActionEvent رو به عنوان پارامتر قبول کنه، کد زیر رو ببینید:

class MyListener implements ActionListener
{
    . . .
    public void actionPerformed(ActionEvent event)
    {
        // reaction to button click goes here
        . . .
    }
}

خب، حالا وقتی کاربر روی button کلیک کنه، اون یک شیء ActionEvent می‌سازه و به listener.actionPerformed می‌فرسته. اشیائی مثل JButton می‌تونن تعدادی شنونده داشته باشن که وقتی رخداد رخ می‌ده، همه از اون آگاه می‌شن.

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

JButton button = new JButton("Ok");
button.addActionListener(new ActionListener()
{
    . . .
    public void actionPerformed(ActionEvent event)
    {
        // reaction to button click goes here
        . . .
    }
});

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

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

Action action = new AbstractAction()
{
    public void actionPerformed(ActionEvent event)
    {
        // reaction to button click goes here
        . . .
    }
};
action.putValue(Action.NAME, "OK");
action.putValue(Action.SMALL_ICON, smallIcon); //The menu will use this icon
action.putValue(Action.LARGE_ICON_KEY, largeIcon); //The button will use this icon
action.putValue(Action.SHORT_DESCRIPTION, "A short description for display in a tooltip");
JButton button = new JButton (action);
JMenuItem menuItem = new JMenuItem (action);

خب به همین راحتی! در کل بحث رخداد‌ها توی جاوا بحث شیرین، مهم و جالبیه. اگر درک نشه، خیلی سخت خواهد بود! در کل کتاب Core Java, Volume I یک فصل رو بهش اختصاص داده که در مورد خیلی از رخداد‌ها مثل رخداد‌های پنجره و موس بحث شده توش.

=-=-=-=-=
Powered by
Bilbo Blogger





Regex، ابزاری کاربردی در ویرایشگر‌های متنی

4 03 2010

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

public class StatePropertiesPanel extends JPanel implements StateProperties {
  
        private JComboBox statesComboBox;
        private JComboBox zeroStateComboBox;
        private JButton zeroStateColorButton;
        private JComboBox oneStateComboBox;
        private JButton oneStateColorButton;
        private JTextField nameTextField;
        private JCheckBox isFinalStateCheckBox;
        private JButton addButton;
        private JButton removeButton;
        private JButton applyButton;
        private Graph graph;
        private JButton openButton;
        private JButton saveButton;
        private Action openAction;
        private Action saveAction;
  
}

خب می‌خوایم برای این class یک سازنده بسازیم که توی اون، این مقادیر رو هم مقدار دهی کنیم با پارامترهای متد سازنده، یعنی نتیجه‌ی خروجی باید این شکلی بشه:

public class StatePropertiesPanel extends JPanel implements StateProperties {
  
        private JComboBox statesComboBox;
        private JComboBox zeroStateComboBox;
        private JButton zeroStateColorButton;
        private JComboBox oneStateComboBox;
        private JButton oneStateColorButton;
        private JTextField nameTextField;
        private JCheckBox isFinalStateCheckBox;
        private JButton addButton;
        private JButton removeButton;
        private JButton applyButton;
        private Graph graph;
        private JButton openButton;
        private JButton saveButton;
        private Action openAction;
        private Action saveAction;
  
        public StatePropertiesPanel(JComboBox statesComboBox,
                                JComboBox zeroStateComboBox,
                                JButton zeroStateColorButton,
                                JComboBox oneStateComboBox,
                                JButton oneStateColorButton,
                                JTextField nameTextField,
                                JCheckBox isFinalStateCheckBox,
                                JButton addButton,
                                JButton removeButton,
                                JButton applyButton,
                                Graph graph,
                                JButton openButton,
                                JButton saveButton,
                                Action openAction,
                                Action saveAction) {
                this.statesComboBox = statesComboBox;
                this.zeroStateComboBox = zeroStateComboBox;
                this.zeroStateColorButton = zeroStateColorButton;
                this.oneStateComboBox = oneStateComboBox;
                this.oneStateColorButton = oneStateColorButton;
                this.nameTextField = nameTextField;
                this.isFinalStateCheckBox = isFinalStateCheckBox;
                this.addButton = addButton;
                this.removeButton = removeButton;
                this.applyButton = applyButton;
                this.graph = graph;
                this.openButton = openButton;
                this.saveButton = saveButton;
                this.openAction = openAction;
                this.saveAction = saveAction;
        }
}

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

برای ویندوز اول:

  • Notepad++ برنامه‌ی خیلی قوی و متن باز و البته رایگان.
  • Geany که یک برنامه‌ی در ابتدا گنو/لینوکسی بوده ولی به لطف متن‌باز بودن، نسخه‌ی ویندوزی اون هم وجود داره.
  • MEdit که برنامه‌ی بدی به نظر نمیاد. گنو/لینوکسیه ولی برای ویندوز کامپایل شده.
  • Netbeans هم که یک محیط مجتمع قوی به حساب میاد.
  • Vim که هرچی در موردش بگم کم گفتم. البته خودم خیلی خوب بلد نسیتم باهاش کار کنم، ولی میلاد توی وبلاگش متن‌های خوبی در این مورد نوشته
  • و خیلی برنامه‌های دیگه و تقریبن تمام برنامه‌هایی که این پایین برای لینوکس معرفی می‌کنم که نسخه‌ی ویندوزی هم دارن. فعلن همینا کافیه.

و برای لینوکس:

  • Geany
  • MEdit
  • Kate
  • KWrite
  • Netbeans
  • Vim
  • Bluefish
  • و خیلی‌های دیگه.

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

private JComboBox statesComboBox;
private JComboBox zeroStateComboBox;
private JButton zeroStateColorButton;
private JComboBox oneStateComboBox;
private JButton oneStateColorButton;
private JTextField nameTextField;
private JCheckBox isFinalStateCheckBox;
private JButton addButton;
private JButton removeButton;
private JButton applyButton;
private Graph graph;
private JButton openButton;
private JButton saveButton;
private Action openAction;
private Action saveAction;

از منوی Edit ویرایشگر متنم که الان Kate است، Replace رو انتخاب می‌کنم. برای نرم‌افزار‌هایی که معرفی کردم، ممکنه این گزینه توی منو‌هایی مثل Search یا Find هم باشه. من باید این کار رو کنم، اول private‌ها حذف بشه، بعد «;» رو باید با «,» تعویض کنم، در آخر هم public StatePropertiesPanel( رو به ابتدا و ({} رو به انتها اضافه کنم. این کار آخر که آسونه و می‌شه با دست انجام داد، اما برای بقیه‌ی کار، Replace رو باز می‌کنم، گزینه‌ی Regular expression رو فعال می‌کنم و توی کادر Find عبارت زیر رو می‌نویسم (بعد از این توضیح می‌دم که معانی این عبارات چی هستن):

private (.*);

و توی کادر Replace مقدار زیر رو می‌نویسم:

\t\1,

و در انتها دکمه‌ی Replace All رو می‌زنم. نتیجه به شکل زیر می‌شه:

        JComboBox statesComboBox,
        JComboBox zeroStateComboBox,
        JButton zeroStateColorButton,
        JComboBox oneStateComboBox,
        JButton oneStateColorButton,
        JTextField nameTextField,
        JCheckBox isFinalStateCheckBox,
        JButton addButton,
        JButton removeButton,
        JButton applyButton,
        Graph graph,
        JButton openButton,
        JButton saveButton,
        Action openAction,
        Action saveAction,

خب، کامای خط آخر رو پاک می‌کنم و به جای اون می‌نویسم ({} و ابتدای خط اول public StatePropertiesPanel( رو اضافه می‌کنم. تا اینجا که متد سازنده‌ی من شکل کلی رو به خودش گرفت. پس متن رو کپی می‌کنم به سورس فایلم. اما حالا محتوایت این متد سازنده. دوباره مقایر رو مثل چند مرحله قبل به یک فایل جدید (و موقت، راه‌های دیگه هم هست، ولی این از همه دم دست تره!) انتقال می‌دم و مراحل رو اینبار به این شکل تکرار می‌کنم. استراتژی کار این بار به این شکله. private ها و اسم کلاس‌هایی که شیء از اون ساخته می‌شه باید حذف بشه، اسم شیء باید با اسم فیلد تغییر کنه (یعنی یه this. بیاد قبلش) و بعد مساوی و باز اسم شیء به عنوان پارامتر متد. پس توی کادر Find این رو می‌نویسم:

private .* (.*);

و بعد توی کادر Replace می‌نویسم:

\t\tthis.\1 = \1;

و Raplace all رو می‌زنم. نتیجه می‌شه:

                this.statesComboBox = statesComboBox;
                this.zeroStateComboBox = zeroStateComboBox;
                this.zeroStateColorButton = zeroStateColorButton;
                this.oneStateComboBox = oneStateComboBox;
                this.oneStateColorButton = oneStateColorButton;
                this.nameTextField = nameTextField;
                this.isFinalStateCheckBox = isFinalStateCheckBox;
                this.addButton = addButton;
                this.removeButton = removeButton;
                this.applyButton = applyButton;
                this.graph = graph;
                this.openButton = openButton;
                this.saveButton = saveButton;
                this.openAction = openAction;
                this.saveAction = saveAction;

خب، به همین راحتی این‌ها هم تولید شد.

با یک مثال شروع کردم که حرف‌هام ملموس باشه. این الگو، قواعد خودش رو داره و قواعد متفاوتی داره. من POSIX Basic Regular Expressions همراه با POSIX Extended Regular Expressions رو توضیح می‌دم. یک عبارت منظم یک مجموعه از رشته‌ها رو مطابق می‌شه که می‌تونیم از این مجموعه برای پیدا کردن متن مورد نظر استفاده کنیم. ما یک سری Metacharacter (که حالا فارسی بگیم ابرحرف) داریم که معنی خاصی دارن. اولی این‌ها رو یاد بگیریم:

  • «.» مطابق می‌شه با یک حرف. البته در اکثر بنامه‌ها این حرف شامل خط جدید نمی‌شه
  • «[ ]» مطابق یکی از حروف مشخص‌شده یا شامل شده می‌شه. مثلن [abc] مطابق می‌شه با حرف a یا b یا c و [a-z] مطابق هر حرف از حروف کوچیک الفبای انگلیسی می‌شه. [abx-z] مطابق a یا b یا x یا y یا z می‌شه. [a\-b] هم مطابق a یا – یا b می‌شه. \ اینجا برای تغییر معنی به کار می‌ره. [a-dx-z] هم مطابق می‌شه با a یا b یا c یا d یا x یا y یا z می‌شه. یعنی می‌شه بازه‌ها رو ترکیب کرد.
  • «[^ ]» مطابق هر حرفی به‌جز حرف‌های درون براکت می‌شه. به عنوان مثال [^abc] تمام حروف به‌جز a و b و c خواهد بود. قواعد براکت معمولی رو هم می‌شه به کار برد
  • «^» معنی موقعیت یک رشته درون رشته‌ی دیگه رو می‌ده که این معنی برای ابزار‌هایی که خط در اونها معنی داره (مثل ویرایشگر‌های متنی) به معنی شروع خط خواهد بود.
  • «$» معنی موقعیت پایان رشته و در ابزار‌های خطی، به معنی پایان خط هست. مثال‌های انتها معنی رو بهتر روشن می‌کنه.
  • «()» یک عبارت علامتگذاری شده رو مشخص می‌کنه. شما می‌تونید توی پرانتز یک عبارت منظم رو که براتون مهمه، مثل نام شیء تو مثال اول مطلب، علامت بزنید تا از اون استفاده کنید. قسمت زیر هم مرتبط با این قستمه.
  • «\n» که n یک عدد بین ۱ تا ۹ هست که مطابق می‌شه با nامین رشته‌ی علامت گذاری شده با پرانتز. بعضی ابزار ها اجازه‌ی گستش این دستور رو بیشتر از ۹ فراهم می‌کنن.
  • «*» مطابق می‌شه با رخداد ۰ یا بیشتر از حرف ماقبل این علامت. به این معنی که ab*c رو اگر برای عبارت منظم داشته باشیم، مطابق می‌شه با ac و abc و abbc و abbbc و….
  • «+» مطابق می‌شه با رخداد ۱ یا بیشتر از حرف ماقبل این علامت. به این معنی که ab+c رو اگر برای عبارت منظم داشته باشیم، مطابق می‌شه با abc و abbc و abbbc و….
  • «?» مطابق می‌شه با رخداد ۰ یا یک باز از حرف ماقبل این علامت. به این معنی که ab? مطابق a و ab خواهد بود.
  • «|» برای اجتماع کردن دو عبارت منظم می‌شه. یا به عبارتی برای انتخاب بین دو عبارت منظم به کار می‌ره. مثلن abc|def مطابق abc و def می‌شه.
  • «{n,m}» هم مطابق با n تا m تکرار از حرف ما قبل خودش می‌شه. این عبارت ممکنه توسط ابزار‌های قدیمی تر پشتیبانی نشه. مثال هم: ab{1,3} مطابق می‌شه با ab و abb و abbb.

و البته اگر برنامه‌نویسی هم کرده باشین، مژده اینه که می‌تونید از حروف خاص مثل \t یا \n هم استفاده کنید.

اما با چند مثال بیشتر مفهوم رو گسترش می‌دم.

.at

مطابق تمام رشته‌های ۳ حرفی شامل at می‌شه. مثل cat و bat و hat و حتی 2at

[hc]at

مطابق hat و cat می‌شه و نه چیز دیگه‌ای.

[^b]at

مطابق تمام رشته‌های ۳ حرفی به‌جز bat می‌شه.

^[hc]at

مطابق تمام cat و hat ها در اول خط می‌شه.

[hc]at$

مطابق تمام cat و hat های انهای خط می‌شه.

[hc]?at

مطابق hat و cat و at می‌شه.

.*=

مطابق تمام رشته‌هایی که به = ختم می‌شن، می‌شه.

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

(.*)=(.*)

طبق فرض، پرانتز اول برابر کلمه‌ی اول و پرانتز دوم برابر کلمه‌ی دومه. حالا برای جایگزینی، کادر Replace رو با عبارت زیر پر می‌کنم:

\2=\1

به همین راحتی. بذارین یه مثال خیلی کاربردی برای وبلاگ نویسا بگم. می‌خوایم قبل تمام لینک‌های موجود توی یک متن، favicon اون رو (همون آیکون کوچیکه که کنار نوار آدرس توی مرورگر دیده می‌شه) رو با استفاده از «سرویس گوگل برای بدست آوردن favicon ها و اعمال آن بر لینک های خارجی» قرار بدیم. تقریبن تمام ابزار‌هایی که برای نوشتن وبلاگ استفاده می‌شه (مثل ویرایشگر خود وبلاگ(ها) و Bilbo Blogger) این امکان رو به شما می‌دن که بعد از نوشتن متن، کد HTML اون رو ببینید. پس شما اول متن رو بنویسید و کد HTML اون رو به یک ویرایشگر متن انتقال بدین تغییرات رو اعمال کنید و باز کد رو از ویرایشگر متن به وبلاگ منتقل کنید. خب اول در مورد لینک برای کسانی که آشنایی ندارن، این رو بگم.

وقتی شما یک لینک می‌سازین، برچسبی قبل و بعد اون قسمت لینک اضافه می‌شه. به عنوان مثال لینک «سار» رو شرح می‌دم:

<a href="http://saarblog.wordpress.com">سار</a>

خب، برچسب <a> معرفی کننده‌ی شروع یک لینکه. خصوصیت href از اون مشخص کننده‌ی آدرس لینکه. و برچسب با </a> تموم می‌شه. ما باید domain مربوط رو پیدا کنیم. این domain قسمت ابتدای URL آدرس ماست و یا تا اولین / و در صورت نبودن اولین /، تا آخر URL ادامه داره. از اونجا که حروف بزرگ و کوچیک تفاوتی ایجاد نمی‌کنه، پس می‌تونیم برچسب <A> رو هم داشته باشیم. اول عبارت منظم:

<[aA] ([^>]*[hH][rR][eE][fF]="?[hH][tT][tT][pP][sS]?)://([^/" ]+)("?[^>]*)>

خب برای این که یک لینک شروع بشه، باید <a یا <A رو داشته باشیم که من از <[aA] استفاده کردم. بعد از اون می‌تونه هر عبارتی بیاد به‌جز «>» و عبارت هم برای ما اهمیت داره (برای این که ساختار لینک از بین نره) ولی حتمن باید یک فاصله بعد از a یا A باشه (وگرنه ممکنه یه برچسب دیگه باشه!). عبارت href= شروع آدرس URL رو نشون می‌ده که ممکنه (و در اکثر موارد) این URL بین دو «”» قرار داره. برای همین بعد از «”» یک علامت سوال قرار دادم. پروتکل می‌تونه http یا https باشه، و از اونجا که می‌شه اینطور هم نوشت: HtTpS، من کاراکتر به کاراکتر اون‌ها رو توی براکت قرار دادم. بعد از اون حتمن باید :// وجود داشته باشه، بعد Domain از اینجا تا اولین «/» یا «”» یا فاصله ادامه خواد داشت. و بعد ادامه تا علامت «>». خب، حالا عبارت Replace باید به این شکل ساخته بشه:

<a \1://\2\3><img src="http://www.google.com/s2/favicons?domain=\2" />

پرانز دوم Domain بود، برای همین جاهایی که نیاز بود، \2 رو استفاده کردم. جالب بود، نه؟

فکر می‌کنم الآن می‌تونید مثال‌های برنامه نویسی رو متوجه بشین.
پ‌ن: این ترفند favicon رو برای این پست اعمال کردم.

=-=-=-=-=
Powered by Bilbo Blogger, Made with Bluefish HTML editor.





برنامه نویسی، جاوا و معرفی چند کتاب

2 03 2010

Books Photoخیلی وقتا از من سوال می‌شه که «چه کتابی رو برای یادگیری جاوا خوبه؟» یا حتی «چه‌کار کنیم که برنامه‌نویسی یاد بگیریم؟» و از این قبیل سوال‌ها. مدت‌هاست می‌خوام در این مورد یه مطلب بنویسم.

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

برای شروع برنامه نویسی، فکر می‌کنم زبون C++ گزینه‌ی خوبی باشه. در حال حاضر پاسکال رو خیلی‌ها توصیه می‌کنن که من با این زبون مخالفم (البته به عنوان واحد دانشگاهی این درس رو پاس کردم). سنتی بودن این زبون و قدیمی بودنش دلیل اصلی این حرف منه. دانشجوی ترم اولی پاسکال می‌خونه، ترم بعد همون پاسکالی رو که خونده به زبون C++ می‌خونه. این یعنی یک گام درجا زدن.

برای شروع یادگیری C++ من کتاب «C++: a beginner’s guide» و بعد از اون کتاب خوب «C++ nuts & bolts: for experienced programmers» که نسخه‌ی ترجمه شده‌ی تقریباً خوبی با نام «راهنمای سریع C++» داره. البته به نظر من کتاب دوم هم می‌تونه برای شروع C++ مورد استفاده قرار بگیره. برای مرجع هم دو کتاب «C++: The Complete Reference» و کتاب معروف «C++ how to program» که ترجمه‌های زیادی هم از این کتاب وجود داره. من یکی از این ترجمه‌ها رو با نام «چگونه با C++ برنامه بنویسیم» از نشر «سیمای دانش» رو خودم گرفتم که نگارش خوبی نداشت و اون رو پیشنهاد نمی‌کنم. این دو کتاب رو به عنوان مرجع گفتم ونه به عنوان محور آموزش. دقت کنید که اگر همین الان یکی از این دوتا رو باز کنید و از اولی بخونید، از برنامه نویسی زده می‌شین. درست مثل اینه که شما یک فرهنگ لغت رو بشینید از اول بخونید.

اما جاوا، راستشو بخواین دیشب که به پادکست دوم رادیو لینوکس (که کار بسیار جالبیه) گوش می‌کردم، حس حسادت به برنامه نویس‌های C++ توی من به وجود اومد. البته هرچند به زودی چیچک رو به عنوان یه پروژه‌ی ابتکاری توسعه می‌دم ولی خب برای این که بشه یه برنامه طوری که بتونه مورد اسفتاده‌ی عموم قرار بگیره نوشت، بهترین زبون C++ خواهد بود. ولی به شخصه، من دوست دارم با زبونی برنامه بنویسم که ابهام آمیز نباشه. همه چیز اون طبق قاعده و مستند شده باشه و تفاوت میون Compilerها در ترجمه‌ی برنامه وجود نداشته باشه. برای من سخته از کدی به شکل String.compareTo در جاوا دل بکنم و اون رو با strcmp از C++ تعویض کنم. همونقدر که از مستقل از بستر بودن جاوا نمی‌شه گذشت، از قدرت C++ هم نمی‌شه گذشت و خوشبختانه اگر در جاوا به قدرت C++ نیاز شد، می‌شه با Native نویسی اون رو بدست آورد.

اما برای کسانی که مایل هستن جاوا رو یاد بگیرن بگم که بهترین کتابی که من می‌تونم معرفی کنم، دو جلد کتاب «Core Java» از نشر «Prentice Hall» هست که به نظر من خوندن این دو جلد کتاب برای یاد گیری جاوا از هر کتابی بهتره. «The Java Tutorials» هم منبع خیلی مفیدی برای یاد گیری جاوا، به خصوص رابط گرافیکی توی اونه. اما کتاب‌های «آموزش جاوا در 21 روز» از نشر «نص» رو به عنوان یه کتاب برای شروع به زبون فارسی بد نمی‌دونم. کتاب «جاوا، جاوا، جاوا: رهیافتی شی ء گرا در حل مسائل » از نشر «جنگل» هم کتاب خوبی به حساب میاد. و البته کتاب «راهنمای جامع Java» از نشر «کانون نشر علوم» هم کتاب خوبیه و به قول میلاد، مختصر و مفید توضیح داده و برای مرجع فارسی کتاب خوبیه. البته من نسخه‌ی اصلی این کتاب یعنی «Java™ 2: The Complete Reference» رو مرجع خوبی نمی‌دونم. برای مرجع بهترین چیز، مستندات جاواست که از هر کتابی می‌تونه مفید باشه. برای تمام مباحث جاوا هم کتابای خوبی پیدا می‌شه. مثلاً کتاب «Computer Graphics Using Java™ 2D and 3D» و یا کتاب «Java Network Programming».

دو چیز رو با تاکید بگم:

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

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

اما جزئیات بیشتر از کتاب‌هایی که توی این مطلب نامشون رو بردم:

C++ how to program

Title: C++ how to program
Authors: Paul J. Deitel, Harvey M. Deitel
Publisher: Prentice Hall
ISBN: 0136152503, 9780136152507


C++ A Beginner's Guide

Title: C++: a beginner’s guide
Author: Herbert Schildt
Publisher: McGraw-Hill/Osborne
ISBN: 0072194677, 9780072194678


C++ Nuts & Bolts

Title: C++ nuts & bolts: for experienced programmers
Author: Herbert Schildt
Publisher: Osborne McGraw-Hill
ISBN: 0078821401, 9780078821400


C++ The Complete Reference

Title: C++: The Complete Reference
Author: Herbert Schildt
Publisher: McGraw-Hill Osborne Media
ISBN: 0072226803, 9780072226805


Core Java, Vol. 1 Fundamentals

Title: Core Java, Vol. 1: Fundamentals
Authors: Cay S. Horstmann, Gary Cornell
Publisher: Prentice Hall PTR
ISBN: 0132354764, 9780132354769


Core Java, Vol. 2 Advanced Features

Title: Core Java, Vol. 2: Advanced Features
Authors: Cay S. Horstmann, Gary Cornell
Publisher: Prentice Hall PTR
ISBN: 0132354799, 9780132354790


Computer graphics using Java 2D and 3D

Title: Computer graphics using Java 2D and 3D
Authors: Hong Zhang, Y. Daniel Liang
Publisher: Prentice Hall
ISBN: 0130351180, 9780130351180


Java network programming

Title: Java network programming
Author: Elliotte Rusty Harold
Publisher: O’Reilly Media, Inc.
ISBN: 0596007213, 9780596007218


Java 2: the complete reference

Title: Java 2: the complete reference
Author: Herbert Schildt
Publisher: Osborne/McGraw-Hill
ISBN: 0072130849, 9780072130843


عنوان: جاوا، جاوا، جاوا: رهیافتی شی ء گرا در حل مسائل
تالیف: رالف مورلی، هادی محمدزاده (مترجم)، علی جهانیان (مترجم)
نشر: چنگل
شابک: 978-964-981-065-2

عنوان: چگونه با C++ برنامه نویسی کنیم
تالیف: هاروی دیتل، پل دیتل، علیرضا انصاری (مترجم)
نشر: زانیس
شابک: 978-964-377-302-1

عنوان: راهنمای سریع C++
تالیف: هربرت شیلد، ابوالقاسم شادمان پور (مترجم)
نشر: دانشگاه هرمزگان
شابک: 964-6426-31-X

عنوان: راهنمای جامع Java
تالیف: هربرت شیلد، فرهاد قلی زاده نوری (مترجم)، علی اصغر شریف پور (مترجم)
نشر: کانون نشر علوم
شابک: 964-8587-21-3

عنوان: برنامه نویسی جاوا: خودآموز سریع در 21 روز
تالیف: چارلز پرکینز، لورا لمی، علیرضا زارع پور (مترجم)
نشر: نص
شابک: 964-6264-21-2





Slax، سیستم عامل جیبی شما

27 02 2010

خیلی وقتا بحث پیش میاد که «سیستم‌عامل زنده به چه دردی می‌خوره. حالا گیریم که اوبونتو از روی CD هم بالا اومد، غیر از نجات سیسم معیوب، چه دردیو دوا می‌کنه». اما خب از بحث‌های تکنیکی که بگذریم، گاهی این زنده بودن سیستم‌عامل می‌تونه خیلی به درد بخور باشه. شما یه فلش یا حد اقل پخش کننده‌ی موسیقی همراهتون هست همیشه ولی اگرم Laptop داشته باشین، همه‌جا که همراهتون نیست ولی خیلی چیزای اون رو همه جا نیاز دارین. مثل Firefox و برنامه‌های دیگه. خیلی جاها نیاز به سیستم امنی دارین تا با خیال راحت و دوری از هر Keylogger بتونید یه ایمیل چک کنید و خیلی محاسن دیگه. بد نیست که با سیستم عامل جیبی Slax آشناتون کنم. اول از توضیحات وب‌سایت اون شروع می‌کنم:

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

رویکرد ماژولار این امکار را به شما می‌دهد که به راحتی نرم‌افزار‌های دیگر را به Slax اضافه کنید. اگر فقدان ویرایشگر متن، ابزار شبکه یا بازی مورد علاقه‌ی خود را احساس می‌کنید، به راحتی ماژول آن نرم‌افزار را دریافت کرده و آن را در Slax کپی کنید، نیازی به نصب و تنظیم نیست.

خب فکر می‌کنم توضیحات کامل بود. اما حالا برای داشتن یه Slax روی حافظه‌ی قابل حملمون چکار باید کرد؟ به چیا نیاز داریم؟

  • یک رسانه‌ی حافظه مثل USB Flash یا Music Player
  • فایل slax-6.1.2.tar که در حال حاظر آخرین نسخست و می‌تونید به حجم 200 مگا بایت اون رو از این پیوند دریافت کنید.
  • یک برنامه برای باز کردن فایل‌های tar. اگر نمی‌شناسین باید بگم که تقریبن تمام برنامه‌هایی که فایل رو فشرده می‌کنن می‌تونن این مدل آرشیو رو باز کنن. می‌تونید از اینجا برنامه‌ی رایگان و متن باز 7-Zip رو دریافت کنید.

برای شروع، اول راه اندازی توی Windows رو توضیح می‌دم:

  • اول رسانه‌ی حافظه رو که به عنوان مثال USB Flash شماست رو به کامپیوتر متصل کنید و در صورت لزوم منتظر بمونید تا نصب شه. به عنوان مثال یک درایو به نام F: به کامپیوتر شما اضافه می‌شه.
  • برنامه‌ی 7-Zip رو باز کنید (یا برنامه‌ی فشرده ساز خودتون رو) و فایل slax-6.1.2.tar رو باز کنید. (برای 7-Zip می‌تونید از قسمت مدیریت فایل که مرکز صفحست استفاده کنید).
  • فایل رو Extract کنید به درایو USB Flash که برای مثال ما آدرس F:\ خواهد بود.
  • به درایو مورد نظر برین (برای مثال ما، درایو F:) و بعد پوشه‌ی boot.
  • توی اون پوشه، فایل bootinst.bat رو باز کنید. دقت کنید که با نام bootinst دو تا فایل وجود داره، ما به فایلی نیاز داریم که در انتهاش نوشته شده باشه .bat یا این که چیزی نوشته نشده باشه.
  • یک صفحه‌ی مشکی نشون داده می‌شه که توضیحاتی در مورد نصبه:

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
                         Welcome to Slax boot installer
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  
This installer will setup disk F: to boot only Slax.
  
Warning! Master Boot Record (MBR) of the device F: will be overwritten.
If F: is a partition on the same disk drive like your Windows installation,
then your Windows will not boot anymore. Be careful!
  
Press any key to continue, or kill this window [x] to abort…

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

Setting up boot record for F:, wait please…
Disk F: should be bootable now. Installation finished.
  
Read the information above and then press any key to exit…

  • اگر ماژول خاصی رو هم دریافت کردین، می‌تونید اون رو به پوشه‌ی F:\slax\modules انتقال بدین.
  • کار تمومه. کافیه کامپیوتر رو Restart کنید و بهش بگین که می‌خواین سیستم‌عامل از روی حافظه‌های خارجی بارگذاری بشه. معمولاً وقتی که کامپیوتر روشن می‌شه می‌تونید از کلید F12 استفاده کنید یا از کلیدی که خود سیستم به شما معرفی می‌کنه توی همون صفحه‌ی ابتدایی استفاده کنید. در نهایت می‌تونید با زدن Delete یا F1 وارد تنظیمات Bios بشین و اولویت Boot رو برای دستگاه‌های خارجی یا USB ها بالا ببرین تا ابتدا برای بارگذاری سیستم، Bios سراغ رسانه‌های خارجی بره.
  • کار تمومه! خسته نباشین. صفحه‌ی سبز و سفید Slax جلوی روی شماست.

اما کاربرای گنو/لینوکس چکار باید کنن؟ خیلی با مراحل بالا تفاوتی وجود نداره الا این که هر مرحله به جای برنامه‌ها و آدرس‌های ویندوزی، از معادل گنو/لینوکسی اون استفاده کنن.

  • برای فایل tar در تقریبن تمام گنو/لینوکس‌ها ابزار گرافیکی و در تمام اونها ابزار خط فرمانی tar وجود داره و نیازی به 7-Zip نیست.
  • در پوشه‌ی boot باید Script نصب که bootinst.sh هست رو با مجوز کاربر ریشه اجرا کرد.

اما بذارین از قابلیت‌ها و امکاناتی که می‌تونید با Slax داشته باشین بگم.

شاید جذاب ترین قابلیتی که یه Slax می‌تونه برای یه دانشجوی نرم‌افزار داشته باشه، داشتن یک Compiler به روز وقوی GCC برای Compile کردن برنامه‌هایی که به زبون C++ استاندارد نوشته می‌شه، باشه. من ترم 2 برای پروژه‌ی C++ برنامه‌ای که نوشتم، تمام و کمال با ابزار‌های Slax بود (از جمله ویرایشگر متن قوی kate) و برای ارائه هم، متن برنامه و فایل اجرایی اون رو، روی میزکار یه Slax گذاشتم و از اون با ابزاری که توی پوشه‌ی slax به نام make_iso هست، یک CD زنده درست کردم و به استاد دادم. با این کار هم نمره‌ی خودم رو گرفتم و گنو/لینوکس رو ترویج دادم!

این که شما می‌تونید به راحتی برنامه به Slax اضافه کنید و یک مجموعه‌ی بزرگ از نرم‌افزارها رو داشته باشین، شاید یک امکان بسیار خوب برای هر کاربر و نه تنها یک دانشجوی نرم‌افزاره. می‌تونید ماژول‌های Slax رو از این آدرس دریافت کنید.

یکی از قابلیت‌های جالب Slax امکانیه به نام PXE که هنگام بارگذاری سیستم‌عامل می‌شه با نام «Slax as PXE server» اون رو استفاده کرد. اگر بخوام به زبون ساده این امکان رو شرح بدم، اینه که اگر این قابلیت رو توی یک شبکه استفاده کنید، می‌تونید بدون هیچ رسانه‌ای و فقط از طریق شبکه، یک سیستم دیگه‌ای رو با Slax بارگذاری کنید. شاید بار‌ها مثل من براتون سوال پیش اومده باشه که Boot From Network رو چطور می‌شه به کار برد. جواب همین قابلیته.

یکی دیگه از قابلیت‌های Slax انعطاف پذیر بودن اونه. یعنی بدون این که از برنامه نویسی دانشی داشته باشین، می‌تونید Slax رو برای خودتون تغییر بدین. به عنوان مثال پوشه‌ی rootcopy که توی پوشه‌ی slax وجود داره یک نمونه از این انعطاف پذیریه. وقتی سیستم بارگذاری می‌شه، فایل‌های این پوشه به پوشه‌ی ریشه (/) کپی‌میشن. به عنوان مثال اگر توی همین rootcopy یه پوشه با نام Desktop درست کنیم و توی Desktop یک فایل به نام saar.txt داشته باشیم، وقتی سیستم‌عامل بارگذاری می‌شه، روی میز‌کار فایل saar.txt وجود خواهد داشت. برای پروژه‌ی ترم 2 که قبل از این گفتم، من متن و فایل اجرایی پروژه رو به این پوشه انتقال دادم تا وقتی سیستم‌عامل بارگذاری می‌شه روی میز کار باشه این فایل‌ها.

و در نهایت برای آموزش فوق‌العادست. شما هر بلایی که دلت خواست سر این Slax بیار. بعد وقت بارگذاری اون، گزینه‌ی «Slax Always Fresh» رو بزن. به همین راحتی یه Slax تازه دم دست شماست!

و در نهایت بگم این رو که باید Slax رو امتحان کرد تا از امکاناتش و حتی به قول خود Slax از Cheat Codes هاش آگاه شد. Slax رو حتی می‌شه روی Hard دیسک نصب کرد (چیزی که من پیشنهاد نمی‌کنم) و از اون روی Hard Disk استفاده کرد. ساختار Slax ساختار مناسبیه برای کسانی که می‌خوان روی تولید یک سیستم‌عامل وقت بذارن و می‌تونه منبع اطلاعاتی خوبی برای اون‌ها باشه.


پ.ن: امیدوارم تونسته باشم جواب این دیدگاه رو بدم.

به‌روز رسانی:

من نمی‌دونستم که قبل از این هم در مورد Slax نوشتم.





تبدیل فایل‌های اجرایی جاوا به فایل‌های اجرایی محلی سیستم‌عامل

24 02 2010

مدت زیادیه که مشغله‌ی زیادی دارم و خیلی کم‌تر می‌تونم به «سار» برسم. اما بهونه‌ی این پست کامنت دوستم، علی، در مورد تبدیل فایل «JAR» به فایل اجرایی ویندوز «EXE» است:

… یکی از دوستام روانی ساختن فایل exe برای نرم افزارهای جاوایی که درست می‌کنه. وقتی دقت کردم دیدم چیچک رو اینجوری ساختی. اگه می‌شه درمورد ساختن فایل‌های stand alone با پسوند exe برای ویندوز من و در واقع دوستم رو راهنمایی کن.

خب من در این مورد کتاب «Core Java: Volume I-Fundamentals» توی صفحه‌ی «497» مطلبی رو نوشته بود که به نظر مفید میاد:

However, a Java program in a JAR file does not have the same feel as a native application. On Windows, you can use third-party wrapper utilities that turn JAR files into Windows executables. A wrapper is a Windows program with the familiar .exe extension that locates and launches the Java virtual machine (JVM), or tells the user what to do when no JVM is found. There are a number of commercial and open source products, such as JSmooth ( http://jsmooth.sourceforge.net) and Launch4J (http://launch4j.sourceforge.net). The open source installer generator IzPack (http://izpack.org) also contains a native launcher. For more information on this topic, see http://www.javalobby.org/articles/java2exe.

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

    • نمونه‌های تجاری
    1. JEXECreator
    2. exe4J
    3. NativeJ
    4. execJava
    5. Executor
    6. JExePack
    7. Jlaunch
    • نمونه‌های رایگان و متن باز
    1. JSmooth
    2. Launch4j
    3. jstart32
    4. exeJ
    5. Janel
    6. jstart
    7. Roxes Ant Tasks
    8. Marner Java Launcher
    9. jelude

    امیدوارم تونسته باشم جواب سوال رو داده باشم.





    نرم‌افزار‌های غیر آزاد من

    24 12 2009

    روزبه عزیز، تقریبن اواخر شهریور ماه، من رو به یه کار جمعی دعوت کرده تا به قول خودش:

    در آستانه جشن روز آزادی نرم افزار ( شنبه هفته آینده در تمام نقاط دنیا و امروز در اصفهان ) مثل سال گدشته وبلاگ نویسان لینوکسی نویس را به این حرکت دعوت می کنم ! کاری که پارسال هم آنرا انجام دادیم و نسبتا هم با استقبال خوبی مواجه شد . حالا این حرکت ( من اسمش رو می ذارم “جنبش” ) بدین صورت است که : با نصب پکیج vrms هرکسی می تواند پکیج های غیرآزاد (Non-free) را بر روی سیستمش جستجو می کند و نتیجه آن را بر روی وبلاگش منتشر می کند و سعی می کند جایگزین مناسبی برای این پکیج های غیر آزاد پیدا کند .

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


                Non-free packages installed on ramin-laptop
      
    opera                     The Opera Web Browser
    rar                       Archiver for .rar files
    sl-modem-daemon           SmartLink software modem daemon
    sun-java6-bin             Sun Java(TM) Runtime Environment (JRE) 6 (architecture
    sun-java6-jdk             Sun Java(TM) Development Kit (JDK) 6
    sun-java6-jre             Sun Java(TM) Runtime Environment (JRE) 6 (architecture
    xmind                     XMind - Brainstorming and Mind Mapping
      
                Contrib packages installed on ramin-laptop
      
    nvidia-common             Find obsolete NVIDIA drivers
      
    Contrib packages with status other than installed on ramin-laptop
      
    flashplugin-installer     ( dei)  Adobe Flash Player plugin installer
      
      7 non-free packages, 0.5% of 1508 installed packages.
      2 contrib packages, 0.1% of 1508 installed packages.

    اما این رو هم اضافه کنم که از این بسته‌هایی که روی سیستمم دارم، شاید خیلیهاشون نسخه‌ی متن باز دارن و البته نسخه‌ی متن بازشون رو هم نصب شده دارم.

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





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

    8 09 2009

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

    gccegg-65کمتر کسی از جامعه‌ی برنامه نویسی اسم gcc رو نشنیده. gcc کامپایلریه که نامش از سر‌کلمه‌های Gnu Compiler Collection گرفته شده و ریچارد استالمن در سال 1985 برای ترجمه‌ی برنامه‌های نوشته شده به زبون c اون شروع به ساخت کرد. (منبع، اطلاعات بیشتر، وب‌سایت پروژه)

    برای داشتن قدرت و امکانات gcc لزومی نداره که کاربر، سیستم‌عامل خاصی، به عنوان مثال gnu/linux یا gnu/hurd داشته باشه.
    توی این پست نحوه‌ی استفاده از GCC توی ویندوز رو توضیح می‌دم.

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

    • اون رو اجرا کنید.
    • پنجره‌ی خوشامد گویی رو با کلید Next جواب بدین.
    • اگر روی سیستمی که برنامه رو اجرا کردین می‌خواین برنامه رو نصب کنید که Download and Install رو انتخاب کنید و اگر می‌خواین فقط بسته‌ها رو دانلود کنید، Download only رو انتخاب کنید و کلید Next رو بزنید.
    • با پروانه‌ی استفاده و توزیع مجدد در صورتی که موافقت دارید، با زدن کلید I Agree موافقت کنید.
    • بذارین بسته‌های نسخه‌ی Current نصب شه. پس Next رو کلیک کنید.
    • کامپایلر‌هایی که نیاز دارین رو علامت دار کنید و با Next به صفحه‌ی بعد برین.
    • مکان نصب رو انتخاب کنید و Next رو کلیلک کنید.
    • در انتها هم با زدن کلید Install منتظر دانلود شدن (و احتمالا نصب) بسته‌ها باشید.

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

    اما یه کار کوچولوی دیگه هم اگر انجام بدیم کارمون خیلی راحت تر می‌شه. من فرض رو بر این می‌ذارم که شما این MinGW رو توی درایو C ویندوز نصب کردین. اگر اینطور نیست توی توضیحات به جای این آدرس، محل نصب نرم‌افزار تو سیستمتون رو بذارین. این توضیحات برای ویندوز XP هستش و برای نسخه‌های دیگه‌ی ویندوز روال مشابهی طی می‌شه.

    • به Control Panel برین.
    • اگر گزینه‌ی Performanceand Maintenance رو می‌بینید (کنترل پانل به صورت Category view هست) رو بزنید.
    • System رو انتخاب کنید و اون رو باز کنید.
    • سربرگ Advanced رو انتخاب کنید.
    • از پایین پنجره کلید Environment Variables رو بزنید.
    • از لیست System variables دنبال Path بگردین و از پایین لیست Edit رو کلیک کنید.
    • متن زیر رو که آدرس پوشه‌ی bin نرم‌افزار MinGW نصب شدست رو به همراه یک سیمی‌کالن به ابتداری متن کادر Variable value اضافه کنید:
      C:\MinGW\bin;
    • تمام پنجره‌های باز رو با زدن کلید Ok ببندین.

    خب، از این به بعد می‌تونید بدون تایپ کردن آدرس از g++ و امکانات دیگه استفاده کنید.

    اما اگر Geany رو نصب کردین، از همون تو می‌تونید برنامه رو کامپایل کنید (F8) یا فایل اجرایی رو تولید کنید (F9) و یا برنامه رو اجرا کنید (F5). پس کد زیر رو توی اون کپی کنید، با نام hello.cpp سیو کنید و بعد F9 رو از روی صفحه‌کلید بزنید و بعد برای اجرای اون کلید F5 رو بزنید. به همین راحتی!
    #include<iostream>
    using namespace std;
    int main(int argc, char** argv){
        cout << "Hello MinGW!\tHello Geany!\n";
        return 0;
    }

    خب امیدوارم این پست براتون مفید باشه. بد نیست برنامه‌ی Cygwin رو هم تست کنید!
    محیط توسعه‌ی Netbeans هم خیلی آسون و سریع و قدرتمنه. بد نیست اون رو هم تست کنید.
    پ‌ن: این پست هم تقدیم به ایشون که بسیار با اراده و مصمم دارن برنامه نویسی رو یاد می‌گیرن.
    پ‌ن: یک نمونه‌ی کار بسیار عالی رو هم می‌تونید اینجا ببینید


    بروز رسانی

    توی نظرات بحث گرمی در گرفت. خیلی‌ها از جمله خود من با فایل w32api-3.13-mingw32-dev.tar.gz مشکل داشتن که ساسان عزیز یه راه حل خیلی خوب پیشنهاد داد. Mirror دانلود رو عوض کنید تا مشکل حل بشه!





    Origo IDE ابزاری مناسب برای برنامه نویسی موبایل

    8 08 2009
    Origo IDE™

    Origo IDE

    هميشه کد نويسي براي موبايل خيلي پر دردسر تر از کد نويسي معمولي بوده. خب اول نياز بود تا يه زبون برنامه نويسي رو ياد بگيريم و بعد ابزار هاي کد نويسي براي موبايل که البته توي ايران به اين راحتي ها هم در دسترس نيست (به خاطر تحريم) و بعد شرو به کد نويسي و تست کنيم. سختي اين کار باعث شد که من فقط 2 تا برنامه اونم با زبون جاوا براي موبايل بنويسم و از اين کار دست بکشم. اما ديروز با يک IDE آشنا شدم که با اون به راحتي و حتي با دانش خيلي کم برنامه نويسي مي شه براي موبايل برنامه ي کاربردي نوشت. اسم اين محيط توسعه ي نرم افزار هست Origo IDE. بهتره قبل از توضيح بيشتر من، توضيح وبسايت Origo IDE رو ببينيم:

    Origo IDE™ delivers exceptional performance on Symbian S60 3rd and 5th edition devices.Developing quality applications for Nokia Smartphones is suddenly faster than ever with Origo IDE™.
    Start developing great software for Symbian S60 now and publish it at Nokia Ovi Store in record time.

    خب همونطور که مي بينيد با اين محيط توسعه ي نرم افزار مي شه براي گوشي هاي داراي سيستم عامل Symbian سري 60 که محبوب ترين سري توي گوشي هاي موبايل هست، البته نسخه ي 3 (مثل Nokia N73 و Nokia N95) و نسخه ي 5 (مثل Nokia 5800 Xpress Music و Nokia N97 و Samsung i8910 Omnia HD) به راحتي و با کيفيت عالي برنامه ي کاربردي نوشت و حتي اون ها رو به فروش رسوند. اين خيلي عاليه.بد نيست که يه Hello World رو هم به اين زبون ببينيم:

    .// program entrypoint
    .export main
    .  System.run application new MyApplication
    .
    .// MyApplication is the application launched from entrypoint
    .class MyApplication extends Application implements TimerListener
    .
    .  // from class Application
    .  draw to <Canvas deviceCanvas>
    .    deviceCanvas.draw string "Hello World" to 0, 0

    مي بينيد که کد هاي اين برنامه بيشتر به زبون محاوره اي شباهت داره تا کد يک برنامه اونم براي موبايل! بله! به همين راحتي. البته بايد اعتراف کنم که کد نويسي براي من سخته که به اين شکل کد بنويسم!

    تو صفحه ي آموزش اينطور جمله اي به چشم مي خوره:

    Origo Programming Language is a multi-paradigm, statically typed programming language. It is powerful but easy to learn and use. Many aspects of Origo are similar to Java but Origo borrows certain aspects also from other programming languages, such as indentation blocks and range style vector manipulation from Python.

    خب حق هم داره. خيلي از جنبه هاي جاوا رو توي خودش داره ولي از زبون هاي ديگه مثل Python هم جنبه هايي رو به ارث برده. مثل اين بلاک بندي (که به بيرون زدگي بلاک ها يا دندونه کردن بلاک ها معروفه) رو از Python داره. يعني شما رو مجبور مي کنه که بلاک ها رو مرتب بنويسيد.

    اگر مشتاق شديد که برنامه با اين زبون براي گوشي خودتون بنويسيد (مثل من) يا حتي اون رو به فروش برسونيد، آموزشي هم براي شما ترتيب دادن. مي تونيد از منوي Help برنامه Documention رو بياريد يا از اين صفحه توي مرور گرتون ديدن کنيد.

    و در نهايت بايد اين ها رو اضافه کنم که اين برنامه براي Microsoft Windows ساخته شده و نسخه اي براي سيستم عامل هاي ديگه هنوز وجود نداره. هنوز به صورت آزمايشي به سر مي بره و نهايي نشده. و البته بزرگ ترين مشکل که براي ما ايراني ها وجود داره اينه که اين برنامه به صورت رايگان نيست. البته مي تونيد نسخه ي آزمايشي اون رو دريافت کنيد و فکر مي کنم بدون محدوديت در امکانات يا محدوديت زماني از اون استفاده کنيد. احتمالا توي اين حالت نمي تونيد برنامه هاي خودتون رو به فروش برسونيد. من فعلا از اين حالت دارم استفاده مي کنم.

    من مي خوام براي امتحان هم که شده يک بازي براي گوشي سري 60 نسخه ي 5 خودم بنويسم. اگر تونستم، حتماً به صورت متن باز اون رو توي وبلاگ ارائه مي کنم.

    پ ن: براي IDE معادلي بهتر از «محيط توسعه ي نرم افزار» پيدا نکردم. اگر بخوايم کلمه به کلمه «Integrated Development Environment» رو ترجمه کنيد معادل مناسبي به دست نمياد. توي ويکي پديا نوشته «محيط توسعه ي مجتمع» که براي من همچين قابل قبول نيست!
    پ ن: اگر سوالي براتون پيش اومد، من در خدمت هستم که اگر بتونم به اين سوال جواب بدم.
    پ ن: توی اون مثال ابتدای هر خط من یه نقطه اضافه کردم تا این ورد پرس کد رو به هم نریزه.





    قرعه کشی فروشگاه سی تو

    28 07 2009
    فروشگاه محصولات گنو/لینوکس سی تو

    فروشگاه محصولات گنو/لینوکس سی تو

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

    sitoir: سلام – شما برنده خرید ۲۵۰۰۰ تومان نرم افزاز فروشگاه لینوکس سی تو شدید. پس از اتمام جشنواره می توانید اقدام به خرید تا این سقف نمایید

    بله! من ۲۵۰۰۰ تومن برنده شدم! راستش من همیشه پشتیبان این فروشگاه بودم و البته از خریدارانشون هم محسوب می شم. البته به خاطر هدف زیبایی که دارن به این شدت ازشون پشتیبانی می کنم.

    امروز هم این ایمیل رو دریافت کردم:

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

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

    برنده توییت پنجم مردادماه چه شخصی بود؟
    بنا به قول قبلی در روز پنجم مردادماه قرعه کشی در بین توییت کنندگان سی تو برگزار گردید و شخص با نام کاربری saarblog@ مدیر وبلاگ http://saarblog.wordpress.com برنده 25000 تومان بن خرید نرم افزار از سی تو گردید.
    برای توییت کردن فروشگاه جهت آگاهی از جشنواره ها و محصولات جدید از آدرس http://www.twitter.com/sitoir استفاده نمایید.

    با تشکر از همراهی شما
    مدیریت فروشگاه محصولات گنو/لینوکس سی تو

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

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

    پیشنهاد بعدی من هم اینه که روی مخازن محلی بیشتر تکیه کنن. یکی از مشکلات ایرانی ها سرعت پایین اینترنته که باعث شده از جامعه ی متن باز بیشتر از پیش دور باشن. این مخازن محلی می تونه حد اقل مقداری از این کاستی رو جبران کنه.

    پیشنهاد سوم هم این که آرم فروشگاه یا لوگوی اون رو توی این تصاویر کوچیک 80 در 15 پیکسلی بذاره تا کسانی که این فروشگاه رو حمایت می کنن اون آرم رو توی صفحه ی خودشون بذارن.

    پ ن: راستش چند وقتی بود که می خواستم مجموعه کامل LCD4Linux رو بخرم. پس احتمالا این کار رو با این جایزه خواهم کرد. البته در کنار اون بدم نمیاد سیستم عامل اندروید گوگل به صورت دیسک زنده رو هم تجربه کنم. در کل یه پست هم در مورد خرید های خودم خواهم نوشت!


    بعد نوشت

    توی این چند وقت که از اینترنت دور بودم گویا مخازن محلی اوبونتو به فروشگاه اضافه شده! اینم لینک!





    تغییر تصویر زمینه‌ی صفحه‌ی بوت سیستم

    23 07 2009

    براي شکستن سکوت «سار» بهانه‌اي بهتر از يه قابليت جالب سيستم‌هاي گنو/لينوکسي پيدا نکردم. اين بار مي‌خوام در مورد Grub که وظيفه‌ي بارگذاري سيستم عامل Ubuntu و البته خيلي از گنو/لينوکسي ديگه رو داره، يک قابليت جالب رو بگم.

    Grub Splash Image

    Grub Splash Image

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

    اولين چيزي‌هايي که بهشون نياز داريم اين‌ها هستن:

    • يک سيستم عامل Ubuntu که البته نصب شده باشه.
    • اينترنت يا DVD اوبونتو. البته براي نصب يک برنامه. می تونید از فروشگاه سی تو یا لینوکس شاپ تهیه کنید.
    • يک تصوير دلخواه که من براي شروع اين تصوير رو انتخاب کردم.
    • برنامه‌ي imagemagick.
    • بعلاوه‌ي يکم صبر و حوصله و تايپ چند تا دستور.

    خب اول از همه بايد imagemagick رو نصب کرد. پس يهTerminal باز کنيد و کد زير رو بنويسيد:

    sudo apt-get install imagemagick

    بعد کد عبور رو تايپ کنيد و منتظر بمونيد تا برنامه دانلود بشه يا از DVD نصب بشه (براي نصب از DVD بايد اون رو به مخازن اضافه کرده باشيد) و نصب بشه.

    حالا يه تصوير انتخاب کنيد و اون رو به پوشه‌ي خانگي کپي کنيد يا اين که توي Terminal کد زير رو بنويسيد تا تصويري که من انتخاب کردم Download بشه:

    wget http://saarblog.files.wordpress.com/2009/07/boot_image.jpg

    ما نياز داريم تا سايز تصوير ۶۴۰×۴۸۰ Pixel باشه. پس با دستور زير اون تصوير رو تغيير سايز مي‌ديم. فرض بر اينه که اسم تصوير boot_image.jpg هستش که اگر اينطور نيست توي کد زير اسم تصوير خودتون رو جايگزين کنيد.

    convert -resize 640x480 boot_image.jpg image.jpg

    با کد بالا از تصوير boot_image.jpg يک تصوير تغيير اندازه داده شده با نام image.jpg مي‌سازيم. تو اين مرحله نياز داريم تا تصويرمون رو ۱۵ رنگ و به نوع xpm تغيير بديم. براي اين کار کد زير رو استفاده مي‌کنيم:

    convert -colors 15 image.jpg image.xpm

    و در نهايت بايد تصوير حاصل رو فشرده کنيم:

    gzip image.xpm

    خب تا اينجا ما يک تصوير فشرده با نام image.xpm.gz خواهيم داشت. اين تصوير رو با کد زير به پوشه‌ي grub منتقل مي‌کنيم. البته بايد مجوز داشته باشيم براي اين کار، به همين دليل sudo رو هم قبل از دستور کپي تايپ کردم.

    sudo cp image.xpm.gz /boot/grub/

    خب با کد زير از فايل متني حاوي تنظيمات grub يک پشتيبان بسازيد:

    sudo cp /boot/grub/menu.lst /boot/grub/menu.lst.backup

    و با کد زير فايل رو باز کنيد:

    sudo gedit /boot/grub/menu.lst

    اگر قبل از اين تصويري به عنوان پس زمينه‌ي صفحه‌ي boot انتخاب نکردين، کد زير رو به فايل اضافه کنيد. براي راحتي کار ابتداي فايل يک خط جديد اضافه کنيد و کد زير رو اونجا کپي کنيد:

    splashimage /boot/grub/image.xpm.gz

    فايل رو ذخيره کنيد و ببنيد ويرايشگر رو. کار تمومه و مي‌تونيد براي ديدن نتيجه کامپيوتر رو restart کنيد. البته مي‌تونيد از دستور زير هم کمک بگيريد!

    sudo reboot

    اما خب براي اين که جلوه‌ي بهتري به کارمون بديم مي‌تونيم رنگ خطورط و زمينه‌ي انتخاب (و البته سايه‌ي خطوط) رو هم انتخاب کنيم. براي اين کار ابتدا دو تا رنگ براي اين دو در نظر بگيريد و کد RGB اون دوتا رو بدست بيارين (مي‌تونيد از gimp کمک بگيريد. البته براي اين کار برنامه‌ي gcolor2 هم وجود داره!) اگر از تصوير من استفاده کردين مي‌تونيد از کد رنگ‌هاي من هم استفاده کنيد. اين کد‌ها براي من: E1EAD8 براي زمينه و 512420 براي خط‌ها هستن. با اين حساب اين دو خط رو به فايل تنظيمات اضافه کنيد:

    background E1EAD8
    foreground 512420

    خب. خسته نباشيد. اميد وارم اين راهنمايي هم براتون جالب باشه.

    پ‌ن: من براي Ubuntu توضيح دادم ولي خب براي اکثر گنو/لينوکس‌ها که از Grub استفاده مي‌کنن، روال همين هست. اگر به مشکلي برخورد کردين با من تماس بگيريد.

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

    پ‌ن: چند روز پيش تولدم بود. هرچند روز خوبي براي خودم نبود با اين همه خيلي از دوستان من رو شرمنده‌ي خودشون کردن که نمي‌تونم اسم تک تکشون رو ببرم. با اين همه از همشون تشکر مي‌کنم.

    به روز رسانی:

    برای Grub 2 هم آی لینوکی یه پست خوب داره. برای این کار می تونید این لینک رو دنبال کنید.








    دنبال‌کردن

    هر نوشته‌ی تازه‌ای را در نامه‌دان خود دریافت نمایید.