Kentico Hosted Trial Kentico Administrator Backend Overview
Jul 26
নোড . জে এস । Node.js – ইভেন্ট ইমিটার (Event Emitter)
নড জেএসঃ ইভেন্ট ইমিটার
রিদওয়ান বিন শামীম
নড ইমিট ইভেন্টের অনেক অবজেক্ট যেমন net.Server এর সাথে কোনও সদৃশ পিয়ার যুক্ত হলে কোনও ইভেন্টকে ইমিট করে। fs.readStream কোনও ইভেন্টকে ইমিট করে যখন এর ফাইল খোলা থাকে। events.EventEmitter সব ইভেন্ট ইমিট হওয়ার উদাহরণ।
ইভেন্ট ইমিটারের শ্রেণীঃ ইভেন্ট ইমিটারের শ্রেণী events module তে ব্যপিত থাকে।
নিচে উদাহরণ দেয়া হল,
// Import events module
var events = require(‘events’);
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
ইভেন্ট ইমিটারের কোনও পর্যায়ে ভুল দেখা দিলে ‘error’ ইভেন্ট দেখানো হয়। নতুন লিসনার যোগ হলে ‘newListener’ ইভেন্ট আর কোনও লিসনার মুছে ফেললে ‘removeListener’ ইভেন্ট প্রদর্শিত হয়। ইভেন্ট ইমিটার on ও emit. এর মত অনেক বৈশিষ্ট্য ধারণ করে।
প্রক্রিয়াঃ
S.N. প্রক্রিয়া
1 addListener(event, listener)
2 on(event, listener)
3 once(event, listener)
4 removeListener(event, listener)
5 removeAllListeners([event])
6 setMaxListeners(n)
7 listeners(event)
8 emit(event, [arg1], [arg2], […])
ক্লাস মেথডঃ
S.N. প্রক্রিয়া
1 listenerCount(emitter, event)
ইভেন্টসঃ
S.No. ইভেন্ট
1 newListener
• event – ইভেন্ট নেমের স্ট্রিং
• listener – ইভেন্ট হ্যান্ডেলার ফাংশন
2 removeListener
• event – ইভেন্ট নেমের স্ট্রিং
• listener – ইভেন্ট হ্যান্ডেলার ফাংশন
উদাহরণঃ নিচের Node.js কোড দ্বারা main.js নামের ফাইল তৈরি করি,
var events = require(‘events’);
var eventEmitter = new events.EventEmitter();
// listener #1
var listner1 = function listner1() {
console.log(‘listner1 executed.’);
}
// listener #2
var listner2 = function listner2() {
console.log(‘listner2 executed.’);
}
// Bind the connection event with the listner1 function
eventEmitter.addListener(‘connection’, listner1);
// Bind the connection event with the listner2 function
eventEmitter.on(‘connection’, listner2);
var eventListeners = require(‘events’).EventEmitter.listenerCount(eventEmitter,’connection’);
console.log(eventListeners + ” Listner(s) listening to connection event”);
// Fire the connection event
eventEmitter.emit(‘connection’);
// Remove the binding of listner1 function
eventEmitter.removeListener(‘connection’, listner1);
console.log(“Listner1 will not listen now.”);
// Fire the connection event
eventEmitter.emit(‘connection’);
eventListeners = require(‘events’).EventEmitter.listenerCount(eventEmitter,’connection’);
console.log(eventListeners + ” Listner(s) listening to connection event”);
console.log(“Program Ended.”);
এখন main.js রান করালে,
$ node main.js
আউটপুট ভেরিফাই করে দেখতে পারি,
2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.
তথ্যসূত্রঃ http://www.tutorialspoint.com/nodejs/nodejs_event_emitter.htm
Jul 26
বাংলাদেশ কারিগরি শিক্ষা বোর্ডের অধিনে HSC BM এবং HSC VOC প্রোগ্রামে ভর্তির অনলাইন আবেদন
01732487334
01731582032
Jul 25
ইউজার ডায়াগ্রাম প্রটোকল
রিদওয়ান বিন শামীম
টিসিপি/আইপি প্রটোকল স্যুইটের সরলতম ট্রান্সপোর্ট লেয়ার কমিউনিকেশন প্রটোকল হল ইউজার ডায়াগ্রাম প্রটোকল । এটিতে কম সংখ্যক যোগাযোগ কৌশল প্রয়োগ করা হয়। ইউজার ডায়াগ্রাম প্রটোকলকে অনির্ভরযোগ্য যোগাযোগ প্রটোকল বলা হলেও এটি আইপি সার্ভিস ব্যবহার করে যেটিতে সেরা সরবরাহ কৌশল ব্যবহৃত হয়।
ইউজার ডায়াগ্রাম প্রটোকলে ডাটা প্যাকেট গ্রহণকারী কোনোরূপ প্রাপ্তি সংবাদ পাঠায় না , ডাটা প্যাকেট প্রেরণকারীও কোনও ধরণের প্রাপ্তি সংবাদ আশা করে না। এই বিষয়টিই এই প্রক্রিয়াকে একই সাথে সহজ কিন্তু অনির্ভরযোগ্য করেছে।
ইউজার ডায়াগ্রাম প্রটোকলের রিকোয়ারমেন্টঃ একটি প্রশ্ন উঠতে পারে, অনির্ভরযোগ্য প্রটোকল ব্যবহার করে ডাটা ট্রান্সফারের দরকার কি? আমরা ইউজার ডায়াগ্রাম প্রটোকল তখন ব্যবহার করি যেসব ক্ষেত্রে একনলেজমেন্ট প্যাকেট মূল ডাটার সাথে প্রচুর পরিমান ব্যান্ডউইথ শেয়ার করে। যেমন, ভিডিও স্ট্রিমিংএর সময় এর ব্যবহারকারীর দিকে হাজার হাজার ডাটা প্যাকেটকে ফরোয়ার্ড করা হয়। এসব ডাটা প্যাকেটের সবগুলোর জন্য একনলেজমেন্ট অর্থাৎ প্রাপ্তি সংবাদ ব্যবস্থা করা কঠিন ও তা প্রচুর ব্যান্ডউইথ অপচয় করবে। অন্তর্নিহিত আইপি প্রটোকলের সেরা সরবরাহ কৌশল ডাটা সরবরাহের সর্বোচ্চ সম্ভবনা নিশ্চিত করে। এমনকি ভিডিও স্ট্রিমিংএর সময় অল্প কিছু ডাটা প্যাকেট হারিয়ে গেলেও তা আর তেমন প্রভাব রাখবে না। ভিডিও বা ভয়েজ ট্র্যাফিকের সময় হারানো ডাটা প্যাকেট তেমন প্রভাব রাখে না।
ইউজার ডায়াগ্রাম প্রটোকলের বৈশিষ্ট্য
- ইউজার ডায়াগ্রাম প্রটোকল তখন ব্যবহৃত হয় যখন একনলেজমেন্ট অর্থাৎ প্রাপ্তি সংবাদের কোনও গুরুত্ব নেই,
- একমুখী ডাটা প্রবাহের জন্য ইউজার ডায়াগ্রাম প্রটোকল বেশি উপযোগী,
- ইউজার ডায়াগ্রাম প্রটোকল সহজ এবং কোয়েরিভিত্তিক যোগাযোগের জন্য উপযোগী,
- এটি যোগাযোগ ওরিয়েন্টেড নয়,
- ইউজার ডায়াগ্রাম প্রটোকল কনজেশন কন্ট্রোল কৌশল ব্যবহারে সক্ষম নয়,
- এটি ডাটার নির্দেশিত সরবরাহ নিশ্চিত করে না,
- ইউজার ডায়াগ্রাম প্রটোকল স্টেটবিহীন,
- স্ট্রিমিং এপ্লিকেশন যেমন ভিওআইপি, মাল্টিমিডিয়া স্ট্রিমিং এর জন্য বেশি উপযোগী।
ইউজার ডায়াগ্রাম প্রটোকলের হিডার(header) চারটি মূল প্যারামিটার ব্যবহার করে,
- সোর্স পোর্ট,
- ডেসটিনেশন পোর্ট,
- লেন্থ,
- চেকসাম
যেসব এপ্লিকেশনে ডাটা ট্রান্সফারের জন্য ইউজার ডায়াগ্রাম প্রটোকল ব্যবহৃত হয়,
- ডোমেইন নেম সার্ভিস,
- সিম্পল নেটওয়ার্ক মেনেজমেন্ট প্রটোকল,
- ট্রিভিয়াল ফাইল ট্রান্সফার প্রটোকল,
- রাউটিং ইনফরমেশন প্রটোকল,
- কার্বারোতে।
Jul 25
ইউনিক্স বেসিক ইউটিলিটিঃ প্রিন্টিং, ইমেইল
রিদওয়ান বিন শামীম
ইউনিক্স অপারেটিং সিস্টেম ও এর বেসিক কম্যান্ড সম্পর্কে আপনাদের নিশ্চয়ই কিছু ধারণা হয়েছে, এই টিউটোরিয়ালে এর এমন কিছু বেসিক ইউটিলিটি নিয়ে কাজ করা হবে যা আমাদের দৈনন্দিন জীবনে অনেক কাজে লাগে।
ফাইল প্রিন্ট করা
ইউনিক্স সিস্টেমে ফাইল প্রিন্ট করার আগে আমরা মার্জিন, কোনও লাইন হাইলাইট করার থাকলে তা করা ইত্যাদি সমন্বয় করে রিফর্ম করে নিব। বেশিরভাগ ফাইল কোনও রিফরমিং ছাড়াই প্রিন্টআউট করা সম্ভব তবে তা দেখতে অতটা সুন্দর নাও হতে পারে।
ইউনিক্সের অনেক ভার্সন nroff এবং troff দুটি শক্তিশালী টেক্সট ফরম্যাটার ব্যবহার করতে দেয়, আমরা এখানে এগুলো সম্পর্কে আলোচনা না করলেও ইন্টারনেটে এদের নিয়ে অনেক টিউটোরিয়াল পাওয়া যায়, সেগুলো অনেক হেল্পফুলএসব ইউটিলিটির জন্য।
pr কম্যান্ড
pr কম্যান্ড টার্মিনাল স্ক্রিন বা প্রিন্টারের জন্য ছোটখাটো ফরম্যাটিং করে থাকে, যেমন যদি কোনও ফাইলে নামের লম্বা লিস্ট থেকে থাকে তাহলে আমরা স্ক্রিনে সেগুলোকে দুই বা ততোধিক কলামে ভাগ করে দিতে পারি।
pr কম্যান্ডের সিনট্যাক্স নিচে দেয়া হল,
pr option(s) filename(s)
pr কম্যান্ড স্ক্রিনে বা প্রিন্টেড কপিতে পরিবর্তন ও ফরম্যাটিং করে থাকে, এটি মূল ফাইলে কোনও পরিবর্তন সাধন করে না।
কিছু pr কম্যান্ড অপশন নিচের ছকে দেখানো হল।
অপশন | বর্ণনা |
-k | আউটপুটে k কলাম গঠন করে |
-d | আউটপুটে ডবল স্পেস(সবpr ভার্সনে নয়) |
-h “header” | পরবর্তী আইটেমকে রিপোর্টার হিডার হিসেবে নেয় |
-t | টপ ও বটম মার্জিন ও হিডার বাদ দেয় |
-l PAGE_LENGTH | পেজলেন্থ নির্ধারণ করে PAGE_LENGTH (66) lines. টেক্সটের ডিফল্ট লাইন নাম্বার ৫৬ |
-o MARGIN | মার্জিন স্পেস দ্বারা প্রতি লাইনকে অফসেট করানো। |
-w PAGE_WIDTH | পেজের উইডথ নির্ধারণ করে PAGE_WIDTH (72) characters মাল্টিপল টেক্সট কলাম আউটপুটের জন্য |
উদাহরণস্বরূপ, food নামের একটি স্যাম্পল ফাইলের জন্য,
$cat food
Sweet Tooth
Bangkok Wok
Mandalay
Afghani Cuisine
Isle of Java
Big Apple Deli
Sushi and Sashimi
Tio Pepe's Peppers
........
$
Restaurants হিডারে pr কম্যান্ড ব্যবহার করে দুই কলামে রিপোর্ট লিখলে,
$pr -2 -h "Restaurants" food Nov 7 9:58 1997 Restaurants Page 1
Sweet Tooth Isle of Java Bangkok Wok Big Apple Deli Mandalay Sushi and Sashimi Afghani Cuisine Tio Pepe's Peppers ........ $
lp বা lpr কমান্ড
lp বা lpr কমান্ড কোনও ফাইল স্ক্রিনের পরিবর্তে কাগজে প্রিন্টের জন্য ব্যবহৃত হয়। ডিফল্ট প্রিন্টারে কোনও নির্দিষ্ট ফাইল প্রিন্ট করার জন্য lp বা lpr কমান্ড ব্যবহার করতে হয় যেমন food নামের স্যাম্পল ফাইলের জন্য
$lp food request id is laserp-525 (1 file) $
lpstat ও lpq কম্যান্ড
lpstat কম্যান্ড নির্দেশ করে প্রিন্টারে কোন কোন ডাটা সারিবদ্ধ আছে যেমন রিকুয়েস্ট আইডি, ওউনার, ফাইল সাইজ এসব। নিজের আউটপুট রিকোয়েস্ট ছাড়া অন্য সব রিকোয়েস্ট দেখতে lpstat –o কম্যান্ড ব্যবহার করা যায়।
$lpstat -o laserp-573 john 128865 Nov 7 11:27 on laserp laserp-574 grace 82744 Nov 7 11:28 laserp-575 john 23347 Nov 7 11:35 $
lpq, lpstat –o থেকে একটু ভিন্ন ধরণের তথ্য দেয়,
$lpq laserp is ready and printing Rank Owner Job Files Total Size active john 573 report.ps 128865 bytes 1st grace 574 ch03.ps ch04.ps 82744 bytes 2nd john 575 standard input 23347 bytes $
এখানে প্রথম লাইন প্রিন্টার স্ট্যাটাস বুঝায়, প্রিন্টার অকেজো বা কাগজ না থাকলে প্রথম লাইনে অন্য ম্যাসেজ আসবে।
cancel ও lprm কম্যান্ড
cancel কম্যান্ড lp কম্যান্ড থেকে প্রিন্টিং রিকোয়েস্ট বাদ দেয়, lprm lpr রিকোয়েস্ট বাদ দেয়।
$cancel laserp-575 request "laserp-575" cancelled $
প্রিন্ট হচ্ছে এমন রিকোয়েস্ট বাতিল করতে শুধু নিচের কোড প্রবেশ করাতে হবে,
$cancel laserp request "laserp-573" cancelled $
Lprm কম্যান্ড চলমান রিকোয়েস্ট বাতিলের জন্য প্রয়োগ করা হয়,
$lprm 575 dfA575diamond dequeued cfA575diamond dequeued $
ইমেইল প্রেরণ
ইমেইল প্রেরণের সিনট্যাক্স হল,
$mail[-s subject][-c cc-addr][-b bcc-addr] to-addr
মেইল কম্যান্ডের গুরুত্বপূর্ণ অপশনগুলো হল,
অপশন | বর্ণনা |
-s | কম্যান্ড লাইনে বিষয় নির্ধারণ |
-c | ইউজার লিস্ট কার্বন কপি করা। কমা দ্বারা আলাদা করা তালিকা হতে হবে |
-b | লিস্টে ব্লাইন্ড কার্বন কপি প্রেরণ করা। কমা দ্বারা আলাদা করা তালিকা হতে হবে |
যেমন, admin@yahoo.com তে টেস্ট ম্যাসেজ পাঠাতে কোড,
$mail-s"Test Message" admin@yahoo.com
লাইনের শুরুতে “control-D” ব্যবহার করে ম্যাসেজ লিখতে হবে, এটি বন্ধ করতে শুধু dot (.) নিচের মত করে লিখতে হবে,
Hi, This is a test . Cc:
নিচের কোড ব্যবহার করে সম্পূর্ণ ফাইল প্রেরণ করা যায়,
$mail-s"Report 05/06/07" admin@yahoo.com< demo.txt
ইনকামিং মেইল চেক করতে ইউনিক্স সিস্টেমে নিচের কোড ব্যবহার করতে হয়,
$mail no email
Jul 25
নোড.জেএস । Node.js – ইভেন্ট লুপ (Node.js – Event Loop)
রিদওয়ান বিন শামীম
নড জেএস একক থ্রেড এপ্লিকেশন কিন্তু এটি ইভেন্ট ও কলব্যাকের সমন্বয়ের ধারনায় সমর্থন করে। যেহেতু নড জেএসের প্রতিটি এপিআই অসমন্বিত ও একক থ্রেডের, তাই এরা ফাংশন কল ব্যবহার করে সমন্বয় সাধনের জন্য। নড অবজারভার প্যাটার্ন ব্যবহার করে। নড থ্রেড ইভেন্ট লুপ রাখে, যখন কোনও টাস্ক সম্পন্ন হয় এটি সংশ্লিষ্ট ইভেন্টকে বাতিল করে দেয় যা কিনা ইভেন্ট লিসনার ফাংশনকে টাস্ক সম্পাদনের সিগন্যাল পাঠায়।
ইভেন্টভিত্তিক প্রোগ্রামিং
নড জেএস প্রচুর ইভেন্ট ব্যবহার করে আর এজন্যই এজাতীয় অন্যান্য প্রযুক্তির চেয়ে এটি অনেক বেশি দ্রুত। নড এর সার্ভার শুরু করার সাথে সাথে এর চলকও শুরু হয়ে যায়, ফাংশন ঘোষণা করে এবং ইভেন্ট সম্পন্ন হওয়ার জন্য অপেক্ষা করে।
ইভেন্টভিত্তিক এপ্লিকেশনে একটি মেইন লুপ থাকে যা ইভেন্টের সন্ধান করে, পাওয়া গেলে তাকে কলব্যাক ফাংশনের সাথে সমন্বয় করিয়ে দেয়।
ইভেন্টকে কলব্যাকের সমতুল্য মনে হতে পারে, মূলত পার্থক্য হল, অসমন্বিত ফাংশনের ফলাফল ফেরত আসলে কলব্যাক ফাংশন কাজ করে, আর ইভেন্ট অবজারভার প্যাটার্নে কাজ করে। যেসব ফাংশন ইভেন্টকে শোনে তারা অবজারভাররূপে কাজ করে। কোনও ইভেন্ট বাদ পরলে তার লিসনার ফাংশন সম্পাদন শুরু করে।
নড জেএসের অনেকগুলি বিল্ট ইন ইভেন্ট আছে যা events মডিউলের মাধ্যমে পাওয়া যায় এবং EventEmitter ক্লাস ইভেন্ট ও ইভেন্ট লিসনারের মধ্যে সমন্বয় সাধন করে।
// Import events module var events = require('events'); // Create an eventEmitter object var eventEmitter = new events.EventEmitter();
নিচের সিনট্যাক্স ইভেন্ট ও ইভেন্ট হ্যান্ডলারের মধ্যে সমন্বয় সাধন করে,
// Bind event and even handler as follows eventEmitter.on('eventName', eventHandler);
প্রোগ্রামিঙের মাধ্যমে কোনও ইভেন্ট বাদ দিতে,
// Fire an event eventEmitter.emit('eventName');
উদাহরণ,
main.js নামের জেএস ফাইল তৈরি করি যাতে নিচের কোড থাকবে,
// Import events module var events = require('events'); // Create an eventEmitter object var eventEmitter = new events.EventEmitter();
// Create an event handler as follows var connectHandler = function connected() { console.log('connection succesful.'); // Fire the data_received event eventEmitter.emit('data_received'); }
// Bind the connection event with the handler eventEmitter.on('connection', connectHandler); // Bind the data_received event with the anonymous function eventEmitter.on('data_received', function(){ console.log('data received succesfully.'); });
// Fire the connection event eventEmitter.emit('connection');
console.log("Program Ended.");
প্রোগ্রামটি রান করিয়ে আউটপুট পাব,
$ mnode main.js
এটি যে ফলাফল দেখাবে,
connection succesful. data received succesfully. Program Ended.
যেভাবে নড এপ্লিকেশন কাজ করেঃ অসমন্বিত ফাংশন শেষ প্যারামিটাররূপে কলব্যাককে গ্রহণ করে, কলব্যাক এররকে প্রথম প্যারামিটাররূপে গ্রহণ করে। পূর্বের উদাহরণের মাধ্যমে আবার দেখা যাক, input.txt নামে একটি ফাইল তৈরি করি, যাতে নিচের কোড থাকবে।
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
main.js নামের ফাইল তৈরি করি যাতে নিচের কোড থাকবে।
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err){ console.log(err.stack); return; } console.log(data.toString()); }); console.log("Program Ended");
এখানে fs.readFile() অসমন্বিত ফাংশন যার কাজ হল ফাইল পড়া। এক্ষেত্রে ভুল হলে err অবজেক্ট দ্বারা সেটি readFile এর মাধ্যমে কলব্যাক ফাংশনে যাবে।
Program Ended Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
Jul 25
নোড.জেএস – প্রথম এপ্লিকেশন (Node.js – First Application)
রিদওয়ান বিন শামীম
নড জেএসের মাধ্যমে ‘হ্যালো ওয়ার্ল্ড’ তৈরির আগে নড জেএসের এপ্লিকেশনের অংশগুলো দেখে নেয়া যাক, এর তিনটি খুব গুরুত্বপূর্ণ অংশ আছে,
- ইমপোর্ট রিকোয়ারড মডিউল
- ক্রিয়েটিভ সার্ভার
- রিড রিকোয়েস্ট, রিটার্ন রেসপন্স
নড জেএস এপ্লিকেশন তৈরি করা
প্রথম ধাপ, প্রয়োজনীয় মডিউল ইমপোর্ট করা
আমরা require ডিরেকটিভ ব্যবহার করব এইচটিটিপি মডিউল লোড করতে, আর রিটার্নড এইচটিটিপি ইন্সটেন্সকে এইচটিটিপি ভেরিয়েবলে নিচের মত করে স্টোর করব,
var http = require("http");
দ্বিতীয় ধাপ, সার্ভার তৈরি করা
পরবর্তী ধাপে আমরা তৈরি করা এইচটিটিপি ইন্সটেন্স ব্যবহার করি ও http.createServer() তে কল করা হয় সার্ভার ইনটেন্স তৈরি করতে। এরপরlisten মেথড ব্যবহার করে আমরা একে port 8081এর সাথে সংযুক্ত করি। একটি ফাংশনকে প্যারামিটার রিকোয়েস্ট ও রেসপন্সসহ পাস করানো হয়। নিচের ব্যবহারিক প্রয়োগ ‘হ্যালো ওয়ার্ল্ড’ ফলাফল দেখাবে।
http.createServer(function (request, response) {
// Send the HTTP header // HTTP Status: 200 : OK // Content Type: text/plain response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World" response.end('Hello World\n'); }).listen(8081);
// Console will print the message console.log('Server running at http://127.0.0.1:8081/');
উপরের কোড এমন এইচটিটিপি সার্ভার তৈরির জন্য যথেষ্ট যা লোকাল মেশিনের 8081 portএর সাথে সমন্বয় সাধন করে।
তৃতীয় ধাপ, রিকোয়েস্ট ও রেসপন্স টেস্ট করা
main.js ফাইলে পূর্বে উল্লেখিত দুটি ধাপের সমন্বয় করে নিচের নত করে এইচটিটিপি সার্ভার চালু করতে হয়,
var http = require("http");
http.createServer(function (request, response) {
// Send the HTTP header // HTTP Status: 200 : OK // Content Type: text/plain response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World" response.end('Hello World\n'); }).listen(8081);
// Console will print the message console.log('Server running at http://127.0.0.1:8081/');
এখন সার্ভার চালুর জন্য main.jsকে সম্পাদন করতে হয় নিচের মত করে,
$ node main.js
আউটপুট ভেরিফাই করলে দেখব, সার্ভার চালু হয়ে গেছে।
Server running at http://127.0.0.1:8081/
নড জেএস সার্ভারে রিকোয়েস্ট করা
যেকোনো ব্রাউজারে http://127.0.0.1:8081/ ওপেন করে রেজাল্ট দেখব, ‘হ্যালো ওয়ার্ল্ড’ ।
অভিনন্দন! আমাদের প্রথম এইচটিটিপি সার্ভার তৈরি ও চালু হল যা port 8081 এর সকল এইচটিটিপি রিকোয়েস্টের সাড়া দেয়।
Jul 25
নোড.জেএস – এনপিএম (Node.js – NPM)
রিদওয়ান বিন শামীম
নড প্যাকেজ ম্যানেজার বা এনপিএম দুটি ফাংশনালিটির প্রবর্তন করে,
- নড জেএস প্যাকেজ বা মডিউলের জন্য অনলাইন সংগ্রহস্থল তৈরি করে যা search.nodejs.orgতে খোঁজা হবে।
- নড জেএস প্যাকেজ ইন্সটলের জন্য কম্যান্ড লাইন ইউটিলিটি, নড জেএস প্যাকেজের ভার্সন ও সংশ্লিষ্ট নির্ভরতা বিষয়ক ব্যবস্থাপনা নিয়ন্ত্রণ করে।
এনপিএম v0.6.3 এর পরবর্তী সংস্করণগুলোতে নড জেএস ইন্সটলেশন প্যাকেজের সাথে বাণ্ডিল আকারে আসে। ভেরিফাই করার জন্য কনসোল ওপেন করে নিচের কম্যান্ড লিখে দেখতে পারি,
$ npm --version 2.7.1
যদি এনপিএমের পুরনো সংস্করণ ব্যবহার করে থাকি তাহলে এটি আপডেট করা অনেক সহজ হবে, নিচের কম্যান্ড ব্যবহার করে আমরা এটি করতে পারি,
$ sudo npm install npm -g /usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js npm@2.7.1 /usr/lib/node_modules/npm
এনপিএম ব্যবহার করে মডিউল ইন্সটল করা
এজন্য একটি সহজ সিনট্যাক্স আমরা ব্যবহার করতে পারি,
$ npm install <Module Name>
যেমন, নিচের কম্যান্ড express নামের একটি পরিচিত নড জেএস ওয়েব ফ্রেমওয়ার্ক মডিউল ইন্সটলের জন্য ব্যবহৃত হতে পারে,
$ npm install express
এখন আমরা জেএস ফাইলে এই মডিউল ব্যবহার করতে পারব,
var express = require('express');
গ্লোবাল বনাম লোকাল ইন্সটলেশন
বাই ডিফল্ট এনপিএম যেকোনো ডিপেন্ডেন্সিকে লোকাল মোডে ইন্সটল করে। এখানে লোকাল মোড বলতে বোঝায় node_modules ডিরেক্টরিতে প্যাকেজ ইন্সটলেশন যা কিনা নড জেএস এপ্লিকেশন যে ফোল্ডারে আছে সেখানে বিদ্যমান। লোকাল মোডের প্যাকেজগুলো require() মেথডে প্রবেশযোগ্য। যেমন, এক্সপ্রেস মডিউল ইন্সটল করার সময় এটি কারেন্ট ডিরেক্টরিতে node_modules ডিরেক্টরি তৈরি করেছে।
$ ls -l total 0 drwxr-xr-x 3 root root 20 Mar 17 02:23 node_modules
অন্যভাবে, লোকালভাবে ইন্সটলড মডিউলকে আমরা npm ls কম্যান্ড ব্যবহার করে তালিকাবদ্ধ করতে পারি,
গ্লোবালভাবে ইন্সটলড প্যাকেজ বা ডিপেন্ডেন্সি সিস্টেম ডিরেক্টরিতে সংরক্ষিত থাকে। এসব ডিপেন্ডেন্সি যেকোনো নড জেএসের সিএলআই বা কম্যান্ড লাইন ইন্টারফেস ফাংশনে ব্যবহৃত হতে পারে কিন্তু require()ব্যবহার করে নড এপ্লিকেশনে সরাসরি ইমপোর্ট করা যায় না। গ্লোবাল ইন্সটলেশন ব্যবহার করে এক্সপ্রেস মডিউল ইন্সটল করা যাক,
$ npm install express -g
এটি একই ফলাফল দেবে কিন্তু মডিউল গ্লোবালি ইন্সটলড হবে। এখানে প্রথম লাইন মডিউলের ভার্সন ও ইন্সটলের লোকেশন নির্দেশ করবে।
express@4.12.2 /usr/lib/node_modules/express ├── merge-descriptors@1.0.0 ├── utils-merge@1.0.0 ├── cookie-signature@1.0.6 ├── methods@1.1.1 ├── fresh@0.2.4 ├── cookie@0.1.2 ├── escape-html@1.0.1 ├── range-parser@1.0.2 ├── content-type@1.0.1 ├── finalhandler@0.3.3 ├── vary@1.0.0 ├── parseurl@1.3.0 ├── content-disposition@0.5.0 ├── path-to-regexp@0.1.3 ├── depd@1.0.0 ├── qs@2.3.3 ├── on-finished@2.2.0 (ee-first@1.1.0) ├── etag@1.5.1 (crc@3.2.1) ├── debug@2.1.3 (ms@0.7.0) ├── proxy-addr@1.0.7 (forwarded@0.1.0, ipaddr.js@0.1.9) ├── send@0.12.1 (destroy@1.0.3, ms@0.7.0, mime@1.3.4) ├── serve-static@1.9.2 (send@0.12.2) ├── accepts@1.2.5 (negotiator@0.5.1, mime-types@2.0.10) └── type-is@1.6.1 (media-typer@0.3.0, mime-types@2.0.10)
গ্লোবালি ইন্সটলড সব মডিউল চেক করে দেখতে,
$ npm ls -g
package.jsonব্যবহারঃ package.json যেকোনো নড এপ্লিকেশন বা মডিউলের রুট ডিরেক্টরিতে থাকে এবং প্যাকেজের বৈশিষ্ট্য বিবৃত করে। node_modules/express/তে অবস্থিত এক্সপ্রেস প্যাকেজের package.json খুলে আমরা পাই,
{ "name": "express", "description": "Fast, unopinionated, minimalist web framework", "version": "4.11.2", "author": { "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" }, "contributors": [ { "name": "Aaron Heckmann", "email": "aaron.heckmann+github@gmail.com" }, { "name": "Ciaran Jessup", "email": "ciaranj@gmail.com" }, { "name": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com" }, { "name": "Guillermo Rauch", "email": "rauchg@gmail.com" }, { "name": "Jonathan Ong", "email": "me@jongleberry.com" }, { "name": "Roman Shtylman", "email": "shtylman+expressjs@gmail.com" }, { "name": "Young Jae Sim", "email": "hanul@hanul.me" } ], "license": "MIT", "repository": { "type": "git", "url": "https://github.com/strongloop/express" }, "homepage": "http://expressjs.com/", "keywords": [ "express", "framework", "sinatra", "web", "rest", "restful", "router", "app", "api" ], "dependencies": { "accepts": "~1.2.3", "content-disposition": "0.5.0", "cookie-signature": "1.0.5", "debug": "~2.1.1", "depd": "~1.0.0", "escape-html": "1.0.1", "etag": "~1.5.1", "finalhandler": "0.3.3", "fresh": "0.2.4", "media-typer": "0.3.0", "methods": "~1.1.1", "on-finished": "~2.2.0", "parseurl": "~1.3.0", "path-to-regexp": "0.1.3", "proxy-addr": "~1.0.6", "qs": "2.3.3", "range-parser": "~1.0.2", "send": "0.11.1", "serve-static": "~1.8.1", "type-is": "~1.5.6", "vary": "~1.0.0", "cookie": "0.1.2", "merge-descriptors": "0.0.2", "utils-merge": "1.0.0" }, "devDependencies": { "after": "0.8.1", "ejs": "2.1.4", "istanbul": "0.3.5", "marked": "0.3.3", "mocha": "~2.1.0", "should": "~4.6.2", "supertest": "~0.15.0", "hjs": "~0.0.6", "body-parser": "~1.11.0", "connect-redis": "~2.2.0", "cookie-parser": "~1.3.3", "express-session": "~1.10.2", "jade": "~1.9.1", "method-override": "~2.3.1", "morgan": "~1.5.1", "multiparty": "~4.1.1", "vhost": "~3.0.0" }, "engines": { "node": ">= 0.10.0" }, "files": [ "LICENSE", "History.md", "Readme.md", "index.js", "lib/" ], "scripts": { "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/", "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/" }, "gitHead": "63ab25579bda70b4927a179b580a9c580b6c7ada", "bugs": { "url": "https://github.com/strongloop/express/issues" }, "_id": "express@4.11.2", "_shasum": "8df3d5a9ac848585f00a0777601823faecd3b148", "_from": "express@*", "_npmVersion": "1.4.28", "_npmUser": { "name": "dougwilson", "email": "doug@somethingdoug.com" }, "maintainers": [ { "name": "tjholowaychuk", "email": "tj@vision-media.ca" }, { "name": "jongleberry", "email": "jonathanrichardong@gmail.com" }, { "name": "shtylman", "email": "shtylman@gmail.com" }, { "name": "dougwilson", "email": "doug@somethingdoug.com" }, { "name": "aredridel", "email": "aredridel@nbtsc.org" }, { "name": "strongloop", "email": "callback@strongloop.com" }, { "name": "rfeng", "email": "enjoyjava@gmail.com" } ], "dist": { "shasum": "8df3d5a9ac848585f00a0777601823faecd3b148", "tarball": "http://registry.npmjs.org/express/-/express-4.11.2.tgz" }, "directories": {}, "_resolved": "https://registry.npmjs.org/express/-/express-4.11.2.tgz", "readme": "ERROR: No README data found!" }
package.jsonএর এট্রিবিউট
- name – প্যাকেজের নাম
- version – প্যাকেজের ভার্সন
- description – প্যাকেজের বর্ণনা
- homepage – প্যাকেজের হোমপেজ
- author – প্যাকেজের অথর
- contributors – প্যাকেজের কন্ট্রিবিউটারের নাম
- dependencies – ডিপেনডেন্সি লিস্ট
- repository – প্যাকেজের সংগ্রহস্থলের প্রকরণ ও ইউআরএল
- main – প্যাকেজের এন্ট্রি পয়েন্ট
- keywords – কী ওয়ার্ড
মডিউল আনইন্সটল করতে
এজন্য কম্যান্ড ব্যবহার করতে পারি,
$ npm uninstall express
আনইন্সটল করে of /node_modules/ ডিরেক্টরি থেকে অথবা নিচের কম্যান্ড ব্যবহার করে ভেরিফাই করতে পারি
$ npm ls
মডিউল আপডেট করতে
package.json আপডেট করে ডিপেন্ডেন্সি ভার্সন পরিবর্তন করে এই কম্যান্ড রান করাতে হয়,
$ npm update express
মডিউল সার্চ করতে
এনপিএম ব্যবহার করে প্যাকেজের নাম সার্চ করতে হয়।
$ npm search express
মডিউল তৈরি করতে
এনপিএম ব্যবহার করে package.json এর কাঠামো তৈরি করা হয়,
$ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sane defaults.
See 'npm help json' for definitive documentation on these fields and exactly what they do.
Use 'npm install <pkg> --save' afterwards to install a package and save it as a dependency in the package.json file.
Press ^C at any time to quit. name: (webmaster)
ভ্যালিড ইমেইল এড্রেসসহ এনপিএম সংগ্রহস্থল সাইটে রেজিস্ট্রেশন করার জন্য কম্যান্ড,
$ npm adduser Username: mcmohd Password: Email: (this IS public) mcmohd@gmail.com
মডিউল পাবলিশ করতে যে কোড ব্যবহার করব,
$ npm publish
সবকিছু ঠিকঠাকভাবে সম্পন্ন হলে মডিউলটি পাবলিশ হয়ে যাবেএবং এনপিএমের মাধ্যমে ইন্সটলের যোগ্য হবে অন্যান্য নড জেএস মডিউলের মত।
Jul 25
নড.জেএস এর পরিবেশ তৈরি করা (Node.js – Environment Setup)
রিদওয়ান বিন শামীম
অনলাইনে অপশন পরীক্ষা করা
নড জেএস এর পরিবেশ নতুন করে তৈরি করার কিছু নেই কারণ ইতোমধ্যেই অনলাইনে সেই পরিবেশ তৈরি হয়ে আছে, অনলাইনে প্রাপ্য সকল উদাহরণ আমরা থিওরি নিয়ে কাজ করার সময়েই সম্পাদন করতে পারব। এটি আমাদের এবিষয়ে পড়াশুনার সময় বিভিন্ন ফলাফলসহ পরীক্ষানিরীক্ষা করার আত্মবিশ্বাস দেবে।
নিচের কোডের সাথে Try it অপশন ব্যবহার করে এটি করা যায়,
/* Hello World! program in Node.js */ console.log("Hello World!");
আমাদের টিউটোরিয়ালের পরবর্তী অংশে Try it অপশন প্রচুর ব্যবহার করা হবে তাই এর ব্যবহার ভালভাবে জেনে নেয়া প্রয়োজন।
লোকাল এনভায়রন সেটআপ করা
লোকাল এনভায়রন সেটআপ করতে চাইলে দুটি জিনিস কম্পিউটারে ইন্সটল করা থাকতে হবে, টেক্সট এডিটর আর নড জেএস বাইনারি ইন্সটলেবল।
টেক্সট এডিটরঃ প্রোগ্রাম টাইপ করার জন্য ব্যবহার করতে হয়। অপারেটিং সিস্টেমের উপর নির্ভর করে উইন্ডোজ নোটপ্যাড, অপারেটিং সিস্টেম এডিট কম্যান্ড ব্রিফ, এপ্সিলন, ইম্যাকস, ভিআইএম বা ভিআই ইত্যাদি টেক্সট এডিটর ব্যবহৃত হয়ে থাকে। এডিটরের মাধ্যমে সোর্স ফাইল তৈরি করা হয় যার মধ্যে প্রোগ্রাম সোর্স কোড থাকে। এর এক্সটেনশনে “.js” থাকে।
প্রোগ্রামিং শুরুর আগে একটি টেক্সট এডিটর ঠিক করে কোডিঙে কিছু অভিজ্ঞতা অর্জন করে একটি ফাইলে রেখে তা সম্পাদন করতে হয়।
নড জেএস রানটাইম
সোর্স ফাইলে লেখা সোর্সকোড হল জাভাস্ক্রিপ্ট। সেই জাভাস্ক্রিপ্ট কোড ইন্টারপ্রিট ও সম্পাদন করতে নড জেএস ইন্টারপ্রিটার ব্যবহৃত হয়।
নড জেএস ডিস্ট্রিবিউশন সান ওএস, লিনাক্স, ম্যাক ওএস এক্স, এবং উইন্ডোজের জন্য ৩২ ও ৬৪ বিট এক্স৮৬ প্রসেসর আর্কিটেকচারে বাইনারি ইন্সটলেবলরূপে পাওয়া যায়।
নড জেএসএর আরকাইভ ডাউনলোড করা
এক্ষেত্রে নড জেএসএর সর্বশেষ আরকাইভ ভার্সন ডাউনলোড করে নিতে হয়, বিভিন্ন ওএসের জন্য প্রযোজ্য কিছু আরকাইভ ভার্সন নিচের ছকে দেয়া হল,
ওএস আরকাইভের নাম
Windows node-v0.12.0-x64.msi Linux node-v0.12.0-linux-x86.tar.gz Mac node-v0.12.0-darwin-x86.tar.gz SunOS node-v0.12.0-sunos-x86.tar.gz
ইউনিক্স, সান ওএস, লিনাক্স ও ম্যাক ওএস এক্সে ইন্সটল করা
ওএস আর্কিটেকচার অনুযায়ী /tmp তে node-v0.12.0-osname.tar.gz আরকাইভ ডাউনলোড ও এক্সট্রাক্ট করতে হয়। এরপর সেটিকে /usr/local/nodejs ডিরেক্টরিতে সরিয়ে রাখতে হয়।
$ cd /tmp $ wget http://nodejs.org/dist/v0.12.0/node-v0.12.0-linux-x64.tar.gz $ tar xvfz node-v0.12.0-linux-x64.tar.gz $ mkdir -p /usr/local/nodejs $ mv node-v0.12.0-linux-x64/* /usr/local/nodejs
পাথ এনভায়রনমেন্ট চলকে /usr/local/nodejs/bin যোগ করতে হয়,
ওএস আউটপুট Linux export PATH=$PATH:/usr/local/nodejs/bin Mac export PATH=$PATH:/usr/local/nodejs/bin FreeBSD export PATH=$PATH:/usr/local/nodejs/bin
উইন্ডোজে ইন্সটলেশন
এমএসআই ফাইল ব্যবহার করে নড জেএসের প্রম্পট ব্যবহার করতে হয়। বাই ডিফল্ট C:\Program Files\nodejs তে নড জেএস ডিস্ট্রিবিউশন ব্যবহার করে থাকে।ইন্সটলার উইন্ডোজের পাথ পরিবেশ চলকে C:\Program Files\nodejs\bin ডিরেক্টরি সেট করে। কম্যান্ড প্রম্পট সক্রিয় করতে রিস্টার্ট করতে হয়।
ইন্সটলেশন ভেরিফাই করা- ফাইল সম্পাদন
main.js নামের জেএস ফাইল তৈরি করতে হয় নিচের কোড সহ,
/* Hello, World! program in node.js */ console.log("Hello, World!"
নড জেএস ইন্টারপ্রিটার ব্যবহার করে main.js ফাইল সম্পাদন করে আমরা ফলাফল দেখতে পারি,
$ node main.js
ইন্সটলেশনের সবকিছু ঠিকঠাক থাকলে এটি যে ফলাফল দেখাবে তা হল,
Hello, World!
Jul 22
ইউনিক্সঃ সিস্টেম লগিং (Unix – System Logging)
রিদওয়ান বিন শামীম
ইউনিক্স সিস্টেমের খুব শক্তিশালী ও স্থিতিস্থাপক লগিং সিস্টেম আছে যার মাধ্যমে আমাদের কল্পনাযোগ্য সব কিছুই আমরা রেকর্ড করে রাখতে ও পরবর্তীতে ব্যবহার করতে পারি।
ইউনিক্সের বেশিরভাগ ভার্সন syslog নামক জেনারেল পারপাস লগিং ফ্যাসিলিটি দিয়ে থাকে। স্বতন্ত্র প্রোগ্রাম যাদের তথ্য লগড অবস্থায় থাকতে হয় তারা এটিতে তথ্য প্রেরণ করে থাকে। এই সিস্টেম একটি কেন্দ্রীভূত সিস্টেম লগড প্রসেস ব্যবহার করে যা /etc/syslogd বা /etc/syslog নামক প্রোগ্রাম সম্পন্ন করে। প্রোগ্রাম তাদের লগ এন্ট্রিকে syslogd এ পাঠায় যা /etc/syslogd.conf বা /etc/syslog ফাইল কনফিগার সংক্রান্ত কাজগুলো করে। কোনও মিল পাওয়া গেলে কাঙ্খিত লগ ফাইলে লগ ম্যাসেজ লিখে রাখে।
মূলত চার ধরণের syslog টার্ম আছে,
টার্ম | বর্ণনা |
Facility | আইডেন্টিফাইয়ার লগ মেসেজে সাবমিট হওয়া এপ্লিকেশন বা প্রোগ্রামের বিবরণ দেয় |
Priority | ম্যাসেজের গুরুত্বের পরিমাপক |
Selector | এক বা একাধিক ফ্যাসিলিটি বা লেভেলের সমন্বয় |
Action | ইনকামিং ম্যাসেজ যা সিলেক্টরের সাথে মিলে যায়, তার ক্ষেত্রে ঘটে। |
সিসলগ ফ্যাসিলিটিজ
সিলেক্টরের জন্য প্রাপ্ত সুবিধাগুলো নিচে দেয়া হল, অবশ্য সব ইউনিক্স ভার্সন সবগুলো সুবিধা পায় না।
প্রায়োরিটি | বর্ণনা |
emerg | জরুরী অবস্থা |
alert | সংশোধন করতে হবে এমন অবস্থা |
crit | জটিল পরিস্থিতি, যেমন হার্ডওয়ারে ক্রুটি |
err | সাধারণ এরর |
warning | সতর্কবাণী |
notice | এরর না, তবু সাবধানে কাজ করতে হবে |
info | তথ্যমূলক ম্যাসেজ |
debug | প্রোগ্রাম ডিবাগের ম্যাসেজ |
none | নট টু লগ ম্যাসেজ নির্ধারণের জন্য সিউডো লেভেল ব্যবহার করা |
/etc/syslog.conf ফাইল
ম্যাসেজ লগড থাকার সময় এই ফাইল কন্ট্রোল করে।
*.err;kern.debug;auth.notice /dev/console daemon,auth.notice /var/log/messages lpr.info /var/log/lpr.log mail.* /var/log/mail.log ftp.* /var/log/ftp.log auth.* @prep.ai.mit.edu auth.* root,amrood netinfo.err /var/log/netinfo.log install.* /var/log/install.log *.emerg * *.alert |program_name mark.* /dev/console
ফাইলের প্রতিটা লাইনের দুটি করে অংশ আছে,
- ম্যাসেজ সিলেক্টর যা নির্ণয় করে কোন ধরণের ম্যাসেজ লগড হবে
- একশন ফিল্ড যা ঠিক করে ম্যাসেজ নিয়ে ঠিক কি করা হবে।
- উপরের কনফিগারেশনের কয়েকটি গুরুত্বপূর্ণ পয়েন্ট আছে,
- ম্যাসেজ সিলেক্টরের দুটি পার্ট আছে, ফ্যাসিলিটি আর প্রাইওরিটি
- kern.debug নামের ম্যাসেজ সিলেক্টর ডিবাগের চেয়ে বড় প্রাইওরিটি নির্বাচন করে।
- ফ্যাসিলিটি আর প্রাইওরিটির স্থলে তারকাচিহ্ন সবগুলোকেই নির্দেশ করে।
- মাল্টিপল ফ্যাসিলিটি নির্ধারণ করতে কমা ও ব্যবহার করা যায়।
লগিং একশন
পাঁচটি একশনের যে কোনও একটি একশন ফিল্ডে প্রযোজ্য হবে,
- কোনও ফাইল বা ডিভাইসে লগ ম্যাসেজ
- ইউজারের কাছে ম্যাসেজ পাঠানো
- সব ইউজারের কাছে ম্যাসেজ পাঠানো
- প্রোগ্রামে ম্যাসেজ পাইপ করা
- অন্য হোষ্টের syslog এ ম্যাসেজ প্রেরণ
লগার কম্যান্ড
লগার কম্যান্ডের ফরম্যাট হল,
logger [-i] [-f file] [-p priority] [-t tag] [message]...
এর প্যারামিটারগুলো এরকম,
প্যারামিটার
-f filename
-i
-p priority
-t tag
message
লগ রোটেশন
লগ রোটেশনের জন্য newsyslog বা logrotate টুল ব্যবহার করা যায়।
গুরুত্বপূর্ণ লগ লোকেশনঃ কিছু গুরুত্বপূর্ণ এপ্লিকেশন ও তাদের লগ ডিরেক্টরি নিচে দেয়া হল,
এপ্লিকেশন | ডিরেক্টরি |
httpd | /var/log/httpd |
samba | /var/log/samba |
cron | /var/log/ |
/var/log/ | |
mysql | /var/log/ |