Monday, May 21, 2012

এবার নিজেই সফটওয়্যার তৈরি করুন ; প্রজেক্টঃ Simple Clock

সফটওয়্যারটি তৈরি শুরু থেকে শেষ পর্যন্ত কোডিং সহ অন্যান্য সব কিছুর একে একে ব্যাখা দেয়ার চেষ্টা করব। আমি নিজেই খুব একটা এক্সপার্ট না। কিন্তু যারা এক্সপার্ট লেভেল নিয়ে কাজ করেন তারা যদি এই স্টাইলে ব্যাখ্যা করত আমাদের মত আগ্রহীরা যে কত উপরের লেভেলে যেতে পারতাম তা হয়ত বলার অপেক্ষা রাখে না। তবুও বলি, “ভেঙ্গে যাবে সিড়ি তবুও উপরে উঠা থামবে না।”

প্রোগ্রামিং ল্যাগুয়েজঃ সি প্লাস প্লাস
ফ্রেমওয়ার্কঃ  নকিয়ার কিউট ফ্রেমওয়ার্ক
Tested প্ল্যাটফরমঃ উইন্ডোজ এক্সপি এবং সেভেন, লিনাক্স with Wine.
ইন্সটলারঃ Nullsoft Scriptable Install System
সফটওয়্যারটি ডাউনলোড করতে পারেন এখান থেকে -  http://www.mediafire.com/?vwtc5fbbs8jpub1 
আর বর্তমানে সোর্সকোডের কিছুটা পরিবর্তন করলাম, সোর্সকোড পেতে পারেন গিটহাব থেকে - https://github.com/Mashpy/Simple-Clock-Qt
আরেকটা কথা এই লেখা যারা পড়বেন, তারা পড়লে ভালমত পড়বেন, কোথায় কোন জায়গায় কোন লাইনে বা কোন কোডে বোঝেন না অবশ্যই বলবেন। আর লেখায় কোথায় কোন জায়গায় কি ভুল আছে তাও দেখার চেষ্টা করবেন। আর গঠনমূলক সমালোচনা আবশ্যক। সত্যিকার অর্থে এ জায়গায় এ লেখাটা দেয়ার আমার কোন টার্গেট বা ইচ্ছা ছিল না। অনেক কিছুই জানি না বলে সফটটি ততটা সুন্দর হয় নি। তবুও দিলাম হয়ত কারো কাজে লাগতে পারে।
এ ডকুমেন্টটি লেখার পেছনে একটাই উদ্দেশ্য – সফটওয়্যার বা এর সম্পর্কিত বিভিন্ন কাজগুলো করতে গিয়ে অনেক কষ্ট করতে হয়েছে বা সামান্য একটা সমস্যা সমাধানের জন্য দিনরাত ঘন্টার পর ঘন্টা পিসিতে বা নেটে থাকতে হয়েছে, এর জন্য অনেক সময় ব্যয় হয়েছে।
 তাই কাজগুলো আমার পরে অন্যরা যাতে আরো সহজেই করতে পারে তার জন্যই এই লেখা।  পরবর্তীতে আপনারা এডভান্স লেভেলের এপ্লিকেশন বানাতে পারবে এই আশা রাখছি।
আমি এনালগ ক্লকটি কিভাবে তৈরি করেছি তা পূর্ণভাবে ব্যাখ্যা করব।


কাজটি করা হয়েছে সি প্লাস প্লাস ল্যাঙ্গুয়েজ দিয়ে। আর ফ্রেমওয়ার্ক হিসেবে ব্যবহার করা হয়েছে নকিয়ার জনপ্রিয় ক্রসপ্ল্যাটফরম ফ্রেমওয়ার্ক ট্রলট্র্যাক কিউট দ্বারা।
প্রোগ্রামিং ল্যাঞ্জুয়েজ সিপ্লাসপ্লাসঃ  আমার সফটওয়্যারটি গ্রাফিক্যাল ইন্টারফেসে সাধারন একটি এনালগ ক্লক। আপনাকে কাজটি করতে হলে সি প্লাস প্লাস এর বেসিক ফিচারগুলো জানতে হবে। লুপ, পয়েন্টার, This পয়েন্টার, ক্লাস, অবজেক্ট, ফাংশন অভারলোডিং, ইনহেরিটেন্স – এই ধরনের সবগুলো ফিচার জেনে রাখা ভাল।  প্রাথমিক অবস্থায় এগুলোর উপর এক্সপার্ট হতে হবে এমন কোন কথা নেই। আস্তে আস্তে প্রেকটিস করতে করতে এক্সপার্ট হয়ে যাবে।
ফ্রেমওয়ার্কঃ  আমরা বেশির ভাগই সি বা সি প্লাস প্লাসের raw লেভেলের কোডিং গুলো দেখে ভয় পাই। আর কনটেস্ট প্রোগ্রামিং এর লজিকগুলো দেখলে মেমরী হ্যাং হয়ে যায়। তবে রিয়েল টাইমে সফটওয়্যার বানানোর বেশির ভাগ কাজগুলো করা হয় ফ্রেমওয়ার্ক দিয়ে। কোন সফটওয়্যার বা এপ্লিকেশন বানানোর ক্ষেত্রে ফ্রেমওয়ার্কের ব্যবহার কাজগুলোকে অনেক সহজ করে দেয়। না হলে সি প্লাস প্লাসের raw লেভেলের কোডিং করতে গিয়ে সফটওয়্যারের একটি সাধারন উইন্ডো বানাতেও ১ দিন লাগবে !
ধরেন আপনি চাচ্ছেন আপনার আপনার জিমেইল একাউন্টে না ঢুকেই আপনি আপনার একটা সফটওয়্যারের মাধ্যমে অন্য জিমেইল একাউন্টে মেইল পাঠাবেন। এটা করার জন্য আপনার নিশ্চয় মেইল সার্ভার, জিমেইলের সার্ভার… অনেক কিছু জানতে হবে?
না হবে না। আসলে ফ্রেমওয়ার্কে একটা ক্লাস বানিয়ে দেয়া আছে, আপ্নি শুধু ঐটা ইউজ করবেন,তাহলেই হল। মানে,ধর তক্তা-মার পেরেক টাইপের :D কিন্তু এখন আপনি যদি ঐ ক্লাসটা নিজে বানাতে চান তাহলে কিন্তু অনেক কিছু জানতে হতেই পারে। :-B আপনাকে জানতে হবে কোন ক্ষেত্রে কি ক্লাস ফাংশন বা মডিউল ইউজ করা লাগে। সব কিছু মুখস্থের দরকার নেই।  তবে লজিক ভাল জানতে হবে। এই জিনিসটা অবশ্য কনটেস্ট প্রোগ্রামিং বাড়িয়ে দেয়। কনটেস্ট প্রোগ্রামিং সমস্যা সমাধানের মাধ্যমে নতুন কিছু করার চিন্তাভাবনাগুলো সম্প্রসারিত করে।
আপনি যদি কোন সফটওয়্যার বা এপ্লিকেশন বানাতে চান তাহলে আপনাকে প্রোগ্রামিং ল্যাঞ্জুয়েজ শেখার পর যে কোন একটি ফ্রেমওয়ার্কে এক্সপার্ট হতে হবে। যেমন আপনি যদি সি এর বেসিক প্রোগ্রামগুলো পারেন তাহলে GTK+ ফ্রেমওয়ার্ক নিয়ে কাজ করতে পারেন। আর আমি সি প্লাস প্লাস এর বেসিক ফিচারগুলো শেখার পর কাজ করেছি কিউট ফ্রেমওয়ার্ক নিয়ে। যদিও সি প্লাস প্লাস এখনও সেইরকম এক্সপার্ট হতে পারি নি, তবে ফ্রেমওয়ার্কে কাজ করতে করতে সি প্লাস প্লাস এর অনেক বিষয়গুলো বোঝা যায়, আর ক্লাস, অবজেক্ট, ফাংশন অভারলোডিং, ইনহেরিটেন্স ফিচারগুলোর ব্যবহার ভালভাবে ধরা যায়।
কেন সিপ্লাসপ্লাস কিউট ফ্রেমওয়ার্ক?
ইচ্ছা ছিল যাই করি না কেন লিনাক্সের উপর যেন সফটওয়্যার বানাতে পারি। হোক তা কোন ছোট্ট একটি এপ্লিকেশন। কিন্তু উইন্ডোজ , ম্যাক, লিনাক্স , মোবাইল ডিভাইস সব প্ল্যাটফরমেরই প্রয়োজন হয়। আর তার জন্য সবচেয়ে ভাল হচ্ছে নকিয়ার কিউট ফ্রেমওয়ার্ক । যা ওপেনসোর্স। আপনি এর দ্বারা সফটওয়্যার তৈরি করে বিনামূল্যে বিতরন করতে পারবেন অথবা বানিজ্যিক কাজের জন্যও এই ফ্রেমওয়ার্ক ব্যবহার করতে পারবেন।  এটি ক্রসপ্ল্যাটফরম। মানে আমি আমার এনালগ ঘড়িটি যদি চাই তাহলে উইন্ডোজের পাশাপাশি লিনাক্স, ম্যাক, সিম্বিয়ান মোবাইল ডিভাইসের জন্য আউটপুট পাব।
কিউট ফ্রেমওয়ার্ক ছাড়াও আরো অনেক ফ্রেমওয়ার্ক আছে। যেমন আপনি যদি শুধুমাত্র উইন্ডোজের উপর এপ্লিকেশন তৈরি করতে চান তাহলে ওদের ভিজুয়াল স্টুডিও , ডট নেট , ভিজুয়াল বেসিক, MFC এর উপর দক্ষ হতে পারেন। কিন্তু এতে আপনি শুধু উইন্ডোজ এপ্লিকেশনেই সীমাবদ্ধ থাকলেন। অন্য প্ল্যাটফরম লিনাক্স, মোবাইল ডিভাইস বা ম্যাকে এ যাওয়া হল না। আজকাল সবাই ক্রসপ্ল্যাটফরম পছন্দ করে। উইন্ডোজে সীমাবদ্ধ থাকতে চায় না অনেকেই।
কিউট ফ্রেমওয়ার্ক নিয়ে তবুও যদি আপনার সংশয় থাকে তাহলে কয়েকটা সফট এর নাম বলি যেগুলো কিউট দিয়ে করা। -
১। গুগল আর্থ
২। গুগল ক্রোম
৩। স্কাইপি
৪। গ্রামীনফোন মডেমের সফটওয়্যার
৫। রবির হাওয়াই মডেলের সফটওয়্যার
৬। সিটিসেল এখন নতুন যেই মডেমগুলো দেয় তার সফট
এছাড়া এটি দিয়ে এমন এমন চোখ ধাধানো স্টাইল দেয়া যায় যে চেয়েই থাকবেন, চোখ আর ফেরানো যাবে না।  এছাড়া এর আছে মাল্টি থ্রেডিং , সঠিকভাবে লেয়াউট ব্যবস্থাপনা, ড্রাগ এন্ড ড্রপ, গেমস, 2d , 3d গ্রাফিক্স, নেটওয়ার্ক, ডাটাবেজ এরকম আরো অনেক সাপোর্ট আছে। এদের জন্য আছে হাজারটা ক্লাস, ফাংশন, মডিউল সাপোর্ট।
জাস্ট এর ক্লাস কতগুলো দেখেন – http://developer.qt.nokia.com/doc/qt-4.8/classes.html
আর ফাংশনের ইউজ দেখেন, এগুলো এত যে পুরোপুরি এক্সপার্ট ইহজনমে হওয়া যাবে কিনা সন্দেহ -             http://developer.qt.nokia.com/doc/qt-4.8/functions.html
কিউট ডাউনলোডঃ
যাই হোক, আপনি নেট থেকে কিউট ফ্রেমওয়ার্ক ডাউনলোড করতে পারেন। এর জন্য QT SDK ডাউনলোড করতে পারেন। মাত্র ১ জিবি ! লিঙ্ক নেন – http://qt.nokia.com/downloads/
অথবা,
QT SDK ডাউনলোড করতে না চাইলে কিউট ক্রিয়েটর (৫৮ মেগা) এবং কিউট ডিজাইনার ( ৩২৮মেগা) ডাউনলোড করবেন। আমি এটাই ইউজ করি।

কিউট ফ্রেমওয়ার্ক ইন্সটলঃ
আপনি যদি কিউট SDK ডাউনলোড করেন থাকেন তাহলে এই একটি ফাইল ইন্সটল করলেই হয়ে যাবে। আলাদাভাবে কানেক্ট করতে হবে না। এখানে ক্রিয়েটর, ডিজাইনার , এসিস্টেন্ট, কমান্ড লাইনসহ সবকিছু দেয়া আছে। সকল প্ল্যাটফরমের সাপোর্ট এটিতে আছে। তবে এটিতে কম্পাইল হতে বেশি সময় নেয়। তাই আমি নিচেরটি ইউজ করি।
অথবা-
আর আমি যেটা ইউজ করি কিউট ক্রিয়েটর (৫৮ মেগা) এবং কিউট ডিজাইনার ( ৩২৮মেগা)। এই দুটি ডাউনলোড করার পর আপনাকে এই দুটির মধ্যে কানেক্ট করতে হবে। কিউট ক্রিয়েটর Open করুন। এখন Tools-Option- QT4 – ডানদিকে Add – তারপর এই(c:\qt\4.7.4\bin\qmake.exe) লোকেশনে qmake কে দেখিয়ে দিন। আর বেশির ভাগ ইউজার ভুল করে C:\Qt\4.7.4\qmake\qmake.exe লোকেশন দেখিয়ে দেয়। so be careful.
প্রজেক্ট এনালগ ঘড়িঃ
 কিউট ফ্রেমওয়ার্কে বেশিরভাগ সময় আপনাকে কাজ করতে হবে QT CREATOR নিয়ে। আর এর কাজ করার স্টাইল হচ্ছে প্রথমে এটি একটি .pro এক্সটেনশনের প্রজেক্ট তৈরি করে। তারপর সি প্লাস প্লাসের হেডার ফাইল, সোর্স এবং মেইন ফাইল দিতে হয়। সাথে আরো অনুসাঙ্গিক ফাইল ইচ্ছা হলে দেয়া যায়।
যাই হোক analogclock.pro নামে প্রজেক্ট বানালাম। এতে বর্ননা দেয়া থাকে আমি কি কি ফাইল নিয়ে কাজ করব।
প্রথমে QT creator – File – New File or project – Other Project- Empty QT project- analogclock.pro – Next-Next-Finish
এর কোডিং হবে -

HEADERS       = analogclock.h

SOURCES       = analogclock.cpp \
main.cpp
———————  কিউট ফ্রেমওয়ার্কে কোন কিছু তৈরি করতে হলে প্রজেক্ট তৈরি করতে হয়। উপরে তাই করা হয়েছে। উল্লেখ আমার প্রজেক্টে analogclock.h, analogclock.cpp,main.cpp এই তিনটি ফাইল থাকবে।
এখন সি প্লাস প্লাসের হেডার ফাইল তৈরি করব। তাই এখন আবার QT creator – File – New File or project – C++ – C++ Header File – analogclock.h – Next-Next-Finish
এর কোডিং হবে -

#ifndef ANALOGCLOCK_H

#define ANALOGCLOCK_H
#include <QWidget>
class AnalogClock : public QWidget
{Q_OBJECT
public:
AnalogClock(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *event);
};
#endif
উপরে আমি কি কি বিষয় নিয়ে কাজ করব কোনগুলো পাবলিক এবং প্রাইভেট বা প্রটেকটেড থাকবে তা তুলে ধরা হবে হেডার ফাইলে।
এখন যেই কোডিং হবে তাতে একটি ঘড়ি কিভাবে চলবে কোন লজিকে চলবে তার বর্ণনা থাকবে analogclock.cpp ফাইলে। এর লজিকটি দেখলে কল্পনা করতে পারবেন কত প্রতিভাবান মানুষের গভীর চিন্তার ফসল। আর আমরা শুধু ঐগুলোকেই মডিফাই করি !
এখন – আবার QT creator – File – New File or project – C++ – C++ Source File – analogclock.cpp – Next-Next-Finish
এর কোডিং -

#include <QtGui>

#include “analogclock.h”
//! [0] //! [1]
AnalogClock::AnalogClock(QWidget *parent)
//! [0] //! [2]
: QWidget(parent)
//! [2] //! [3]
{
//! [3] //! [4]
QTimer *timer = new QTimer(this);
//! [4] //! [5]
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
//! [5] //! [6]
timer->start(1000);
//! [6]
setWindowTitle(tr(“NSTU Clock, Developed by Mashpy”));
resize(450, 400);
//! [7]
}
//! [1] //! [7]
//! [8] //! [9]
void AnalogClock::paintEvent(QPaintEvent *)
//! [8] //! [10]
{
static const QPoint hourHand[10] = {
QPoint(7, 13),
QPoint(-7, 8),
QPoint(0, -55)
};
static const QPoint minuteHand[5] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -80)
};
QColor hourColor(0, 128, 0);
QColor minuteColor(252, 3, 28);
int side = qMin(width(), height());
QTime time = QTime::currentTime();
//! [10]
//! [11]
QPainter painter(this);
//! [11] //! [12]
painter.setRenderHint(QPainter::Antialiasing);
//! [12] //! [13]
painter.translate(width() / 2, height() / 2);
//! [13] //! [14]
painter.scale(side / 200.0, side / 200.0);
//! [9] //! [14]
//! [15]
painter.setPen(Qt::NoPen);
//! [15] //! [16]
painter.setBrush(hourColor);
//! [16]
//! [17] //! [18]
painter.save();
//! [17] //! [19]
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
//! [18] //! [19]
//! [20]
painter.setPen(hourColor);
//! [20] //! [21]
for (int i = 0; i < 12; ++i) {
painter.drawLine(88, 0, 98, 0);
painter.rotate(30.0);
}
//! [21]
//! [22]
painter.setPen(Qt::NoPen);
//! [22] //! [23]
painter.setBrush(minuteColor);
//! [24]
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
//! [23] //! [24]
//! [25]
painter.setPen(minuteColor);
//! [25] //! [26]
//! [27]
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
painter.drawLine(92, 0, 98, 0);
painter.rotate(6.0);
}
//! [27]
}
//! [26]
//! [27]
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
painter.drawLine(92, 0, 96, 0);
painter.rotate(6.0);
}
//! [27]
}
//! [26]

এবার এই main.cpp ফাইলে জাস্ট এনালগ ক্লকটি কম্পিউটারের দেখানোর জন্য নির্দেশ দেয়া আছে। এবং window.setStyleSheet(“*{ background-color:rgb(0,255,0); padding: 7px;)}”);  কোডের মাধ্যমে ব্যকগ্রাউন্ড কালার সেট করা হয়েছে।
এখন – আবার QT creator – File – New File or project – C++ – C++ Header File – main.cpp  – Next-Next-Finish

#include <QApplication>

#include “analogclock.h”
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
AnalogClock window;
window.setStyleSheet(“*{ background-color:rgb(0,255,0); padding: 7px;)}”);
window.show();
return app.exec();
}
কোডিং এর ব্যাখ্যাঃ
এনালগ ক্লক বানাতে হলে কয়েকটি বিষয় এলগরিদম আকারে চিন্তা করতে হবে -
১। প্রথমে কম্পিউটার থেকে টাইম কালেক্ট করবে।  analogclock.cpp ফাইলে ১ থেকে ৬ লাইন পর্যন্ত টাইম কালেক্ট করা হয়েছে।
২। ১ হাজার মিলি সেকেন্ডের একটি টাইম কাউন্ট হচ্ছে ৬ নাম্বার লাইনে।
৩। উইন্ডোর টাইটেল এবং এর সাইজ নির্ধারন করা হল ৭ নং লাইনে।
৪। analogclock.h ফাইলে ক্লাস হিসেবে AnalogClock নেয়া হয়েছে তা Inline ফাংশনের মাধ্যমে আবার ডিফাইন করা হল analogclock.cpp এর ৮ নং লাইনে।
৫। এখন যে ব্যাখ্যাটি দিব তা বুঝতে হলে খুব ভালভাবে খেয়াল করতে হবে।


প্রথমে মিনিটের কাঁটা এবং ঘন্টার কাঁটার জন্য ২ টি বিন্দু নেই। যার ক্লাস Qpoint . এবার বিন্দুটিকে ৯ নাম্বার লাইনের কোডিং এর মত করে সাইজ নির্ধারন করে দেই। ফলে বিন্দুটি ঘড়ির কাঁটার আকার ধারন করবে। এভাবে ৮ থেকে ১০ নং লাইন পর্যন্ত মিনিট এবং ঘন্টার কাটা বানাই এবং এদের কালার নির্ধারন করে দেই।
৬। কম্পিউটার থেকে বর্তমান টাইম কালেক্ট করবে।
৭। একটি উইন্ডোর কোন অবস্থানে ঘড়িটি থাকবে বা এটি কি লম্বালম্বিভাবে হবে নাকি পাশাপাশি হবে তা নির্দেশ করা হয়েছে ৯ থেকে ১৬ নাম্বার লাইনে।
৮। এবার ঘড়ির কাটা দুটির ঘূর্ননের জন্য 30.0 * ((time.hour() + time.minute() / 60.0) করা হল। সময় হিসাব করে ক্যালকুলেটর দিয়ে সূত্রটি মিলিয়ে দেখতে পারেন।






৯।    এবার ঘড়িটির চারপাশে সময় নির্দেশের জন্য যে রেখাগুলো টানা হয়েছে তা অনেক মজার।
১ টি ছোট আকারের রেখা নিলাম। লুপিং করে রেখাটিকে ৬০ টি রেখায় বানালাম। তবে এর মধ্যে শর্ত দিলাম সে প্রতি ৪ ঘর শেষ ৫ ঘরের জায়গায় কোন রেখা আকা হবে অনা। ফলে ৪৮ টি রেখা পেলাম। এরপর বৃত্তাকার করে দিলাম। আর এখানে painter.drawLine এর মাধ্যমে রেখার আকার নির্ধারন করা হয়েছে।
আবার ১ টি ছোট আকারের রেখা নিলাম। লুপিং করে রেখাটিকে ১২ টি রেখায় বানালাম। আর এখানে কন্ডিশন হবে ৪ ঘর শেষে ৫ ঘরের জায়গায় লাইন আঁকা হবে। আর এর সাইজ (92, 0, 96, 0); এর মাধ্যমে বাড়িয়ে দিলাম।
১০। সবশেষ কথা হল, পিসি থেকে টাইম নিবে তারপর ঘড়ির কাটাগুলো Rendaring এর মাধ্যমে ঘুরতে থাকবে।
১১। আর main.cpp  ফাইলে analogclock ক্লাসের মাধ্যমে clock অবজেক্ট নেয়া হয়েছে। clock.show(); এবং app.exec(); এর মাধ্যমে আমরা ডেক্সটপে ক্লকটি দেখতে পাব।
—————- এই হল এনালগ ক্লকের আসল কনসেপ্ট।
Splash স্ক্রীন তৈরিঃ
আমরা পিসি অন করলেই অনেক সময় ৩-৪ সেকেন্ডের জন্য বিজয়ের মুস্তফা জাব্বারের ছবি দেখতে পাই। এটি আসলে Splash screen. এর ছবিটিকে BMP ফরমেটে রাখতে হয়। তাহলেই কাজ করবে।
আমি splash হিসেবে নিচের ছবিটিকে দিব।


বরাবরের মত এবারো একটি প্রজেক্ট তৈরি করি করে splashscreen.cpp ফাইলে নিচের কোড কপি পেস্ট করে কম্পাইল করুন। ৫ সেকেন্ডে splash screen টি পেয়ে যাবেন।

#include <QApplication>

#include <QPixmap>
#include <QSplashScreen>
#include <QWidget>
#include <QMainWindow>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPixmap pixmap(“c://Program Files/Analogclock/win.bmp”);
QSplashScreen splash(pixmap);
QTimer::singleShot(5000, &splash, SLOT(close()));
splash.show();
return app.exec();
}
ফলে splashscreen নামে আউটপুট পাবেন।
কম্পাইল এবং প্রয়োজনীয় লাইব্রেরী ফাংশন অন্তর্ভুক্ত করাঃ
কোড লেখার পর কম্পাইল করার জন্য বামদিকে সবুজ বাটন আছে, একে QT 4.7.4 রিলিজ মুডে সিলেক্ট করে কম্পাইল করতে হবে। সব কিছু ঠিক থাকলে কম্পাইল হবে এবং আপনি একটি এনালগ ক্লক দেখতে পাবেন। আপনার সফটওয়্যার পাবেন এই ডাইরেক্টোরীতে –  C:\Qt\qtcreator-2.3.1\analogclock-build-desktop-Qt_4_7_4__4_7_4__Debug\release\analog.exe আপনি এবার এই exe ফাইলকে চালানোর চেষ্টা করুন। দেখবেন চলছে না বরং কিছু dll ফাইল চাচ্ছে। যেসব dll ফাইল চাচ্ছে তা C:\Qt\qtcreator-2.3.1\bin ফোল্ডার থেকে কপি করে analog.exe এর সাথে রাখুন। এবার চালানোর চেষ্টা করুন। দেখবেন ৪-৫ টা dll ফাইল কালেক্ট করার পর আপনার এনালগ ঘড়িটি পেয়ে গেছেন !
 

analog.exe ফাইল চলতে কেন এতগুলো dll ফাইলের দরকার হচ্ছে আর ছোট্ট একটি সফটের সাইজ উইন্ডোজে কেন ১৩মেগা আর লিনাক্সে ৭০ কিলোবাইট?
লিনাক্সের জন্য সফটওয়্যার বানানোর জন্য কিউট খুব ভাল একটি ফ্রেমওয়ার্ক। কিউট যে লাইব্রেরী ব্যবহার করে তার অধিকাংশই লিনাক্সের অপারেটিং সিস্টেমের সাথে দেয়া হয়ে থাকে। ফলে analog ফাইলটি চালাতে এর সাথে সাপোর্ট হিসেবে dll ( dynamic link libraby) গুলো দেয়ার প্রয়োজন পড়ে না।
আর উইন্ডোজে কিউট ফ্রেমওয়ার্কের জন্য কোন লাইব্রেরী ফাইলই দেয়া থাকে না। ফলে analog.exe সাথে সাপোর্ট হিসেবে অনেক গুলো dll ( dynamic link libraby) ফাইল রাখতে হয়। তাই সফটওয়্যারের সাইজ বাড়ে।
আপনি যদি ক্রসপ্ল্যাটফরমের এপ্লিকেশন বানাতে চান তাহলে সফটওয়্যারের সাইজ বেশি হচ্ছে না কম হচ্ছে এত কিছু চিন্তা করে লাভ নাই। আর সাইজ যদি কমই রাখতে চান তাহলে ঐ নির্দিষ্ট প্ল্যাটফরমের জন্য API এ কাজ করুন।
তবে কথা হল আপনি যখন সফটওয়্যারের ইন্সটলার বানাবেন তখন সাইজ কমে ১৩ মেগা থেকে ৪ মেগাতে নেমে আসবে।
 ইন্সটলার তৈরিঃ   এই ক্লকটি বানাতে গিয়ে উইন্ডোজের সি ড্রাইভে আসলে সফটওয়্যারগুলো কেন ইন্সটল করা হয়, কিভাবে ইন্সটল হলেই বা কি হয়, রেজিস্ট্রি এডিটর, স্টার্ট মেনু, স্টার্ট আপ মেনু, কুইক লাঞ্চ ইত্যাদি কিভাবে করতে হয় তা সম্পর্কে ক্লিয়ার ধারনা হয়েছে।
তবে এর আগেই উইন্ডোজের বিভিন্ন গুরুত্মপূর্ণ ফাইল বা ডাইরেক্টোরি সম্পর্কে ধারনা মোটামুটি ধারনা ছিল Hack MY Windows XP বইটি পড়ার কারনে। বইটির ডাউনলোড লিঙ্ক http://www.mediafire.com/?0bpxdqxiyp
যাই হোক, এতক্ষন আমরা সফটওয়্যার তৈরি করলাম। ফলে analogclock.exe, splashscreen.exe, libgcc_s_dw2-1.dll mingwm10.dll, QtGui4.dll , QtCore4.dll ফাইলগুলো পেলাম। এখন কোন বন্ধুকে দিতে গেলে ৬ টা ফাইল আলাদা আলাদা ভাবে না দিয়ে একটা ফাইল দিলে অনেক সুন্দর দেখায়। তাছাড়া আরো বড় প্রজেক্টের ক্ষেত্রে প্রায় ১০০-২০০ টি এরকম আলাদা আলাদা ফাইল থাকতে পারে। তখন কাউকে দিতে গেলে সুন্দর দেখায় না। তাই আমরা একটা ইন্সটলার বানিয়ে তারপর ক্লায়েন্টে দেই। ইন্সটলারে এই ১০০-২০০ টি ফাইল এক্সিকিউট থাকে।
তাছাড়া ইন্সটলার আরো কিছু কাজ করে -
১। এটি সি ড্রাইভের প্রোগ্রাম ফাইলসে বা দেখিয়ে দেয়া ডাইরেক্টোরীতে ফাইলগুলো রাখে।
২। সফটওয়্যার যাতে ইন্সটল এবং আনইন্সটল করা যায় তা রেজিস্ত্রি এডিটরের ফাইলে পরিবর্তন আনে। ফলে Add or Remove অপশনে আমরা সফটওয়্যারের নাম দেখে থাকি।
৩। স্টার্ট মেনুর all programs এ সফটওয়্যারের নাম সাজিয়ে রাখে।
৪। এছাড়া রেজিস্ট্রি এডিটরের অনেক ভেল্যুর পরিবর্তন করে, স্টার্ট আপ, কুইক লাঞ্চ, splash স্কীন, পিসি রিস্টার্ট করে।
তবে আমি আমার সফটওয়্যারে শুধুমাত্র ইন্সটল করার অপশন রেখেছি। আনস্টল করার কোন অপশনই রাখি নি !
Nullsoft Scriptable Install Systemইন্সটলার স্ক্রীপ্টঃ
                           Oh নো ! এই জিনিসের নাম শুনলেই ভয় লাগে ! এটা শিখতে অনেক সময় লেগেছে। বিশেষ করে এটা কিভাবে এবং কোন প্রক্রিয়ায় কাজ করে তা বুঝতে। যাই হোক  নিচের ছবিটি দেখে বুঝতে পারছেন সফলভাবেই এই স্ক্রীপ্টের ব্যবহার করতে পেরেছি। তবে রেড হ্যাট লিনাক্স ৬ এডমিনিস্ট্রিশন এর কমান্ড বা প্রক্রিয়া গুলো সম্পর্কে ধারনা থাকার কারনে স্ক্রীপ্টের অনেক জায়গায় কাজ করতে সহজ হয়েছে। কোন শেখাই বৃথা নয়।
স্ক্রীপ্ট এর কোডঃ

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME ;ওয়েলকাম স্ক্রীন
!insertmacro MUI_PAGE_DIRECTORY ; কোথায় ইন্সটল হবে
!insertmacro MUI_PAGE_INSTFILES ; যে ফাইলগুলো ইন্সটল হবে তা ডিটেইলস
InstallDir “$PROGRAMFILES\Analogclock” ; এই ডাইরেক্টোরিতে ইন্সটল হোক
ShowInstDetails show ; যা ইন্সটল হচ্ছে তার ডিটেইলস দেখানো হোক
!insertmacro MUI_PAGE_FINISH ; ইন্সটল প্রক্রিয়া শেষ
!insertmacro MUI_LANGUAGE “English” ; অতি গুরুত্মপূর্ণ একটি ফাইল, পরে বলছি।
Section
CreateDirectory $SMPROGRAMS\$R0  ; স্টার্ট মেনুর অপশনে প্রোগ্রামটির পাঠানো হবে।
CreateShortCut $SMPROGRAMS\$R0\Simple Analogclock.lnk $INSTDIR\analogclock.exe
SetShellVarContext All
CreateDirectory $SMPROGRAMS\$R0\Mashpy ;স্টার্ট মেনুর all programs এ প্রোগ্রামটি পাঠানো হবে।
CreateShortCut “$SMPROGRAMS\$R0\Mashpy\Simple Analogclock.lnk” $INSTDIR\analogclock.exe
CreateShortCut “$SMPROGRAMS\$R0\Startup\Technologybasic.lnk” $INSTDIR\splashscreen.exe ; পিসি স্টার্ট হওয়ার সাথে সাথেই splashscreen প্রোগ্রামটি অন হবে।
CreateShortCut “$SMPROGRAMS\$R0\Startup\Simple Analogclock.lnk” $INSTDIR\analogclock.exe
CreateShortCut “$DESKTOP\Analogclock by Mashpy.lnk” $INSTDIR\analogclock.exe
SectionEnd
Section “”
SetOutPath $INSTDIR ; এটিও অনেক গুরুত্মপূর্ণ। পরে ডিটেইলস বলছি।
File analogclock\*
SectionEnd
Name “Analog Clock” ; প্রোগ্রামের নাম
OutFile “Mashpy.exe” ; যে নামে প্রোগ্রাম আউটপুট দিবে।
Function .onInit ; আমার ব্যাচের ফ্রেন্ডরা মিলে technologybasic,com বানিয়েছিলাম, তাই splash আকারে বিজ্ঞাপন দিলাম।
InitPluginsDir
File /oname=$PLUGINSDIR\splash.bmp “${NSISDIR}\Contrib\Graphics\Wizard\splash.bmp”
advsplash::show 5000 800 1000 0x04025C $PLUGINSDIR\splash
FunctionEnd
Section
SectionEnd
এটা Mashpy.nsi লিখে সেভ করবেন। রাইট ক্লিক করুন – compile nsis script এ ক্লিক করুন।

উপরের গুরুত্মপূর্ণ দুটি কোডের বিষয় নিয়ে আলোচনাঃ

!insertmacro MUI_LANGUAGE “English” এই কোডে
C:\Program Files\NSIS\Contrib\Language files\English.nsh এই ডাইরেক্টরিতে .nsh হেডার ফাইলটি আছে। যেমন আমি ওয়েলকাম পেজে HI, I Mashpy সহ আরো বিভিন্ন কিছু লিখেছি। আপনিও ওয়েলকাম স্ক্রীনে কিছু লিখতে চাইলে এই ফাইলে এডিট করুন।
আর ভার্সিটির লোগোর যে ছবিটি দিয়েছি তা  C:\Program Files\NSIS\Contrib\Graphics\Wizard\win.bmp নামে এডিট করে দিলেই হয়ে যাবে।
এবার দেখুন এই কোডটি -
SetOutPath $INSTDIR ;
File analogclock\*
আগে চিন্তা করুন ইন্সটলার প্রোগ্রামের কাজ কি? এটি আমার সফটওয়্যারের ৫ টা ফাইল নিয়ে ১ টিতে বানাবে। তাহলে কাজটা করতে হবে ঠিক এভাবে -
একটা analogclock নামক ফোল্ডারের ভেতর analogclock.exe libgcc_s_dw2-1.dll mingwm10.dll, QtGui4.dll , QtCore4.dll ফাইলগুলো রেখে , এই analogclock ফোল্ডার DESKTOP এ  রাখতে হবে । সাথে উপরের Mashpy.nsi কোডটি রাখতে হবে। এবার কম্পাইল করুন। সুন্দরভাবেই ইন্সটলার তৈরি হবে।

এবার সফটওয়্যারটি আপনার বন্ধুকে দিতে পারেন !……!!!!!!

8 comments:

  1. অনেক বিষয় ক্লিয়ার হল...
    ধন্যবাদ :D

    ReplyDelete
  2. ভাই কষ্ট করছেন কিন্তু বুঝলাম না কিভাবে প্রথম থেকে শুরু করা যায় সেটা বলেন যেমন লিখব কি নোট প্যাডে সেভাবে

    ReplyDelete
  3. ভাই আমি এক্টা সাধারন ঘ্রের । ক্লাস টেন থেকে আমার ইছা ছিল soft were engineer হবো । কিন্তু তা হয়ে উঠে নি
    আপনি কি কোনোভাবে সাহাজ করতে পারবেন

    ReplyDelete
  4. ভাই আমি এক্টা সাধারন ঘ্রের । ক্লাস টেন থেকে আমার ইছা ছিল soft were engineer হবো । কিন্তু তা হয়ে উঠে নি
    আপনি কি কোনোভাবে সাহাজ করতে পারবেন

    ReplyDelete
    Replies
    1. ডিপ্লোমা করতে পারেন #GiafatAli

      Delete
  5. খুবই গুরুত্বপূর্ণ টিউন করেছেন আপনাকে ধন্যবাদ।

    ReplyDelete
  6. প্রোগ্রামার হবো কিভাবে????

    ReplyDelete
  7. প্রোগ্রামার হবো কিভাবে????

    ReplyDelete

এখানে আপনি আপনার মূল্যবান মতামতটি প্রকাশ করতে পারেন।