Blog

প্রোগ্রামিং উইথ রুবিঃ আরেকটু Classy হোন! (পর্ব ১)

[ডিসক্লেইমারঃ আজকে একটু বকবক বেশি করবো, এবং খুবই গুরুত্বপূর্ন বকবক। আজকে যদি সারভাইভ করতে পারেন তাহলে ধরে নিতে পারেন যে আপনি রুবি ৪৫% শিখে ফেলেছেন।]

শুন্য পর্বে বলেছিলাম, একজন প্রোগ্রামার হচ্ছে তার ভার্চুয়াল দুনিয়ার একক সম্রাট। সে চাইলেই যা খুশি তাই বানিয়ে ফেলতে পারে। শুধু দালান কেনো, রাস্তা ব্রীজ যা খুশি তাই!

আমাদের দুনিয়াতে কোন একটা জিনিস একবারে বোঝাতে সাধারণত জাতি বা কাছাকাছি কোন শব্দ ব্যবহার করি। যেমন সকল মানুষ একসাথে বোঝাতে আমরা মানুষজাতি শব্দটা ব্যবহার করি। আর আমি বা আপনি হচ্ছেন তার একটা পার্ট। চলাফেরা করা সকল জীবন্ত জিনিসকে একসাথে প্রাণীকুল, সকল জীবন্ত জিনিসকে একসাথে জীব বলা হয়! রুবিতেও আমরা একই কনসেপ্ট নিয়ে কাজ করি। তবে এখানে জাতি বা কুল শব্দ ব্যবহার করা হয় না। রুবি এই টাইপের জিনিসগুলোকে সিমপ্লিফাইড করে বলে Class। যেমন মানুষ Class, Animal Class এই টাইপের আরকি! এখানে আপনি বা আমি হব মানুষ ক্লাসের Object, যেমন Babar Object. বলার সময় অনেকটা এভাবে বলা হয়, Babar হচ্ছে মানুষ ক্লাসের একটা অবজেক্ট।

বেশি না পেচিয়ে, জাস্ট মনে রাখেন যে সিম্পল hierarchy মেইনটেইন করা হচ্ছে। রুবি দুনিয়ার সবকিছুকেই এরকম ক্লাস এবং অবজেক্ট দিয়ে ডিফাইন করে। যেমন আমরা যে গতকাল স্ট্রিং নিয়ে কাজ করেছি, ওইগুলা হলো String ক্লাসের অবজেক্ট। Integer নাম্বারগুলা হচ্ছে Fixnum ক্লাসের অবজেক্ট আর Flooting নাম্বার গুলা হচ্ছে Floot ক্লাসের অবজেক্ট। আপনি নিচের মত করে খুব সহজেই কোনটা কোন ক্লাসের অবেজক্ট সেটা নিজেই বের করে ফেলতে পারবেন।

[2] pry(main)> 5425.class
=> Fixnum
[3] pry(main)> 25725.0.class
=> Float
[4] pry(main)> "Hello Ruby".class
=> String

এখন মানুষ ক্লাসের অবেক্ট হিসেবে আমার কিছু বৈশিষ্ট আছে। যেমন মানুষ সামাজিক জীব, সো আমিও সামাজিক জীব(!), আমি একটা ফ্যামিলির সাথে বসবাস করি। নির্দিষ্ট একটা উচ্চতা আছে, সাথে আছে হাতির মত ওজন। এই বৈশিষ্টগুলা সব মানুষের মাঝেই কমন। খেয়াল করে দেখুন, একটা রিকশা ক্লাসের অবজেক্টের কিন্তু সামাজিক হওয়ার বৈশিষ্ট নেই। এইরকম বিভিন্নতা থাকার কারণেই সবগুলাকে আলাদা আলাদা ক্লাসে ভাগ করা হয়েছে। যাইহোক, এইযে আমার বিভিন্ন বৈশিষ্ট আছে, রুবিতে এইগুলাকে বলা হয় Properties. এখন এই প্রোপার্টিজ গুলাকে আবার দুইভাগে ভাগ করা যায়। যেমন মানুষ হিসেবে সব মানুষের মাঝে কমন হলো তার হাত আছে, পা আছে, সে কথা বলতে পারে এইসব। এইগুলাকে বলতে পারি মানুষ ক্লাসের প্রোপার্টিজ। আবার কিছু প্রোপার্টি আছে, যেগুলা সব মানুষেরই আছে, কিন্তু ভিন্ন ভিন্ন। যেমন সব মামুষ কথা বললেও সবাই একই ভাষায় কথা বলে না। তাহলে কি হলো? আমার ল্যাংগুয়েজ প্রোপার্টি/বৈশিষ্ট হলো বাংলা, একনজন গ্রীসের অধিবাসী মানুষ ক্লাসের অবজেক্টের ল্যাংগুয়েজ প্রোপার্টি হলো গ্রীক। তো এইরকম অবজেক্ট টু অবজেক্ট পরিবর্তনশীল প্রোপার্টিজগুলোকে আমরা অবজেক্ট প্রোপার্টি বলতে পারি। উপরে যে আপনি বিভিন্ন অবজেক্টের ক্লাস বের করতেছিলেন, ওইটাও ওই অবজেক্টের একটা প্রোপার্টি!

বিভিন্ন প্রোপার্টি থাকার পাশাপাশি মানুষ কাজকামও করে। মানুষ খায়দায়, ঘুমায় আরও কতকি! এই বিভিন্ন রকমের কাজগুলাকে রুবি বলে Methods. রুবির ভাষায় ঘুমানো/Sleep, ব্যায়াম/Excersie হচ্ছে একেকটা Method. প্রোপার্টির মত মেথডগুলোকেও আমরা ক্লাস মেথড এবং অবজেক্ট মেথড দুইভাগে ভাগ করতে পারি। যেমন আমি কোড করি কিন্তু আমার বাপজান কোড করে না। সো এইটা মানুষ ক্লাসের সকল অবজেক্টের জন্য প্রযোজ্য/কমন নয়, বরং বাবর অবজেক্টের জন্য প্রযোজ্য।

তো মেলা কথা হইছে, এইবার আসেন আমরা কিছু কোড দেখি। আজকে আমরা একটা ফাইলে কোড লিখবো। ওহ, তার আগে একটু অন্য প্রসঙ্গে বলি। সেটা হলো, আগের পর্বে আপনারা irb তে কিছু কোড লিখতেছিলেন, সে একটা ভ্যালু রিটার্ণ করতেছিলো। কিন্তু রিটার্ণ করাই সবসময় এনাফ না। আপনি চাবেন, ইউজারকে কিছু একটা প্রিন্ট করিয়ে দেখাতে। নিচের কোডটা ট্রাই করে দেখুনঃ

[7] pry(main)> "Hello Ruby"
=> "Hello Ruby"
[8] pry(main)> puts "Hello Ruby"
Hello Ruby
=> nil

প্রথম লাইনটা রিটার্ণ করেছে, পরের লাইনটা স্ক্রীণে প্রিন্ট করেছে। আপাতদৃষ্টিতে দুটো একই মনে হলেও আসলে এক না। স্পেশালী দেখুন, পরের লাইনে কোন কোটেশন আসে নাই আউটপুটে। আর তারও নিচে একটা nil অবজেক্ট রিটার্ণ করেছে। nil এর মানে হচ্ছে কোন কিছুই না। ক্যারমবোর্ডে Nil এ গেম দেয়ার মত আরকি! আমরা স্ক্রীণে কোনকিছু প্রিন্ট করার জন্য puts/print ব্যবহার করি। যেমন আমরা “Hello Ruby” String এর আগে nuts/print বসিয়ে দিয়েছি। এটাও একটা মেথড। এটা হচ্ছে রুবির বিল্টইন মেথড। আমরা শুধু স্ট্রিং না, নাম্বারও প্রিন্ট করতে পারি।

[11] pry(main)> puts 5745
5745
=> nil
[12] pry(main)> puts 528725.45
528725.45
=> nil

মোটের উপর কথা হচ্ছে, ফাইলে কোড লেখার সময় আমরা নরমাল ফ্লোতেই চলবো। শুধউমাত্র ইউজারকে যতটুকু জানানোর দরকার ততটুকু প্রিন্ট করবো।

তো এবার চলুন মানুষ প্রজাতিটাকে কোড করে ফেলি। সেটআপ পর্বে বানানো আপনার রুবি ফোল্ডারে একটা নতুন ফাইল সেভ করুন man.rb নামে এবং নিচের কোডটুকু ওইফাইলে লিখে ফেলুনঃ

class Man
end

ওয়াও, আপনি তো দেখি রুবির সবচেয়ে কঠিন জিনিসগুলার একটা এত্ত সহজে পার করে ফেললেন, নতুন একটা ক্লাস পানিয়ে ফেলেছেন! কনগ্র্যাটস! বুঝতেই পারতেছেন, এটা হলো ক্লাস ডেফিনেশন, এরপর থেকে নতুন কোন ক্লাস বানাতে হলে আমরা এভাবেই লিখবো। প্রথমে class কীওয়ার্ড, এরপরে ক্লাসের নাম এবং সর্বশেষ পরের লাইনে end কীওয়ার্ড। খেয়াল করুন, ক্লাসের নাম কিন্তু বড় অক্ষর দিয়ে শুরু, এটাও সবসময়ই এরকমই হবে।
আচ্ছা এখন কাহিনী হলো, এই ক্লাসটা তো একেবারেই খালি। মানব প্রজাতির কিছু কমন বৈশিষ্ট (Properties) আছে, চলুন সেগুলোও ইমপ্লিমেন্ট করে ফেলি।

class Man
def initialize(name, age)
@name = name
@age = age
end
def status
"Hello My name is " + @name + " and I am " + @age + " years old!"
end
end

একটু বেশি কোড লিখে ফেলছি। টেনশনের কোন কারণ নাই। বুঝিয়ে দেয়ার জন্য আমি তো আছিই! প্রথমে যে def initialize(name, age) এটা হচ্ছে একটা মেথড, মেথড শেষ হয় end দিয়ে। পরে যখন আমরা নতুন কোন মানুষ বানাবো এই Man ক্লাসের কোড দিয়ে, তখন এই মেথডটা সবসময়ই রান করবে। এটাকে আপনি অনেকটা ডেলিভারীর সাথে তুলনা করতে পারেন, সব মানুষ জন্মানোর জন্য ডেলিভারী হতেই হবে সেরকম। জন্মানোর সময় থেকেই তার বয়স গণনা শুরু হয়ে যায়, একটা নাম পরিয়ে দেয়া হয়। ব্যাপারটা অনেকটা ওরকমই। মানুষের জন্ম হতে হলে ভুমিষ্ঠ হতে হবে, আর কোডে নতুন মানুষ বানাতে হলে এই কোডটা রান করতে হবে। তবে সুবিধা হলো, এটা আমাদের ম্যানুয়ালী করতে হবে না। রুবি নিজেই আমাদের জন্য এটা করে দেবে!
তো এই মেথডের ভিতরে আছে হলো, @name এবং @age নামে দুইটা ভ্যারিয়েবল এবং দুইটা এসাইনমেন্ট স্টেটমেন্ট। আমরা যখন নতুন একটা মানুষ কোড করবো তথা এই ক্লাসের একটা অবজেক্ট বানাবো তখন এই দুইটা ভ্যারিয়েবল নাম এবং বয়স মনে রাখবে। এদেরকে অনেকসময় Object Variable বলেও ডাকা হয়। এবং এরাই হচ্ছে Man ক্লাসের অবজেক্টের Properties বা বৈশিষ্ট। একটু মনে রাখবেন অবজেক্ট ভ্যারিয়েব সবসময় এট (@) সাইন দিয়ে শুরু হয়।
এরপরে আছে def status লাইন। এটাও আগের মতই মেথড। তবে এটা অটোমেটিক কল হয় না। একে আমরা নিজেদের সুবিধামত যখন দরকার কল করতে পারবো। এই মেথডের কাজ হচ্ছে যে কোন মানুষের ওভারঅল একটা অবস্থা আমাদের জানানো। মেথডের ভিতরের কোডটা খেয়াল করুনঃ

"Hello My name is " + @name + "and I am " + @age + "years old!"

এই কোডটুকু আপনার পরিচিতই লাগার কথা, যদি গত পর্বটা ঠিকঠাক মত ফলো করে থাকেন! তেমন কিছুই না, সিমপ্লি দুটো ভ্যারিয়েবল এবং কিছু String জোড়া দেয়া হয়েছে পুরো একটা বাক্য গঠনের জন্য।

তো আমাদের ক্লাস ডিফাইন শেষ। এবার আমরা এই ক্লাস দিয়ে কোডের রহিম, করিম, জদু, মধু বানানো শুরু করে দেই! ক্লাস ডেফিনেশনের পরে একেবারে ফাইলের শেষের দিকে নিচের কোড লেখা শুরু করে দিনঃ

rahim = Man.new("Rahim Chowdhury", "42")
karim = Man.new("Karim Khan", "35")

পড়তে পারেন অনেকটা এইভাবে, rahim হচ্ছে Man ক্লাসের নতুন সদস্য যার নাম Rahim Chowdhury আর বয়স 42। এইবার আমাদের কোডের লাস্ট পার্ট, রহিম বা করিম সাহেবের কি স্ট্যাটাস তা জানার চেষ্টা করি।

puts rahim.status
puts karim.status

ফাইলটা সেভ করুন। এবার ফাইলটা আমরা রুবি দিয়ে টার্মিনাল থেকে রান করবো। খেয়াল করে, এইবার কিন্তু irb লিখি নাই, সরাসরি ruby লিখেছি এবং ফাইলনেমটা পাস করে দিয়েছি!

$ ruby man.rb
Hello My name is Rahim Chowdhury and I am 42 years old!
Hello My name is Karim Khan and I am 35 years old!

কনগ্র্যাটস ম্যান, আপনি তো আপনার প্রথম ডায়নামিক প্রোগ্রাম বানিয়ে ফেলেছেন অলরেডী! ওয়াও!

আচ্ছা এবার তাহলে আমরা আর অল্প একটু কাজ করি আমাদের ক্লাসটাকে আরেকটু কাজের করার জন্য। ধরুন আপনি স্ট্যাটাস না জেনে সরাসরি কারও নাম জানতে চাচ্ছেন। তাহলে কি করা যায় বলেন তো? জি ঠিক ধরেছেন, আমার status এর মত আরেকটা মেথড বানাবো name নামে এবং সেটাকে আমরা rahim.name এইভাবে কল করবো! তো করে ফেলি কাজটুকু!

def name
@name
end

এবার আমরা করিম সাহেবের পুরো নাম জানতে চাইবো

puts karim.name

পুরো ফাইলটা আবার রান করে দেখুন তো কি আউটপুট দেখায়! দেখছেন কত্ত সোজা!

আজকের মত এইখানেই খতম দেই।
এইবার আপনার এসাইনমেন্ট
প্রথমটা হলো আমার তো নাম জানতে পারলাম আলাদাভাবে, এবার তাহলে বয়স জানার মেথডটাও ইমপ্লিমেন্ট করে ফেলুন নিজে নিজে। সাথে আরও দুয়েকটা প্রোপার্টিজ (যেমন জব, জাতীয়তা) ও ইমপ্লিমেন্ট করতে পারেন!
পরের এসাইনমেন্ট হলো, গার্লফ্রেন্ড প্রজাতির জন্য একটা ক্লাস বানাবেন সাথে বিভিন্ত প্রোপার্টিজ ইমপ্লিমেন্ট করবেন। এবং আপনার বর্তমান এবং পূর্ববর্তী (যদি থাকে, না চাইলে দিয়ে না, কিছু কথা থাকনা গুপন!) গার্লফ্রেন্ডএর অবজেক্ট বানিয়ে কোডটা আমাদের সবার সাথে শেয়ার করুন। তবে সাধু সাবধান, গার্লফ্রেন্ড ক্লাসে কিন্তু কোনমতেই বয়স প্রোপার্টি ইমপ্লিমেন্ট করার ট্রাই কইরেন না, সেক্ষেত্রে আপনার বর্তমানও অতীত হয়ে যেতে পারে!

এইবার দুটো টিপস দিয়ে দেই আপনাদের
টিপস ১ উপরে কোডগুলা দেখুন, ক্লাসের ভিতরে মেতডগুলা কিরকম একটু ডান দিকে চাপিয়ে দিয়ছি স্পেস দিয়ে। মেথডরে ভিতরের কোডগুলা আরেকটু ডানে। দেখতে জিনিসটা সুন্দর লাগতেছে। এইভাবে কোড সাজানোকে বলে Indentation. Rubyist রা মূলত দুটো করে স্পেস দিয়ে এইভাবে কোড ইনডেন্ট করে থাকে। আপনিও কোড করার সময় অবশ্যই ইন্ডেন্ট করবেন। একজন কোডারের ভালো অভ্যাসগুলোর মাঝে এটা একটা।
টিপস ২ কোড শেয়ার করার জন্য আপনারা Gist ব্যবহার করতে পারেন। খুবই ভালো একটা জায়গা। রেজিস্টার না করেও কোড শেয়ার করতে পারবেন, তবে আমি রিকমেন্ড করবো রেজিস্টার করে ফেলার জন্য। তাহলে আপনি পরে আপনার কোডগুলা রিভিউ করতে পারবেন একসাথে চাইলেই। আর কোন প্রবলেমে পড়লে এইভাবে শেয়ার করলে অনেকেই হেল্প করতে পারবে।

নোটঃ এই পর্বের পুরো সোর্সকোড একসাথে পাবেন এখানে Man.rb

প্রোগ্রামিং উইথ রুবিঃ ইট সুড়কি যোগাড়যন্ত্র

রুবি হচ্ছে কম্পিউটারের ইংরেজী। ৫-৬ দিন নিয়মিত রুবি প্র্যাকটিস করলে তারপরে রুবিতে প্রোগ্রাম লেখায় সময় মনে হবে আপনি সেকেন্ড ল্যাংগুয়েজ ব্যবহার করতেছেন। খুবই সহজ এবং এক্সপ্রেসিভ।
যাইহোক, প্রোগ্রামিং শিখবেন ভালো কথা। তবে শুরুর আগে দুটো কথা বলে দেই। শেখার সময় কোন কোড মুখস্থ করার ট্রাই করবেন না। কিছু মনে না থাকলে নাই, রেফারেন্স ঘেটে যাবেন। প্রোগ্রামিং জিনিসটা ধীরে ধীরে আপনার সেকেন্ড ন্যাচারে পরিণত হবে। যতক্ষণ সেটা না হচ্ছে ততক্ষণ হাতের আশেপাশে রেফারেন্স রাখবেন, সাথে ধুমসে প্র্যাকটিস করবেন। যত বেশি প্র্যাকটিস করবেন ততবেশি এগিয়ে যাবেন।
প্রোগ্রামিং মুখস্থ করার ট্রাই করলে আপনার বাড়িতে আগুন লেগে যেতে পারে, আপনার গার্লফ্রেন্ড আরেকজনের সাথে ভেগে যেতে পারে কিংবা আপনার বিড়ালটা বিছানায় হাগু করা শুরু করে দিতে পারে। অবশ্যই আমি এসব কোনটার জন্যই দায়ী থাকবো না, আমার সতর্ক করে দেয়া দরকার, আগেই করে দিয়েছি!

আচ্ছা মনে আছে, গতদিন আমি খুব গুরুত্তপূর্ণ একাট কমান্ডের কথা বলেছিলাম? ঠিক ধরেছেন, আমি irb এর কথা বলতেছি। ওকে, একটা কমান্ড প্রম্পটে irb চালু করে ফেলুন তো দেখি। না পারলে আগের পর্বের পোস্ট ভালো করে পড়ে আসুন! আর পারলে চলুন আগাই।

5 + 5 লিখে বড় এন্টার কী টা ধাপ করে চেপে দিন! দেখেন তো কি আউটপুট দেয়। আমার এরকম আসলোঃ

2.2.1 :001 > 5 + 5
=> 10
2.2.1 :002 >

ওয়াও, আপনি দেখি আপনার প্রথম রুবি কোড লিখে ফেলেছেন। এই নেন চকোলেট, থুক্কু খুশিতে আমি নিজেই চকোলেট খায়ালাইছি। তো আরও দুয়েকটা নাম্বার দিয়ে ট্রাই করে দেখেন কি হয়। প্রোগ্রামিং শেখার মূল কথা হচ্ছে কিউরিসিটি। আমি বলার আগেই দুয়েকবার ট্রাই করে ফেলবেন। ভয় কি, সমস্যা হলে আমি তো আছিই! নরমাল এরিথমেটিক সব সাইনই রুবি সাপোর্ট করে।
2.2.1 :002 > 6 * 2
=> 12
2.2.1 :003 > 9-4
=> 5
2.2.1 :004 > 7/2
=> 3

ভাই থামেন। ৭ রে ২ দিয়া ভাগ করলে ৩ হয় ক্যামনে? ৩.৫ হহওয়ার কথা না?
ধইরালাইছেন দেখি। আচ্ছা দাড়ান, কচ্ছি! রুবি এর হিসাবে ৭ হচ্ছে Integer নাম্বার, ২ ও Integer (সংক্ষেপে int) নাম্বার। অন্যদিকে ৩.৫ হচ্ছে Flooting তথা দশমিক নাম্বার। রুবির সোজা কথা, একটা Integer কে আরেকটা Integer কে ভাগ দিলে আমিও একটা Integer নাম্বারই দিবো! এখানে এই দেয়াটাকে প্রোগ্রামিংয়ের ভাষায় retern করা বলে, দেখছেন আমি আগেই বলছিলাম না, রুবি হচ্ছে প্রোগ্রামিংয়ের ইংরেজী! আচ্ছা যাই হোক, আগের রেজাল্টটা ঠিক করার উপায় কি? জি, আবার ঠিকমতই ধরে ফেলেছেনঃ
2.2.1 :006 > 7.0 / 2
=> 3.5

যে কোন একটা নাম্বারকে Flooting তথা দশমিক নাম্বার করে দেন, হয়ে গেলো ঝামেলা শেষ। তো আপনার দৈনন্দিন ব্যবহারের জন্য আরেকটা ক্যালকুলেটর পেয়ে গেলেন। বন্ধুবান্ধবের মাঝে কালো স্ক্রীণের ক্যালকুলেটর বের করে চাইলে একটু ভাব নিতেই পারেন! এবার বিশাল একটা সংখ্যার ভাগশেষ বের করে ফেলুন তাহলেঃ
2.2.1 :008 > 5287257257425 % 25425
=> 9475

গুড জব, তালিয়া!
আচ্ছা, আপনি কিন্তু খুব সহজেই আমাদের এই ছোট্ট ক্যালকুলেটর দিয়ে দুটো নাম্বার কম্পেয়ার করে ফেলতে পারবেন।
2.2.1 :009 > 5 > 2
=> true
2.2.1 :010 > 5 > 6
=> false
2.2.1 :011 > 5 == 5
=> true

এবার রুবি আপনাকে true/false ফেরত দিচ্ছে, খেয়াল করেছেন? সিম্পল ইংলিশ, ৫ কি ২ এর চেয়ে বড়? জি। ৫ কি ৬ এর চেয়ে বড়? না। সিম্পল!
তো এই true আর false এর একটা সুন্দর নাম আছে। প্রোগ্রামাররা একে আদর করে Boolean (সংক্ষেপে bool) বলে ডাকে। তো এর পরে কেউ যদি বলে এই জিনিস একটা bool ভ্যালু রিটার্ন করে। তাহলে সিম্পলি বুঝে নিবেন যে একটা true বা false আসতেছে, আর কিচ্ছু না!
আচ্ছা আপনি লাস্টের লাইনটা খেয়াল করেছেন? আমরা দুইটা সংখ্যা সমান কিনা তা চেক করার জন্য == দুইটা ইকুয়াল সাইন ব্যবহার করেছি। নরমাল ম্যাথে আপনি হয়তো একটা ব্যবহার করেন। রুবি দুইটা জিনিস সমান কিনা এটা চেক করার জন্য ডাবল ইকুয়ালই ব্যবহার করে। একটা ইকুয়াল সাইনের আলাদা একটা ব্যবহার আছে, সেটা আমি একটু পড়ে দেখাচ্ছি। আর দুইটা সমান নাম্বার চেক করার ব্যাপারটা চাইলেই কিন্তু একটু উল্টে দেয়া যায় সহজেই! এজন্য একটা আশ্চর্যবোধক চিহ্ণ ব্যবহার করা হয়। নিচের উদাহরণগুলো দেখলেই পরিষ্কার হয়ে যাবেঃ
5 != 6
=> true

আপনি বলতেছেন ৫ আর ৬ সমান না, রুবি ও আপনার সাথে একমত প্রকাশ করতেছে।

অনেক হইছে সংখ্যা নিয়ে, চলুন এবার আমরা একটু A B C D নিয়ে গুতাগুতি করি! আপনারা কেউ কেউ হয়তো এতক্ষণে a লিখে এন্টারও চেপে দিয়েছেন এবং রুবি আপনাকে প্র্যাঙ্ক করার জন্য কি সব হাবিজাবি লিখে ফেরত পাঠিয়ে দিয়েছে। ব্যাপারনা, খেলার সাথী, একটু আধটু এরাম করতেই পারে। একচুয়ালী হইছে কি, নরমাল রুবিকে যদি A বা B বুঝাতে চান তাহলে ওটাকে একটু দুইপাশে “/’ কোটেশন দিয়ে মুড়ে দিতে হবে। সেটা সিংগেল বা ডাবল কোটেশন যে কোনটা হতে পারে, পুরোটাই আপনার ইচ্ছা।

2.2.1 :016 > "Hello Ruby"
=> "Hello Ruby"
2.2.1 :017 > "My name is Babar"
=> "My name is Babar"
2.2.1 :018 > "আমার নাম বাবর"
=> "আমার নাম বাবর"

আরেহ, রুবি দেখি বাংলাও বুঝে! সাবাশ। এইরকম কোটেশন দিয়ে হাবিজাবি A B C D বা বাংলা লেখাকে কি বলে জানেন? আপনি কি বলেন, সেটা জানি না, বাট আমি এইটারে String (সংক্ষেপে str) বলে ডাকি। String এ শুধু A B C D ই না, আপনার কীবোর্ডে যত সাইন আছে, মোটামুটি সবই ঢুকিয়ে দেয়া যায়! খেয়াল করে দেখছেন, প্রোগ্রামররা সবকিছুরই একটা সুন্দর নাম বের করে রাখছে, তার আবার একটা করে সংক্ষেপও আছে! ভাবজ, বুঝতে হবে!
আপনি ম্যাথের দুই একটা অপরেটর স্ট্রিংয়ের সাথেও ব্যবহার করতে পারেন।
2.2.1 :022 > "HabiJabi" + "Abaro Habijabi"
=> "HabiJabiAbaro Habijabi"
2.2.1 :023 > "HabiJabi" * 5
=> "HabiJabiHabiJabiHabiJabiHabiJabiHabiJabi"

প্রথমটা ব্যবহার করা হইছে দুইটা String কে একসাথে করার জন্য। পরেরটা হলো একটা স্ট্রিং কে ৫ বার রিপিট করার জন্য। তো, যারা বাচ্চা আছে এখনথেকে যদি ক্লাসের ম্যাম কান ধরে বলে বলে, এক হাজার বার লেখো, “I will not do it again” তাহলে কি করা যেতে পারে?
2.2.1 :025 > "I will not do it again" * 1000

সেই মজা। আমি অবশ্য আউটপুটটা দিলাম না, বিশাল আউটপুট হয়ে যাবে!

মেলা খেলাধুলা হইছে, আসেন, আমি দুইটা গোপন কথা কই! কান পাতেন মিয়া, গোপন কথা কেউ এমনে কয় নাকি! এইযে লাইনগুলা দেখতেছেন না, বিভিন্ন সংখ্যা দিয়ে বানানো বা স্ট্রিং দিয়ে বানানো? প্রোগ্রামাররা না এইগুলারে লাইন কয় না, তারা এইগুলারে Statement আর নাইলে Expression বলে ডাকে! আমরাও এরথেকে আর লাইন বলবো না, Statement বা Expression বলে ডাকবো, ঠিকাছে?

আচ্ছা চলেন, আজকের দিনের কাহিনী শেষ করি। তার আগে একটা জিনিস বাকি আছে। আমি আপনাদের বলছিলাম, একটা ইকুয়াল সাইন কি কাজে ব্যবহার হয় রুবিতে সেটা বলবো। মনে আছে, ছোটবেলায় ম্যাথ করতেন, ধরি x = 5. জি ভাইজান, আজকে আরেকবার আপনি ঠিক ধরেছেন, আমরা একটা ইকুয়াল সাইন ব্যবহার করি পরিবর্তনশীল কোনকিছু মনে রাখার জন্য অনেকটা রেফারেন্স রাখার মত। তবে সুবিধা হচ্ছে মনে রাখার জিনিসটা সংখ্যা বা স্ট্রিং যে কোনটাই হতে পারে!

2.2.1 :031 > x = 5
=> 5
2.2.1 :032 > y = "Hello Ruby"
=> "Hello Ruby"

এখানে বাম দিকেরটা (x বা y) কে বলা হয় Variable (সংক্ষেপে var), আর পুরো এক্সপ্রেশনটাকে বলা হয় Assignment Expression, যেহেতু আমরা একটা ভ্যালু (স্ট্রিং বা সংখ্যা) এসাইন করতেছি একটা Variable এ। ভ্যারিয়েব লেখার কিছু নিয়ম কানুন আছে। প্রথম দেখায় এটাকে স্ট্রিংয়ের মত মনে হলেও, এর কিন্তু কোন কোটেশন নেই। আর দুই একটা ছোটখাটো নিয়ম হলো, ভ্যারিয়েবল সংখ্যা দিয়ে শুরু হতে পারবে না, সবসময় একটা অক্ষর দিয়ে শুরু হতে হবে। নাম বড় হলে আন্ডারস্কোর _ ব্যবহার করতে পারবেন, কিন্তু ড্যাশ ব্যবহার করা যাবে না।
আপনি উপরের ভ্যারিয়েবগুলো দিয়ে খুব সহজেই এখন তার ভ্যলুগুলো পেতে পারেন। প্রয়োজনে আগের ভ্যলু মুছে নতুন ভ্যালুও ঢুকিয়ে দিতে পারেন।
2.2.1 :033 > x
=> 5
2.2.1 :034 > y
=> "Hello Ruby"
2.2.1 :035 > x = "Da da da"
=> "Da da da"
2.2.1 :036 > x
=> "Da da da"
2.2.1 :037 > my_name = "Babar"
=> "Babar"
2.2.1 :038 > "Ruby says " + x
=> "Ruby says Da da da"
2.2.1 :039 > my_name
=> "Babar"

ওকা, বেশি বেশি প্র্যাকটিস করেন, আর সাহস থাকলে নিচের এক্সপ্রেশনের আউটপুটটা কমেন্ট করে জানান!

5 + 045

ভালো থাকুন, আর কোন সমস্যা হলে অবশ্যই জানাবেন।

প্রোগ্রামিং উইথ রুবিঃ সেটআপ এবং প্রস্তুতি

সবাই যে ভাবে উৎসাহ দিচ্ছিলো তাতে আবার লেখার জন্য বসে পড়তে বাধ্য হলাম! যাইহোক আগেরদিন আপনাদের একটা ছোট্ট এসাইনমেন্ট দিয়েছিলাম। সেটার কি খবর?

আবার একটু ভূমিকা
রুবি হচ্ছে ইন্টারপ্রেটেড ল্যাংগুয়েজ। এটাকে কম্পাইল করতে হয় না। মানে হচ্ছে আপনি সিম্পলি একটা টেক্সট ফাইল দিয়ে বলবেন যে এটায় যে কোড আছে তা এক্সিকিউট করে দেয়ার জন্য, রুবি ইন্টারপ্রেটের সাথে সাথে আপনার হুকুম পালন করবে। সি বা ওই টাইপ ল্যাংগুয়েজ গুলা কম্পাইল করে নিতে হয়। কম্পাইলের সমস্যা হলো অনেক সময় লাগে কম্পাইল হতে, আউটপুট দেখতেও সময় লাগে। ইন্টারপ্রেটেড ল্যাংগুয়েজ এ সেই সমস্যা নেই। রিয়েলটাইম ফীডব্যাক পাওয়া যাচ্ছে, এতে শেখাটা খুব সহজ এবং ইন্টারএকটিভ হয়। এছাড়া কাজের সময়ও খুব হেল্পফুল হয়। কম্পাইলড ল্যাংগুয়েজ হলে একটা প্রোগ্রামে কোন এরর আছে কিনা সেটা দেখার জন্য প্রত্যেকবার পুরো প্রোগ্রাম কম্পাইল করতে হচ্ছে, যা খুবই সময় সাপেক্ষ, তারপরও আবার প্রোগ্রাম রান করে চেক করতে হবে! ইন্টারপ্রেটেড ল্যাংগুয়েজে আপনি সরাসরি রান করে দেখতে পারবেন কোথায় কি অবস্থা!
আরেকটা বড় সুবিধা হলো, প্রোগ্রাম ডিস্ট্রিবিউশন। একটা রুবি প্রোগ্রাম আলাদা প্ল্যাটফর্ম (যেমন ম্যাক/লিনাক্স) এর জন্য আলাদা করে কম্পাইল/টুইক করার দরকার নেই। যে প্রোগ্রাম পনার লিনাক্স মেশিনে চলবে সেটা মোটামুটি ৯৯% শিওর একটা ম্যাশ মেশিনেও চলবে। উইন্ডোজে একটু ঝামেলা করতে পারে, তবে ৮৫%-৯০% রুবি প্রোগ্রাম এজ ইজ উইন্ডোজো রান করবে। কোন পরিবর্তন করার দরকারই হবে না!

তো এখন কথা হচ্ছে কিভাবে আপনার মেশিনকে রুবি এর উপযোগী করবেন। আপনার যে কোন ধরণের মেশিনই হোক, আপনি সেটায় রুবি চালাতে পারবেন। ARM থেকে শুরু করে ম্যাক সব জায়গায় রুবি এর পোর্ট আছে।

তবে রুবি প্রোগ্রামিংয়ের জন্য আমি পার্সোনালি ইউনিক্স বেজড এনভার্ণমমেন্ট (লিনাক্স / বিএসডি / ম্যাক) রিকমেন্ড করবো। আপনি আপনার উইন্ডোজ মেশিনেও কাজ করতে পারবেন আরামসেই। কিন্তু কিছু ঝামেলা হতেই পারে, যেহেতু রুবির জন্মই হয়েছে ইউনিক্স এনভার্ণমমেন্ট মাথায় রেখে! ছোট্ট একটা উদাহরণ দেই, যেমন ইউনিক্স লাইক প্ল্যাটফর্মগুলাতে ডিরেক্টরী পাথ নির্দেশ করটা হয় ফরোয়ার্ড স্ল্যাশ (/) দিয়ে, কিন্তু উইন্ডোজে ব্যবহার করা হয় ব্যাকস্ল্যাশ (\)। প্রথমদিকে আপনার উইন্ডোজেও কোন সমস্যা হবে না, তবে এডভান্সড লেভেলে গিয়ে একটু ঝামেলায় পড়তে পারেন।
আরেকটা ব্যাপার হলো, আমি নিজে উইন্ডোজ ইউজার না, সো আমাকে প্রবলেম বললেও আমি তেমন একটা হেল্প করতে পারবো না।

ইউনিক্স বেজড এনভার্ণমমেন্ট (লিনাক্স / বিএসডি / ম্যাক) এ রুবি সেটআপ
এইগুলা প্রত্যেকটা ডিস্টিবিউশনে আলাদা ভাবে রুবি ইন্সটল করা যায়। যৈমন ম্যাকে বাই ডিফল্ট রুবি আসে। ডেবিয়ান লিনাক্সে apt দিয়ে ইন্সটল করে নিতে পারবেন। সেন্ডওএস/রেডহ্যাটে এ yum আর BSD তে pkg/port দিয়ে ইন্সটল করে নিতে পারবেন খুব সহজেই। কিন্তু আমি সবগুলা আলাদা আলাদা কাভার না করে, একসাথে কাভার করবো। এজন্য আমরা RVM (Ruby Version Manager) নামে একটা টুলস ব্যবহার করবো।
প্রথমেই নিশ্চিত করুন আপনার সিস্টেমে Bash, cURL ইন্সটল করা আছে। যেমন FreeBSD তে Bash থাকে না। আবার অনেক লিনাক্স ডিস্টিবিউশনে cURL থাকে না। এছাড়া এক্সট্রা হিসেবে Git ও ইন্সটল করে ফেলতে পারেন। রুবি এর মত আধুনিক টুলস নিয়ে কাজ করবেন আর গিট ইউজ করবে না, সেটা কিভাবে হয়! যাইহোক, সবকিছু রেডি থাকলে এবার আপনার টার্মিনাল ওপেন করে নিচের কমান্ডটা রান করুনঃ

\curl -sSL https://get.rvm.io | bash -s stable

ইন্সটলেশন শেষ হলে এবার এই কমান্ডটা রান করুনঃ
source ~/.rvm/scripts/rvm

ব্যস, হয়ে গেলো! এবার আপনার টার্মিনালে এই কমান্ডটা রান করে দেখুন রুবি ইন্সটলেশন সাকসেসফুল কিনা।
ruby -v

সব ঠিকঠাক থাকলে নিচের মত আউটপুট পাওয়ার কথাঃ
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]

আপনার ক্ষেত্রে কিছুটা ভিন্ন হতে পারে, তবে মূল কথা হচ্ছে ইন্সটলড রুবি এর ভার্সন দেখতে পারবেন এটা দিয়ে। আচ্ছা আরেকটা কমান্ড আছে, এটা খুবই গুরুত্তপূর্ণ। টার্মিনালে irb লিখে এন্টার দিন, আউটপুট মিলিয়ে দেখুনঃ
2.2.1 :001 >

এখানে প্রথম পার্টটা হচ্ছে আপনার রুবি এর ভার্সন নাম্বার। মিলে গেলে এবার exit লিখে এন্টার দিন!
আপনার কাজ আপাতত শেষ। নিচে দেখুন এডিটর নামে একটা পার্ট আছে, ওটা পড়া শুরু করে দিন।
আর আপনার ইউজার ডিরেক্টরীতে Ruby নামে একটা ফোল্ডার বানিয়ে রাখুন।
mkdir ~/Ruby

এখানেই আমরা আমাদের সকল রুবি কোড সেভ করে রাখবো পরবর্তীতে।

উইন্ডোজে রুবি সেটআপ
ওকে, এইবার উইন্ডোজ ইউজাররা এইদিকে আসুন। আপনারা আবার পরে বইলেন না, আমি আপনাদের সতর্ক করি নাই!
যাই হোক, এখনো যদি আপনারা শিওর থাকেন যে উইন্ডোজেই শিখবেন তাহলে RubyInstaller থেকে থেকে আপনার পিসির আর্কিটেকচার অনুযায়ী লেটেস্ট ভার্সনটা নামিয়ে নিন। এরপর নরমালি উইন্ডোজে যেভাবে জিনিসপত্র ইন্সটল করে সেভাবে করে ফেলুন।
ইন্সটলেশন শেষ হলে cmd ওপেন করুন। নিচের কমান্ড রান করে দেখুন ঠিকঠাক মত ভার্সন দেখায় কিনা।

ruby -v

অবশ্যই irb কমান্ডও রান করে দেখুন সব ঠিক আছে কিনা। irb রান করলে নিচের মত আউটপুট দেয়ার কথাঃ
2.2.1 :001 >

সব ঠিক থাকলে exit লিখে কাজ শেষ করুন।
এই বিষয়ে কোন হেল্প লাগলে ওদের ডকস ঘাটুক প্লীজঃ https://github.com/oneclick/rubyinstaller/wiki/FAQ
আর আপনার ইউজার ডিরেক্টরীতে Ruby নামে একটা ফোল্ডার বানিয়ে রাখুন। এখানেই আমরা আমাদের সকল রুবি কোড সেভ করে রাখবো পরবর্তীতে।

(টেক্সট/কোড) এডিটরস
কোড লেখার জন্য যৈ কোন একটা টেক্সট এডিটর হলেই হবে। তবে টেক্সট এডিটরই লাগবে। মাইক্রোসফট অফিসের মত কোন এপ হলে কাজ হবে না। উইন্ডোজে যে নোডপ্যাড আছে এটা দিয়েও হবে। কিন্তু এধরণের এডটর গুলোর একটা সমস্যা হলো, একেবারেই সাদামাটা। আমি মাঝে মাঝে দিনে ৫-৭ ঘন্টা কোড লিখি। সো এত সাদামাটা জিনিস আমার পছন্দ না।
Rubyist দের মধ্যে সবচেয়ে জনপ্রিয় এডিটর ছিলো TextMate, কিন্তু এটার ভার্সন ২ আর কখনো আলোর মুখ দেখেনি!
সবার জন্য আমার রিকমেন্ডেশন হচ্ছে SublimeText 3 বা Atom এর মত মডার্ণ কোন এডিটর। দুটো এডিটরই খুবই ভালো এবং উইন্ডোজ/লিনাক্স/ম্যাক সব জায়গার জন্য এভেইলএবল।
আমার পছন্দ হলো Vim, এটাও রুবিয়িস্টদের পছন্দের একটা এডিটর। তবে এটার ইনিশিয়াল লার্ণিং কার্ভ একটু বড় বিধায় সবার জন্য রিকমেন্ড করা যাচ্ছে না। তবে আগ্রহ পেলে জিনিসটা ঘেটে দেখতে পারেন সময় করে। খুবই পাওয়ারফুল একটা টুল। আমার মতে, Vim যতখানি না একটা এডিটর তারচেয়ে বেশি হচ্ছে টাইপ করার স্টাইল। একবার ইউজডটু হয়ে গেলে যে কোন জায়গায় এটাকে মিস করবেন ফর শিওর!

সারমার্ম
আজ থেকে আপনার খুব প্রিয় দুটো জিনিস হচ্ছে Terminal/cmd আর আপনার কোড/টেক্সট এডিটর। এই দুটোর সাথে বন্ধুত্ব করে ফেলুন, প্রোগ্রামার হিসেবে আপনার জীবন অনেক ভালো হবে!

তো জিনিসপত্র নিয়ে রেডি হন। এরপর দিন আমার আসল রুবি কোড নিয়ে ঘাটাঘাটি শুরু করে দিবো! আর কোন সমস্যা হলে কমেন্টে জানাবেন অবশ্যই।

প্রোগ্রামিং উইথ রুবিঃ শূন্য দিয়ে শুরু!

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

তো এখন তাহলে কিভাবে শুরু করবেন?
ঠিক আছে, এইবার তাহলে আমার টার্ণ। প্রথমে আপনার যে কোন একটা প্রোগ্রামিং ল্যাংগুয়েজ চয়েজ করতে হবে। অপশন হিসেবে আপনার কাছে থাকতেছে C/C++, Python, Ruby, JS. ল্যাংগুয়েজ আরও অনেকই আছে, কিন্তু আমি এই কয়েকটাই রিকমেন্ড করবো একেবারে নতুনদের শুরু করার জন্য। এর মাঝে পাইথন আর রুবি হচ্ছে সবচেয়ে সহজ দুটো ল্যাংগুয়েজ। আপনি যদি ডেস্কটপের জন্য শিখতে চান তাহহলে সি বা সি++ বেটার চয়েজ। শুধু ওয়েবের জন্য শিখতে চাইলে জেএস। ওয়েব প্রোগ্রামিং + ডেস্কটপ দুইটাই কাভার করতে চাইলে পাইথন বা রুবি যে কোনটা দিয়ে শুরু করতে পারেন। আমি যেহেতু ওয়েব প্রোগ্রামার, আমি একটু এদিকেই বায়াসড। সো আমার সাথে থাকতে হলে শেষের ৩ টা থেকে একটা পিক করতে হবে!

তো রুবিই ক্যানো?
আরে ভাই, সহজ হিসাব, ফেসবুকে স্ট্যাটাস দিতে পারবেন, “I’m in love with Ruby! <3". আমার মত কম্পু নার্ডদের আর কি চাই! জোকস এপার্ট, হ্যালো ফ্রম জাপান। রুবি প্রথম দেখায় খেলনা মনে হতে পারে। এত্তটাই সহজ, প্রোগ্রামিং শুরু করার জন্য খুবই ভালো একটা চয়েজ। আবার একই সাথে, খুবই পাওয়ারফুল একটা ল্যাংগুয়েজ। রুবি এর ক্রিয়েটর "Yukihiro "Matz" Matsumoto" এর মতামত হচ্ছে, তার Perl এর চেয়ে পাওয়ারফুল এবং Python এর চেয়ে অবজেক্ট ওরিয়েন্টেড একটা ল্যাংগুয়েজ তার দরকার ছিলো। কিছু না পেয়ে সে নিজেই একটা বানিয়ে ফেলেছে! এমনকি নামটাও পার্ল এর প্রতি সম্মান দেখিয়ে রুবি রাখা হয়েছে। খুবই পাওয়ারফুল, একই সাথে হাইলি অবজেক্ট অরিয়েন্টেড, সহজ সিনট্যাক্স, নতুন প্রোগ্রামিং শেখার জন্য রুবিকে একেবারেই আদর্শ একটা চয়েজ বানিয়েছে! তাহলে আমার কি কি লাগবে শেখার জন্য?
একটা কম্পিউটার, একটা ইন্টারনেট কানেকশন, কিছু সময়, আমার বাকোয়াজ লেখা পড়ার ধৈর্য, আর কিচ্ছু না! আপনি যেহেতু এই আর্টিকেলটা পড়তেছেন, তাহলে ধরেই নিতে পারি প্রথম দুটো আছে। এবার আপনি নিজেকে জিজ্ঞেস করুন বাকি দুটো কই পাওয়া যাবে! জ্বি না, আপনাকে সিএসই পড়তে হবে না প্রোগ্রামিং শেখার জন্য। মোটামুটি কমন সেন্স থাকলে হাই স্কুলের স্টুডেন্টরাও এই সিরিজ ফলো করতে পারার কথা। ওহ আরেকটা জিনিস লাগবে, কৌতুহল। সো ব্রেস ইয়োরসেল্ফ!

ওকা, ম্যালা বক বক করছি! আজকের মত বাই বাই। আপনাদের জন্য আজকের এসাইনমেন্ট হচ্ছে, নিজের পিসিতে কিভাবে রুবি প্রোগ্রাম চালানোর উপযুক্ত করবেন, সেটা নিয়ে গুগল করা। না পারলেও সমস্যা নেই, আমি এই নিয়ে পরেরদিন বলবো তবে নিজেকে যতটা আগিয়ে রাখা যায় আরকি! কিছু জানার থাকলে অবশ্যই নিচে কমেন্ট করে জানাবেন।

ওহ, ভালো কথা, সিরিজ কিন্তু শূন্য দিয়ে শুরু, এটা একটু মাথায় রাইখেন। আমি পরে আপনাকে একটা সিক্রেট বলবোনি এই ব্যাপারে!

আর সাথে এই ভিডুটা দেখতে থাকুনঃ

পরের পর্বঃ

Enable remote access to PostgreSQL database server

Often it’s good to access databases directly from desktop. Or maybe you want your database server to be different from your application server. Whatever your reason is, the requirement is enabling remote access to your PostgreSQL database server.

It’s very simple procedure. First locate your DB configuration files. Commonly they lives under /etc/postgresql/9.3/main/ directory. Be sure to replace ‘9.3’ with your own database version.

Now open up the file pg_hba.conf with your favorite text editor and paste the bellow code at the end of the file:

host all all  0.0.0.0/0 md5

Okay, Attention first: this will open up your server to the whole world. You can alter the above code to meet your specific need. Like replace the first ‘all’ with your single database name or replace second ‘all’ with your database user name. Also you can limit the network at the 4th column. Just tweak it as you need. It’ll be more secure.

Next open up postgresql.conf and change the value of listen_addresses = ‘localhost’ to something like this:

listen_addresses = '*'

Now PostgreSQL will listen to the whole network.

Simply restart your server:

sudo service postgresql restart

You should be good to go by now!

Test your setup:

psql -h server.ip -U postgres

Basic Database Design tips for Relational Database

Database is one of the biggest bottleneck of a Web App performance now a days.

A poorly designed database can make your life hell as a dev while optimizing an app.

On the other hand, A good design can speedup your development process along with the performance of the app.

I’m also learning the basics of database design, in that process here listing some basic tips.

  • Actually draw the design on a big paper.
  • List down all columns you may need.
  • If you have confusion about a column (you may need or not), list it down.
  • Now break those into multiple tables.
  • Don’t keep any irrelevant data on a table, better use additional table.
  • As it’s a relational database design, check your relations properly.
  • For MySQL advanced engines like InnoDB supports relations inside database end, use them, This way you’ll have to write less code and less query.
  • Now run your design through Normalization Form (NF) rules.

As I always say, Database design is almost 30% of whole development process for me. With a solid design I can write code very confidently.
So think before the design, don’t be upset later.

If you have any other point, please let me know via comment. I’m eagerly waiting to learn something new.