Category Archives: Professional

নোড . জে এস । 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

ইউজার ডায়াগ্রাম প্রটোকল

রিদওয়ান বিন শামীম

 

টিসিপি/আইপি প্রটোকল স্যুইটের সরলতম ট্রান্সপোর্ট লেয়ার কমিউনিকেশন প্রটোকল হল ইউজার ডায়াগ্রাম প্রটোকল । এটিতে কম সংখ্যক যোগাযোগ কৌশল প্রয়োগ করা হয়। ইউজার ডায়াগ্রাম প্রটোকলকে অনির্ভরযোগ্য যোগাযোগ প্রটোকল বলা হলেও এটি আইপি সার্ভিস ব্যবহার করে যেটিতে সেরা সরবরাহ কৌশল ব্যবহৃত হয়।

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

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

 

ইউজার ডায়াগ্রাম প্রটোকলের বৈশিষ্ট্য

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

 

ইউজার ডায়াগ্রাম প্রটোকলের হিডার(header) চারটি মূল প্যারামিটার ব্যবহার করে,

  • সোর্স পোর্ট,
  • ডেসটিনেশন পোর্ট,
  • লেন্থ,
  • চেকসাম

 

যেসব এপ্লিকেশনে ডাটা ট্রান্সফারের জন্য ইউজার ডায়াগ্রাম প্রটোকল ব্যবহৃত হয়,

  • ডোমেইন নেম সার্ভিস,
  • সিম্পল নেটওয়ার্ক মেনেজমেন্ট প্রটোকল,
  • ট্রিভিয়াল ফাইল ট্রান্সফার প্রটোকল,
  • রাউটিং ইনফরমেশন প্রটোকল,
  • কার্বারোতে।

 

নোড.জেএস । Node.js – ইভেন্ট লুপ (Node.js – Event Loop)

রিদওয়ান বিন শামীম

 

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

ইভেন্টভিত্তিক প্রোগ্রামিং

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

ইভেন্টভিত্তিক এপ্লিকেশনে একটি মেইন লুপ থাকে যা ইভেন্টের সন্ধান করে, পাওয়া গেলে তাকে কলব্যাক ফাংশনের সাথে সমন্বয় করিয়ে দেয়।

Event Driven Programming

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

নড জেএসের অনেকগুলি বিল্ট ইন ইভেন্ট আছে যা 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!!!!!

 

 

নোড.জেএস – প্রথম এপ্লিকেশন (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/ ওপেন করে রেজাল্ট দেখব, ‘হ্যালো ওয়ার্ল্ড’ ।

Node.js server

অভিনন্দন! আমাদের প্রথম এইচটিটিপি সার্ভার তৈরি ও চালু হল যা port 8081 এর সকল এইচটিটিপি রিকোয়েস্টের সাড়া দেয়।

 

নোড.জেএস – এনপিএম (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

 

সবকিছু ঠিকঠাকভাবে সম্পন্ন হলে মডিউলটি পাবলিশ হয়ে যাবেএবং এনপিএমের মাধ্যমে ইন্সটলের যোগ্য হবে অন্যান্য নড জেএস মডিউলের মত।

 

নড.জেএস এর পরিবেশ তৈরি করা (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!


 

ইউনিক্সঃ সিস্টেম লগিং (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/
mail /var/log/
mysql /var/log/

 

ডট নেট নিউক ডিএনএন – ৬ (DNN 6 – Quick Start Guide)

রিদওয়ান বিন শামীম

 

ডটনেট নিউক ৬ ডেভেলপার কুইক স্টার্ট

ডটনেট নিউক ৬ ডেভেলপার কুইক স্টার্ট পেজ ডটনেট নিউক এক্সটেনশন ডেভেলপারদের সাহায্যার্থে ব্যবহৃত হতে পারে। স্কিন অবজেক্ট, মডিউল বা প্রভাইডার ডেভেলপমেন্টে নতুনরা মডিউল ডেভলাপমেন্ট পেজ দেখতে পারেন।

অ্যাজিউর উপযোগিতা

ডটনেট নিউক ৬এর সব সংস্করণ অ্যাজিউর ডেভলাপমেন্ট উপযোগী, যদিও সংশ্লিষ্ট কিছু কাজ করতে হয়।

কন্ট্রোল প্যানেল

রিবন বার নামক কন্ট্রোল প্যানেল যা ডটনেট নিউক ৫এ ছিল তা বর্তমান সংস্করণে আরও বেশি আপডেট করে আনা হয়েছে।

সিএসএসের গুরুত্বপূর্ণ নোট

নতুন ইউজার ইন্টারফেসের জন্য ডিফল্ট সিএসএস ফাইল গুরুত্বপূর্ণ স্টাইল ডেফিনেশন সংরক্ষণ করে। সংশ্লিষ্ট ফর্ম প্যাটার্ন ও জেকুয়েরি প্লাগিন ডিফল্ট সিএসএস ফাইলের উপর নির্ভর করে।

ডিডিআর মেনু

ডিডিআর মেনু একটি ডিফল্ট মেনু যা ফ্রেমওয়ার্কের সাথে আসে।

ডটনেট নিউক এক্সটেনশন ফিড

এটি ডটনেট নিউক ৬ এর নতুন সংযোজন।

ডিএসটি সাপোর্ট- টাইম জোনে নতুন সংস্করণ

এটি কোর ফ্রেমওয়ার্কে নতুন সংস্করণ।

ফোল্ডার প্রভাইডার এপিআই

ডটনেট নিউক ৬তে ফাইল ও ফোল্ডার ব্যবস্থাপনার জন্য দুটি নতুন এপিআই সংযোজিত হয়েছে , ফাইল ম্যানেজার ও ফোল্ডার ম্যানেজার।

ফর্ম প্যাটার্ন

ডটনেট নিউক ৬তে ইউজার ইন্টারফেসের আপডেট ফর্ম প্যাটার্ন সংশ্লিষ্ট।

জেড ইনডেক্স

  • মডেল পপ আপ 1000 থেকে বেশি
  • কন্ট্রোল প্যানেল 950 – 999
  • মডিউল একশন 900 – 949
  • বাকি সব কিছু 0 – 899
  • টেলিরিক কন্ট্রোল

আইকন এপিআই

ফ্রেমওয়ার্কের আইকনে প্রবেশ্যতা পেতে একটি ইউনিফাইড এপিআই ব্যবহারের ব্যবস্থা করা হয়েছে।

ওয়েব কন্ট্রোলের আইকন কী প্রপার্টি

ওয়েব কন্ট্রোলের কিছু নতুন আইকন কী প্রপার্টি থাকে ।

  • asp:Image
  • asp:ImageButton
  • asp:HyperLink
  • asp:HtmlImage
  • dnn:CommandButton
  • dnn:ImageCommandColumn
  • dnn:DnnGridButtonColumn
  • dnn:DnnImage
  • dnn:DnnImageButton

জেকুয়েরি ও জেকুয়েরি ইউআই

ডটনেট নিউক ৬ এর সব সংস্করণ জেকুয়েরি ও জেকুয়েরি ইউআই উপযোগী ও কোর এডমিন ও হোস্ট মডিউলের সব ইন্টারফেস দ্বারা ব্যবহৃত হয়।

লগ ফর নেট

ডটনেট নিউক ৬ ফ্রেমওয়ার্কের সব ভার্সনে লগ ফর নেট এসেম্বলি ( ভার্সন 1.2.10) সংযোজিত আছে।

মেনিফেস্ট আপডেট

আগের সংস্করণে এ সংক্রান্ত ফাইল ছিল কিন্তু এক্সটেনশন ডেভলপারদের জন্য কোনও অপশন বর্তমানে চালু নেই।

মডেল পপ আপ

ডটনেট নিউক ৬ তে মডেল পপ আপের সাপোর্ট সংযোজিত হয়েছে।

মডিউল একশন

বর্তমানে ডটনেট নিউক ৬ তে পূর্ববর্তী সংস্করণের মত মডিউল একশন প্রদর্শিত হয় না।

মডিউল ব্র্যান্ডিং

মডিউল ব্র্যান্ডিং ডেভেলপারদের এক্সটেনশন প্যাকেজের সাথে আইকন ব্যবহারের ব্যবস্থা করে দেয়।

মডিউল ক্যাটাগরাইজ করা

এটি হোস্ট ইউজারকে মডিউল ক্যাটাগরাইজ করতে সাহায্য করে যাতে কন্ট্রোল প্যানেলে মডিউলকে সহজে খুঁজে পাওয়া যায়।

নতুন মডিউল, টেলিরিক ও আপডেট করা মডিউল ও প্রভাইডার ডটনেট নিউক ৬ এর অন্যতম অনুষঙ্গ।

 

ডটনেট নিউককে আপগ্রেড করা (Upgrade DNN)

রিদওয়ান বিন শামীম

 

ডটনেট নিউককে আপগ্রেড করা মূলত একটি সরল প্রক্রিয়া। নতুন সংস্করণের ফাইল পুরনো ইন্সটল করা সংস্করণে নিয়মমত কপি করে এপ্লিকেশনকে আপগ্রেড করা সংক্রান্ত নির্দেশনা দিতে দেয়া হয়।

সবসময় ব্যাকআপ ঠিক রাখতে হবে।

  • ব্যাকআপের ভিত্তিতে ডুপ্লিকেট ওয়েব সাইট তৈরি করে আপগ্রেড করা যায়।
  • ওয়েবসাইটে আপগ্রেড পোর্টাল অ্যালি তৈরি করতে হয়,
  • ওয়েবসাইট ফাইল ব্যাকআপ করতে হয়,
  • ডাটাবেস ব্যাকআপ করতে হয়
  • এর সর্বশেষ সুস্থিত সংস্করণের ফাইল DotNetNuke_Community_XX.XX.XX.UPGRADE.zip
  • ডাউনলোড করতে হয়,
  • ওয়েব সার্ভারের নিউ ফোল্ডার পাথে ব্যাকআপ ওয়েবসাইট পুনরায় স্থাপন করতে হয়,
  • হোস্ট হিডারের সাথে আইআইএস কনফিগার করা,
  • ফাইল সিস্টেমের সেটআপ পারমিশন,
  • নতুন ডাটাবেস নামে ডাটাবেস রিস্টোর করানো,
  • নতুন ওয়েবসাইটের web.configমডিফাই করা
  • অটো আপগ্রেড ফলসে সেট করা,
  • আপগ্রেড প্যাকেজের উপাদানকে কম্পিউটারের কোনও ফোল্ডারে কপি করা,সরাসরি ওয়েবসাইটে কপি করা ঠিক নাও হতে পারে।
  • এরপর আপগ্রেড প্যাকেজের উপাদানকে ওয়েবসাইটে কপি করা
  • ওয়েব ব্রাউজারের মাধ্যমে নতুন ওয়েবসাইটে প্রবেশ করা, ইউআরএলকে http://MYWEBSITE/install/install.aspx?mode=upgrade
  • তে পরিবর্তন করে নিতে হয়।
  • আপগ্রেড করার পর আইআইএসে থেকে নতুন ওয়েবসাইট সেটিং পরিবর্তন করা যায়।

মনে রাখা দরকার, যদি default.css, portal.css বা menu.css পরিবর্তন করে সাইট আপগ্রেড করা হয় তবে আপগ্রেড প্যাকেজ কপির পরে এসব ফাইলকে ওয়েবসাইটের ফোল্ডারে কপি করতে হবে।

এডভান্সড কিছু কৌশল

ডাটাবেস ও ওয়েবসাইটের সম্পূর্ণ ব্যাকআপ ছাড়া আপগ্রেড প্রক্রিয়া চালানো ঠিক নয়। এডভান্সড কৌশলের সাথে সংশ্লিষ্ট কিছু বিষয় হল,

APP_OFFLINE.HTM
SQL BACKUP TO APP_DATA
IN-PLACE UPGRADES
IIS ROOT FOLDER

আপগ্রেড সংক্রান্ত কিছু ভিডিও,

A Simple way to Upgrade DotNetNuke
Upgrading Via FTP
Upgrading DotNetNuke on WebMatrix
Customizing the App_Offline.htm File

ডটনেট নিউকের ইন্সটলেশন (Install DNN. Install Dot Net Nuke)

রিদওয়ান বিন শামীম

 

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

ডটনেট নিউকের ইন্সটলেশন রিকয়ারমেন্টঃ ডটনেট নিউক ৭ প্রকাশের সাথে এর সিস্টেম রিকয়ারমেন্ট বৃদ্ধি পেয়েছে। রিকয়ারমেন্ট বৃদ্ধির অফিশিয়াল লিস্ট দেখতে সিস্টেম রিকয়ারমেন্ট পেজ দেখা যেতে পারে।

ডটনেট নিউক ইন্সটলেশন সিনারিও

ইউজার ইন্সটেনস ডাটাবেসসহ এসকিউএল সার্ভার ২০০৫/২০০৮/২০০৮ ২য়/২০১২ ব্যবহার করে ইন্সটলেশনের জন্য ডটনেট নিউকের সর্বশেষ ভার্সন ডাউনলোড করে নিতে হয়। জিপ প্যাকেজ এক্সট্র্যাক্ট করে নিতে হয় কম্পিউটারে, c:\inetpub\wwwroot\ folder তে একটি ডিরেক্টরি তৈরি করতে হয় DotNetNuke নামে, যা দেখতে হবে c:\inetpub\wwwroot\dotnetnuke\ এমন। এই ফোল্ডারে জিপ কন্টেন্টগুলো কপি করে c:\inetpub\wwwroot\dotnetnuke\ folder এর প্রপার্টিজে গিয়ে সিকিউরিটি ট্যাবে ঢুকতে হবে। ইউজারের পারমিশন নিশ্চিত করা থাকতে হবে। ওয়েব সার্ভার আইআইএস কনসোল খুলতে হবে, (start->run->INETMGR)। ওয়েবসাইট নড ও ডিফল্ট ওয়েবসাইট নড এক্সপান্ড করতে হবে। ইন্সটলেশন উইজারডের ধাপগুলো পার হতে হবে। ডাটাবেস স্ক্রিনের জন্য কোনও কিছু কনফিগার করার দরকার নেই। এসব সম্পন্ন হলে হোমপেজে ডিফল্ট লগইন একাউন্ট দেখাবে।

এটাচড ডাটাবেসসহ এসকিউএল সার্ভারে ইন্সটলেশনের জন্য এসকিউএল ম্যানেজমেন্ট স্টুডিয়ো (২০০৫/২০০৮/২০০৮২য়/২০১২) ওপেন করে ডাটাবেস সার্ভারের সাথে (লোকাল সার্ভারও হতে পারে)কানেক্ট করাতে হয়। এরপর এসকিউএল ইউজার একাউন্ট ও সিকিউরিটি কনফিগার করতে হবে। http://localhost/dotnetnuke ব্যবহার করে ওয়েবসাইট ব্রাউজ করতে হবে, টিপিকাল বা কাস্টম অপশন ব্যবহার করে ইন্সটলেশন উইজার্ডের ধাপগুলো পার হতে হয়। ডাটাবেস কানেকশন চেক করে দেখতে হয় ঠিকমত কাজ করছে কিনা। হোস্ট ও এডমিনের একাউন্ট কনফিগার করতে ইন্সটলেশন উইজারডের রিমাইন্ডার অতিক্রম করতে হয়।

ভিডিও রিসোর্স

ডটনেট নিউক কর্পোরেশনের ভিডিও টিউটোরিয়াল আছে,

Installing DotNetNuke video available in the video library
Installing DotNetNuke with the Microsoft platform installer

ইউনিক্সঃ সেল গুরুত্বপূর্ণ রিসোর্স (Unix – Shell Useful Resources)

রিদওয়ান বিন শামীম

 

ইউনিক্স সেলের গুরুত্বপূর্ণ রিসোর্স

  • বেল ল্যাবঃ ইউনিক্স অপারেটিং সিস্টেমের সূতিকাগার, ইউনিক্স অপারেটিং সিস্টেমের সারসংক্ষেপ ,ইতিহাস ও বর্ণনা এখানে পাওয়া যাবে।
  • বিডিএস ইউনিক্সঃ বর্তমান সময়ের সার্ভার, কম্পিউটার ও সংশ্লিষ্ট সিস্টেমের জন্য FreeBSD একটি ভাল অপারেটিং সিস্টেম।
  • লিনাক্স অনলাইনঃ লিনাক্স ইউনিক্স টাইপ ফ্রী একটি প্লাটফর্ম।
  • Unix @ Wikipedia : ইউনিক্স অপারেটিং সিস্টেমের সংক্ষিপ্ত বিবরণের জন্য।
  • The Unix Forums : ইউনিক্সপ্রিয় প্রোগ্রামারদের ফোরাম।

 

ইউনিক্সের উপর কিছু বই

http://www.amazon.com/exec/obidos/ASIN/0131480057/httpwwwtuto0a-20

http://www.amazon.com/exec/obidos/ASIN/0596009658/httpwwwtuto0a-20

http://www.amazon.com/exec/obidos/ASIN/0596005954/httpwwwtuto0a-20

http://www.amazon.com/exec/obidos/ASIN/0130424110/httpwwwtuto0a-20

http://www.amazon.com/exec/obidos/ASIN/0672324903/httpwwwtuto0a-20

http://www.amazon.com/exec/obidos/ASIN/0201877589/httpwwwtuto0a-20

 

ইউনিক্স, লিনাক্স সিস্টেম কল এর তালিকা (List of Unix, Linux System Calls)

ইউনিক্স, লিনাক্স সিস্টেম কল এর তালিকা

accept
access
acct
add_key
adjtimex
afs_syscall
alarm
alloc_hugepages
arch_prctl
bdflush
bind
break
brk
cacheflush
chdir
chmod
chown
chroot
clone2
clone
close
connect
create_module
creat
dup2
dup
epoll_create
epoll_ctl
epoll_wait
execve
exit_group
_exit
exit
_Exit
faccessat
fattch
fchdir
fchmodat
fchmod
fchownat
fchown
fcntl
fdatasync
fdetach
flock
fork
free_hugepages
fstatat
fstatfs
fstat
fstatvfs
fsync
ftruncate
futex
futimesat
getcontext
getcwd
getdents
getdomainname
getdtablesize
getegid
geteuid
getgid
getgroups
gethostid
gethostname
getitimer
get_kernel_syms
get_mempolicy
getmsg
getpagesize
getpeername
getpgid
getpgrp
getpid
getpmsg
getppid
getpriority
getresgid
getresuid
getrlimit
get_robust_list
getrusage
getsid
getsockname
getsockopt
get_thread_area
gettid
gettimeofday
getuid
getunwind
gtty
idle
inb
inb_p
init_module
inl
inl_p
inotify_add_watch
inotify_init
inotify_rm_watch
insb
insl
insw
intro
inw
inw_p
io_cancel
ioctl
ioctl_list
io_destroy
io_getevents
ioperm
iopl
ioprio_get
ioprio_set
io_setup
io_submit
ipc
isastream
kexec_load
keyctl
kill
killpg
lchown
linkat
link
listen
_llseek
llseek
lock
lookup_dcookie
lseek
lstat
madvise
mincore
mkdirat
mkdir
mknodat
mknod
mlockall
mlock
mmap2
mmap
modify_ldt
mount
move_pages
mprotect
mpx
mq_getsetattr
mremap
msgctl
msgget
msgop
msgrcv
msgsnd
msync
multiplexer
munlockall
munlock
munmap
nanosleep
_newselect
nfsservctl
nice
obsolete
oldfstat
oldlstat
oldolduname
oldstat
olduname
openat
open
outb
outb_p
outl
outl_p
outsb
outsl
outsw
outw
outw_p
path_resolution
pause
perfmonctl
personality
pipe
pivot_root
poll
posix_fadvise
ppoll
prctl
pread
prof
pselect
ptrace
putmsg
putpmsg
pwrite
query_module
quotactl
readahead
readdir
read
readlinkat
readlink
readv
reboot
recvfrom
recv
recvmsg
remap_file_pages
renameat
rename
request_key
restart_syscall
rmdir
rtas
rt_sigaction
rt_sigpending
rt_sigprocmask
rt_sigqueueinfo
rt_sigreturn
rt_sigsuspend
rt_sigtimedwait
sbrk
sched_getaffinity
sched_getparam
sched_get_priority_max
sched_get_priority_min
sched_getscheduler
sched_rr_get_interval
sched_setaffinity
sched_setparam
sched_setscheduler
sched_yield
security
select
select_tut
semctl
semget
semop
semtimedop
sendfile
send
sendmsg
sendto
setcontext
setdomainname
setegid
seteuid
setfsgid
setfsuid
setgid
setgroups
sethostid
sethostname
setitimer
setpgid
setpgrp
setpriority
setregid
setresgid
setresuid
setreuid
setrlimit
set_robust_list
setsid
setsockopt
set_thread_area
set_tid_address
settimeofday
setuid
setup
sgetmask
shmat
shmctl
shmdt
shmget
shmop
shutdown
sigaction
sigaltstack
signal
sigpending
sigprocmask
sigqueue
sigreturn
sigsuspend
sigtimedwait
sigwaitinfo
socketcall
socket
socketpair
splice
spu_create
spufs
spu_run
ssetmask
statfs64
statfs
stat
statvfs
stime
stty
swapcontext
swapoff
swapon
symlinkat
symlink
sync_file_range
sync
_syscall
syscall
syscalls
_sysctl
sysctl
sysfs
sysinfo
syslog
tee
tgkill
time
timer_create
timer_delete
timer_getoverrun
timer_gettime
timer_settime
times
tkill
truncate
tux
umask
umount2
umount
uname
undocumented
unimplemented
unlinkat
unlink
unshare
uselib
ustat
utime
utimes
vfork
vhangup
vm86
vm86old
vmsplice
vserver
wait3
wait4
wait
waitid
waitpid
write
writev

ইউনিক্সঃ সেল বিল্টইন গাণিতিক ফাংশন (Unix – Shell Builtin Mathematical Functions)

রিদওয়ান বিন শামীম

 

আমাদের টিউটোরিয়ালের বেশিরভাগ অংশে বর্ন সেল নিয়ে কাজ করা হয়েছে কিন্তু আজ এখানে আমরা কর্ন সেলের বিল্টইন গাণিতিক ফাংশনগুলো দেখব।

কর্ন সেল গাণিতিক ফাংশনের আদর্শ সেটে প্রবেশযোগ্যতা সৃষ্টি করে, সি ফাংশন কল সিনট্যাক্স ব্যবহার করে এদের কল করা হয়।

ফাংশন বর্ণনা
abs আদর্শ মান
log ন্যাচারাল লগারিদম
acos আর্ক কোসাইন
sin সাইন
asin আর্ক সাইন
sinh হাইপারবোলিক সাইন
cos কোসাইন
sqrt স্কয়ার রুট
cosh হাইপারবোলিক কোসাইন
tan টেনজেন্ট
exp এক্সপোনেন্সিয়াল ফাংশন
tanh হাইপারবোলিক টেনজেন্ট
int ফ্লোটিং পয়েন্ট নাম্বারের পূর্ণসংখ্যা অংশ

 

 

ইউনিক্স কুইক গাইড (Unix – Quick Guide)

রিদওয়ান বিন শামীম

 

ইউনিক্স কি

ইউনিক্স অপারেটিং সিস্টেম হল প্রোগ্রামের একটি সেট যা কম্পিউটার ও ব্যবহারকারীর মধ্যে লিঙ্ক হিসেবে কাজ করে।

  • ১৯৬৯ সালে এটিএন্ডটি কর্মীদের দ্বারা বেল ল্যাবরেটরিতে প্রথম ইউনিক্স ডেভেলাপ করা হয়,
  • ইউনিক্সের বিভিন্ন ভার্সন পাওয়া যায়, Solaris Unix, AIX, HP Unix এবং BSD সহ লিনাক্সও অনেকটা ইউনিক্সের মত, যেটি ফ্রী ওএস।
  • ইউনিক্স কম্পিউটার একসাথে কয়েকজন ব্যবহারকারী ব্যবহার করতে পারেন।
  • ইউনিক্স কম্পিউটারে একজন ব্যবহারকারী একসাথে কয়েকটি প্রোগ্রাম চালু রাখতে পারেন।

 

লগইন

login কম্যান্ড দিয়ে আমরা সিস্টেমে লগইন করতে পারি,


login : amrood
amrood's password:
Last login: Sun Jun 14 09:32:32 2009 from 62.61.164.73
$

 

লগআউটের জন্য

কম্যান্ড প্রম্পটে logout কম্যান্ড টাইপ করলে সিস্টেম সবকিছু পরিষ্কার করে যোগাযোগ বিচ্ছিন্ন করে দেবে।

 

ফাইল ব্যবস্থাপনা

ইউনিক্সে তিন ধরণের ফাইল আছে,

  • সাধারণ ফাইল,
  • ডিরেক্টরি,
  • স্পেশাল ফাইল।

 

ফাইলনেমের সাবস্টিটিউশন

কম্যান্ড
ls -[l]
ls -[l]a
~
~user
?
*

 

ফাইলনেমের মেনিপুলেশন

কম্যান্ড
cat filename
cp source destination
mv oldname newname
rm filename
chmod nnn filename
touch filename
ln [-s] oldname newname
ls -F

 

ডিরেক্টরি ম্যানেজমেন্ট

কম্যান্ড
mkdir dirname
rmdir dirname
cd dirname
cd -
cd ~
pwd

 

এনভায়রনমেন্ট সেটআপ

PS1ও PS2 চলক, এস্কেপ ক্যারেক্টার ও এনভায়রনমেন্ট চলক নিয়ে এনভায়রনমেন্ট সেটআপ গঠিত হয়।

এস্কেপ ক্যারেক্টারের সিকোয়েন্স,

 

এস্কেপ সিকোয়েন্স
\t
\d
\n
\s
\W
\w
\u
\h
\#
\$

 

এনভায়রনমেন্ট চলক

চলক
DISPLAY
HOME
IFS
LANG
LD_LIBRARY_PATH
PATH
PWD
RANDOM
SHLVL
TERM
TZ
UID

 

ফিল্টার ও পাইপ

কম্যান্ড
wc [-l]
tail [-n]
sort [-n]
pr -t
grep "pattern" filename
pg or more

 

স্পেশাল চলক

চলক
$0
$n
$#
$*
$@
$?
$$
$!

 

সেল বেসিক অপারেটর

সেল বেসিক অপারেটরঃ তিন ধরণের হয়,

  • এরিথমেটিক অপারেটর,
  • রিলেসনাল অপারেটর,
  • বুলিয়েন অপারেটর

 

এরিথমেটিক অপারেটর

অপারেটর
+
-
*
/
%
=
==
!=

 

রিলেসনাল অপারেটর

অপারেটর
-eq
-ne
-gt
-lt
-ge
-le

 

বুলিয়েন অপারেটর

অপারেটর
!
-o
-a

 

স্ট্রিং অপারেটর

অপারেটর
=
!=
-z
-n
str

 

ফাইল টেস্ট অপারেটর

অপারেটর
-b file
-c file
-d file
-f file
-g file
-k file
-p file
-t file
-u file
-r file
-w file
-x file
-s file
-e file

 

সেল ডিসিশন মেকিং

if...fi বিবৃতি


if [ expression ]
then
   Statement(s) to be executed if expression is true
fi

 

if...else...fi বিবৃতি


if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi

 

if...elif...fi বিবৃতি


if [ expression 1 ]
then
   Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
   Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
   Statement(s) to be executed if expression 3 is true
else
   Statement(s) to be executed if no expression is true
fi

 

case...esac বিবৃতি


case word in
  pattern1)
     Statement(s) to be executed if pattern1 matches
     ;;
  pattern2)
     Statement(s) to be executed if pattern2 matches
     ;;
  pattern3)
     Statement(s) to be executed if pattern3 matches
     ;;
esac

 

সেল লুপ টাইপ

while লুপ


while command
do
   Statement(s) to be executed if command is true
done

 

for লুপ


for var in word1 word2 ... wordN
do
   Statement(s) to be executed for every word.
done

 

until লুপ


until command
do
   Statement(s) to be executed until command is true
done

 

select লুপ


select var in word1 word2 ... wordN
do
   Statement(s) to be executed for every word.
done

 

 

সেল লুপ কন্ট্রোল

ব্রেক স্টেটমেন্টের জন্য


break[n]

 

আর কন্টিনিউ স্টেটমেন্টের জন্য


continue[n]

 

সেল সাবস্টিটিউশনের জন্য

কম্যান্ড সাবস্টিটিউশন


`command`

 

আর সম্ভাব্য চলক সাবস্টিটিউশন

সাবস্টিটিউশন ফর্ম
${var}
${var:-word}
${var:=word}
${var:?message}
${var:+word}

 

রিডাইরেকশন কম্যান্ড

কম্যান্ড
pgm > file
pgm < file
pgm >> file
n > file
n >> file
n >& m
n <& m
<< tag
|

 

ইউনিক্স – কিছু প্রয়োজনীয় কমান্ড (Unix – Useful Commands)

রিদওয়ান বিন শামীম

 

এই কুইক গাইডে কম্যান্ড, সিনট্যাক্স ও সংক্ষিপ্ত বিবরণ তুলে ধরা হবে,এরচেয়ে বিস্তারিত জানতে হলে যে কম্যান্ড ব্যবহার করতে হবে তা হল,


$man command

 

যাই হোক, এখানে কুইক গাইডটি দেয়া হল।

ফাইল এবং ডিরেক্টরির জন্য

ডিরেক্টরি তৈরি ও ফাইল নিয়ন্ত্রণ করার জন্য যেসব কম্যান্ড ব্যবহার করা হয় তা হল,

 

কম্যান্ড বর্ণনা
cat ফাইল কন্টেন্ট প্রদর্শন করে
cd ডিরেক্টরিকে dirname তে রূপান্তরিত করে
chgrp ফাইল গ্রুপ পরিবর্তন করে
chmod পারমিশন পরিবর্তন করে
cp সোর্স ফাইলকে গন্তব্যে কপি করে
file ফাইল টাইপ নির্ধারণ করে
find ফাইল খোঁজে
grep বরাবরের ভুমিকার জন্য ফাইল খোঁজে
head প্রথম কিছু লাইনকে একটি ফাইলে দেখায়
ln পুরনো নামে সফট লিঙ্ক তৈরি করে
ls ফাইল টাইপ সম্পর্কিত তথ্য প্রদর্শন করে
mkdir Dirname শ্রেণীর নতুন ডিরেক্টরি তৈরি করে
more paginated ফর্মে ডাটা প্রদর্শন করে
mv oldname কে newnameএ রূপান্তরিত করে
pwd কারেন্ট ওয়ারকিং ডিরেক্টরিকে প্রিন্ট করে
rm ফাইলনেম রিমুভ করে
rmdir শূন্য ডিরেক্টরি মুছে ফেলে .
tail ফাইলের শেষ কিছু লাইন মুছে ফেলে
touch কোনও ফাইলের এক্সেস ও মডিফিকেশন টাইম আপডেট করে .

 

ডাটাকে নিপুনভাবে ব্যবহার করার জন্য

 

কম্যান্ড বর্ণনা
awk প্যাটার্ন স্ক্যান ও ভাষা প্রক্রিয়া করণ
cmp দুই ফাইলের উপাদান তুলনা করা
comm সর্টেড ডাটা তুলনা করা
cut কোনও ফাইলের প্রতি লাইনের নির্ধারিত অংশ কেটে ফেলা
diff ডিফারেন্সিয়াল ফাইল কম্পারেটর
expand ট্যাবকে স্পেসে ছড়িয়ে দেয়া
join ফাইলকে কোনও কমন ফিল্ডে সংযুক্ত করা
perl ডাটা মেনিপুলেশন ল্যাঙ্গুয়েজ
sed স্ট্রিম টেক্সট এডিটর
sort সর্ট ফাইল ডাটা
split ফাইলকে ছোট ফাইলে বিভক্ত করা
tr ক্যারেক্টারকে অনুবাদ করা
uniq ফাইলের ভেতরের পুনরাবৃত্তি হওয়া লাইন রিপোর্ট করা
wc শব্দ, লাইন ও ক্যারেকটার গোনা
vi ভিআই টেক্সট এডিটর ওপেন করা
vim ভিআইএম টেক্সট এডিটর ওপেন করা
fmt সিম্পল টেক্সট ফরমেটর
spell ভুল বানানের সন্ধান করা
ispell ভুল বানানের সন্ধান করা
ispell ভুল বানানের সন্ধান করা
emacs GNU প্রকল্প Emacs
ex, edit লাইন এডিটর
emacs GNU প্রকল্প Emacs
emacs GNU প্রকল্প Emacs

 

কম্প্রেসড ফাইল

জায়গা বাঁচানোর জন্য ফাইলকে কম্প্রেস করা হতে পারে। কম্প্রেসড ফাইল তৈরি ও নিরীক্ষণের জন্য কোডঃ

 

কম্যান্ড বর্ণনা
compress ফাইলকে কম্প্রেস করা
gunzip জিপ ফাইলকে আনকম্প্রেস করা
gzip GNU বিকল্প কম্প্রেসন পদ্ধতি
uncompress ফাইল আনকম্প্রেস করা
unzip জিপ আর্কাইভে কম্প্রেসড ফাইলকে লিস্ট, টেস্ট ও এক্সট্রাক্ট করা
zcat কম্প্রেসড ফাইলকে ক্যাটাগরিতে আবদ্ধ করা
zcmp কম্প্রেসড ফাইল তুলনা করা
zdiff কম্প্রেসড ফাইল তুলনা করা
zmore কমপ্রেসড টেক্সটের crt এর জন্য File perusal filter

 

তথ্য পাওয়ার জন্য

 

কম্যান্ড বর্ণনা
apropos কিওয়ার্ডের মাধ্যমে কম্যান্ড নির্ধারণ
info কম্যান্ড ইনফরমেশন পেজকে অনলাইনে দেখানো
man ম্যানুয়াল পেজকে অনলাইনে দেখানো
whatis সম্পূর্ণ শব্দের জন্য whatis ডাটাবেসে সন্ধান
yelp GNOME হেল্প ভিউয়ার

 

নেটওয়ার্ক কমুনিকেশন

লোকাল ইউনিক্স হোষ্ট থেকে কোনও ফাইল প্রেরণ বা গ্রহণের জন্য যেসব কম্যান্ড ব্যবহৃত হয় সেগুলো হল,

 

কম্যান্ড বর্ণনা
ftp ফাইল ট্রান্সফার প্রোগ্রাম
rcp রিমোট ফাইল কপি
rlogin UNIX hostএ রিমোট লগইন
rsh রিমোট সেল
tftp ট্রিভিয়াল ফাইল ট্রান্সফার প্রোগ্রাম
telnet অন্য হোষ্টের সাথে টার্মিনাল যোগাযোগ স্থাপন করা
ssh সেল টার্মিনাল বা কম্যান্ড কানেকশন নিরাপদ করা
scp সেল রিমোট ফাইল কপি নিরাপদ করা
sftp সেল ফাইল ট্রান্সফার প্রোগ্রামকে নিরাপদ করা

 

নিরাপত্তার কারণে কিছু কিছু কম্পিউটারে কিছু কম্যান্ড রহিত থাকতে পারে।

 

ব্যবহারকারীদের মধ্যে ম্যাসেজ

 

কম্যান্ড বর্ণনা
evolution লিনাক্সে GUI মেইল হ্যান্ডেলিনের টুল
mail মেইল প্রেরন ও পঠন প্রোগ্রাম
mesg ম্যাসেজ অনুমোদন বা বাতিলের প্রোগ্রাম
parcel অন্য ব্যবহারকারীর কাছে ফাইল প্রেরণের প্রোগ্রাম
pine Vdu-ভিত্তিক মেইল সুবিধা
talk অন্য ব্যবহারকারীর সাথে কথা বলা
write অন্য ব্যবহারকারীর কাছে ম্যাসেজ লিখা

 

প্রোগ্রামিং সম্পর্কিত কম্যান্ড

 

কম্যান্ড বর্ণনা
dbx Sun debugger
gdb GNU debugger
make প্রোগ্রাম গ্রুপ নিয়ন্ত্রণ ও সমন্বয়
nm প্রোগ্রামের নামের লিস্ট করা
size প্রোগ্রামের আকার মুদ্রিত করা
strip symbol table মুছা ও bits কে সজ্জিত করা
cb C program সজ্জিতকরন
cc SPARCসিস্টেমের জন্য ANSI C compiler
ctrace C program debugger
gcc GNU ANSI C Compiler
indent C program source ইন্ডেন্ট ও ফরম্যাট করা
bc Interactive arithmetic language processor
gcl GNU Common Lisp
perl General purpose language
php Web page embedded language
py Python language interpreter
asp Web page embedded language
CC C++ compiler for Suns SPARC systems
g++ GNU C++ Compiler
javac JAVA compiler
appletvieweir JAVA applet viewer
netbeans লিনাক্সে জাভা ভিত্তিক উন্নয়ন পরিবেশ তৈরি
sqlplus Oracle SQL interpreter রান করানো
sqlldr Oracle SQL data loader রান করানো
mysql mysql SQL interpreter রান করানো

 

Misc কম্যান্ড

এটি সিস্টেমের তথ্যকে তালিকাবদ্ধ বা অলটার করে,

কম্যান্ড বর্ণনা
chfn আঙ্গুল সঞ্চালনের তথ্য পরিবর্তন
chgrp ফাইলের গ্রুপ ওউনারশিপ তথ্য পরিবর্তন
chown ওউনার পরিবর্তন
date তারিখ মুদ্রণ
determin স্বয়ংক্রিয়ভাবে টার্মিনাল টাইপ খুঁজে পাওয়া
du ডিস্ক ইউসেজ মুদ্রণ
echo আদর্শ প্রকরণের Echo arguments
exit সিস্টেম থামিয়ে দেয়া
finger logged-in users এর তথ্য মুদ্রণ
groupadd user group তৈরি করা
groups group memberships প্রদর্শন করা
homequota quota এবং file usage মুদ্রণ
iostat I/O statistics রিপোর্ট করা
kill প্রক্রিয়ার সিগন্যাল প্রেরণ করা
last সর্বশেষ লগইন তথ্য
logout ইউনিক্স থেকে বেরিয়ে যাওয়া
lun নাম বা লগইন আইডি তালিকা করা
netstat নেটওয়ার্ক স্ট্যাটাস দেখানো
passwd ইউজার পাসওয়ার্ড পরিবর্তন
passwd লগইন পাসওয়ার্ড পরিবর্তন
printenv সেল চলকের মান প্রদর্শন
ps চলতি প্রক্রিয়ার স্ট্যাটাস দেখানো
ps চলতি প্রক্রিয়ার স্ট্যাটাস মুদ্রণ
quota -v ডিস্ক ইউসেজ ও সীমাবদ্ধতা প্রদর্শন
reset টার্মিনাল মোড রিসেট করা
script টার্মিনাল সেশনের স্ক্রিপ্ট রাখা
script কম্যান্ড বা প্রসেসের আউটপুট সংরক্ষণ
setenv পরিবেশগত চলক সেট করা
stty টার্মিনাল অপশন সেট করা
time কম্যান্ডের সময়
top সিস্টেম প্রসেস প্রদর্শন
tset টার্মিনাল মোড সেট করা
tty কারেন্ট টার্মিনাল নেম মুদ্রণ
umask সরাসরি দৃশ্যমান ফাইলের অনুমতি প্রদান
uname কারেন্ট সিস্টেমের নাম প্রদর্শন
uptime সিস্টেমকে আপটাইম করা
useradd ইউজার একাউন্ট করা
users লগইনকৃত ইউজারদের নাম মুদ্রিত করা
vmstat ভারচুয়াল মেমরির পরিসংখ্যান বিন্যাস করা
w লগইনকৃত ইউজারদের কর্মকাণ্ড প্রদর্শন
who লগইনকৃত ইউজারদের তালিকা করা

 

ইউনিক্সঃ সিগন্যাল ও ট্র্যাপ (Unix – Signals and Traps)

রিদওয়ান বিন শামীম

 

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

 

সিগন্যালের নাম সিগন্যাল নাম্বার বিবরণ
SIGHUP 1 টার্মিনালে সমস্যা বা প্রক্রিয়ার সমাপ্তি
SIGINT 2 ইউজার ইন্টারাপ্ট ম্যাসেজ পাঠালে (Ctrl + C).
SIGQUIT 3 ইউজার সমাপ্তি ম্যাসেজ পাঠালে (Ctrl + D).
SIGFPE 8 ভুল গাণিতিক প্রচেষ্টা হলে
SIGKILL 9 প্রক্রিয়া সমাপ্তি ও কোনও ধরণের পরিষ্কার বা ক্লিনআপ বন্ধ
SIGALRM 14 এলারম ক্লক সিগন্যাল
SIGTERM 15 সফটওয়ার টারমিনেশন সিগন্যাল

 

সিগন্যালের তালিকা

kill -l কম্যান্ডের মাধ্যমে সাপোর্টেড সব সিগন্যাল তালিকাবদ্ধভাবে আমরা দেখতে পারি।


$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

সিগন্যালের মূল তালিকা সোলারিস, এইচপি –ইউএক্স ও লিনাক্সের মধ্যে কিছু ব্যতিক্রম হয়।

 

ডিফল্ট একশন

সিগন্যালের ডিফল্ট কিছু একশন হল,

  • প্রক্রিয়া টারমিনেট করে,
  • সিগন্যাল অগ্রাহ্য করে,
  • প্রক্রিয়ায় মেমোরি ইমেজ সমৃদ্ধ কোর ফাইল তৈরি করে,
  • প্রক্রিয়া থামায়,
  • থামানো প্রক্রিয়া চালু করে।

 

সিগন্যাল প্রেরণ করা

স্ক্রিপ্ট লেখার সময় CONTROL-C অথবা INTERRUPT কী চাপা সিগন্যাল প্রেরণের কমন উপায়, এছাড়াও kill কম্যান্ড ব্যবহার করে এটি করা যায়,


$ kill -signal pid

 

এখানে সিগন্যাল হয় নাম অথবা নাম্বার(সিগন্যালের) আর pid হল প্রসেস আইডি যাতে সিগন্যাল পাঠানো হবে।


$ kill -1 1001

 

process ID 1001 তে প্রক্রিয়াধীন ক্ষেত্রে kill signal পাঠাতে কম্যান্ড,


$ kill -9 1001

 

সিগন্যাল ট্র্যাপ করা

ট্র্যাপ কম্যান্ডের জন্য যে সিনট্যাক্স ব্যবহার করা যায় তা হল,


$ trap commands signals

 

সেল স্ক্রিপ্টে ট্র্যাপের ব্যবহার হয় এসব কারণে-

  • টেম্পোরারি ফাইল ক্লিনআপে
  • সিগন্যাল ইগনোর করতে

 

টেম্পোরারি ফাইল ক্লিনআপ করা

কিছু ফাইল রিমোভ করে এক্সিট করতে নিচের কম্যান্ড ব্যবহার করতে পারি,


$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2

 

স্পেসিফাইড ফাইল মুছার জন্য ট্র্যাপ মডিফাই করতে সিগন্যাল লিস্টে সিগন্যাল নাম্বার 1 যোগ করতে পারি,


$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2

 

সিগন্যাল এক ও দুই রিসিভ করার ক্ষেত্রে সাবস্টিটিউশন ঘটাতে চাইলে কম্যান্ডকে সিঙ্গেল কোটের মধ্যে লিখতে পারি,


$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2

 

সিগন্যাল ইগনোর করতে

রিসিভের সময় সিগন্যাল ইগনোর করতে কম্যান্ড,


$ trap '' 2

 

মাল্টিপল সিগন্যাল ইগনোর করতে,


$ trap '' 1 2 3 15

 

প্রথম আর্গুমেন্টকে সিগন্যালের জন্য স্পেসিফাইড হতে হবে, যার নিজস্ব মানে থাকতে হবে,


$ trap 2

 

ট্র্যাপ রিসেট করতে কম্যান্ড ব্যবহার করা যায়,


$ trap 1 2

যা কিনা প্রথম আর্গুমেন্টের উপর ভিত্তি করে করতে হবে।

 

ইউনিক্সঃ সিস্টেম লগিং (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/
mail /var/log/
mysql /var/log/

 

ইউনিক্সঃ সিস্টেম পারফর্মেন্স (Unix – System Performance)

রিদওয়ান বিন শামীম

 

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

ইউনিক্সে কিছু গুরুত্বপূর্ণ রিসোর্স আছে যাদেরকে পর্যবেক্ষণ করা ও নিয়ন্ত্রণে রাখা জরুরী।

  • সিপিইউ
  • মেমোরি
  • ডিস্ক স্পেস
  • কমুনিকেশন্স লাইন
  • আই/ও টাইম
  • নেটওয়ার্ক টাইম
  • এপ্লিকেশন প্রোগ্রামস

পারফরমেন্সের উপাদান

পাঁচটি প্রধান উপাদান পারফরমেন্সে অবদান রাখে,

উপাদান বর্ণনা
User state CPU ইউজার স্টেটে সিপিইউ দ্বারা ব্যয়িত মত সময়। লাইব্রেরী সেলে ব্যয়িত সময় এর অন্তর্ভুক্ত কিন্তু কার্নেল বিষয়ক সময় এর অন্তর্ভুক্ত নয়
System state CPU সিস্টেম স্টেটে সিপিইউ দ্বারা ব্যয়িত মত সময়।
I/O Time and Network Time I/O requests ও ডাটা স্থানান্তরের জন্য ব্যয়িত সময়
Virtual Memory Performance কনট্যাক্স switching ও swapping এর অন্তর্গত।
Application Program অন্য প্রোগ্রাম চলার জন্য ব্যয়িত সময় – যখন সিস্টেম এপ্লিকেশনকে সময় দিচ্ছে না, সিপিইউ অন্য কোনও এপ্লিকেশনের জন্য বরাদ্দ আছে।

 

পারফরমেন্স টুল

 

কম্যান্ড বর্ণনা
nice/renice পরিবর্তিত প্রাধান্যসহ প্রোগ্রাম চালনা করা
netstat নেটওয়ার্ক কানেকশন, রাউটিং টেবিল, ইন্টারফেস পরিসংখ্যান, মাল্টিকাস্ট মেম্বারশিপ মুদ্রিত করা
time কম্যান্ড ও সিম্পল রিসোর্স টাইম
uptime সিস্টেম লোড এভারেজ
ps সাম্প্রতিক প্রক্রিয়ার স্নেপশট রিপোর্ট
vmstat ভার্চুয়াল মেমোরি পরিসংখ্যানের রিপোর্ট
gprof কল গ্রাফ প্রোফাইলের ডাটা প্রদর্শন
prof প্রফাইলিং প্রক্রিয়াজাত করা
top সিস্টেম টাস্ক প্রদর্শন করা

 

এখানে বর্ণিত সকল কম্যান্ডের বিস্তারিত সিনট্যাক্সের জন্য মেনপেজ হেল্প দেখা যেতে পারে।

 

ইউনিক্সঃ ইউজার এডমিনিস্ট্রেশন (Unix – User Administration)

রিদওয়ান বিন শামীম

 

ইউনিক্স সিস্টেমে তিন ধরণের একাউন্ট দেখা যায়,

  • রুট একাউন্ট,
  • সিস্টেম একাউন্ট
  • ইউজার একাউন্ট

 

ইউজার এবং গ্রুপ ব্যবস্থাপনা

তিন ধরণের ইউজার এডমিনিস্ট্রেশন ফাইল দেখা যায়,

  • /etc/passwd: এটি ইউজার একাউন্ট ও পাসওয়ার্ড সংরক্ষণ করে।
  • /etc/shadow: এটি কোরেসপনডিং একাউন্টের এনক্রিপটেড পাসওয়ার্ড সংরক্ষণ করে
  • /etc/group: এটি প্রত্যেক একাউন্টের গ্রুপ ইনফরমেশন সংরক্ষণ করে

 

ইউনিক্সের একাউন্ট ও গ্রুপ তৈরি ও ব্যবস্থাপনা সংক্রান্ত কম্যান্ডের কয়েকটি নিচের ছকে দেয়া হল,

কম্যান্ড বিবরণ
useradd সিস্টেমে একাউন্ট যোগ করে
usermod একাউন্ট এট্রিবিউট মডিফাই করে
userdel সিস্টেম থেকে একাউন্ট ডিলিট করে .
groupadd সিস্টেমে গ্রুপ যোগ করে
groupmod গ্রুপ এট্রিবিউট মডিফাই করে
groupdel সিস্টেম থেকে গ্রুপ রিমুভ করে .

 

গ্রুপ তৈরি করা

নতুন গ্রুপ তৈরির সিনট্যাক্স হল,


groupadd[-g gid[-o]][-r][-f] groupname

 

এর প্যারামিটারগুলো হল,

-g GID
-o
-r
-f
groupname

 

নিচের উদাহরণে ডিফল্ট ভ্যালুতে developers গ্রুপ তৈরি করা হয়েছে।


$ groupadd developers

 

গ্রুপ মডিফাই করা

groupmod সিনট্যাক্স ব্যবহার করে গ্রুপ মডিফাই করা যায়।


$ groupmod-n new_modified_group_name old_group_name

 

developers_2 গ্রুপনেমকে developer গ্রুপনেমে পরিবর্তনের জন্য,


$ groupmod-n developer developer_2

 

financial GID গ্রুপনেমকে 545 গ্রুপনেমে পরিবর্তনের জন্য,


$ groupmod-g545 developer

 

গ্রুপ ডিলিট করার জন্য

গ্রুপ ডিলিট করার জন্য কম্যান্ড,


$ groupdel developer

 

একাউন্ট তৈরি করা

একাউন্ট তৈরি করার জন্য সিনট্যাক্স,


useradd-d homedir-g groupname-m-s shell-u userid accountname

 

এর প্যারামিটারগুলো হল,

Option
-d homedir
-g groupname
-m
-s shell
-u userid
accountname

 

mcmohd নামের একাউন্ট যার হোম ডিরেক্টরি /home/mcmohd, এবং developersনামের গ্রুপ,এটিকে ব্যবহারকারী কর্ন সেলের মাধ্যমে এসাইন করতে পারে, নিচে পুরো উদাহরণটি দেয়া হল,


$ useradd-d/home/mcmohd-g developers-s/bin/ksh mcmohd

 

একাউন্ট তৈরি হয়ে গেলে passwd কম্যান্ড ব্যবহার করে আমরা এতে পাসওয়ার্ড বসাতে পারি,


$ passwd mcmohd20
Changing password for user mcmohd20.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

 

একাউন্ট মডিফাই করা

usermod কম্যান্ড ব্যবহার করে একাউন্ট মডিফাই করা সম্ভব।


$ usermod-d/home/mcmohd20-m-l mcmohd mcmohd20

 

একাউন্ট ডিলিট করা

userdel কম্যান্ড ব্যবহার করে আমরা একাউন্ট ডিলিট করতে পারি।


$ userdel-r mcmohd20

 

যদি আমরা হোম ডিরেক্টরিকে ব্যাকআপের জন্য রাখতে চাই তবে -r অপশন বর্জন করতে হবে।

 

ইউনিক্সঃ ফাইল সিস্টেম বেসিক (Unix – File System Basics)

রিদওয়ান বিন শামীম

 

ফাইল সিস্টেম হল পার্টিশন বা ডিস্কে ফাইলের লজিকাল কালেকশন। পার্টিশন ইনফরমেশনের কন্টেইনার হিসেবে কাজ করে এবং প্রয়োজনে পুরো হার্ডডিস্ক স্পান করতে পারে ।

হার্ডড্রাইভে অনেকগুলো পার্টিশন থাকতে পারে যেগুলো মূলত একটিমাত্র ফাইল সিস্টেম ফলো করবে। প্রতিটা পার্টিশনের জন্য একটিমাত্র ফাইল সিস্টেম এটির সুষ্ঠু ব্যবস্থাপনা ও রক্ষণাবেক্ষণ নিশ্চিত করে।

ইউনিক্সে সব উপাদানকে ফাইল হিসেবে গণ্য করা হয়, এমনকি ডিভিডি রম, ইউএসবি ডিভাইস বা ফ্লপি ড্রাইভের মত ফিজিকাল ডিভাইসকেও।

 

ডিরেক্টরি কাঠামো

ইউনিক্স ক্রমবিন্যাসগত কাঠামো মেনে চলে, root (/)কে ফাইল সিস্টেমের ভিত্তি ধরে, অন্য সব ডিরেক্টরি সেটি থেকে ছড়িয়ে পড়ে।

ইউনিক্স ফাইল সিস্টেম ফাইল ও ডিরেক্টরির কালেকশন যেটির মূলত নিচের বৈশিষ্ট্যগুলি থাকে।

  • এটির root directory (/) থাকে যা অন্য ফাইল ও ডিরেক্টরিগুলোকে ধারণ করে,
  • প্রত্যেকটি ফাইল ও ডিরেক্টরি এর স্বতন্ত্র নাম দ্বারা সনাক্ত হয়,
  • কনভেনশন অনুসারে root directoryএর inode number থাকে ২ এর , আর ost+found directoryএর inode number থাকে ৩ এর।
  • ফাইল সিস্টেমগুলো স্বতন্ত্র, এদের পারস্পরিক কোনও নির্ভরতা নেই।

ডিরেক্টরিগুলোর নির্ধারিত কাজ থাকে, ইউনিক্সের প্রধান ভার্সনগুলোয় যে ডিরেক্টরিগুলোকে সাধারণত দেখা যায়,

 

ডিরেক্টরি
/
/bin
/dev
/etc
/lib
/boot
/home
/mnt
/proc
/tmp
/usr
/var
/sbin
/kernel

 

ফাইল সিস্টেম নেভিগেট করা

নিচের কম্যান্ডগুলো নেভিগেশনের জন্য প্রয়োজন হয়,

 

কম্যান্ড
cat filename
cd dirname
cp file1 file2
file filename
find filename dir
head filename
less filename
ls dirname
mkdir dirname
more filename
mv file1 file2
pwd
rm filename
rmdir dirname
tail filename
touch filename
whereis filename
which filename

 

df (disk free) কম্যান্ড

পার্টিশনের জায়গা ব্যবস্থাপনার জন্য df –k কম্যান্ড কিলোবাইটে ডিস্ক স্পেস ইউসেজ প্রকাশ করে,


$df -k
Filesystem      1K-blocks      Used   Available Use% Mounted on
/dev/vzfs        10485760   7836644     2649116  75% /
/devices                0         0           0   0% /devices
$

সব ইউনিক্সের জন্য df –kআউটপুট একই রকমের বা কাছাকাছি। এগুলো হল,

 

আউটপুট কলাম
Filesystem
kbytes
used
avail
capacity
Mounted on

 

ডিইউ কলাম

ডিইউ (disk usage) কমান্ডে প্রতি ডিরেক্টরির কনজিউম করা ব্লকের সংখ্যা দেখানো হয়, একটি সিঙ্গেল ব্লক ৫১২ বাইট বা ১ কিলোবাইট জায়গা নেয়, এই পরিমান সিস্টেমের উপর নির্ভর করে।


$du    /etc
10     /etc/cron.d
126    /etc/default
6      /etc/dfs
...
$

 

-h অপশন আউটপুট প্রকাশকে সহজ করে,


$du -h /etc
5k    /etc/cron.d
63k   /etc/default
3k    /etc/dfs
...
$

 

ফাইল সিস্টেম মাউন্টিং

বর্তমানে মাউন্টেড ফাইল দেখতে,


$ mount
/dev/vzfs on / type reiserfs (rw,usrquota,grpquota)
proc on /proc type proc (rw,nodiratime)
devpts on /dev/pts type devpts (rw)
$

 

কোনও ফাইল সিস্টেমকে মাউন্ট করতে সিনট্যাক্স,


mount-t file_system_type device_to_mount directory_to_mount_to

 

 

যেমন, কোনও সিডি রমকে /mnt/cdrom ডিরেক্টরিতে মাউন্ট করতে সিনট্যাক্স,


$ mount-t iso9660/dev/cdrom/mnt/cdrom

 

ফাইল সিস্টেমকে আনমাউন্ট করতেঃ এক্ষেত্রে umount কম্যান্ড ব্যবহার করতে হবে, যেমন একটি সিডি রমকে আনমাউন্ট করতে


$ umount/dev/cdrom

 

ইউজার ও গ্রুপ কোটা

এক্ষেত্রে এডমিন নির্ধারণ করে দেন নির্দিষ্ট ব্যবহারকারী বা গ্রুপ কি পরিমান জায়গা ব্যবহার করতে পারবেন, এডমিন নির্ধারিত জায়গা অতিক্রম করলে দুটো লিমিটে ব্যবহারকারী ব্যবস্থা নিতে পারেন,

  • সফট লিমিট
  • হার্ড লিমিট

এডমিন কোটার কম্যান্ডগুলো হল,

কম্যান্ড
quota
edquota
quotacheck
setquota
quotaon
quotaoff
repquota

 

ইউনিক্স – SED এর সাথে রেগুলার এক্সপ্রেশন (Unix – Regular Expressions with SED)

রিদওয়ান বিন শামীম

 

আজকের টিউটোরিয়ালে আমরা দেখব কীভাবে sed তে রেগুলার এক্সপ্রেশন ব্যবহার করা হয়।

 

এসইডিকে ইনভোক করা

পাইপের মাধ্যমে এসইডিতে ডাটা প্রেরণ করে একে ইনভোক করা যায়,


$ cat /etc/passwd | sed
Usage: sed [OPTION]... {script-other-script} [input-file]...
 
  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression=script
...............................

 

এসইডির জন্য সাধারণ সিনট্যাক্স

এসইডির জন্য সাধারণ সিনট্যাক্স এরকম,


/pattern/action

 

এখানের স্ল্যাস ক্যারেক্টারগুলো ডিলিমিটার হিসেবে ব্যবহৃত হয়।

রেঞ্জ বিবরণ
p লাইন প্রিন্ট করে
d লাইন ডিলিট করে
s/pattern1/pattern2/ প্যাটার্ন ১ এর ঘটনাকে প্যাটার্ন ২ দ্বারা প্রতিস্থাপন করে।

 

 

এসইডিতে লাইন ডিলিট করতে

লাইন ডিলিট করতে নিচের কম্যান্ড ব্যবহৃত হয়,


$ cat /etc/passwd | sed 'd'
$

 

cat command ছাড়া এই কম্যান্ডও অনুরূপ কাজ করে,

 


$ sed -e 'd' /etc/passwd
$

এসইডি এড্রেসিং

এসইডি কম্যান্ডে বেসিক এড্রেস যোগ করতে যে কম্যান্ড ব্যবহার করতে পারি,

 


$ cat /etc/passwd | sed '1d' |more
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

এসইডি কম্যান্ডে এড্রেস রেঞ্জ নির্ধারণ করতে আমরা  যে কম্যান্ড ব্যবহার করতে পারি তা হল,


$ cat /etc/passwd | sed '1, 5d' |more
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

উপরের কম্যান্ড এক থেকে পাঁচ নাম্বার পর্যন্ত লাইন ডিলিট করতে ফলপ্রসূ হবে।

 

আরও কিছু এড্রেস রেঞ্জের উদাহরণ,

রেঞ্জ
'4,10d'
'10,4d'
'4,+5d'
'2,5!d'
'1~3d'
'2~2d'
'4,10p'
'4,d'
',10d'

 

মনে রাখা দরকার, p একশন ব্যবহারের সময় পুনরাবৃত্তি এড়াতে -n অপশন ব্যবহার করা উচিৎ,

 


$ cat /etc/passwd | sed -n '1,3p'

এই কম্যান্ডকে -n ছাড়া ব্যবহার করলে যা পাচ্ছি,


$ cat /etc/passwd | sed '1,3p'

সাবস্টিটিউশন কম্যান্ড

স্ট্রিং root কে amrood স্ট্রিং দ্বারা প্রতিস্থাপিত করতে কম্যান্ড,

 


$ cat /etc/passwd | sed 's/root/amrood/'
amrood:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
..........................

এসইডিকে গ্লোবাল সাবস্টিটিউশনের নির্দেশ দিতে কম্যান্ডের শেষে g লাগাতে হয়,

 


$ cat /etc/passwd | sed 's/root/amrood/g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh

 

 

সাবস্টিটিউশন ফ্ল্যাগ

অনেকগুলো সাবস্টিটিউশন ফ্ল্যাগ আছে যার মধ্যে একই সময়ে একাধিককে স্পেসিফাই করে দিতে পারি আমরা,

 

ফ্ল্যাগ
g
NUMBER
p
w FILENAME
I or i
M or m

 

অলটারনেটিভ স্ট্রিং সেপারেটর ব্যবহার করা

s এর পড়ে কাঙ্খিত ক্যারেক্টার ব্যবহার করে বিভিন্ন সেপারেটর ব্যবহার করা যায়।

 


$ cat /etc/passwd | sed 's:/root:/amrood:g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

এম্পটি স্পেস দ্বারা রিপ্লেস করা

/etc/passwd ফাইল থেকে রুট স্ট্রিং ডিলিট করার জন্য এম্পটি সাবস্টিটিউশন স্ট্রিং ব্যবহার করতে পারি,

 


$ cat /etc/passwd | sed 's/root//g'
:x:0:0::/:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

এড্রেস সাবস্টিটিউশন

কেবল দশম লাইনের string shকে string quiet দ্বারা  সাবস্টিটিউট করতে,


$ cat /etc/passwd | sed '10s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/quiet

একইভাবে, এড্রেস রেঞ্জ সাবস্টিটিউশন করতে,

 


$ cat /etc/passwd | sed '1,5s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/quiet
daemon:x:1:1:daemon:/usr/sbin:/bin/quiet
bin:x:2:2:bin:/bin:/bin/quiet
sys:x:3:3:sys:/dev:/bin/quiet
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

ম্যাচিং কম্যান্ড

-n অপশনের সাথে p অপশন ব্যবহার করে ম্যাচিং লাইন প্রিন্ট করতে পারি,


$ cat testing | sed -n '/root/p'
root:x:0:0:root user:/root:/bin/sh
[root@ip-72-167-112-17 amrood]# vi testing
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

রেগুলার এক্সপ্রেশন ব্যবহার করা

daemon দিয়ে করা লাইন খুঁজে বের করে ডিলিট করতে,

 


$ cat testing | sed '/^daemon/d'
root:x:0:0:root user:/root:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

 

sh দিয়ে শেষ এমন লাইনের ক্ষেত্রে ডিলিটের কম্যান্ড,

 


$ cat testing | sed '/sh$/d'
sync:x:4:65534:sync:/bin:/bin/sync

 

রেগুলার এক্সপ্রেশনের জন্য গুরুত্বপূর্ণ এমন চারটি স্পেশাল ক্যারেক্টার,

ক্যারেক্টার
^
$
.
*
[chars]

 

ম্যাচিং ক্যারেক্টার

ম্যাচিং ক্যারেক্টারের কিছু প্যাটার্ন দেয়া হল,

এক্সপ্রেশন
/a.c/
/a*c/
/[tT]he/
/^$/
/^.*$/
/ */
/^$/

বহুল ব্যবহৃত কিছু ক্যারেক্টার সেট নিচে দেয়া হল,

সেট
[a-z]
[A-Z]
[a-zA-Z]
[0-9]
[a-zA-Z0-9]

 

ক্যারেক্টার ক্লাস কীওয়ার্ড

/etc/syslog.conf ফাইলের উদাহরণে এলফাবেট ক্যারেক্টার ক্লাস কীওয়ার্ড ব্যবহৃত হয়েছে।


$ cat /etc/syslog.conf | sed -n '/^[[:alpha:]]/p'
authpriv.*                         /var/log/secure
mail.*                             -/var/log/maillog
cron.*                             /var/log/cron
uucp,news.crit                     /var/log/spooler
local7.*

 

জিএনইউ এসইডিতে পাওয়া ক্যারেক্টার ক্লাস কীওয়ার্ডের একটি তালিকা নিচে দেয়া হল,

ক্যারেক্টার ক্লাস
[[:alnum:]]
[[:alpha:]]
[[:blank:]]
[[:cntrl:]]
[[:digit:]]
[[:graph:]]
[[:lower:]]
[[:print:]]
[[:punct:]]
[[:space:]]
[[:upper:]]
[[:xdigit:]]

 

এম্পারসেন্ড রেফারেন্সিং

ধরা যাক, নিচের ফাইলে ফোননাম্বার আছে, এতে এরিয়া কোড বসাতে হবে,

 


5555551212
5555551213
5555551214
6665551215
6665551216
7775551217

এম্পারসেন্ড রিপ্লেসমেন্ট ক্যারেক্টার বসিয়ে এটি করতে হলে যা করতে হবে তা হল,

 


$ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt
(555)5551212
(555)5551213
(555)5551214
(666)5551215
(666)5551216
(777)5551217

মাল্টিপল এসইডি কম্যান্ড ব্যবহার

সিঙ্গেল এসইডি কম্যান্ডে মাল্টিপল এসইডি কম্যান্ড ব্যবহার করতে নিচের কম্যান্ড ব্যবহার করতে পারি,

 


$ sed -e 'command1' -e 'command2' ... -e 'commandN' files

একই কৌশল ব্যবহার করে ফোন নাম্বার উদাহরণকে আমরা এভাবে লিখতে পারি,

 


$ sed -e 's/^[[:digit:]]\{3\}/(&)/g'  \
                      -e 's/)[[:digit:]]\{3\}/&-/g' phone.txt
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

ব্যাক রেফারেন্স

ধরা যাক, অনুমিত ফোন টেক্সটে এই টেক্সটগুলো আছে,

 


(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

এতে নিচের কম্যান্ড প্রয়োগ করা যেতে পারে,

 


$ cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area \
                       code: \1 Second: \2 Third: \3/'
Area code: (555) Second: 555- Third: 1212
Area code: (555) Second: 555- Third: 1213
Area code: (555) Second: 555- Third: 1214
Area code: (666) Second: 555- Third: 1215
Area code: (666) Second: 555- Third: 1216
Area code: (777) Second: 555- Third: 1217

 

ইউনিক্সঃ সেল ম্যানপেজ হেল্প (Unix – Shell Manpage Help)

রিদওয়ান বিন শামীম

 

ইউনিক্স কম্যান্ডগুলো অনেকধরণের ঐচ্ছিক ও বাধ্যতামূলক অপশন নিয়ে গঠিত হয়, এসব কম্যান্ডের সম্পূর্ণ সিনট্যাক্স মনে রাখা সহজ নাও হতে পারে।

যেহেতু কোনও ব্যক্তির পক্ষে এসব কম্যান্ডের সম্পূর্ণ সিনট্যাক্স মনে রাখা সম্ভব না তাই ইউনিক্সের প্রথম যুগ থেকেই অনলাইনে এসব সিনট্যাক্স সম্পর্কে সাহায্য লাভের সুযোগ আছে।

 

ইউনিক্সের সাহায্য ফাইলের ভার্সনগুলোকে ম্যান পেজ বলে। কোনও কম্যান্ড নেম জানা থাকলে কিন্তু প্রয়োগ বিধি জানা না থাকলে ম্যান পেজ প্রতিটা ধাপে সাহায্য করতে পারে।

সিনট্যাক্স

সিস্টেমে কাজ করার সময় কোনও ইউনিক্স কম্যান্ডের বিস্তারিত তথ্য পেতে নিচের কোড ব্যবহার করা হয়,


$man command

 

যেমন, pwd সম্পর্কে জানতে গেলে নিচের কোড লিখতে হবে,


$man pwd

 

man কম্যান্ড সম্পর্কে বিস্তারিত জানতে হলে যে কোড লিখতে হবে তা হল,


$man man

 

ম্যানপেজের সেকশন

ম্যানপেজ মূলত সেকশনে বিভক্ত থাকে যা প্রধানত এর অথরের বিবেচনায় মূল্যায়িত হয়। কিছু কমন সেকশন নিচের ছকে দেখানো হল,

 

সেকশন বর্ণনা
NAME কম্যান্ডের নাম
SYNOPSIS কম্যান্ডের জেনারেল ইউসেজ প্যারামিটার
DESCRIPTION কম্যান্ড ও এর কাজের বর্ণনা
OPTIONS কম্যান্ডের অপশন
SEE ALSO ম্যানপেজে সরাসরি সম্পৃক্ত কম্যান্ড ও তাদের সদৃশ ফাংশনালিটির তালিকাভুক্তি
BUGS কম্যান্ড বা এর আউটপুটে থাকে এমন জানা বিষয় বা বাগ।
EXAMPLES কম্যান্ড ব্যবহার বিষয়ে কমন উদাহরণ
AUTHORS ম্যানপেজ বা কম্যান্ডের অথর

 

এভাবেই গুরুত্বপূর্ণ ও প্রয়োজনীয় ইউনিক্স সেল কম্যান্ড আমরা হেল্প পেজ থেকে পেতে পারি।

 

ইউনিক্সঃ সেল ফাংশন (Unix – Shell Functions)

রিদওয়ান বিন শামীম

 

ফাংশন কোনও স্ক্রিপ্টের ফাংশনালিটিকে ছোট ছোট লজিকাল সাবসেকশনে ভাগ করে যাতে এগুলো প্রয়োজনমত তাদের কাজ সম্পন্ন করতে পারে।

পুনরাবৃত্তিমূলক কাজ সম্পাদনের জন্য ফাংশন ব্যবহার করা কোডের পুনঃব্যবহারের একটি ভাল উপায়। কোডের পুনঃব্যবহার বর্তমান সময়ের অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিঙের একটি গুরুত্বপূর্ণ অংশ।

সেল ফাংশন অন্যান্য প্রোগ্রামিং ভাষার সাবরুটিন, প্রক্রিয়া ও ফাংশনের মতই।

 

ফাংশন তৈরি করা

ফাংশন হিসেবে স্বীকৃতি পেতে নিচের সিনট্যাক্স ব্যবহার করতে হয়,


function_name () { 
   list of commands
}

 

নিচে ফাংশনের ব্যবহারের সহজ উদাহরণ দেয়া হল,


#!/bin/sh
 
# Define your function here
Hello () {
   echo "Hello World"
}
 
# Invoke your function
Hello

 

উপরের কোডকে কার্যে পরিণত করলে নিম্নে প্রদত্ত ফলাফল পাওয়া যাবে,


$./test.sh
Hello World
$

 

ফাংশনের পাস প্যারামিটার

কিছু ফাংশন কাজের ক্ষেত্রে প্যারামিটার গ্রহণ করে, $1, $2 এসব দ্বারা এই ফাংশন প্রকাশ করা হয়,


#!/bin/sh
 
# Define your function here
Hello () {
   echo "Hello World $1 $2"
}
 
# Invoke your function
Hello Zara Ali

 

যা নিচের ফলাফল দেখাবে,


$./test.sh
Hello World Zara Ali
$

 

ফাংশন থেকে মান ফিরিয়ে আনাঃ return কম্যান্ড ব্যবহার করে ফাংশন থেকে যেকোনো মান ফিরিয়ে আনা সম্ভব, যার সিনট্যাক্স হল,


return code

 

এখানে যেকোনো কোড হতে পারে কিন্তু তা স্ক্রিপ্টের কনটেক্সটে অর্থবোধক হতে হবে।

যেমন, নিচের ফাংশন ভ্যালু ফিরিয়ে আনে,


#!/bin/sh
 
# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}
 
# Invoke your function
Hello Zara Ali
 
# Capture value returnd by last command
ret=$?
 
echo "Return value is $ret"

 

যা নিম্নোক্ত ফলাফল দেবে,


$./test.sh
Hello World Zara Ali
Return value is 10
$

 

নেস্টেড ফাংশন

ফাংশনের একটি মজার ফিচার হল, এটি অন্য ফাংশনকে যেমন কল করতে পারে তেমনি নিজেদেরও কল করতে পারে। এধরনের ফাংশনকে রিকারসিভ ফাংশন বলে।

দুটি ফাংশনের নেস্টিং নিচের উদাহরণে দেয়া হল,


#!/bin/sh
 
# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}
 
number_two () {
   echo "This is now the second function speaking..."
}
 
# Calling function one.
number_one

 

এটি যে ফলাফল দেখাবে তা হল,


This is the first function speaking...
This is now the second function speaking...

 

প্রম্পট থেকে ফাংশন কল

.profile এর ভিতরে সচরাচর ব্যবহৃত ফাংশনের জন্য সংজ্ঞা অন্তর্ভুক্ত করা যায়,অপরদিকে test.sh জাতীয় ফাইলে সংজ্ঞার গ্রুপ সংবদ্ধ করে কারেন্ট সেলে নিচের কোড দ্বারা সম্পাদন করা যায়,


$. test.sh

 

যা কিনা কারেন্ট সেলকে নিচের মত করে বিবৃত করে,


$ number_one
This is the first function speaking...
This is now the second function speaking...
$

 

সেল থেকে কোনও ফাংশনের সংজ্ঞা মুছে ফেলতে .f অপশনের সাথে unset কম্যান্ড ব্যবহার করতে হয়, এটি সেই একই কম্যান্ড যা সেল থেকে চলকের বিবরণ মুছে ফেলতে ব্যবহৃত হয়,


$unset.f function_name

 

ইউনিক্সঃ সেল ইনপুট/আউটপুট রিডাইরেকশন (Unix – Shell Input/Output Redirections)

রিদওয়ান বিন শামীম

 

বেশিরভাগ ইউনিক্স সিস্টেম কম্যান্ড টার্মিনাল থেকে ইনপুট গ্রহণ করে এবং টার্মিনালে আউটপুট প্রদান করে।

কম্যান্ড স্ট্যান্ডার্ড ইনপুট থেকে ইনপুট পড়ে ও স্ট্যান্ডার্ড আউটপুটে আউটপুট লিখে।

 

আউটপুট রিডাইরেকশন

নিচের who কম্যান্ড ইউজার ফাইলের কম্যান্ডের পুরোপুরি আউটপুটে পরিণত হবে,


$ who> users


 

এখানে লক্ষ্য করার মত বিষয়, টার্মিনালে কোনও আউটপুট নেই, কারণ আউটপুট স্পেসিফাইড ফাইলে চলে গেছে, সেটি ডিফল্ট স্ট্যান্ডার্ড আউটপুট ডিভাইস(এক্ষেত্রে টার্মিনাল) থেকে রিডাইরেক্ট হয়ে গেছে। যদি আমরা users ফাইল চেক করে দেখি তাহলে পরিপূর্ণ উপাদান দেখব,


$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

 

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


$ echo line1> users
$ cat users
line1$

 

পূর্বে থাকা কোনও ফাইলে আউটপুট বিস্তারনের জন্য আমরা >> অপারেটর ব্যবহার করতে পারি।


$ echo line2>> users
$ cat users
line1
line2
$

 

ইনপুট রিডাইরেকশন

আউটপুট যেমন রিডাইরেক্ট হয়ে ফাইলে আসতে পারে তেমনি ফাইল থেকে ইনপুট রিডাইরেক্ট হয়ে চলেও যেতে পারে। আউটপুট রিডাইরেকশন যেমন > ক্যারেক্টার দ্বারা প্রকাশ পায় তেমনি ইনপুট রিডাইরেকশন < ক্যারেক্টার দ্বারা প্রকাশ পায়।

যেমন, users ফাইলের লাইন নাম্বার নিচের কম্যান্ড থেকে বের করা যায়,


$ wc-l users
2 users
$

 

এখানে আউটপুট ২ লাইনের। users ফাইলের wc কম্যান্ডের স্ট্যান্ডার্ড ইনপুটের রিডাইরেকশনের মাধ্যমে আমরা লাইন সংখ্যা জানতে পারি।


$ wc-l< users
2
$

 

হেয়ার ডকুমেন্ট

হেয়ার ডকুমেন্টের সাধারণ ফর্ম এরকম,


command<< delimiter
document
delimiter

 

মোট লাইনসংখ্যা জানার wc –l কম্যান্ডের ইনপুট এরকম,


$wc -l << EOF
        This is a simple lookup program 
        for good (and bad) restaurants
        in Cape Town.
EOF
3
$

 

স্ক্রিপ্ট ব্যবহার করে মাল্টিপল লাইন প্রিন্ট করতে here document কম্যান্ড ব্যবহার করা যায়,


#!/bin/sh
 
cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

 

যা এরকম ফলাফল দেখাবে,


This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

 

এই স্ক্রিপ্ট vi টেক্সট এডিটর দিয়ে একটি সেশন চালাবে এবং test.txt ফাইলে ইনপুট সংরক্ষণ করবে।


#!/bin/sh
 
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

 

vi টেক্সট এডিটরের স্থলে vim টেক্সট এডিটর ব্যবহার করলে স্ক্রিপ্টের আউটপুট এরকম হবে,


$ sh test.sh
Vim: Warning: Input is not from a terminal
$

 

স্ক্রিপ্ট চালুর পর test.txt ফাইলে ফাইলে আমরা যা দেখব তা এরকম,


$ cat test.txt
This file was created automatically from
a shell script
$

 

আউটপুট ডিসকার্ড করা

আউটপুটকে /dev/null ফাইলে রিডাইরেক্ট করে এটি করা হয়,


$ command>/dev/null

 

কম্যান্ডের আউটপুট ও এর এরর আউটপুট দুটিকে ডিসকার্ড করতে


$ command>/dev/null2>&1

 

STDIN কে STDERR তে রিডাইরেক্ট করে ম্যাসেজ প্রদর্শন করতে


$ echo message1>&2

এই কোড ব্যবহার করা যায়।

 

রিডাইরেকশন কম্যান্ড

এরকম কয়েকটি রিডাইরেকশন কম্যান্ড হল,

কম্যান্ড
pgm > file
pgm < file
pgm >> file
n > file
n >> file
n >& m
n <& m
<< tag
|

মনে রাখা দরকার, ফাইল ডেসক্রিপ্টর ০ হল নরমাল স্ট্যান্ডার্ড ইনপুট (STDIN), ১ হল স্ট্যান্ডার্ড আউটপুট (STDOUT) আর ২ হল স্ট্যান্ডার্ড এরর আউটপুট (STDERR) ।

 

ইউনিক্সঃ সেল কোটিং মেকানিজম (Unix – Shell Quoting Mechanisms)

রিদওয়ান বিন শামীম

 

মেটাক্যারেক্টার

ইউনিক্স সেল বিভিন্ন মেটাক্যারেক্টার ব্যবহার করে যারা সেল স্ক্রিপ্টে ব্যবহৃত হওয়ার সময় স্বতন্ত্র অর্থ প্রকাশ করে। যেমন


*?[]' " \ $ ; & ( ) | ^ < > new-line space tab

 

উদাহরণ, * বা ? চিহ্ন প্রিন্ট করার জন্য যে কোড লিখব তা হল,


#!/bin/sh 
echoHello;Word

 

এটি যে ফলাফল দেখাবে তা হল,


Hello
./test.sh: line2:Word: commandnot found 
shell returned127

 

এখন একটি কোটেড ক্যারেক্টার ব্যবহার করে দেখা যাক,


#!/bin/sh 
echoHello\;Word

 

এটি যে ফলাফল দেখাবে,


Hello;Word

 

$ একটি মেটাক্যারেক্টার তাই সেলের ব্যতিক্রমী আচরণ এড়াতে একে কোটেড অবস্থায় রাখতে হবে,


#!/bin/sh 
echo"I have \$1200"

 

এটি যে ফলাফল দেবে তা হল,


I have $1200

 

চার ধরণের কোটিং দেখা যায়,

কোটিং বর্ণনা
Single quote এই কোটের মধ্যবর্তী বিশেষ ক্যারেক্টার তাদের বিশেষ অর্থ হারায়
Double quote এই কোটের মধ্যবর্তী বেশিরভাগ বিশেষ ক্যারেক্টার তাদের বিশেষ অর্থ হারায়,ব্যতিক্রমগুলো হল,

  • $
  • `
  • \$
  • \'
  • \"
  • \\
Backslash ব্যাকস্লেসকে অনুসরণ করা কোনও ক্যারেক্টার তাদের বিশেষ অর্থ হারায়
Back Quote ব্যাককোটের মধ্যবর্তী যেকোনো কিছুই কম্যান্ড, এগুলোকে সম্পাদন করা হয়

 

সিঙ্গেল কোট

একটি ইকো কম্যান্ড চিন্তা করা যাক যেটিতে অনেকগুলো সেল কম্যান্ড আছে।


echo<-$1500.**>;(update?)[y|n]

 

এর প্রত্যেকটি স্পেশাল ক্যারেক্টারের সামনে ব্যাকস্লেস দেয়া শ্রান্তিজনক ও পড়া কঠিন করে ফেলতে পারে।


echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]

 

এরকম বড় ক্যারেক্টার গ্রুপকে কোটিং করার একটি সহজ উপায় আছে। স্ট্রিংএর শুরু আর শেষে একটি করে সিঙ্গেল কোট ( ') দিতে হবে,


echo'<-$1500.**>; (update?) [y|n]'

 

আউটপুট হবে এমন স্ট্রিংএ সিঙ্গেল কোট বসলে পুরো স্ট্রিংকে সিঙ্গেল কোটে রাখার বদলে নিচের উদাহরণের মত করে ব্যাকস্লেস ব্যবহার করতে হবে,


echo'It\'s Shell Programming'

 

ডাবল কোট

নিচের সেল স্ক্রিপ্ট চেষ্টা করে দেখা যাক, এটি সিঙ্গেল কোটের আচরণ দেখাবে,


VAR=ZARA
echo'$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'

 

যার ফলাফল,


$VAR owes<-$1500.**>;[as of(`date +%m/%d`)]

 

কিন্তু যদি আমরা সাবস্টিটিউট চলক মান চাই ও ইনভার্টেড কমা কার্যকর দেখতে চাই তাহলে ডাবল কোটের মধ্যে নিম্নোক্ত উপায়ে কম্যান্ড লিখতে হবে,


VAR=ZARA
echo"$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"

 

এতে করে যে ফলাফল আসবে তা হল,


ZARA owes<-$1500.**>;[as of(07/02)]

 

ডাবল কোট সব ক্যারেক্টারের স্পেশাল মিনিং নিয়ে নেয় কিছু ব্যতিক্রম ছাড়া

  • প্যারামিটারসাবস্টিটিউশনের জন্য $
  • কম্যান্ড সাবস্টিটিউশনের জন্য ব্যাককোট
  • লিটারেল ডলার সাইনের অনুমোদনের জন্য \$
  • লিটারেল ব্যাককোট অনুমোদনের জন্য \`
  • এমবেডেড ডাবল কোট অনুমোদনের জন্য \"
  • এমবেডেড ব্যাকস্লেস অনুমোদনের জন্য \\
  • অন্য সব \ ক্যারেক্টার স্পেশাল নয়

 

ব্যাক কোট

ব্যাক কোটের মধ্যে সেল কম্যান্ড রাখলে তা সম্পাদন করা হয়, সেল কম্যান্ডকে ব্যাক কোটের মধ্যে রাখার সরল সিনট্যাক্স নিচের উদাহরণে,


var=`command`

 

যেমন, ডেট কম্যান্ড সম্পাদন করে এর ফলাফলকে ডাটা ভেরিয়েবলে রাখার জন্য,


DATE=`date` 
echo"Current Date: $DATE"

 

এটি নিচের ফলাফল প্রদর্শন করবে,


CurrentDate:ThuJul205:28:45 MST2009

 

ইউনিক্সঃ সেল সাবস্টিটিউশন (Unix – Shell Substitution)

রিদওয়ান বিন শামীম

 

সাবস্টিটিউশন কী

একটি সেল সাবস্টিটিউশন প্রয়োগ করে তখন, যখন সেটি এমন পরিস্থিতি অনুধাবন করে যা এক বা একাধিক বিশেষ চিহ্ন(স্পেশাল ক্যারেকটার) ধারণ করে থাকে।

নিচের উদাহরণটি এমন একটি ক্ষেত্র যেখানে কোনও চলকের মুদ্রায়িত মান এর মূল মানের দ্বারা প্রতিস্থাপিত হয়েছে। একই সাথে "\n" একটি নতুন লাইনের মাধ্যমে প্রতিস্থাপিত হয়েছে।


#!/bin/sh
 
a=10
echo -e "Value of a is $a \n"

 

-e অপশন প্রয়োগে যা নিম্নোক্ত ফলাফল প্রদান করে,

Value of a is 10 এবং -e অপশন প্রয়োগ না করে ফলাফল হবে, Value of ais10\n ইকো কম্যান্ডের জন্য নিম্নোক্ত এস্কেপ সিকোয়েন্স প্রয়োগ করা যায়,

 

Escape Description
\\ backslash
\a alert (BEL)
\b backspace
\c suppress trailing newline
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab

ব্যাকস্লেস এস্কেপের ইন্টারপ্রিটেশন ডিজেবল রাখতে –E অপশন ও নতুন লাইনের অন্তর্ভুক্তি রহিত করতে –n ব্যবহার করা যায়।

 

কম্যান্ড সাবস্টিটিউশন

কম্যান্ড সাবস্টিটিউশন হল একপ্রকার প্রক্রিয়া যার মাধ্যমে সেল কোনও কম্যান্ডের সেট সম্পাদন করে ও এর আউটপুট দ্বারা কম্যান্ডকে প্রতিস্থাপিত করে।

কম্যান্ড সাবস্টিটিউশন তখন কার্যকর হয় যখন নিম্নোক্ত নির্দেশনা দেয়া থাকে,


`command`

 

এসব ক্ষেত্রে সিঙ্গেল কোট ক্যারেকটারের পরিবর্তে ব্যাককোট ব্যবহার করতে হয়।

উদাহরণ

কম্যান্ড সাবস্টিটিউশন মূলত কম্যান্ডের আউটপুটকে চলকরূপে প্রকাশের জন্য ব্যবহৃত হয়,

নিচের প্রত্যেকটি উদাহরণ কম্যান্ড সাবস্টিটিউশনকে বিবৃত করে।


#!/bin/sh
 
DATE=`date`
echo "Date is $DATE"
 
USERS=`who | wc -l`
echo "Logged in user are $USERS"
 
UP=`date ; uptime`
echo "Uptime is $UP"

 

এই কোডগুলো যে ফলাফল দেখাবে তা হল,


Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

 

চলক সাবস্টিটিউশন

চলক সাবস্টিটিউশন চলকের অবস্থার প্রেক্ষিতে সেল প্রোগ্রামারকে এর মান ব্যবহারের সুযোগ দেয়।

সম্ভাব্য সাবস্টিটিউশন গুলো নিচের ছকে দেয়া হল,

প্রকার বর্ণনা
${var} var. এর মানকে প্রতিস্থাপিত করে
${var:-word} var শূন্য বা আনসেট হলে, var.এর জন্য শব্দ প্রতিস্থাপিত হয়। var এর মান অপরিবর্তিত থাকে।
${var:=word} var শূন্য বা আনসেট হলে, var শব্দের মান অনুসারে নির্ণীত হয়
${var:?message} var শূন্য বা আনসেট হলে, message standard error হিসেবে প্রতীয়মান হয়, চলক ঠিকমত প্রয়োগ করা হয়েছে কিনা এটি তা দেখে।
${var:+word} var সেট হলে শব্দ var এর দ্বারা প্রতিস্থাপিত হয় var এর মান অপরিবর্তিত থাকে।

 

উদাহরণ

নিচে এধরণের সাবস্টিটিউশনের উদাহরণ দেয়া হল,


#!/bin/sh
 
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
 
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
 
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
 
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
 
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

 

উপরের কোডগুলো যে ফলাফল দেখাবে তা হল,


Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
 
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

 

ইউনিক্সঃ সেল লুপ কন্ট্রোল (Unix – Shell Loop Control)

রিদওয়ান বিন শামীম

 

বিভিন্ন কাজের জন্য লুপ তৈরি ও ব্যবহার করার সাথে আমরা সবাই পরিচিত। কখনো কখনো লুপ এড়ানো বা এর পুনরাবৃত্তি করা প্রয়োজন হয়ে পরে।

 

সেল লুপ নিয়ন্ত্রণের জন্য দুটি স্টেটমেন্ট নিয়ে আমরা আলোচনা করব।

  • ব্রেক স্টেটমেন্ট
  • কন্টিনিউ স্টেটমেন্ট

 

ইনফিনিট লুপ

সব লুপের শুরু বা শেষ ও একটি সীমিত ক্রিয়াসীমা থাকে, নির্ধারিত শর্তে পৌঁছে এর ক্রিয়াসীমা শেষ হয়। সেই নির্ধারিত শর্তে না পৌঁছলে লুপ স্থায়ী হয়ে থেকে যেতে পারে। এধরনের লুপ ইনফিনিট লুপ নামে পরিচিত।

 

নিচের উদাহরণে জিরো থেকে ৯ পর্যন্ত নাম্বার প্রদর্শনের নিমিত্তে লুপের প্রয়োগ দেখানো হল।


#!/bin/sh
 
a=10
 
while [ $a -ge 10 ]
do
   echo $a
   a=`expr $a + 1`
done

এই লুপ সারা জীবন স্থায়ী হবে কারণ a সবসময় ১০এর চেয়ে বড় বা এর সমান, এটি কখনো ১০ এরচেয়ে ছোট হবে না।

 

ব্রেক স্টেটমেন্ট

ব্রেক স্টেটমেন্ট সম্পূর্ণ লুপের কার্যক্রম থামাতে ব্যবহৃত হয়, এর পূর্ব পর্যন্ত সকল কোডের কার্যক্রম সম্পন্ন হওয়ার পর।

 

সিনট্যাক্স

লুপের কার্যক্রম থামাতে নিম্নোক্ত ব্রেক স্টেটমেন্ট ব্যবহার করা হয়,


break


 

 

নেস্টেড লুপ থেকে বেরিয়ে যেতে যে ব্রেক কম্যান্ড ব্যবহার করা হয় তা হল,


break n


 

 

n তম লুপ থেকে বেরিয়ে যাওয়ার জন্য এই কোড ব্যবহৃত হয়।

যেমন


#!/bin/sh
 
a=0
 
while [ $a -lt 10 ]
do
   echo $a
   if [ $a -eq 5 ]
   then
      break
   fi
   a=`expr $a + 1`
done

 

উপরের কোড যে ফলাফল দেখাবে তা হল,


0
1
2
3
4
5

 

এই উদাহরণের উভয় লুপের ক্ষেত্রে পরিবর্তন হবে যদি var1 দুইয়ের সমান ও var2 শূন্যের সমান হয়।


#!/bin/sh
 
for var1 in 1 2 3
do
   for var2 in 0 5
   do
      if [ $var1 -eq 2 -a $var2 -eq 0 ]
      then
         break 2
      else
         echo "$var1 $var2"
      fi
   done
done

 

শর্ত পূরণ হলে ইনার লুপ ও আউটার লুপ বিলুপ্ত করে দেয়া হয়,


1 0
1 5

 

কন্টিনিউ স্টেটমেন্ট

লুপের পুনরাবৃত্তির ক্ষেত্রে কন্টিনিউ স্টেটমেন্ট প্রয়োগ করা সম্ভব, এর সিনট্যাক্স হল,


continue


 

 

নেস্টেড লুপ থেকে বেরিয়ে যেতে যে ইন্টেজার আর্গুমেন্ট ব্যবহার করা হয় কন্টিনিউ কমান্ডে তা হল,


continue n


n তম লুপের ক্ষেত্রে এই কোড ব্যবহৃত হয়।

 

উদাহরণ

নিচের উদাহরণে কন্টিনিউ স্টেটমেন্টের এই কোড ব্যবহার করা হয়,


#!/bin/sh
 
NUMS="1 2 3 4 5 6 7"
 
for NUM in $NUMS
do
   Q=`expr $NUM % 2`
   if [ $Q -eq 0 ]
   then
      echo "Number is an even number!!"
      continue
   fi
   echo "Found odd number"
done

 

এটি নিচের মতো ফলাফল দেখাবে,


Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number

 

ইউনিক্সঃ সেল লুপ টাইপ (Unix – Shell Loop Types)

রিদওয়ান বিন শামীম

 

লুপ হল আদর্শ প্রোগ্রামিং অনুষঙ্গ যার দ্বারা কম্যান্ডের সেটকে পুনরাবৃত্তিক ভাবে সম্পাদন করা যায়। সেল প্রোগ্রামিঙের জন্য প্রযোজ্য লুপের প্রকরণগুলোকে নিচে পরীক্ষা করে দেখা হবে।

  • হোয়াইল লুপ
  • ফর লুপ
  • আনটিল লুপ
  • সিলেক্ট লুপ

 

বিভিন্ন পরিস্থিতির উপর ভিত্তি করে বিভিন্ন লুপ ব্যবহার করতে হয়। এটি ব্যবহারের দক্ষতা প্রোগ্রামিং প্র্যাকটিসের সাথে সাথে বৃদ্ধি পাবে। হোয়াইল লুপ ও ফর লুপ সি, সি প্লাস প্লাস বা পিইআরএল জাতীয় প্রোগ্রামিং ভাষায় পাওয়া যায়।

 

নেস্টিং লুপ

সব ধরণের লুপ নেস্টিং ধারণাকে সমর্থন করে, এই ধারণা অনুসারে একটি লুপকে সদৃশ আরেকটি লুপের ভেতর স্থাপন করা যায়।

এভাবে হোয়াইল লুপ বা সদৃশ অন্য কোনও লুপকে কীভাবে স্থাপন করা যায় তা দেখানো যাক,

এক হোয়াইল লুপকে অন্য হোয়াইল লুপের অংশ হিসেবে ব্যবহার করা যায়, এর সিনট্যাক্স হল,


while command1 ; # this is loop1, the outer loop
do
   Statement(s) to be executed if command1 is true
 
   while command2 ; # this is loop2, the inner loop
   do
      Statement(s) to be executed if command2 is true
   done
 
   Statement(s) to be executed if command1 is true
done

 

লুপ নেস্টিংএর একটি সহজ উদাহরণ হল,


#!/bin/sh
 
a=0
while [ "$a" -lt 10 ]    # this is loop1
do
   b="$a"
   while [ "$b" -ge 0 ]  # this is loop2
   do
      echo -n "$b "
      b=`expr $b - 1`
   done
   echo
   a=`expr $a + 1`
done

 

নয় গণনার লুপের ভেতর আরেকটি গণনা লুপ প্রয়োগ করার ক্ষেত্রে উপরের কোডিং ব্যবহৃত হয়েছে, যা নিম্নোক্ত ফলাফল দেখায়,


0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
5 4 3 2 1 0
6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

এখানে echo –n কাজ করেছে, -n এর জন্য নতুন লাইন ক্যারেকটার স্থাপন রহিত হয়েছে।

 

ইউনিক্সঃ সেল ডিসিশন মেকিং (Unix – Shell Decision Making)

রিদওয়ান বিন শামীম

 

সেল স্ক্রিপ্ট লেখার সময় দুটি প্রদত্ত পাথ থেকে একটি বেছে নেয়ার প্রয়োজন হতে পারে, সেক্ষেত্রে সঠিক সিদ্ধান্ত নেয়ার জন্য কন্ডিশনাল স্টেটমেন্টের সাহায্য নেয়া যেতে পারে।

ভিন্ন কন্ডিশনে ভিন্ন ভিন্ন পদক্ষেপ নিতে পারে ইউনিক্স সেল এমন কন্ডিশনাল স্টেটমেন্টের সাহায্য নেয়, এখানে আমরা দুই ধরণের ডিসিশন মেকিং স্টেটমেন্ট বিষয়ে আলোচনা করব।

  • if...else স্টেটমেন্ট
  • case...esac স্টেটমেন্ট

 

if...else স্টেটমেন্ট

এক সেট প্রদত্ত অপশন থেকে একটি নির্বাচনের জন্য এই পদ্ধতি প্রয়োগ করা হয়। ইউনিক্স সেল if...else স্টেটমেন্টের যে ফর্মগুলো সমর্থন করে তা হল,

  • ..fi statement
  • ..else...fi statement
  • ..elif...else...fi statement

মাল্টিওয়ে ব্রাঞ্চের জন্য মাল্টিপল if...elif স্টেটমেন্ট প্রয়োগ করা সম্ভব হয়, যদিও এটি সবসময় ফলপ্রসূ নয় কারণ ব্রাঞ্চগুলো একক চলকের উপর নির্ভরশীল থাকতে পারে। এসব ক্ষেত্রে ইউনিক্স সেল case...esac স্টেটমেন্ট সমর্থন করে। এটি কেবলমাত্র এক প্রকরণের হয়ে থাকে,

  • case...esac statement

ইউনিক্স সেল case...esac স্টেটমেন্ট অন্যান্য প্রোগ্রামিং ভাষা যেমন সি বা সি প্লাস প্লাস বা পিইআরএলের switch...case এর সদৃশ।

 

ইউনিক্সঃ সেল বেসিক অপারেটরস (Unix – Shell Basic Operators)

রিদওয়ান বিন শামীম

 

প্রত্যেক সেল সমর্থিত কিছু অপারেটর থাকে। আমরা এখানে ডিফল্ট সেল (Bourne) নিয়ে আলোচনা করব।বর্ন সেলের গুরুত্বপূর্ণ যে অপারেটরগুলো নিয়ে এখানে আলোচনা করা হবেঃ

  • এরিথমেটিক অপারেটর
  • রিলেশনাল অপারেটর
  • বুলিয়েন অপারেটর
  • স্ট্রিং অপারেটর
  • ফাইল টেস্ট অপারেটর

বর্ন সেলের নিজের এরিথমেটিক কাজ সম্পাদনের কৌশল নেই কিন্তু তারা বাইরের প্রোগ্রাম যেমন awk বা expr ব্যবহার করে,

নিচের উদাহরণে দুটি সংখ্যা যোগ করার প্রক্রিয়া দেখানো হল,


#!/bin/sh
 
val=`expr 2 + 2`
echo "Total value : $val"

 

এটি যে ফলাফল দেবে তা হল,


Total value:4


 

 

এখানে কয়েকটি ব্যপার মনে রাখা দরকার,

  • অপারেটর ও এক্সপ্রেশনের মাঝে স্পেস থাকতে হয়,
  • সম্পূর্ণ এক্সপ্রেশন ইনভার্টেড কমা দ্বারা আবদ্ধ করা থাকে

 

এরিথমেটিক অপারেটর

বর্ণ সেল যেসব এরিথমেটিক অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

a চলকের মান ১০ ও b চলকের মান ২০ধরে নিচের ছকে আমরা দেখি,

 

অপারেটর উদাহরণ
+ `expr $a + $b` হয় 30
- `expr $a - $b` থেকে পাই -10
* `expr $a \* $b` থেকে পাই 200
/ `expr $b / $a` থেকে পাই 2
% `expr $b % $a` থেকে পাই 0
= a=$b এটি এই বুঝায় যে bএর মান a এর মানের মধ্যে আছে।
== [ $a == $b ] এর রিটার্ন মিথ্যা
!= [ $a != $b ] রিটার্ন সত্য

 

এখানে একটি বিষয় খুব গুরুত্বপূর্ণ যে, কন্ডিশনাল এক্সপ্রেশনকে স্কয়ার ব্র্যাকেটের মধ্যে দুপাশে একটি করে স্পেস দিয়ে আবদ্ধ রাখতে হয়। যেমন,

[ $a == $b ] সঠিক।

[$a==$b] ভুল।

 

সব এরিথমেটিক হিসাব লম্বা পূর্ণসংখ্যার মাধ্যমে করা হয়।

 

রিলেশনাল অপারেটর

বর্ণ সেল যেসব রিলেশনাল অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

অপারেটর উদাহরণ
-eq [ $a -eq $b ] বিবৃতি সত্য নয়
-ne [ $a -ne $b ] বিবৃতি সত্য
-gt [ $a -gt $b ] বিবৃতি সত্য নয়
-lt [ $a -lt $b ] বিবৃতি সত্য
-ge [ $a -ge $b ] বিবৃতি সত্য নয়
-le [ $a -le $b ] বিবৃতি সত্য

 

এখানে একটি বিষয় খুব গুরুত্বপূর্ণ যে, কন্ডিশনাল এক্সপ্রেশনকে স্কয়ার ব্র্যাকেটের মধ্যে দুপাশে একটি করে স্পেস দিয়ে আবদ্ধ রাখতে হয়। যেমন,

[ $a <= $b ] সঠিক।

[$a <= $b] ভুল।

 

বুলিয়েন অপারেটর

বর্ণ সেল যেসব বুলিয়েন অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

a চলকের মান ১০ ও b চলকের মান ২০ধরে নিচের ছকে আমরা দেখি,

 

অপারেটর উদাহরণ
! [ ! false ] বিবৃতি সত্য
-o [ $a -lt 20 -o $b -gt 100 ] বিবৃতি সত্য
-a [ $a -lt 20 -a $b -gt 100 ] বিবৃতি মিথ্যা

 

স্ট্রিং অপারেটর

বর্ণ সেল যেসব স্ট্রিং অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

a চলকের মান "abc" ও b চলকের মান "efg"ধরে নিচের ছকে আমরা দেখি,

 

অপারেটর উদাহরণ
= [ $a = $b ] মিথ্যা বিবৃতি
!= [ $a != $b ] সত্য বিবৃতি
-z [ -z $a ] মিথ্যা বিবৃতি
-n [ -z $a ] সত্য বিবৃতি
str [ $a ] সত্য বিবৃতি

 

ফাইল টেস্ট অপারেটর

ইউনিক্স ফাইলের বিভিন্ন প্রপার্টি টেস্টের জন্য যে অপারেটর সেগুলো নিচে দেয়া হয়েছে।

১০০ বাইটের "test" নামের চলক ফাইলের জন্য টেস্ট অপারেটরঃ

 

অপারেটর উদাহরণ
-b file [ -b $file ] বিবৃতি সত্য
-c file [ -c $file ] বিবৃতি সত্য নয়
-d file [ -d $file ] বিবৃতি সত্য নয়
-f file [ -f $file ] বিবৃতি সত্য
-g file [ -g $file ] বিবৃতি সত্য নয়
-k file [ -k $file ] বিবৃতি সত্য নয়
-p file [ -p $file ] বিবৃতি সত্য নয়
-t file [ -t $file ] বিবৃতি সত্য নয়
-u file [ -u $file ] বিবৃতি সত্য নয়
-r file [ -r $file ] বিবৃতি সত্য
-w file [ -w $file ] বিবৃতি সত্য
-x file [ -x $file ] বিবৃতি সত্য
-s file [ -s $file ] বিবৃতি সত্য
-e file [ -e $file ] বিবৃতি সত্য

 

ইউনিক্সঃ সেল অ্যারি ব্যবহার করা (Unix – Using Shell Arrays)

রিদওয়ান বিন শামীম

 

সেল ভেরিয়েবল একক মান ধারণে সক্ষম। এই ধরণের ভেরিয়েবল বা চলককে স্কেলার চলক বলে। সেল অ্যারি ভেরিয়েবল নামের ভিন্ন একধরনের চলক সমর্থন করে যারা একসাথে অনেকগুলো মান ধারনে সক্ষম। অ্যারি ভেরিয়েবল চলকের সেট গ্রুপিং এর জন্য একটি পদ্ধতি ব্যবহার করে। চলকের নতুন নাম সৃষ্টির পরিবর্তে,একক অ্যারি ভেরিয়েবল ব্যবহার করা যায় যার মধ্যে অন্য চলকগুলোকে সংরক্ষণ করা যাবে।

 

অ্যারি ভ্যালুর বিবৃতি

অ্যারি ভেরিয়েবল ও স্কেলার ভেরিয়েবলের মধ্যে যে পার্থক্য তা নিচে দেখানো হল,

ধরা যাক কোনও চলকের মধ্যে থাকে কিছু ছাত্রের নাম নিয়ে আমরা কাজ করতে চাই, প্রত্যেকটি স্বতন্ত্র চলক (নিচের মত) একটি করে স্কেলার চলক।


NAME01="Zara"
NAME02="Qadir"
NAME03="Mahnaz"
NAME04="Ayan"
NAME05="Daisy"


 

আমরা এই সবগুলো নাম সংরক্ষণের জন্য একক অ্যারি ব্যবহার করতে পারি। নিচে অ্যারি ভেরিয়েবল তৈরির সহজ একটি উপায় দেয়া হল,


array_name[index]=value


 

এখানে array_name হল অ্যারির নাম, index হল আইটেমের ইনডেক্স আর value হল আইটেমের যে ভ্যালু আমরা সেট করতে চাই। উদাহরণ হিসেবে কম্যান্ডগুলো হল,


NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"

 

ksh সেল ব্যবহার করে থাকলে অ্যারি শুরু করতে যে সিনট্যাক্স ব্যবহার করতে হবে তা হল,


set-A array_name value1 value2... valuen

 

bash সেল ব্যবহার করে থাকলে অ্যারি শুরু করতে যে সিনট্যাক্স ব্যবহার করতে হবে তা হল,


array_name=(value1... valuen)

 

অ্যারি ভ্যালুতে প্রবেশ করা

কোনও অ্যারি ভেরিয়েবল তৈরির পর সেটিতে প্রবেশ করার জন্য কোড,


${array_name[index]}


 

এখানে array_name হল অ্যারির নাম, index হল যে ভ্যালু প্রবেশ করাব তার ইনডেক্স।নিচে একটি সহজ উদাহরণ দেয়া যাক,


#!/bin/sh
 
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

 

যেটির ফলাফল হবে এমন,


$./test.sh
First Index: Zara
Second Index: Qadir


 

অ্যারির সবগুলো আইটেমে আমরা নিচের যেকোনো একটি উপায়ে ঢুকতে পারি,


${array_name[*]}
${array_name[@]}


 

এখানে array_name হল সেই অ্যারির নাম যাতে আমরা ঢুকতে চাই। নিচে এর একটি সরল উদাহরণ দেয়া হল,


#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"


 

এটি যে ফলাফল দেখাবে তা হল,


$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy


 

ইউনিক্সঃ স্পেশাল ভেরিয়েবলস (Unix – Special Variables)

রিদওয়ান বিন শামীম

 

পূর্ববর্তী টিউটোরিয়ালে ভেরিয়েবল নামে নন আলফানিউমেরিক ক্যারেক্টার ব্যবহার বিষয়ে সতর্ক করা হয়েছিল, কারণ ইউনিক্স চলকে এদের ভিন্ন অর্থ হয়।

যেমন, $ ক্যারেক্টার কারেন্ট সেলে আইডি নাম্বার বা পিআইডি প্রক্রিয়া বোঝায়।


$echo $$


 

উপরের কম্যান্ড কারেন্ট সেলের পিআইডি যেভাবে বোঝায়,


29949


 

নিচের ছকে সেল স্ক্রিপ্টে ব্যবহার করা যায় এমন স্পেশাল ভেরিয়েবল দেখানো হল,

Variable Description
$0 কারেন্ট স্ক্রিপ্টের ফাইল নেম
$n এই চলক সেসব আর্গুমেন্টের সাথে সমন্বয় করে যারা স্ক্রিপ্টকে সাহায্য করে।
$# স্ক্রিপ্টে সরবরাহ করা আর্গুমেন্টের সংখ্যা
$* সব আর্গুমেন্ট ডাবল কোটেড। কোনও স্ক্রিপ্ট দুটি আর্গুমেন্ট রিসিভ করলে $* , $1 $2 এর সমপর্যায়ের।
$@ সব আর্গুমেন্ট স্বতন্ত্রভাবে ডাবল কোটেড। কোনও স্ক্রিপ্ট দুটি আর্গুমেন্ট রিসিভ করলে $@, $1 $2 এর সমপর্যায়ের।
$? সর্বশেষ সম্পাদিত কম্যান্ডের এক্সিট স্ট্যাটাস
$$ কারেন্ট সেলের প্রসেস নাম্বার
$! সর্বশেষ ব্যাকগ্রাউন্ড সেলের প্রসেস নাম্বার

 

কম্যান্ড লাইন আর্গুমেন্টঃ কম্যান্ড লাইন আর্গুমেন্ট $1, $2, $3,...$9 হল পজিসনাল প্যারামিটার যার $0 প্রকৃত কম্যান্ড, সেল স্ক্রিপ্ট,প্রোগ্রাম বা ফাংশন ও $1, $2, $3, ...$9 হল কম্যান্ডের আর্গুমেন্ট।

নিচের স্ক্রিপ্ট কম্যান্ড লাইন সংশ্লিষ্ট বিভিন্ন স্পেশাল ভেরিয়েবলস ব্যবহার করে,


#!/bin/sh

echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

 

নিচে উপরের স্ক্রিপ্টের পরীক্ষামূলক সম্পাদন দেয়া হল,


$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

 

স্পেশাল প্যারামিটার $* and $@ঃ কম্যান্ড লাইন আর্গুমেন্টে ঢোকার জন্য স্পেশাল প্যারামিটার আছে, $* ও $@ এমন স্পেশাল প্যারামিটার, যারা ডাবল কোটে আবদ্ধ হওয়ার আগ পর্যন্ত একই রকম প্রতিক্রিয়া দেখায়। আমরা অজানা সংখ্যক কম্যান্ড লাইন আর্গুমেন্টের প্রক্রিয়ার জন্য $* বা $@ যেকোনো স্পেশাল প্যারামিটার দিয়ে সেল স্ক্রিপ্ট লিখতে পারি।


#!/bin/sh
 
for TOKEN in $*
do
   echo $TOKEN
done

 

উপরের স্ক্রিপ্টের পরীক্ষামূলক সম্পাদন


$./test.sh Zara Ali 10 Years Old
Zara
Ali
10
Years
Old

 

এক্সিট স্ট্যাটাস

$?চলক পূর্ববর্তী কম্যান্ডের এক্সিট স্ট্যাটাস নির্দেশ করে। এক্সিট স্ট্যাটাস হল একপ্রকারের নিউমেরিক্যাল মান যা কম্যান্ড সম্পন্ন হওয়ার সাথে সাথে আবর্তিত হয়।

নিচে সফল কম্যান্ডের উদাহরণ দেয়া হল,


$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$


 

ইউনিক্সঃ সেল ভেরিয়েবল বা চলক ব্যবহার করা (Unix – Using Shell Variables)

রিদওয়ান বিন শামীম

 

ভেরিয়েবল বা চলক একপ্রকারের ক্যারেক্টার স্ট্রিং যেটিতে আমরা মান আরোপ করি। এই মান সংখ্যা, টেক্সট, ফাইলনেম, ডিভাইস বা যেকোনো ডাটাও হতে পারে। চলক আসলে মূল ডাটার নির্দেশক বই কিছু নয়।

 

চলকের নাম

চলকের নাম অক্ষর, সংখ্যা বা আন্ডারস্কোর বিশিষ্ট হতে পারে। ইউনিক্স সেল চলকের নাম বড় হাতের অক্ষরের হয়।

নিচের উদাহরণ চলকের গ্রহণযোগ্য উদাহরণ


_ALI
TOKEN_A
VAR_1
VAR_2

 

আবার নিচের উদাহরণ চলকের গ্রহণযোগ্য উদাহরণ না।


2_VAR
-VARIABLE
VAR1-VAR2
VAR_A!

এক্ষেত্রে !,*, বা – ব্যবহার করা যাবে না বলেই এটি বৈধ উদাহরণ না। সেলের ক্ষেত্রে এগুলোর স্বতন্ত্র মানে দাঁড়ায়।

 

চলক বিবৃতি

চলককে নিচের কোড দ্বারা বিবৃত করা হয়।


variable_name=variable_value


 

উদাহরণস্বরূপ,


NAME="Zara Ali"


 

এই উদাহরণে NAME হল চলক আর "Zara Ali" হল এতে আরোপিত মান। এধরনের চলককে স্কেলার চলক বলে, একক সময়ে এগুলো একটি মাত্র মান ধারণ করে।

চলকে আমরা যে মান চাই সেল তাই সংরক্ষণের সুযোগ দেয়। যেমন,


VAR1="Zara Ali"
VAR2=100

 

মানে প্রবেশ করা

চলকে সংরক্ষিত মানে প্রবেশ করতে হলে নামের সাথে ( $) চিহ্ন ব্যবহার করতে হয়।

যেমন,


#!/bin/sh
NAME="Zara Ali"
echo $NAME

 

উপরের কোড যে ফলাফল দেখাবে তা হল,


ZaraAli


 

রিড অনলি চলক

readonly কম্যান্ড দ্বারা নির্ধারিত এই চলকের মান পরবর্তীতে আর পরিবর্তন করা যায় না।

 

যেমন নিচের উদাহরণে কোনও নামের মান পরিবর্তন করলে তা ভুল চলক হয়ে যাবে।


#!/bin/sh
NAME="Zara Ali"
readonly NAME
NAME="Qadiri"

 

যার ফলে যে ফলাফল হবে তা হল,


/bin/sh: NAME:This variableis read only.

 

আনসেটিং চলক

কোনও চলককে আনসেট করার পর সেটিতে আর কোনও মান আরোপ করা যায় না।

নিচের উদাহরণে unset কম্যান্ড ব্যবহার করে বিবৃত চলককে আনসেট করার সিনট্যাক্স ব্যবহার করা হয়,


 unset variable_name

 

নিচে এর একটি উদাহরণ দেয়া যাক,

#!/bin/sh


NAME="Zara Ali"
unset NAME
echo $NAME

 

চলকের প্রকারভেদ

সেল সক্রিয় থাকার সময় তিন প্রকারের চলক দেখা যায়,

  • লোকাল চলক,
  • এনভায়রনমেন্ট চলক,
  • সেল চলক।

 

ইউনিক্সঃ vi এডিটর টিউটোরিয়াল । UNIX VI Editor Tutorial

রিদওয়ান বিন শামীম

 

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

  • এটি ইউনিক্স সংশ্লিষ্ট সব অনুসঙ্গে উপযোগী
  • এর প্রায়োগিক দিকগুলো বোর্ডের জন্য বিশেষ উপযোগী
  • এটির অনেক কম রিসোর্স লাগে
  • এটি অন্যান্য এডিটরের চেয়ে অনেক বেশি ইউজার ফ্রেন্ডলি

 

vi এডিটর শুরু করা

নিচের উপায়েগুলোর মাধ্যমে vi এডিটর ব্যবহার শুরু করা যায়,

কম্যান্ড
vi filename
vi -R filename
view filename

নতুন testfile নামক ফাইল তৈরির জন্য,


$vi testfile

 

এর ফলাফলে স্ক্রীনে আমরা যা দেখতে পাব তা হল,


|
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 "testfile" [New File]

 

অপারেশন মোড

vi এডিটর দ্বারা কাজ করার সময় আমরা দুটি মোড দেখতে পাব,

  • কম্যান্ড মোড
  • ইনসার্ট মোড

 

vi এডিটর থেকে বেরিয়ে আসতে

সেভ না করে বেরিয়ে আসতে q! কম্যান্ড, সেভ করতে w কম্যান্ড আর সেভ করে বেরিয়ে আসার জন্য সবচেয়ে সহজ কম্যান্ড ZZ কম্যান্ড আমরা ব্যবহার করতে পারি।

 

ফাইলের পরিসরে মুভ করা

নিচে কয়েকটি কম্যান্ড দেয়া হল যার মাধ্যমে কোনও ক্যারেক্টারকে আমরা ফাইলের পরিসরে মুভ করাতে পারি।

কম্যান্ড বর্ণনা
k কার্সরকে এক লাইন উপরে উঠায়
j কার্সরকে এক লাইন নিচে নামায়
h কার্সরকে এক ক্যারেক্টার বামে সরায়
l কার্সরকে এক ক্যারেক্টার ডানে সরায়

খেয়াল রাখতে হবে,

  • vi এডিটর কেস সেন্সেটিভ
  • কম্যান্ড প্রেফারেন্স একশন সংখ্যার উপর নির্ভর করে

ফাইল মুভ করানোর আরও কিছু কম্যান্ড আছে, যেগুলো মোটামুটিভাবে এগুলোঃ

কম্যান্ড
0 or |
$
w
b
(
)
E
{
}
[[
]]
n|
1G
G
nG
:n
fc
Fc
H
nH
M
L
nL
😡

 

কন্ট্রোল কম্যান্ড

কন্ট্রোল কী এর সাথে ব্যবহার করা যায় এমন কিছু কম্যান্ড নিচে দেয়া হল,

কম্যান্ড
CTRL+d
CTRL+d
CTRL+f
CTRL+u
CTRL+b
CTRL+e
CTRL+y
CTRL+u
CTRL+d
CTRL+b
CTRL+f
CTRL+I

 

ফাইল এডিট করা

ফাইল এডিট করতে ইনসার্ট মোডে থাকতে হয়। কম্যান্ড মোড থেকে ইনসার্ট মোডে যেতে কয়েকটি কম্যান্ড আছে,

কম্যান্ড
i
I
a
A
o
O

 

ক্যারেক্টার ডিলিট করতে

ওপেন করা ফাইল থেকে লাইন ও ক্যারেক্টার ডিলিট করতে প্রয়োজনীয় কম্যান্ডের লিস্ট নিচে দেয়া হল,

কম্যান্ড
x
X
dw
d^
d$
D
dd

 

চেঞ্জ কম্যান্ড

vi এডিটরে লাইন বা ক্যারেক্টার ডিলিট না করে পরিবর্তন করারও সুযোগ রয়েছে, এ সংশ্লিষ্ট কয়েকটি কম্যান্ড নিচে দেয়া হল,

কম্যান্ড
cc
cw
r
R
s
S

 

কপি ও পেস্ট কম্যান্ড

নিচের কমান্ডগুলো কপি ও পেস্ট করার জন্য প্রয়োজন হয়,

কম্যান্ড
yy
yw
p
P

 

এডভান্সড কম্যান্ড

vi এডিটরে আরও কিছু এডভান্সড কম্যান্ড এর ব্যবহারকে আরও ফলপ্রসূ করে তুলছে-

কম্যান্ড
J
<<
>>
~
^G
U
u
J
:f
:f filename
:w filename
:e filename
:cd dirname
:e #
:n
:p
:N
:r file
:nr file

 

ওয়ার্ড ও ক্যারেক্টার সার্চ করতে

সার্চের সময় দুটি কম্যান্ডে ব্যতিক্রম ঘটে,

  • / command ফাইলে ফরোয়ার্ড(ডাউনওয়ার্ড) সার্চ ও
  • ? command ফাইলে ব্যাকওয়ার্ড(আপওয়ার্ড) সার্চ সম্পাদন করে

সার্চ কম্যান্ডের কিছু অনুষঙ্গ নিচে দেয়া হল,

ক্যারেক্টার
^
.
*
$
[
<
>

 

সেট কম্যান্ড

সেট কম্যান্ডের জন্য কম্যান্ড মোডে ফিরে এসে নিচের যে কোনও কম্যান্ড ব্যবহার করে আমরা vi স্ক্রীনের চেহারা ও অনুভূতি পরিবর্তন করতে পারি,

কম্যান্ড
:set ic
:set ai
:set noai
:set nu
:set sw
:set ws
:set wm
:set ro
:set term
:set bf

 

কম্যান্ড রান করানো

vi এডিটরে প্রক্রিয়াধীন প্রকল্পকেও কম্যান্ড দ্বারা রান করানো যায়।

 

টেক্সট রিপ্লেস করা

নিচের কোড ব্যবহার করে শব্দ বা শব্দসমষ্টিকে রিপ্লেস করানো যায়,


:s/search/replace/g


 

 

মনে রাখা দরকার,

  • কম্যান্ড ব্যবহারের জন্য কম্যান্ড মোড ব্যবহার করা দরকার
  • সব কম্যান্ডের জন্য কেস(ক্যাপিটালাইজেশন) সচেতন থাকা দরকার
  • টেক্সট প্রবেশ করাতে ইনসার্ট মোডে থাকতে হবে

 

ইউনিক্সঃ সেল কি? (Unix – What is Shells?)

রিদওয়ান বিন শামীম

 

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

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

 

সেল প্রম্পট

$ দ্বারা কম্যান্ড প্রম্পট বোঝায়, এটি সেলের মাধ্যমে প্রবর্তিত হয়ে থাকে। কীবোর্ডে এন্টার চাপার পর সেল ইনপুট পড়তে পারে। ইনপুটের প্রথম শব্দ দেখেই সেল কম্যান্ড সম্পর্কে ধারণা পেয়ে যায়। শব্দ মূলত নিরবচ্ছিন্ন ক্যারেকটারের সেট, স্পেস এবং ট্যাব যাদেরকে পৃথক করে রাখে।

নিচের উদাহরণে ডেট কম্যান্ডের উদাহরণ দেয়া হল,


$date
ThuJun2508:30:19 MST2009

কম্যান্ড প্রম্পটকে পরিবেশ চলকের মাধ্যমে কাস্টমাইজ করা যায়।

 

সেল টাইপ

ইউনিক্সে প্রধানত দুই ধরণের সেল টাইপ আছে,

  • বর্ন সেল
  • সি সেল

এদের মধ্যে বর্ন সেল আবার কয়েক রকমের হয়,

  • বর্ন সেল,
  • কর্ন সেল,
  • বর্ন এগেইন সেল,
  • পিওসিক্স সেল।

কয়েকটি সি টাইপ সেল হল,

  • সি সেল
  • টেনেক্স/টপস সি সেল

মূল ইউনিক্স সেল স্টিফেন বার্নের উদ্ভাবিত ধারণা, ৭০এর দশকের মাঝামাঝি তিনি নিউ জার্সির এটিএন্ড টি বেল ল্যাবে থাকার সময় এটি লেখেন।

 

সেল স্ক্রিপ্টস

সেল স্ক্রিপ্টস এর মূল ধারণা হল কম্যান্ডের লিস্ট, যা সম্পাদনার ক্রমানুসারে সজ্জিত থাকে। আদর্শ সেল স্ক্রিপ্টে ধাপ গুলো # চিহ্ন দ্বারা সজ্জিত থাকে।

 

পরীক্ষামূলক স্ক্রিপ্ট

.sh এক্সটেনশন দ্বারা এটিকে বোঝানো হয়, এক্ষেত্রে সিস্টেমকে নিম্নোক্ত কোডের মাধ্যমে আগেই জানাতে হয় যে এরকমের একটি স্ক্রিপ্ট চালু করা হচ্ছে।


 #!/bin/sh

 

এই ধরণের স্ক্রিপ্ট চালুর জন্য আগে সেবাং (shebang) লাইন এবং তার পর কম্যান্ড যোগ করতে হয়।


#!/bin/bashpwdls

 

সেল কম্যান্ড

স্ক্রিপ্টে নিম্নোক্ত ভাবে কম্যান্ড লেখা যায়,


#!/bin/bash
 
# Author : Zara Ali
# Copyright (c) Tutorialspoint.com
# Script follows here:
pwd
ls

উপরের উপাদানগুলো সংরক্ষণ করে স্ক্রিপ্টকে সম্পাদনযোগ্য করা হয়,


$chmod+x test.sh

 

এখন সম্পাদনযোগ্য সেল স্ক্রিপ্ট পাওয়া গেলো,


$./test.sh

 

যা থেকে নিম্নোক্ত ফলাফল পাওয়া যায়,


/home/amrood
index.htm  unix-basic_utilities.htm  unix-directories.htm  
test.sh    unix-communication.htm    unix-environment.htm

বর্তমান ডিরেক্টরিতে থাকা কোনও প্রোগ্রাম সম্পাদনের জন্য ./program_name ব্যবহার করা হয়।

 

এক্সটেনডেড সেল স্ক্রিপ্ট

নিচের কম্যান্ড read কম্যান্ড ব্যবহার করে যা কীবোর্ড থেকে ইনপুট নেয় এবং PERSON চলকের মান বিবৃত করে ও STDOUT এ মুদ্রিত করে।


#!/bin/sh
 
# Author : Zara Ali
# Copyright (c) Tutorialspoint.com
# Script follows here:
 
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

 

স্ক্রিপ্টের পরীক্ষামূলক সম্পাদন,


$./test.sh
What is your name?
Zara Ali
Hello, Zara Ali
$

 

ইউনিক্স – নেটওয়ার্ক কমিউনিকেশন অনুষঙ্গ (Unix – Network Communication Utilities)

রিদওয়ান বিন শামীম

 

বণ্টনকৃত পরিবেশে কাজ করার সময় রিমোট ইউজারদের সাথে যোগাযোগ করতে অতে পারে, রিমোট ইউনিক্স মেশিনেও প্রবেশযোগ্যতা থাকতে হবে।

নেটওয়ার্কিংকৃত, বণ্টনকৃত পরিবেশে কাজ করছে এমন ইউজারদের জন্য প্রয়োজনীয় হতে পারে এমন বেশকিছু ইউনিক্স অনুষঙ্গ বা ইউটিলিটি আছে, এই টিউটোরিয়ালে এমন কয়েকটি নিয়ে আমরা কাজ করব।

 

পিং ইউটিলিটি

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

  • হার্ডওয়ার ও সফটওয়ারের সমস্যা নির্ণয় ও পৃথক করা,
  • বিভিন্ন নেটওয়ার্ক ও ফরেন হোষ্টের স্ট্যাটাস নির্ণয় করা,
  • নেটওয়ার্ক টেস্ট, পরিমাপ ও নিয়ন্ত্রণ করা।

পিং কম্যান্ড ব্যবহারের জন্য যে সিনট্যাক্স ব্যবহার করতে হয় তা হল,


$ping hostnameor ip-address


 

এই কম্যান্ড প্রতি সেকেন্ডে একটি করে রেসপন্স প্রিন্ট করা শুরু করবে। এটি থামাতে CNTRL + C কী চাপতে হয়।

নেটওয়ার্কে পাওয়া হোষ্টের প্রাপ্যতা জানতে নিচের উদাহরণ সাহায্য করবে,


$ping google.com
PING google.com (74.125.67.100) 56(84) bytes of data.
64 bytes from 74.125.67.100: icmp_seq=1 ttl=54 time=39.4 ms
64 bytes from 74.125.67.100: icmp_seq=2 ttl=54 time=39.9 ms
64 bytes from 74.125.67.100: icmp_seq=3 ttl=54 time=39.3 ms
64 bytes from 74.125.67.100: icmp_seq=4 ttl=54 time=39.1 ms
64 bytes from 74.125.67.100: icmp_seq=5 ttl=54 time=38.8 ms
--- google.com ping statistics ---
22 packets transmitted, 22 received, 0% packet loss, time 21017ms
rtt min/avg/max/mdev = 38.867/39.334/39.900/0.396 ms
$

 

হোষ্ট পাওয়া না গেলে এটি যে ধরণের ব্যবহার করবে তা হল,


$ping giiiiiigle.com
ping: unknown host giiiiigle.com
$

 

এফটিপি ইউটিলিটি

এফটিপি বা ফাইল ট্রান্সফার প্রটোকল এক কম্পিউটার থেকে অন্য কম্পিউটারে ফাইল আপলোড বা ডাউনলোড করতে সাহায্য করে।

এফটিপির নিজস্ব ইউনিক্স টাইপ কম্যান্ড আছে যা আমাদেরকে নিচের কাজগুলো করতে সাহায্য করে।

  • রিমোট হোষ্টে সংযুক্ত থাকা ও লগইন করা,
  • ডিরেক্টরি নেভিগেট করা,
  • ডিরেক্টরি কন্টেন্ট তালিকাবদ্ধ করা,
  • ফাইল রাখা ও পাওয়া,
  • ascii, ebcdic বা binary ফাইল ট্রান্সফার করা।

পিং কম্যান্ড ব্যবহারের সিনট্যাক্স হল,


 $ftp hostnameor ip-address

 

প্রয়োজনীয় কম্যান্ডের কয়েকটি নিচে লিপিবদ্ধ হল।

 

কম্যান্ড বর্ণনা
put filename লোকাল মেশিন থেকে রিমোট মেশিনে ফাইলনেম আপলোড করা
get filename রিমোট মেশিন থেকে লোকাল মেশিনে ফাইলনেম ডাউনলোড করা
mput file list লোকাল মেশিন থেকে রিমোট মেশিনে একাধিক ফাইল আপলোড করা
mget file list রিমোট মেশিন থেকে লোকাল মেশিনে একাধিক ফাইল ডাউনলোড করা
prompt off প্রম্পট বন্ধ করা
prompt on প্রম্পট চালু করা
dir রিমোট মেশিনের কারেন্ট ডিরেক্টরিতে থাকা সব ফাইল তালিকাবদ্ধ করা
cd dirname ডিরেক্টরিকে রিমোট মেশিনের dirname তে পরিণত করা
lcd dirname ডিরেক্টরিকে লোকাল মেশিনের dirname তে পরিণত করা
quit কারেন্ট লগইন থেকে লগআউট করা

 

কিছু কম্যান্ডের উদাহরণ নিচে দেয়া হল,


$ftp amrood.com
Connected to amrood.com.
220 amrood.com FTP server (Ver 4.9 Thu Sep 2 20:35:07 CDT 2009)
Name (amrood.com:amrood): amrood
331 Password required for amrood.
Password:
230 User amrood logged in.
ftp> dir
200 PORT command successful.
150 Opening data connection for /bin/ls.
total 1464
drwxr-sr-x   3 amrood   group       1024 Mar 11 20:04 Mail
drwxr-sr-x   2 amrood   group       1536 Mar  3 18:07 Misc
drwxr-sr-x   5 amrood   group        512 Dec  7 10:59 OldStuff
drwxr-sr-x   2 amrood   group       1024 Mar 11 15:24 bin
drwxr-sr-x   5 amrood   group       3072 Mar 13 16:10 mpl
-rw-r--r--   1 amrood   group     209671 Mar 15 10:57 myfile.out
drwxr-sr-x   3 amrood   group        512 Jan  5 13:32 public
drwxr-sr-x   3 amrood   group        512 Feb 10 10:17 pvm3
226 Transfer complete.
ftp> cd mpl
250 CWD command successful.
ftp> dir
200 PORT command successful.
150 Opening data connection for /bin/ls.
total 7320
-rw-r--r--   1 amrood   group       1630 Aug  8 1994  dboard.f
-rw-r-----   1 amrood   group       4340 Jul 17 1994  vttest.c
-rwxr-xr-x   1 amrood   group     525574 Feb 15 11:52 wave_shift
-rw-r--r--   1 amrood   group       1648 Aug  5 1994  wide.list
-rwxr-xr-x   1 amrood   group       4019 Feb 14 16:26 fix.c
226 Transfer complete.
ftp> get wave_shift
200 PORT command successful.
150 Opening data connection for wave_shift (525574 bytes).
226 Transfer complete.
528454 bytes received in 1.296 seconds (398.1 Kbytes/s)
ftp> quit
221 Goodbye.
$

 

টেলনেট ইউটিলিটি

টেলনেট একধরনের ইউটিলিটি যা এক প্রান্তের ব্যবহারকারীকে নেটওয়ার্কের অন্য প্রান্তের কম্পিউটারের সাথে যোগাযোগ স্থাপন, লগইন ও তাতে কাজ সম্পাদনের সুযোগ দেয়। টেলনেটের মাধ্যমে লগইন অবস্থায় রিমোটলি কানেক্টেড মেশিনের মাধ্যমে যেকোনো কাজ করা সম্ভব। টেলনেট সেশনের উদাহরণ,


C:>telnet amrood.com
Trying...
Connected to amrood.com.
Escape character is '^]'.
 
login: amrood
amrood's Password: 
*****************************************************
*                                                   *
*                                                   *
*    WELCOME TO AMROOD.COM                          *
*                                                   *
*                                                   *
*****************************************************
 
Last unsuccessful login: Fri Mar  3 12:01:09 IST 2009
Last login: Wed Mar  8 18:33:27 IST 2009 on pts/10
 
   {  do your work }
 
$ logout
Connection closed.
C:>

 

ফিঙ্গার ইউটিলিটি

ফিঙ্গার কম্যান্ড প্রদত্ত হোষ্টে ব্যবহারকারীর তথ্য প্রদর্শন করে। ফিঙ্গার কম্যান্ডের সিনট্যাক্স এরকম,

লোকাল মেশিনে লগইনকৃত সব ব্যবহারকারীদের ক্ষেত্রে,


$ finger
Login     Name       Tty      Idle  Login Time   Office
amrood               pts/0          Jun 25 08:03 (62.61.164.115)

 

লোকাল মেশিনের নির্দিষ্ট কোনও ব্যবহারকারীর ক্ষেত্রে


$ finger amrood
Login: amrood                           Name: (null)
Directory: /home/amrood                 Shell: /bin/bash
On since Thu Jun 25 08:03 (MST) on pts/0 from 62.61.164.115
No mail.
No Plan.

 

রিমোট মেশিনে লগইনকৃত সব ব্যবহারকারীদের ক্ষেত্রে,


$ finger @avtar.com
Login     Name       Tty      Idle  Login Time   Office
amrood               pts/0          Jun 25 08:03 (62.61.164.115)

 

রিমোট মেশিনের নির্দিষ্ট কোনও ব্যবহারকারীর ক্ষেত্রে,


$ finger amrood@avtar.com
Login: amrood                           Name: (null)
Directory: /home/amrood                 Shell: /bin/bash
On since Thu Jun 25 08:03 (MST) on pts/0 from 62.61.164.115
No mail.
No Plan.

 

ইউনিক্স প্রসেস ম্যানেজমেন্ট (Unix – Processes Management)

রিদওয়ান বিন শামীম

 

ইউনিক্স সিস্টেমে প্রোগ্রাম রান করানোর সময় সিস্টেম প্রোগ্রামের উপযুক্ত পরিবেশ তৈরি করে নেয়। অপারেটিং সিস্টেম pid বা প্রসেস আইডি দ্বারা প্রসেসকে ট্র্যাক করে।

 

প্রসেস শুরু করা

প্রসেস শুরু বা রান করানোর সময় দুই ভাবে আমরা এটি করতে পারি,

  • ফোরগ্রাউন্ড প্রক্রিয়ায় ও
  • ব্যাকগ্রাউন্ড প্রক্রিয়ায়

 

ফোরগ্রাউন্ড প্রক্রিয়া

ফোরগ্রাউন্ড প্রক্রিয়ায় সব ফাইলকে ডিরেক্টরিতে তালিকাবদ্ধ দেখতে চাইলে যে কম্যান্ড ব্যবহার করতে হবে তা হল,


$ls ch*.doc

 

.doc দ্বারা শেষ হওয়া নামের সব ফাইল এখানে দেখাবে,


ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

 

ব্যাকগ্রাউন্ড প্রক্রিয়া

এটি শুরু করার জন্য কমান্ডে ( &) চিহ্ন ব্যবহার করা হয়,


$ls ch*.doc
&

 

ch দ্বারা শুরু ও .doc দ্বারা শেষ এমন নামের ফাইলের জন্য,


ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc


 

এবার এন্টার চাপলে আমরা দেখতে পাব,


[1]  +  Done                 ls ch*.doc&
$

 

রানিং প্রক্রিয়া লিস্টিং করা

ps কম্যান্ড ব্যবহার করে আমরা এটি করতে পারব,


$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

 

ps এর জন্য সবচেয়ে বেশি ব্যবহৃত ফ্ল্যাগ হল –f,


$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

 

–f কম্যান্ডের অধীনে থাকা সব ফিল্ডের তালিকা,

 

ফিল্ডের তালিকা
UID
PID
PPID
C
STIME
TTY
TIME
CMD

 

ps কম্যান্ডের সাথে ব্যবহৃত হয় এমন আরও কিছু অপশন হল,

 

অপশন
-a
-x
-u
-e

 

প্রসেস থামাতে

কীবোর্ড থেকে CTRL + C চেপে বা ps কম্যান্ড ব্যবহারের পর kill কম্যান্ড ব্যবহার করে প্রসেস থামানো যায়,


$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

 

যেমন, নিচের উদাহরণে kill -9 কম্যান্ড ব্যবহার করা হয়েছে।


$kill-96738
Terminated

 

কয়েক ধরণের প্রসেস যা ইউনিক্সে অন্তর্ভুক্ত হতে পারে এদের নিচে দেয়া হল,

  • প্যারেন্ট ও চাইল্ড প্রসেস,
  • জম্বি এবং অরফান প্রসেস,
  • ডেমন প্রসেস

 

টপ কম্যান্ড

বিভিন্ন বিষয়ের উপর ভিত্তি করে প্রসেস প্রদর্শনের জন্য টপ কম্যান্ড খুব সুবিধাজনক।

জব আইডি বনাম প্রসেস আইডিঃ ব্যাকগ্রাউন্ড আর সাসপেন্ডেড প্রসেস জব নাম্বারের মাধ্যমে সম্পন্ন হয়,এটি প্রসেস আইডি থেকে ভিন্ন কারণ এটি একটু ছোট।

 

ইউনিক্সঃ পাইপ এবং ফিল্টার (Unix – Pipes and Filters)

রিদওয়ান বিন শামীম

 

ইউনিক্সে দুটি কম্যান্ড এমনভাবে সংযুক্ত করা যায় যাতে এক প্রোগ্রামের আউটপুট অন্য প্রোগ্রামের ইনপুট হিসেবে ব্যবহৃত হতে পারে। পাইপ থেকে দুই বা ততোধিক প্রোগ্রাম এভাবে সংযুক্ত হতে পারে।

কম্যান্ড লাইনে দুটি কম্যান্ডের মাঝে উল্লম্ব (|) কম্যান্ড ব্যবহার করে পাইপ করা যায়। এক প্রোগ্রাম অন্য প্রোগ্রামের থেকে ইনপুট

নিয়ে আদর্শ আউটপুট দেখালে তাকে filter হিসেবে দেখানো হয়।

 

গ্রেপ কম্যান্ড

এটি নির্দিষ্ট লাইন প্যাটার্নের সন্ধান করে, এর সিনট্যাক্স হল,


$grep pattern file(s)

 

গ্রেপকে ফাইলনেম না দিলে এটি পুরো স্ট্যান্ডার্ড ইনপুটকে পড়ে, আর এভাবেই সকল ফিল্টার প্রোগ্রাম কাজ করে,


$ls -l | grep "Aug"
-rw-rw-rw-   1 john  doc     11008 Aug  6 14:10 ch02
-rw-rw-rw-   1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--   1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

 

গ্রেপ কম্যান্ডের সাথে কাজ করে এমন কয়েকটি অপশন,

 

অপশন
-v
-n
-l
-c
-i

 

কেস ইনটেনসিভ সার্চের জন্য -i অপশন ব্যবহার করতে পারি,


$ls -l | grep -i "carol.*aug"
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

 

সর্ট কম্যান্ড

সর্ট কম্যান্ড টেক্সটের লাইনকে এলফাবেটিকেলি বা নিউমেরিকালি সজ্জিত করে,


$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java
Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe's Peppers
$

 

সর্টিং কন্ট্রোলের জন্য কিছু অপশন আছে,

অপশন
-n
-r
-f
+x

 

নিচের পাইপ ls, grep, এবং sort এসব কম্যান্ডের সমন্বয়ে হয়ে থাকে,


$ls -l | grep "Aug" | sort +4n
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-rw-  1 john  doc     11008 Aug  6 14:10 ch02
$

pg ও অন্যান্য কম্যান্ড

লং ডিরেক্টরি লিস্টিংকে সহজ সর্টেড লিস্টিং করতে more কম্যান্ড দ্বারা আউটপুটকে পাইপ করাতে হয়,


$ls -l | grep "Aug" | sort +4n | more
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--  1 john  doc     14827 Aug  9 12:40 ch03
        .
        .
        .
-rw-rw-rw-  1 john  doc     16867 Aug  6 15:56 ch05
--More--(74%)

এরপর ফাইলসাইজ দ্বারা সর্টেড টেক্সটে স্ক্রিন ফিলআপ হয়ে যাবে, এরপর অন্য যেকোনো প্রোগ্রামের জন্য কম্যান্ড লিস্টেড করা যাবে ইউনিক্স ব্যবহার করে।

 

ইউনিক্স বেসিক ইউটিলিটিঃ প্রিন্টিং, ইমেইল (Unix Basic Utility, Printing, Email)

রিদওয়ান বিন শামীম

ইউনিক্স অপারেটিং সিস্টেম ও এর বেসিক কম্যান্ড সম্পর্কে আপনাদের নিশ্চয়ই কিছু ধারণা হয়েছে, এই টিউটোরিয়ালে এর এমন কিছু বেসিক ইউটিলিটি নিয়ে কাজ করা হবে যা আমাদের দৈনন্দিন জীবনে অনেক কাজে লাগে।

ফাইল প্রিন্ট করা

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

ইউনিক্সের অনেক ভার্সন 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

 

ইউনিক্স – এনভায়রনমেন্ট (Unix – Environment)

রিদওয়ান বিন শামীম

 

ইউনিক্সের একটি গুরুত্বপূর্ণ ধারণা হল এর এভায়রনমেন্ট , যা এভায়রনমেন্ট চলকের মাধ্যমে বিবৃত হয়। এদের কয়েকটি সিস্টেমের মাধ্যমে, কয়েকটি সেলের মাধ্যমে, কয়েকটি আমাদের অর্থাৎ ব্যবহারকারীদের মাধ্যমে আর কয়েকটি এমন প্রোগ্রামের মাধ্যমে যা কিনা অন্য প্রোগ্রাম সেট করে।

চলক হল ক্যারেক্টার স্ট্রিং যার উপর আমরা মান আরোপ করি, যা সংখ্যা হতে পারে, টেক্সট, ফাইলনেম, ডিভাইস অথবা অন্য কোনও রকমের ডাটাও হতে পারে।

যেমন, TEST নামের চলক সেট করে তাতে echo কম্যান্ড ব্যবহার করে মান আরোপ করতে,


$TEST="Unix Programming"
$echo $TEST
Unix Programming

 

সিস্টেমে লগইনের সময় এই সংশ্লিষ্ট দুটি প্রক্রিয়া হয়,

  • /etc/profile
  • profile

এই প্রক্রিয়া যে কর্মসূচি অনুসরণ করে তা হল,

  • সেল চেক করে /etc/profile ফাইল কোথায় আছে
  • এটিকে পাওয়া গেলে সেল এটিকে পড়ে। না পাওয়া গেলে স্কিপ করে যায়, কোনও এরর ম্যাসেজ দেখানো হয় না।
  • সেল চেক করে হোম ডিরেক্টরির কোথায় .profile ফাইল আছে।
  • এটিকে পাওয়া গেলে সেল এটিকেও পড়ে। না পাওয়া গেলে এটিও স্কিপ করে যায়, কোনও এরর ম্যাসেজ দেখানো হয় না।

যখন দুটি ফাইলই পড়া হয়ে যায় তখন সিস্টেম এই প্রম্পট দেখায়,


$

এটি সেই প্রম্পট যেটিতে কোনও কম্যান্ড প্রবেশ করিয়ে সম্পাদন করানো যায়।

.profile ফাইল

ইউনিক্স মেশিনের এডমিন /etc/profile ফাইলের দেখাশোনা করে, আর .profile ফাইল ব্যবহারকারীর দায়িত্বে থাকে, এই ফাইলে যত খুশি সেল কাস্টমাইজেশন তথ্য প্রবেশ করানো যায়, সর্বনিম্ন যে তথ্যগুলো কনফিগার করতেই হবে তা হল,

  • যে টার্মিনাল ব্যবহার করছি তার টাইপ
  • কম্যান্ডের জন্য ডিরেক্টরির লিস্ট
  • টার্মিনালে প্রভাব বিস্তারকারী চলকের তালিকা

 

টার্মিনাল টাইপ ঠিক করা

বেশিরভাগ ইউজার টার্মিনালকে সবচেয়ে কম কমন ডিনমিনেটরে সেট করেন,


$TERM=vt100
$

 

পাথ ঠিক করা

পাথকে নিচের কমান্ডে সেট করতে হয়,


$PATH=/bin:/usr/bin
$

 

 

সেলে আবেদনকৃত কোনও কম্যান্ড যদি পাথ চলক নির্দেশিত ডিরেক্টরিতে না পাওয়া যায় তাহলে নিচের মত করে ম্যাসেজ দেখাবে,


$hellohello:not found
$

 

PS1 আর PS2 চলক

সেলের কম্যান্ড প্রম্পট PS1চলকে সংরক্ষিত থাকে,


$PS1='=>'
=>
=>
=>

PS1 এর মান সেট করতে নিচের কম্যান্ড ব্যবহার করা যায়,

 


=>PS1="[\u@\h \w]\$"
[root@ip-72-167-112-17 /var/www/tutorialspoint/unix]$
[root@ip-72-167-112-17 /var/www/tutorialspoint/unix]$

 

PS1 এর ভ্যালু আর্গুমেন্ট হিসেবে ব্যবহার করা যায় এমন কিছু এস্কেপ সিকোয়েন্স নিচে তালিকাবদ্ধ করা হল।

 

এস্কেপ সিকোয়েন্স
\t
\d
\n
\s
\W
\w
\u
\h
\#
\$

 

অসমাপ্ত কম্যান্ডের জন্য সেকেন্ডারি প্রম্পট ব্যবহৃত হয়, এর ডিফল্ট সাইন > যা PS2 সেল চলকের পুনর্বিন্যাসের মাধ্যমে পরিবর্তিত হতে পারে,


$ echo "this is a
> test"
this is a
test
$

 

পরিবর্তিত প্রম্পটের দ্বারা PS2কে পুনঃবিবৃত করার উদাহরণ,


$ PS2="secondary prompt->"
$ echo "this is a
secondary prompt->test"
this is a
test
$

পরিবেশ চলক

গুরুত্বপূর্ণ পরিবেশ চলকের কয়েকটির তালিকা এখানে দেয়া হল,

চলক
DISPLAY
HOME
IFS
LANG
LD_LIBRARY_PATH
PATH
PWD
RANDOM
SHLVL
TERM
TZ
UID

 

কিছু পরিবেশ চলকের উদাহরণ,


$ echo $HOME
/root
]$ echo $DISPLAY
$ echo $TERM
xterm
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/home/amrood/bin:/usr/local/bin
$

 

ইউনিক্সঃ ফাইল পারমিশন ও এক্সেস মোড (Unix – File Permission / Access Modes)

রিদওয়ান বিন শামীম

 

ফাইল ওনারশিপ ইউনিক্সের একটি গুরুত্বপূর্ণ উপাদান যা ফাইল ষ্টোরের নিরাপদ উপায় হিসেবে প্রয়োজন। ইউনিক্সের প্রত্যেকটি ফাইলে যে এট্রিবিউটগুলো থাকে সেগুলো হল,

  • ওনারের পারমিশন,
  • গ্রুপ পারমিশন,
  • অন্যান্য পারমিশন

 

পারমিশন ইনডিকেটর

ls -l কম্যান্ড ব্যবহার করে পারমিশন সংক্রান্ত অনেক তথ্য দেখা যায়,


$ls -l /home/amrood
-rwxr-xr-- 1 amrood   users 1024 Nov 2 00:10 myfile
drwxr-xr--- 1 amrood   users 1024 Nov 2 00:10 mydir

 

read (r), write (w), execute (x) এই অর্ডার ফলো করে

  • প্রথম তিন ক্যারেক্টার ফাইল ওনারের পারমিশন,
  • দ্বিতীয় তিন ক্যারেক্টার গ্রুপ পারমিশন আর
  • শেষ তিন ক্যারেক্টার বাকি সব পারমিশন

 

ফাইল এক্সেস মোড

ইউনিক্সে পারমিশনের বিল্ডিং ব্লক হল এই তিনটি,

  • লেখা
  • পড়া
  • এক্সেকিউট করা

 

ডিরেক্টরি এক্সেস মোড

অন্যান্য ফাইলের মত এদেরও বিল্ডিং ব্লক এগুলোঃ

  • লেখা
  • পড়া
  • এক্সেকিউট করা

যদিও এদের ক্ষেত্রে কিছু মৌলিক পার্থক্য আছে।

 

পারমিশন চেঞ্জ করা

দুটি উপায়ে chmod কম্যান্ড ব্যবহার করে এটি করা যায়,

সিম্বোলিক মোডে chmod কম্যান্ড ব্যবহার করেঃ টেস্টফাইলে ls -1 ব্যবহার করে ফাইলের পারমিশন,


$ls-l testfile
-rwxrwxr--1 amrood   users1024Nov200:10 testfile

 

যার ফলে পারমিশন চেঞ্জ দেখতে পাব,


$chmod o+wx testfile
$ls -l testfile
-rwxrwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod u-x testfile
$ls -l testfile
-rw-rwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod g=rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

 

সিঙ্গেল লাইনের কম্যান্ড সমন্বয়ের ক্ষেত্রে,


$chmod o+wx,u-x,g=rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

 

এবসলিউট পারমিশন হিসেবে chmod কম্যান্ড ব্যবহার করে

প্রত্যেকটি পারমিশন একটি করে এসাইনড ভ্যালু ধারণ করে, এগুলো মোটামুটি এরকম,

 

নাম্বার অক্টাল পারমিশন রিপ্রেজেন্টেশন রেফারেন্স
0 No permission ---
1 Execute permission --x
2 Write permission -w-
3 Execute and write permission: 1 (execute) + 2 (write) = 3 -wx
4 Read permission r--
5 Read and execute permission: 4 (read) + 1 (execute) = 5 r-x
6 Read and write permission: 4 (read) + 2 (write) = 6 rw-
7 All permissions: 4 (read) + 2 (write) + 1 (execute) = 7 rwx

 

টেস্ট ফাইল ব্যবহারের উদাহরণ,


$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

 

এরফলে আমরা যে পারমিশন চেঞ্জ দেখতে পাব,


$ chmod 755 testfile
$ls -l testfile
-rwxr-xr-x  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 743 testfile
$ls -l testfile
-rwxr---wx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 043 testfile
$ls -l testfile
----r---wx  1 amrood   users 1024  Nov 2 00:10  testfile

 

ওনার পরিবর্তন

chown কম্যান্ড ব্যবহার করে ফাইলের ওনারশিপ পরিবর্তন করতে,


$ chown user filelist

 

উদাহরণ,


$ chown amrood testfile
$

 

এটি প্রদত্ত ফাইলের ওনারকে amrood নামে পরিবর্তিত করে।

 

গ্রুপ ওনার পরিবর্তন

এটির জন্য যে সিনট্যাক্স ব্যবহার করতে হয়,


$ chgrpgroup filelist

 

উদাহরণ,


$ chgrp special testfile
$

যেটিতে প্রদত্ত ফাইলের গ্রুপ special গ্রুপে পরিবর্তিত হয়ে যায়।

 

SUID ও SGID ফাইল পারমিশনঃ

এধরনের কম্যান্ড ব্যবহার করে এ ধরণের পারমিশন সম্পর্কে জানা যায়,


$ ls -l /usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47  /usr/bin/passwd*
$

এখানে SUID বিট সেট আর এর কম্যান্ড রুট থেকে আসে।

 

যেকোনো ডিরেক্টরির জন্য SUID ও SGID bits সেট করতে নিচের সিনট্যাক্স প্রয়োগ করা যেতে পারে,


$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root  4096 Jun 19 06:45 dirname
$

 

ইউনিক্সঃ ডিরেক্টরি ব্যবস্থাপনা (Unix folder/directory Management)

রিদওয়ান বিন শামীম

 

ডিরেক্টরি হল একটি ফাইল যার প্রধান কাজ হল ফাইলনেম ও এরকম অন্যান্য তথ্য লিপিবদ্ধ রাখা। সকল ফাইল, তা যেমনই হোক সাধারণ, বিশেষ বা ডিরেক্টরির, তা ডিরেক্টরিতে সংরক্ষিত থাকে।

ফাইল ও ডিরেক্টরি ব্যবস্থাপনার জন্য ইউনিক্স একটি ক্রমবিন্যাসগত কাঠামো ব্যবহার করে। এই কাঠামোকে ডিরেক্টরি ট্রি বলে। এই ট্রিতে সিঙ্গেল রুট নড, স্ল্যাস ক্যারেক্টার ( /) ও অন্যান্য ডিরেক্টরি থাকে যা নিয়ে আমরা নিচে আলোচনা করব।

হোম ডিরেক্টরি

প্রথমে লগইন করার সময় আমরা যে ডিরেক্টরি ব্যবহার করি সেটি হোম ডিরেক্টরি, নিচের কম্যান্ড ব্যবহার করে যেকোনো সময় হোম ডিরেক্টরিতে যাওয়া যায়


 $cd ~
 $

 

এখানে ~ চিহ্ন হোম ডিরেক্টরি নির্দেশক। অন্য কোনও ইউজারনেম ডিরেক্টরিতে যেতে চাইলে,


 $cd ~username
 $

 

সর্বশেষ ডিরেক্টরিতে যেতে চাইলে,


 $cd -
 $

 

পরম/আপেক্ষিক পাথনেম

ডিরেক্টরিগুলো ক্রমবিন্যাসে সজ্জিত, উপরে (/) চিহ্ন নিয়ে। ক্রমবিন্যাসে সজ্জিত যেকোনো ফাইল এর পাথনেম সহ বিবৃত হয়। এবসলিউট ফাইলনেমের উদাহরণ,


 /etc/passwd
 /users/sjones/chem/notes
 /dev/rdsk/Os3

 

কারেন্ট ওয়ার্কিং ডিরেক্টরিতে পাথনেম আপেক্ষিকও হতে পারে। এক্ষেত্রে স্ল্যাস ক্যারেক্টার ( /) সহ শুরু হবে না। এরকম কিছু পাথনেম নিচের মত হতে পারে,


 chem/notes
 personal/res

 

ক্রমবিন্যাসে ঠিক কোথায় অবস্থান করে কাজ করছি তা জানতে কারেন্ট ওয়ার্কিং ডিরেক্টরি প্রিন্ট করতে pwd কম্যান্ড প্রবেশ করাতে হবে।


 $pwd
 /user0/home/amrood
 $

 

লিস্টিং ডিরেক্টরি

ডিরেক্টরিতে ফাইল লিপিবদ্ধ করতে নিচের সিনট্যাক্স ব্যবহৃত হয়,


$ls dirname

 

নিচের উদাহরণে /usr/local ডিরেক্টরিতে লিপিবদ্ধ সব ফাইল দেখানো হল,


X11       bin          gimp       jikes       sbin
ace       doc          include    lib         share
atalk     etc          info       man         ami

 

ডিরেক্টরি তৈরি করা

নিচের কম্যান্ডগুলোর মাধ্যমে ডিরেক্টরি তৈরি করা যায়,


$mkdir dirname

 

যেমন,


 $mkdir mydir
 $

 

এটি কারেন্ট ডিরেক্টরিতে mydir ডিরেক্টরি তৈরি করে। আরেকটি উদাহরণ হল,


$mkdir /tmp/test-dir
$


 

এটি /tmp ডিরেক্টরিতে test-dir ডিরেক্টরি তৈরি করে, এখানে mkdir কম্যান্ড কোনও আউটপুট দেখাবে না। কম্যান্ড লাইনে একটির বেশি ডিরেক্টরি দিলে mkdir প্রত্যেকটি ডিরেক্টরি তৈরি করবে।


$mkdir docs pub
 $

 

প্যারেন্ট ডিরেক্টরি তৈরি করা

ডিরেক্টরি তৈরির সময় প্যারেন্ট ডিরেক্টরি না থাকলে যে এরর ম্যাসেজ আসবে তা হল,


 $mkdir /tmp/amrood/test
 mkdir: Failed to make directory "/tmp/amrood/test";
 No such file or directory
 $

 

তখন mkdir কম্যান্ডে -p অপশন দ্বারা স্পেসিফাই করা যাবে।


$mkdir -p /tmp/amrood/test
 $

 

ডিরেক্টরি মুছে ফেলা

rmdir কম্যান্ড ব্যবহার করে ডিরেক্টরি মুছে ফেলা যায়,


$rmdir dirname
 $

 

একসাথে অনেকগুলো ডিরেক্টরি তৈরি করতে,


$rmdir dirname1 dirname2 dirname3
 $

 

ডিরেক্টরি পরিবর্তন করা

cd কম্যান্ড ব্যবহার করে ডিরেক্টরি পরিবর্তন করা যায়।


 $cd dirname
 $

 

এখানে dirnameহল সেই ডিরেক্টরির নাম যা আমরা পরিবর্তন করতে চাচ্ছি।


$cd /usr/local/bin
 $

 

এটি directory /usr/local/binতে পরিবর্তন। রিলেটিভ পাথ ব্যবহার করে directory /usr/home/amrood তে পরিবর্তনের জন্য,


$cd ../../home/amrood
 $

 

ডিরেক্টরিকে রিনেম করা

ডিরেক্টরিকে রিনেম করার জন্য mv (move) কম্যান্ড ব্যবহার করা হয় যেমন,


$mv olddir newdir
 $

 

mydir ডিরেক্টরিকে yourdir ডিরেক্টরিতে রিনেম করার জন্য,


$mv mydir yourdir
 $

 

. (dot) ও .. (dot dot) ডিরেক্টরি

একটি কারেন্ট ডিরেক্টরি আর অন্যটি তার এক লেভেল উপরের ডিরেক্টরি নির্দেশ করে। যদি -a অপশন দ্বারা কারেন্ট ডিরেক্টরির সব ফাইল আর –l দ্বারা লং লিস্টিংএর অপশন বুঝাই, তাহলে যে ফলাফল হবে তা এরকম,


$ls -la
drwxrwxr-x   4   teacher  class  2048   Jul 16 17.56 .
drwxr-xr-x   60  root 1          536    Jul 13 14:18 ..
----------   1   teacher  class  4210   May 1 08:27 .profile
-rwxr-xr-x   1   teacher  class  1948   May 12 13:42 memo
$

 

ইউনিক্সঃ ফাইল ব্যবস্থাপনা (Unix – File Management)

রিদওয়ান বিন শামীম

 

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

ইউনিক্সে তিন ধরণের ফাইল দেখা যায়,

  • সাধারণ ফাইল
  • ডিরেক্টরি
  • স্পেশাল ফাইল

 

ফাইল লিস্ট করা

এই কম্যান্ড ব্যবহার করে ফাইল লিস্ট করা যায়,


$ls


 

যার সাধারণ আউটপুট এরকম হতে পারে,


$ls 

bin        hosts   lib     res.03
ch07       hw1     pub     test_results
ch07.bak   hw2     res.01  users
docs       hw3     res.02  work

 

ls কম্যান্ড –l অপশন সমর্থন করে, যা থেকে লিস্টেড ফাইল সম্পর্কে আরও ভালভাবে জানা যায়,


$ls -l
total 1962188
 
drwxrwxr-x  2 amrood amrood      4096 Dec 25 09:59 uml
-rw-rw-r--  1 amrood amrood      5341 Dec 25 08:38 uml.jpg
drwxr-xr-x  2 amrood amrood      4096 Feb 15  2006 univ
drwxr-xr-x  2 root   root        4096 Dec  9  2007 urlspedia
-rw-r--r--  1 root   root      276480 Dec  9  2007 urlspedia.tar
drwxr-xr-x  8 root   root        4096 Nov 25  2007 usr
drwxr-xr-x  2    200    300      4096 Nov 25  2007 webthumb-1.01
-rwxr-xr-x  1 root   root        3192 Nov 25  2007 webthumb.php
-rw-rw-r--  1 amrood amrood     20480 Nov 25  2007 webthumb.tar
-rw-rw-r--  1 amrood amrood      5654 Aug  9  2007 yourfile.mid
-rw-rw-r--  1 amrood amrood    166255 Aug  9  2007 yourfile.swf
drwxr-xr-x 11 amrood amrood      4096 May 29  2007 zlib-1.2.3
$

 

ফাইল লাইন প্রেফিক্সের মাধ্যমে শুরু হয়, যা থেকে ফাইল টাইপ সম্পর্কে ধারণা করা যায়।

 

প্রেফিক্স
-
b
c
d
l
p
s

 

মেটা ক্যারেক্টার

ইউনিক্সে মেটাক্যারেক্টারের বিশেষ অর্থ থাকে, যেমন,

 


$ls ch*.doc

 

এটি এমন ফাইল দেখায় যাদের নামের শুরু ch ও শেষ .doc দিয়ে,


ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc c

 

সব ফাইল .doc দিয়ে শেষ করাতে কম্যান্ড ব্যবহার করতে পারি,


$ls*.doc

 

হিডেন ফাইল

এদের প্রথম ক্যারেক্টার dot বা period character (.), এরকম ফাইলের কিছু কমন উদাহরণ,

  • .profile
  • .kshrc
  • .cshrc
  • .rhosts

এসব ফাইল লিস্ট করতে ls −তে -a অপশন স্পেসিফাই করতে হবে,


$ ls -a
 
.         .profile       docs     lib     test_results
..        .rhosts        hosts    pub     users
.emacs    bin            hw1      res.01  work
.exrc     ch07           hw2      res.02
.kshrc    ch07.bak       hw3      res.03
$

 

  • Single dot . মানে কারেন্ট ডিরেক্টরি
  • Double dot .. মানে প্যারেন্ট ডিরেক্টরি

 

ফাইল তৈরি করা

ইউনিক্স সিস্টেমে সাধারণ ফাইল তৈরি করতে vi এডিটর ব্যবহার করা যায়, এই কম্যান্ড ব্যবহার করে।


$ vi filename

 

এডিট মোডে ফাইলে কন্টেন্ট লেখার জন্য কম্যান্ড,


This is unix file....I created it for the first time.....
I'm going to save this content in this file.


 

এডিট মোড থেকে বেরুতেesc এবং ফাইল থেকেই বেরিয়ে আসতেShift + ZZ একসাথে চাপতে হয়।

কারেন্ট ডিরেক্টরিতে filename সহ ফাইল তৈরি করতে,


$ vi filename
$

 

ফাইল এডিট করতে

এজন্য যে কম্যান্ড ব্যবহার করতে পারি তা হল,


$ vi filename

 

ফাইলের কন্টেন্ট ডিসপ্লে করা

cat কম্যান্ড ব্যবহার করে আমরা এটি করতে পারি,


$ cat filename
This is unix file....I created it for the first time.....
I'm going to save this content in this file.
$

 

cat কম্যান্ডের সাথে -b অপশন ব্যবহার করে লাইন নাম্বার পেতে পারি,


$ cat -b filename
1   This is unix file....I created it for the first time.....
2   I'm going to save this content in this file.
$

 

ফাইলের শব্দ গণনা করা

এজন্য wc কম্যান্ড ব্যবহার করতে হয়,


$ wc filename
2  19 103 filename
$

 

মাল্টিপল ফাইলের ক্ষেত্রে এটি হবে,


$ wc filename1 filename2 filename3

 

ফাইল কপি করা

cp কম্যান্ড ব্যবহার করে আমরা ফাইল কপি করতে পারি,


$ cp source_file destination_file

 

filename নামের বিদ্যমান ফাইলের ক্ষেত্রে,


$ cp filename copyfile
$

 

ফাইল রিনেম করা

mv কম্যান্ড ব্যবহার করে আমরা ফাইলের নাম রিনেম করতে পারি।


$ mv old_file new_file

 

উদাহরণঃ filename কে newfile এ রিনেম করতে কম্যান্ড,


$ mv filename newfile
$

 

ফাইল ডিলিট করতে

ফাইল ডিলিট করতে rm কম্যান্ড ব্যবহার করতে পারি।এর বেসিক সিনট্যাক্স হল,


$ rm filename

 

 

যেমন, filename নামের ফাইল ডিলিট করতে কম্যান্ড,


$ rm filename
$

 

 

কয়েকটি ফাইল একসাথে ডিলিট করতে কম্যান্ড


$ rm filename1 filename2 filename3
$

 

আদর্শ ইউনিক্স স্ট্রিম

নরমাল অবস্থায় আদর্শ ইউনিক্সে তিনটি স্ট্রিম দেখা যায়,

  • stdin
  • stdout
  • stderr

ইউনিক্স : শুরুর কথা (Unix – Getting Started)

রিদওয়ান বিন শামীম

 

ইউনিক্স কি ?

ইউনিক্স অপারেটিং সিস্টেম হল প্রোগ্রামের একটি সেট যা কম্পিউটার ও ব্যবহারকারীর মধ্যে লিঙ্ক হিসেবে কাজ করে। এতে ব্যবহারকারী সেল নামের প্রোগ্রামের মাধ্যমে কার্নেলে যোগাযোগ করে। সেল হল কম্যান্ড লাইন ইন্টারপ্রিটার, এটি ইউজারের কম্যান্ড অনুবাদ করে কার্নেলের পাঠযোগ্য ভাষায় পরিবর্তন করে।

  • ১৯৬৯ সালে এটিএন্ডটি কর্মীদের দ্বারা বেল ল্যাবরেটরিতে প্রথম ইউনিক্স ডেভেলাপ করা হয়,
  • ইউনিক্সের বিভিন্ন ভার্সন পাওয়া যায়, Solaris Unix, AIX, HP Unix এবং BSD সহ লিনাক্সও অনেকটা ইউনিক্সের মত, যেটি ফ্রী ওএস।
  • ইউনিক্স কম্পিউটার একসাথে কয়েকজন ব্যবহারকারী ব্যবহার করতে পারেন।
  • ইউনিক্স কম্পিউটারে একজন ব্যবহারকারী একসাথে কয়েকটি প্রোগ্রাম চালু রাখতে পারেন।

 

ইউনিক্সের কাঠামো

ইউনিক্স কাঠামো চারটি মূল অংশ নিয়ে তৈরি হয়,

ইউনিক্সের কাঠামো

  • কার্নেল
  • সেল
  • কম্যান্ড ও ইউটিলিটি
  • ফাইল ও ডিরেক্টরি

 

সিস্টেম বুটআপ ও ইউনিক্সে লগইন

পাওয়ার অন করে বুটআপের পর login কম্যান্ডের মাধ্যমে সিস্টেমে প্রবেশ করতে হবে। লগইনের জন্য ইউজার আইডি, লগইন ডিটেইল অর্থাৎ আইডি নেম ও পাসওয়ার্ড দিয়ে সিস্টেমে প্রবেশ করতে হয়। এসব সঠিকভাবে দিলে যে ধরণের ফলাফল স্ক্রিনে আমরা পাব তা এরকম,


login : amrood
amrood's password:
Last login: Sun Jun 14 09:32:32 2009 from 62.61.164.73
$

 

 

কম্যান্ড প্রম্পটের মাধ্যমে কম্যান্ড দেয়া যায় ইউনিক্সে, যেমন ক্যালেন্ডার চেক করার জন্য cal কম্যান্ড দিতে পারি,


$ cal
      June 2009
Su  Mo Tu  We  Th  Fr  Sa
 1   2  3   4   5   6
 7   8  9  10  11  12  13
14  15 16  17  18  19  20
21  22 23  24  25  26  27
28  29 30
$

 

 

পাসওয়ার্ড পরিবর্তন করা

এটি আমরা করতে পারি passwd কম্যান্ড ব্যবহার করে,


$ passwd
Changing password for amrood
(current) Unix password:******
New UNIX password:*******
Retype new UNIX password:*******
passwd: all authentication tokens updated successfully
$

 

 

ফাইল ও ডিরেক্টরি তালিকাবদ্ধ করা

ls কমান্ডে -l অপশন ব্যবহার করে এটি করা যায়, নিচের উদাহরণে ব্যপারটি দেখানো হল,


$ ls -l
total 19621
drwxrwxr-x 2 amrood amrood 4096 Dec 25 09:59 uml
-rw-rw-r-- 1 amrood amrood 5341 Dec 25 08:38 uml.jpg
drwxr-xr-x 2 amrood amrood 4096 Feb 15 2006 univ
drwxr-xr-x 2 root root 4096 Dec 9 2007 urlspedia
-rw-r--r-- 1 root root 276480 Dec 9 2007 urlspedia.tar
drwxr-xr-x 8 root root 4096 Nov 25 2007 usr
-rwxr-xr-x 1 root root 3192 Nov 25 2007 webthumb.php
-rw-rw-r-- 1 amrood amrood 20480 Nov 25 2007 webthumb.tar
-rw-rw-r-- 1 amrood amrood 5654 Aug 9 2007 yourfile.mid
-rw-rw-r-- 1 amrood amrood 166255 Aug 9 2007 yourfile.swf
$

 

এখানে d..... দ্বারা শুরু হওয়া এন্ট্রি ডিরেক্টরি বুঝায়।

 

Whoami কম্যান্ড

Who am I? প্রশ্নটির উত্তরের জন্য এই কোড ব্যবহার করতে পারি আমরা,


$ whoami
 amrood
$

 

 

লগইন অবস্থায় কে কে আছে

এধরনের তিনটি কম্যান্ড users, who, এবং w, পাওয়া যায়।


$ users
 amrood bablu qadir
$ who
amrood ttyp0 Oct 8 14:10 (limbo)
bablu ttyp2 Oct 4 09:08 (calliope)
qadir ttyp4 Oct 8 12:09 (dent)
$

 

 

লগআউটের জন্য

কম্যান্ড প্রম্পটে logout কম্যান্ড টাইপ করলে সিস্টেম সবকিছু পরিষ্কার করে যোগাযোগ বিচ্ছিন্ন করে দেবে।

 

সিস্টেম সাটডাউন

নিচের যেকোনো এক পদ্ধতির কমান্ডে সিস্টেম সাটডাউন করা যায়,

কম্যান্ড বিবরণ
halt তৎক্ষণাৎ সিস্টেমকে বন্ধ করে।
init 0 সাটডাউনের আগে সবকিছু ক্লিন করে সিস্টেম অফ হয়ে যাওয়া
init 6 সাটডাউনের মাধ্যমে রিবুট
poweroff পাওয়ার অফের মাধ্যমে সাট ডাউন
reboot সিস্টেম রিবুট হওয়া
shutdown সিস্টেম সাটডাউন হওয়া

সাটডাউনের জন্য সুপার ইউজার বা রুট হতে হয়, তবে কিছু ব্যতিক্রমও আছে।

 

ইউনিক্স টিউটোরিয়াল (Unix Tutorial)

লেখকঃ সৈয়দআহমেদ অনুবাদঃ মতিউর রহমান।

ইউনিক্স টিউটোরিয়াল

UNIX হচ্ছে উইন্ডোজ সেভেন/এইট এর মত একটি কম্পিউটার অপারেটিং সিস্টেম যা একই সময়ে একাধিক ব্যবহারকারীর কাছ থেকে কার্যক্রম নিয়ন্ত্রণ করতে পারে। এই অপারেটিং সিস্টেমটি প্রায় ১৯৬৯ সালে (AT&T Bell) এটি&টি বেল ল্যাবস এ কেন থম্পসন এবং ডেনিস রিটছি নামক দুই বাক্তির দ্বারা সুচনা ঘটে। সম্মানিত পাঠক এই টিউটোরিয়ালটি নতুনদের জন্য প্রস্তুত করা হয়েছে যেখানে তারা বেসিক থেকে এডভান্স ইউনিক্স কমান্ড,ইউনিক্স শেলস্ক্রিপ্টিং এবং বিভিন্ন ইউটিলিটি ইত্যাদি মৌলিক ধারনা নিতে পারবে। তবে এটা জানার জন্য আপনার কিছু কম্পিউটার অপারেটিং সিস্টেম এবং তার বৈশিষ্ট্য সম্পর্কে সামান্য জ্ঞান থাকতে হবে আমি ধরে নিচ্ছি আপনার সেটা আছে। আপনার বিভিন্ন কম্পিউটার অপারেটিং সিস্টেম এর উপর যে ধারনা আছে সেটা আপনাকে এই টিউটোরিয়াল দেয়া বিভিন্ন এক্সেরসাইজ বুঝতে সাহায্য করবে।

 

ইউনিক্স শেলপ্রোগ্রামসমূহ

আপনি ইউনিক্স/লিনাক্স মৌলিক কমান্ড এবং শেলস্ক্রিপ্ট শিখতে আগ্রহী কিন্তু আপনার পিসিতে সেট আপ দেয়া নেই বা এই প্রোগ্রামটি আপনার কাছে নেই তাহলে চিন্তার কোন বিষয় নেই আপনি চাইলে এখনি compileonline.com এর ডেডিকেটেড সার্ভার থেকে হেল্প নিতে পারেন, যা একেবারেই বিনামূল্যে এবং যে কোন সময় নিতে পারবেন। পরবর্তী টিউটোরিয়াল এর জন্য নেক্সট পেজ ভিসিট করুন। ধন্যবাদ

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : কুইক গাইড (DCN – Quick Guide)

রিদওয়ান বিন শামীম

 

ডাটা কমিউনিকেশনের সারসংক্ষেপ

পরস্পর সংযুক্ত কম্পিউটার ও তদসংশ্লিষ্ট অনুষঙ্গ (যেমন প্রিন্টার ইত্যাদি) নিয়ে যে ব্যবস্থা তাকে কম্পিউটার নেটওয়ার্ক বলে।কম্পিউটার নেটওয়ার্ককে বিভিন্ন বিষয়ের উপর নির্ভর করে ভাগ করা যায় যথা,

  • ভৌগলিক কারণ
  • আন্তর্সম্পর্ক
  • এডমিনিস্ট্রেশন
  • স্থাপত্যগত কারণ

 

আন্তঃসংযোগ

কয়েকপ্রকার ভাবে নেটওয়ার্কের উপাদানগুলো নিজেদের মধ্যে সংযুক্ত থাকতে পারে,

  • প্রত্যেকটি একক ডিভাইস নেটওয়ার্কের অন্য প্রত্যেক ডিভাইসের সাথে যুক্ত থাকতে পারে,
  • প্রত্যেক ডিভাইস একই মাধ্যমে কিন্তু ভৌগলিকভাবে আলাদা থাকতে পারে,
  • প্রত্যেক ডিভাইস তাদের সংলগ্ন ডিভাইসের সাথে লিনিয়ারভাবে সংযুক্ত থাকতে পারে,
  • প্রত্যেক ডিভাইস তাদের সংলগ্ন একটিমাত্র ডিভাইসের সাথে স্টার ফরম্যাটে যুক্ত থাকতে পারে,
  • উপরে আলোচনা করা সব পদ্ধতির সমন্বয়ে হাইব্রিডভাবেও সংযুক্ত থাকতে পারে।

 

এডমিনিস্ট্রেশন

এডমিনিস্ট্রেশনের ভিত্তিতে নেটওয়ার্ক স্বায়ত্তশাসিত, ব্যক্তিগত, লজিকাল বা পাবলিক ডোমেইন ইত্যাদি রকমের হতে পারে।

 

নেটওয়ার্কের স্থাপত্য কাঠামো

ক্লায়েন্ট-টু-সার্ভার, সদৃশ, হাইব্রিড বিভিন্ন রকম নেটওয়ার্ক হতে পারে, এর কাঠামোর উপর ভিত্তি করে।

  • এক বা একাধিক সিস্টেম সার্ভার হিসেবে কাজ করতে পারে,
  • দুটি সিস্টেম পয়েন্ট-টু-পয়েন্ট অথবা ব্যাক-টু-ব্যাক ভাবে সংযুক্ত থাকতে পারে,
  • দুই রকমের ব্যবস্থার সমন্বয়ে হাইব্রিড ব্যবস্থা থাকতে পারে।

 

 

নেটওয়ার্ক অ্যাপ্লিকেশন

কম্পিউটার ও তদসংশ্লিষ্ট অনুষঙ্গ নেটওয়ার্ক থেকে সংযুক্ত থাকতে পারে। এরা যে সুবিধাগুলো দেয় তা হল,

  • রিসোর্স যেমন প্রিন্টার, স্টোরেজ ডিভাইস শেয়ার করা,
  • ইমেইল ও এফটিপির মাধ্যমে ডাটা স্থানান্তর,
  • ওয়েব বা ইন্টারনেট ব্যবহার করে ডাটা শেয়ার,
  • ডাইনামিক ওয়েব পেজ ব্যবহার করে অন্য ব্যবহারকারীর সাথে যোগাযোগ,
  • আইপি ফোন,
  • ভিডিও কনফারেন্স,
  • প্যারালাল কম্পিউটিং,
  • ইনস্ট্যান্ট ম্যাসেজিং

 

 

কম্পিউটার নেটওয়ার্ক টাইপ

 

  • পারসোনাল এরিয়া নেটওয়ার্ক,

পারসোনাল এরিয়া নেটওয়ার্ক

  • লোকাল এরিয়া নেটওয়ার্ক

লোকাল এরিয়া নেটওয়ার্ক

  • মেট্রোপলিটান এরিয়া নেটওয়ার্ক,

মেট্রোপলিটান এরিয়া নেটওয়ার্ক

  • ওয়াইড এরিয়া নেটওয়ার্ক,

ওয়াইড এরিয়া নেটওয়ার্ক

  • ইন্টারনেটওয়ার্কিং

 

 

নেটওয়ার্ক লেন টেকনোলোজি

নেটওয়ার্ক লেন টেকনোলোজি কয়েক রকমের হতে পারে,

 

  • ইথারনেট,
  • ফাস্ট ইথারনেট,
  • গিগা ইথারনেট,
  • ভার্চুয়াল লেন

ভার্চুয়াল লেন

 

 

 

কম্পিউটার নেটওয়ার্ক টপোলজি

একই নেটওয়ার্কে লজিকাল ও ফিজিকাল টপোলজি একই বা ভিন্ন উভয় রকমেরই হতে পারে। এর প্রকরণগুলো হল,

  • পয়েন্ট টু পয়েন্ট,

পয়েন্ট টু পয়েন্ট

  • বাস টপোলজি,

বাস টপোলজি

  • স্টার টপোলজি,

স্টার টপোলজি

  • রিং টপোলজি,

রিং টপোলজি

  • মেস টপোলজি,

মেস টপোলজি

  • ট্রি টপোলজি,

ট্রি টপোলজি

  • ডেইজি চেইন,

ডেইজি চেইন

  • হাইব্রিড টপোলজি।

হাইব্রিড টপোলজি

 

 

কম্পিউটার নেটওয়ার্ক মডেল

লেয়ারড টাস্ক, ওএসআই ও ইন্টারনেট মডেল, এই তিন রকম হয়ে থাকে।

 

 

কম্পিউটার নেটওয়ার্ক সিকিউরিটি

এর তিনটি প্রধান রূপ হল সিক্রেট কী এনক্রিপশন, পাবলিক কী এনক্রিপশন ও ম্যাসেজ ডাইজেস্ট।

 

 

এসব ছাড়াও ফিজিকাল লেয়ার, ডিজিটাল ট্রান্সমিশন ইত্যাদিও ডিসিএনের আওতাভুক্ত।

 

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ডিসিএন বিষয়ক আলোচনা (Discuss DCN)

রিদওয়ান বিন শামীম

 

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

 

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

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক সার্ভিসসমূহ (DCN – Network Services)

রিদওয়ান বিন শামীম

 

 

কম্পিউটার এবং এর সংশ্লিষ্ট যন্ত্রপাতি মানুষের কাজকর্ম সহজ এবং অজানাকে হাতের কাছে এনে দিয়েছে, আর এসব যন্ত্রপাতি যখন কোনও নেটওয়ার্কের মাধ্যমে পরস্পরের সাথে সংযুক্ত থাকে তখন তাদের কর্মক্ষমতা অনেক অনেক গুন বেড়ে যায়। কম্পিউটারের নেটওয়ার্ক যেধরনের মৌলিক সেবা আমাদের দিতে পারে সেগুলো হল,

 

ডিরেক্টরি সার্ভিস

এই ধরণের সফটওয়ার সিস্টেম তথ্য সংরক্ষণ, ব্যবস্থাপনা ও এতে প্রবেশের সাথে সংশ্লিষ্ট সকল কাজ তত্ত্বাবধায়ন করে থাকে। এর কয়েকটি দিক আছে,

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

 

ফাইল সার্ভিস

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

 

কমুনিকেশন সার্ভিস

নেটওয়ার্ক বিভিন্ন কমুনিকেশনের মাধ্যম নিয়ন্ত্রণ করে যেমন,

  • ইমেইল,
  • সামাজিক যোগাযোগ,
  • ইন্টারনেট চ্যাট,
  • ডিসকাশন বোর্ড,
  • রিমোট এক্সেস।

 

এপ্লিকেশন সার্ভিস

নেটওয়ার্ক কিছু এপ্লিকেশন ভিত্তিক সার্ভিস দিয়ে থাকে, এগুলো হল,

  • রিসোর্স শেয়ারিং,
  • ডাটাবেস,
  • ওয়েব সার্ভিস ইত্যাদি ।

 

 

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : এপ্লিকেশন প্রটোকল : (DCN – Application Protocols)

রিদওয়ান বিন শামীম

 

এমন বেশ কয়েকটি প্রটোকল আছে যারা এপ্লিকেশন লেয়ারে ব্যবহারকারীর জন্য কাজ করে। এদের মোটামুটি দুই ভাগে ভাগ করা যায়,

যেসব প্রটোকল সরাসরি ব্যবহারকারীর জন্য কাজ করে।যেমন ইমেইল।

আর যেসব প্রটোকল ব্যবহারকারীর জন্য সাহায্যকারী প্রটোকলকে সাহায্য করে। যেমন ডিএনএস।

 

কয়েক ধরণের এপ্লিকেশন প্রটোকল সম্পর্কে নিচে আলোচনা করা হল।

ডোমেইন নেম সিস্টেম বা ডিএনএস

ক্লায়েন্ট সার্ভার মডেলে কাজ করে। ট্রান্সপোর্ট লেয়ার কমুনিকেশনে UDP প্রটোকল ব্যবহার করে, এটি UDP port 53 ব্যবহার করে, FQDN এর সাথে প্রস্তাবিত হয় এবং সংশ্লিষ্ট আইপি এড্রেসের সাথে প্রকল্পিত হয়।

সিম্পল মেইল ট্রান্সফার প্রটোকল

এক ইউজার থেকে আরেক ইউজারের কাছে মেইল পাঠাতে ব্যবহৃত হয়, এটি সার্ভার সাইডে প্রেরণের জন্য SMTP ব্যবহার করে, SMTP TCP port number 25 এবং 587 ব্যবহার করে থাকে।

ফাইল ট্রান্সফার প্রটোকল বা এফটিপি

এটি বহুল ব্যবহৃত প্রটোকল, TCP port 20 ব্যবহার করে থাকে, এই পদ্ধতিতে ইউজার সার্ভারে ফাইলের জন্য রিকোয়েস্ট করে। সার্ভার টিসিপি কানেকশন ব্যবহার করে প্রক্রিয়া সম্পন্ন করে থাকে।

পোস্ট অফিস প্রটোকল

ইউজার এজেন্ট ব্যবহৃত সাধারণ ট্রান্সফার প্রটোকল। TCP port 110 ব্যবহার করে।

হাইপার টেক্সট ট্রান্সফার প্রটোকল

এটি ওয়ার্ল্ড ওয়াইড ওয়েবের ভিত্তি। পেজ ও টেক্সট ডকুমেন্টে হাইপারলিঙ্ক ব্যবহার করে। এইচটিটিপি ১.১ ও১.০, এই দুটি ভার্সন আছে।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ক্লায়েন্ট সার্ভার মডেল : (DCN – Client Server Model)

রিদওয়ান বিন শামীম

 

দুটি রিমোট এপ্লিকেশন প্রক্রিয়া দুই ধরণের উপায়ে যোগাযোগ রাখতে পারে,

  • সদৃশ থেকে সদৃশ এপ্লিকেশনে যোগাযোগঃ দুটি রিমোট এপ্লিকেশন একই লেভেলে শেয়ারড রিসোর্স ব্যবহার করে এটি করতে পারে,
  • ক্লায়েন্ট থেকে সার্ভারে যোগাযোগঃ একটি রিমোট প্রক্রিয়া ক্লায়েন্ট হিসেবে সার্ভার রূপে ক্রিয়াশীল অন্য রিমোট প্রক্রিয়ার কাছে রিকোয়েস্ট পাঠাতে পারে। ক্লায়েন্ট সার্ভার মডেলে যেকোনো প্রক্রিয়া ক্লায়েন্ট অথবা সার্ভার হিসেবে কাজ করতে পারে।

ক্লায়েন্ট সার্ভার মডেল

 

যোগাযোগ

ক্লায়েন্ট সার্ভার মডেলে দুটি প্রক্রিয়া বিভিন্ন উপায়ে নিজেদের মধ্যে যোগাযোগ রাখতে পারে,

  • সকেটের মাধ্যমে,
  • রিমোট প্রসেস সেল আরপিসি

 

সকেট

সার্ভাররূপে ক্রিয়াশীল প্রসেস, পোর্ট ব্যবহার করার মাধ্যমে সকেট খোলে, এবং ক্লায়েন্টের রিকোয়েস্টের জন্য অপেক্ষা করে। ক্লায়েন্টরূপে ক্রিয়াশীল প্রক্রিয়া অনুরূপ সকেট খোলে তবে তার কাজ হল রিকোয়েস্ট প্রেরণ করা।

 

রিমোট প্রক্রিয়া সেল

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

  • ক্লায়েন্ট প্রসেস ক্লায়েন্ট স্লাবকে কল করে, এটি প্রোগ্রাম সঙ্ক্রান্ত সকল প্যারামিটার প্রেরণ করে।
  • এরপর সকল প্যারামিটার প্যাকড(মার্শালড) হয় এবং সিস্টেম এগুলোকে নেটওয়ার্কের অপর প্রান্তে প্রেরণের উদ্দেশে একটি কল দেয়।
  • কার্নেল নেটওয়ার্কের মাধ্যমে ডাটা প্রেরণ করে এবং অন্য প্রান্ত সেটিকে গ্রহণ করে।
  • রিমোট হোষ্ট সার্ভার স্লাবে ডাটা প্রেরণ করে যেখানে এটি আনমার্শালড।
  • এরপর প্যারামিটারকে প্রক্রিয়ায় পাঠানো হয় এবং এরপরে প্রক্রিয়াটি সম্পন্ন হয়।
  • একই প্রক্রিয়ায় ক্লায়েন্টের কাছে ফলাফল পাঠানো হয়।

 

তথ্যসূত্রঃ http://www.tutorialspoint.com/data_communication_computer_network/client_server_model.htm

 

২৩০ ওয়ার্ড, বোনাস আশা করছি। ধন্যবাদ।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ইউজার ডায়াগ্রাম প্রটোকল (DCN – User Datagram Protocol)

রিদওয়ান বিন শামীম

 

টিসিপি/আইপি প্রটোকল স্যুইটের সরলতম ট্রান্সপোর্ট লেয়ার কমিউনিকেশন প্রটোকল হল ইউজার ডায়াগ্রাম প্রটোকল । এটিতে কম সংখ্যক যোগাযোগ কৌশল প্রয়োগ করা হয়। ইউজার ডায়াগ্রাম প্রটোকলকে অনির্ভরযোগ্য যোগাযোগ প্রটোকল বলা হলেও এটি আইপি সার্ভিস ব্যবহার করে যেটিতে সেরা সরবরাহ কৌশল ব্যবহৃত হয়।

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

 

ইউজার ডায়াগ্রাম প্রটোকলের রিকোয়ারমেন্ট

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

 

ইউজার ডায়াগ্রাম প্রটোকলের বৈশিষ্ট্য

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

 

ইউজার ডায়াগ্রাম প্রটোকল হেডার

ইউজার ডায়াগ্রাম প্রটোকলের হিডার

ইউজার ডায়াগ্রাম প্রটোকলের হিডার(header) চারটি মূল প্যারামিটার ব্যবহার করে,

  • সোর্স পোর্ট,
  • ডেসটিনেশন পোর্ট,
  • লেন্থ,
  • চেকসাম

 

ইউজার ডায়াগ্রাম প্রটোকল অ্যাপ্লিকেশন

যেসব এপ্লিকেশনে ডাটা ট্রান্সফারের জন্য ইউজার ডায়াগ্রাম প্রটোকল ব্যবহৃত হয়,

  • ডোমেইন নেম সার্ভিস,
  • সিম্পল নেটওয়ার্ক মেনেজমেন্ট প্রটোকল,
  • ট্রিভিয়াল ফাইল ট্রান্সফার প্রটোকল,
  • রাউটিং ইনফরমেশন প্রটোকল,
  • কার্বারোতে।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ট্রান্সমিশন কন্ট্রোল প্রটোকল (DCN – Transmission Control Protocol)

রিদওয়ান বিন শামীম

 

ট্রান্সমিশন কন্ট্রোল প্রটোকল বা টিসিপি ইন্টারনেট প্রটোকল স্যুইটের সবচেয়ে গুরুত্বপূর্ণ প্রটোকলসমূহের একটি। ইন্টারনেটজাতীয় নেটওয়ার্কের ডাটা ট্রান্সমিশনের জন্য এটি একটি বহুল ব্যবহৃত প্রটোকল।

 

বৈশিষ্ট্য

  • এটি একটি নির্ভরযোগ্য প্রটোকল,
  • টিসিপি নিশ্চিত করে, ডাটা যেভাবে প্রেরণ করা হয়েছিল সেভাবেই গ্রহণ করা হয়েছে,
  • টিসিপি যোগাযোগ নির্ভর,
  • টিসিপি ক্রুটি নির্ণয় ও সংশোধন কৌশল ব্যবহার করে,
  • টিসিপি এন্ড টু এন্ড যোগাযোগ ব্যবহার করে,
  • টিসিপি ফ্লো কন্ট্রোল ও সেবার মান প্রদান করে,
  • টিসিপি ক্লায়েন্ট/সার্ভার পয়েন্ট টু পয়েন্ট মোড ব্যবহার করে,
  • টিসিপি ফুল ডুপ্লেক্স সার্ভার ব্যবহার করার সুযোগ দেয়।

 

হিডার

টিসিপি হিডারের দৈর্ঘ্য ২০ বাইট থেকে ৬০ বাইট পর্যন্ত হতে পারে।

এড্রেসিং

দুটি রিমোট হোষ্টের মাঝে যোগাযোগ পোর্ট নাম্বারের ভিত্তিতে হতে পারে। পোর্ট নাম্বার তিনটি শ্রেণীতে বিভক্ত,

  • সিস্টেম পোর্ট,
  • ইউজার পোর্ট,
  • ব্যক্তিগত বা ডাইনামিক পোর্ট

 

কানেকশন ম্যানেজমেন্ট

টিসিপি সার্ভার/ ক্লায়েন্ট মডেলে কাজ করে। যোগাযোগের জন্য ত্রিমুখী সমন্বয় ব্যবহৃত হয়। এরপর যোগাযোগ এসটাব্লিশমেন্টের পরে কাজ সম্পন্ন হলে যোগাযোগ রিলিজ করে দেয়া হয়।

ব্যান্ডউইথ ম্যানেজমেন্ট

টিসিপি ব্যান্ডউইথ ম্যানেজমেন্টের জন্য উইন্ডো সাইজ কনসেপ্ট ব্যবহার করে।

 

এরর কন্ট্রোল ও ফ্লো কন্ট্রোল

ডাটা সেগমেন্টের জন্য কোন ধরণের এপ্লিকেশন প্রসেস দরকার তা জানতে টিসিপি পোর্ট নাম্বার ব্যবহার করে। রিমোট হোষ্টের সাথে সমন্বয় সাধনের জন্য এটি সিকোয়েন্স নাম্বার ব্যবহার করে।

 

মাল্টিপ্লেক্সিং

দুই বা ততোধিক ডাটা স্ট্রিমকে এক সেশনে সমন্বয় করার পদ্ধতিকে মাল্টিপ্লেক্সিং বলে।

 

কনজেশন

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

  • এডিটিভ ইনক্রিজ, মাল্টিপ্লিকেটিভ ডিক্রিজ ,
  • স্লো স্টার্ট,
  • টাইমআউট রিএক্ট

 

টাইমার ম্যানেজমেন্ট

বিভিন্ন ধরণের কাজ নিয়ন্ত্রণের জন্য টিসিপি বিভিন্ন ধরণের টাইমার ব্যবহার করে,

  • কিপ এলাইভ টাইমার
  • রিট্রান্সমিশন টাইমার,
  • পারসিস্ট টাইমার,
  • টাইমড ওয়েইট

 

ক্রাশ রিকভারি

টিসিপি অত্যন্ত নির্ভরযোগ্য প্রটোকল, এটি সেগমেন্টে প্রেরণকৃত প্রত্যেকটি বাইটের সিকোয়েন্স বজায় রাখে। কোনও টিসিপি সার্ভার যোগাযোগ চলাকালে ক্রাশ করলে এটি এর সকল হোষ্টের কাছে টিপিডিইউ সম্প্রচার বার্তা পাঠায়।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ট্রান্সপোর্ট লেয়ার : ভূমিকা (DCN – Transport Layer Introduction)

রিদওয়ান বিন শামীম

 

ওএসআই মডেলের লেয়ার-৪ ট্রান্সপোর্ট লেয়ার হিসেবে পরিচিত। ডাটা ট্রান্সপোর্ট সঙ্ক্রান্ত সকল মডিউল ও প্রণালী এই লেয়ারে সম্পন্ন হয়। অন্য সকল লেয়ারের মত লেয়ার-৪ ট্রান্সপোর্ট লেয়ারও রিমোট হোষ্টে সদৃশ ট্রান্সপোর্ট লেয়ারে যোগাযোগ বজায় রাখে।

 

ট্রান্সপোর্ট লেয়ার রিমোট হোষ্টের দুটি প্রক্রিয়ার মধ্যে peer-to-peer এবং end-to-end যোগাযোগ বজায় রাখে। ট্রান্সপোর্ট লেয়ার ঊর্ধ্বতন লেয়ার থেকে ডাটা সংগ্রহ করে তাকে ক্ষুদ্র ক্ষুদ্র সেগমেন্টে বিভক্ত করে এবং নেটওয়ার্ক লেয়ারে ডেলিভারির জন্য সরবরাহ করে।

 

কার্যাবলী

  • ট্রান্সপোর্ট লেয়ার প্রথম লেয়ার যা ঊর্ধ্বতন লেয়ার থেকে ডাটা সংগ্রহ করে তাকে ক্ষুদ্র ক্ষুদ্র সেগমেন্টে বিভক্ত করে এবং নেটওয়ার্ক লেয়ারে ডেলিভারির জন্য সরবরাহ করে।এটি সেগমেন্টের প্রতিটি বাইটের হিসাব রাখে।
  • এই লেয়ার নিশ্চিত করে প্রেরণকৃত ডাটা সঠিক জায়গায় পৌঁছেছে।
  • বিভিন্ন হোষ্টের মধ্যে ডাটার এন্ডটু এন্ড ডেলিভারি নিশ্চিত করে যা একই সাবনেটে থাকতে পারে আবার নাও পারে।
  • সার্ভারের সকল প্রক্রিয়া যা নেটওয়ার্কের মাধ্যমে যোগাযোগ করবে তারা TSAPs দ্বারা সজ্জিত হবে, এদের পোর্ট নাম্বারও বলা হয়।

 

ইন্ড টু ইন্ড কমিউনিকেশন

রিমোট নেটওয়ার্কে যে প্রক্রিয়ায় সদৃশ হোষ্ট অনুরূপ সদৃশ হোষ্ট খুঁজে পায় সেটিকে পোর্ট নাম্বার দ্বারা চিহ্নিত করা যায়। TSAPs এক্ষেত্রে খুব উপযোগী।

ইন্ড টু ইন্ড কমিউনিকেশন

দুটি প্রধান ট্রান্সপোর্ট লেয়ার প্রটোকল হল,

  • ট্রান্সমিশন কন্ট্রোল প্রটোকল যা দুটি হোষ্টের মধ্যে নির্ভরযোগ্য যোগাযোগ নিশ্চিত করে,
  • ইউজার ডাটাগ্রাম প্রটোকল যা দুটি হোষ্টের মধ্যে অনির্ভরযোগ্য যোগাযোগ নিশ্চিত করে।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক লেয়ার প্রটোকল (DCN – Network Layer Protocols)

রিদওয়ান বিন শামীম

 

সব কম্পিউটারেরই একটি আইপি এড্রেস থাকে যার মাধ্যমে স্বতন্ত্রভাবে শনাক্ত করা যায়। আইপি এড্রেস লেয়ার-৩(নেটওয়ার্ক লেয়ার) লজিকাল এড্রেস। প্রতিবার কম্পিউটার রিস্টার্ট করার সময় এই আইপি এড্রেস পরিবর্তিত হতে পারে।

 

এড্রেস রেসোলিউশন প্রটোকল

যোগাযোগের সময় হোষ্টের অভীষ্ট মেশিনের লেয়ার-২(এমএকে ) এড্রেস প্রয়োজন হয়, এমএকে এড্রেসকে বস্তুগতভাবে মেশিনের নেটওয়ার্ক ইন্টারফেস কার্ডে ঢুকিয়ে রাখা হয় যা অপরিবর্তনীয়।

 

অন্যদিকে পাবলিক ডোমেইনের আইপি এড্রেস কদাচিৎ পরিবর্তিত হয়। কোনও ক্রুটির কারণে নেটওয়ার্ক ইন্টারফেস কার্ড পরিবর্তন করতে হলে এমএকে এড্রেসও পরিবর্তিত হয়। একারনেই লেয়ার-২ যোগাযোগের জন্য দুই প্রান্তের ম্যাপিং প্রয়োজন হয়। ব্রডকাস্ট ডোমেইনের কোনও রিমোট হোষ্টের এমএকে এড্রেস জানার জন্য এআরপি ব্রডকাস্ট ম্যাসেজ পাঠানো হয়, আইপি এড্রেস জানতে চেয়ে। যেহেতু এটি সম্প্রচার, তাই নেটওয়ার্কের ব্রডকাস্ট ডোমেইনে থাকা সব হোষ্ট এই ডাটা প্যাকেট পায় ও প্রক্রিয়া করে।

এড্রেস রেসোলিউশন প্রটোকল

হোষ্ট একবার এমএকে এড্রেস পেয়ে গেলে এটি লেয়ার-২ লিঙ্ক প্রটোকল ব্যবহার করে রিমোট হোষ্টের সাথে যোগাযোগ করতে পারে। এই এমএকে টু আইপি ম্যাপিংকে প্রেরণকারী ও গ্রহণকারী উভয় হোষ্টের এআরপি ক্যাচি(ARP cache)তে সংরক্ষণ করা হয়। পরবর্তীতে যদি তাদের যোগাযোগ করার প্রয়োজন হয় তবে তারা সরাসরি তাদের এআরপি ক্যাচি রেফার করতে পারবে।

 

রিভার্স এআরপি একধরনের কৌশল যেখানে হোষ্ট, রিমোট হোষ্টের এমএকে এড্রেস জানে কিন্তু যোগাযোগের জন্য তাকে আইপি এড্রেসও জানতে হবে।

 

ইন্টারনেট কন্ট্রোল ম্যাসেজ প্রটোকল বা আইসিএমপি

আইসিএমপি নেটওয়ার্ক নিরীক্ষণ ও এরর কন্ট্রোল প্রটোকল।

 

ইন্টারনেট প্রটোকল ভার্সন ৪(Pv4)

টিসিপি/আইপি হোষ্ট এড্রেসিং কৌশলে ব্যবহৃত ৩২ বিট এড্রেসিং স্কিম হল ইন্টারনেট প্রটোকল ভার্সন ৪(IPv4)। এটি পর্যায়ক্রমিক এড্রেসিং স্কিম ব্যবহার করে। আইপি এড্রেস বহু রকম হতে পারে,

 

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

 

যদিও আইপি তেমন নির্ভরযোগ্য নয়, এটি সরবরাহের সেরা প্রক্রিয়া নিশ্চিত করে।

 

ইন্টারনেট প্রটোকল ভার্সন ৬(IPv6)

ইন্টারনেট প্রটোকল ভার্সন ৪ এর পরবর্তী প্রজন্মের ভার্সন হল ইন্টারনেট প্রটোকল ভার্সন ৬(IPv6), এটি এনিকাস্ট এড্রেসিং উদ্ভাবন করলেও সম্প্রচারের ধারণা দূর করেছে। এতে নতুন সংযোজিত কিছু ট্রানজিশন মেকানিজম আছে,

  • ডুয়েল স্টাক ইমপ্লিমেন্টেশন,
  • টানেলিং,
  • এনএটি-পিটি

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ইন্টারনেটওয়ার্কিং (DCN – Internetworking)

রিদওয়ান বিন শামীম

 

বাস্তব জগতে এক প্রশাসনের অধীনে থাকা নেটওয়ার্কগুলো ভৌগলিকভাবে ছড়ানো। সেখানে এক রকম বা ভিন্ন এক বা একাধিক নেটওয়ার্ককে সংযুক্ত করার প্রয়োজন হতে পারে। দুটি নেটওয়ার্কের মধ্যে রাউটিং এর প্রক্রিয়াকে ইন্টারনেটওয়ার্কিং বলে। প্রটোকল, টপোলজি, লেয়ার-২ নেটওয়ার্কিং ও এড্রেসিং স্কিমের তারতম্যের জন্য নেটওয়ার্কগুলোকে ভিন্ন ধরা হয়।

ইন্টারনেটওয়ার্কিং

ইন্টারনেটওয়ার্কিংএ রাউটারগুলো পরস্পরের এড্রেস ও অন্যান্য এড্রেস জানে। তারা স্ট্যাটিকভাবে কনফিগারড হতে পারে আবার ইন্টারনেটওয়ার্কিং রাউটিং প্রটোকলের মাধ্যমেও জেনে নিতে পারে। কোনও সংস্থা বা প্রশাসনের অধীনে যেসব রাউটিং প্রটোকল তাদেরকে ইন্টেরিয়র গেটওয়ে প্রটোকল বা আইজিপি বলে। বিভিন্ন সংস্থা বা প্রশাসনের মধ্যে যেসব রাউটিং তারা এক্সটেরিয়র গেটওয়ে প্রটোকল বা ইজিপি ব্যবহার করে।

 

টানেলিং

ভৌগলিকভাবে পৃথক এমন দুটি নেটওয়ার্ক যদি পরস্পরের সাথে যুক্ত হতে চায় তাহলে তাদের ডাটা মধ্যবর্তী কোনও নেটওয়ার্কের মাধ্যমে স্থানান্তর করতে হবে। টানেলিং হল সেই যন্ত্রকৌশল যার দ্বারা মধ্যবর্তী সেই নেটওয়ার্কের জটিলতা এড়ানো যায়। দুই প্রান্তেই টানেলিং করা হয়, ডাটা টানেলের এক প্রান্তে ঢুকে ট্যাগড হয়, সেই ট্যাগড ডাটা মধ্যবর্তী নেটওয়ার্কের ভেতর দিয়ে অন্য প্রান্তে যায়, এর ট্যাগ সরিয়ে নেটওয়ার্কের অন্য প্রান্তে পৌঁছে দেয়া হয়।

টানেলিং

 

প্যাকেট ফ্রাগমেন্টেশন

বেশিরভাগ ইথারনেট সেগমেন্টের ম্যাক্সিমাম ট্রান্সমিশন ইউনিট(এমটিইউ) ১৫০০ বাইটে সীমাবদ্ধ রাখা থাকে। এপ্লিকেশনের উপর ভিত্তি করে ডাটা প্যাকেট এরচেয়ে কম বা বেশি প্যাকেট লেন্থ পেতে পারে। ট্রানজিট পাথের যন্ত্রপাতির হার্ডওয়ার ও সফটওয়ারের সক্ষমতার উপরও নির্ভর করে সেই যন্ত্র কতটা ডাটা নিয়ন্ত্রণ করতে পারবে বা কত বড় প্যাকেট প্রক্রিয়াজাত করতে পারবে।

ট্রানজিট নেটওয়ার্কের ধারণক্ষমতার চেয়ে ছোট প্যাকেট হলে এটিকে স্বাভাবিকভাবে প্রক্রিয়াজাত করা যাবে। ধারণক্ষমতার চেয়ে বড় প্যাকেট হলে এটিকে ছোট ছোট ভাগে ভাগ করে প্রেরণ করতে হবে। এই প্রক্রিয়াকে প্যাকেট ফ্রাগমেন্টেশন বলে।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক রাউটিং (DCN – Network Layer Routing)

রিদওয়ান বিন শামীম

 

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

রাউটার সবসময় ডিফল্ট রাউটারের মাধ্যমে কনফিগার করা হয়। নির্দিষ্ট লক্ষ্যের জন্য একাধিক পাথ থাকলে রাউটার নিচের বিষয়গুলোর উপর ভিত্তি করে সিদ্ধান্ত নেয়।

  • হপ কাউন্ট
  • ব্যান্ডউইথ
  • মেট্রিক
  • প্রিফিক্স লেন্থ
  • ডিলে

রাউটগুলো স্ট্যাটিকালি কনফিগারড হতে পারে। এক রাউট অন্য রাউটের চেয়ে বেশি কাঙ্খিতরূপে কনফিগারড হতে পারে।

 

ইউনিকাস্ট রাউটিং

ইন্টারনেট ও ইন্ট্রানেটের বেশিরভাগ ট্র্যাফিক ইউনিকাস্ট ডাটা বা ইউনিকাস্ট ট্র্যাফিক নামে পরিচিত। ইউনিকাস্ট ডাটা রাউটিং করা হলে তাকে ইউনিকাস্ট রাউটিং বলে।

ইউনিকাস্ট রাউটিং

 

ব্রডকাস্ট রাউটিং

বাই ডিফল্ট ব্রডকাস্ট প্যাকেটগুলো রাউটেড নয়, যেকোনো নেটওয়ার্কে রাউটার দ্বারা ফরোয়ার্ড করা হয়। রাউটার ব্রডকাস্ট ডোমেইন সৃষ্টি করে।

ব্রডকাস্ট রাউটিং দুই ভাবে হয়ে থাকে,

  • একটি রাউটার ডাটা প্যাকেট তৈরি করে এবং একটি একটি করে হোষ্টে প্রেরণ করে।
  • যখন রাউটার সম্প্রচারের জন্য প্যাকেট গ্রহণ করে তখন এটি ইন্টারফেস থেকে প্যাকেট প্লাবিত করে ফেলে।

ব্রডকাস্ট রাউটিং

 

মাল্টিকাস্ট রাউটিং

মাল্টিকাস্ট রাউটিং ব্রডকাস্ট রাউটিংএর বিশেষায়িত রূপ, মাল্টিকাস্ট রাউটিংএ ডাটা কেবলমাত্র নডে প্রেরণ করা হয় যা প্যাকেট গ্রহণ করতে চায়। রাউটারকে জানতে হয় নড আছে কিনা এবং ফরোয়ার্ড করার জন্য মাল্টিকাস্ট প্যাকেট গ্রহণ করবে কিনা।

মাল্টিকাস্ট রাউটিং

 

এনিকাস্ট রাউটিং

এনিকাস্ট প্যাকেট ফরোয়ার্ডিং একধরণের কৌশল যাতে মাল্টিপল হোষ্টের একই লজিকাল এড্রেস থাকতে পারে। যখন কোনও লজিকাল এড্রেসের দ্বারা গ্রহনের জন্য প্যাকেট প্রস্তুত থাকে তখন এর রাউটিং টপোলজির সবচেয়ে কাছের হোষ্টে এটি প্রেরণ করা হয়।

এনিকাস্ট রাউটিং

 

ইউনিকাস্ট রাউটিং প্রটোকল

ইউনিকাস্ট প্যাকেট রাউটিং করার জন্য দুই ধরণের রাউটিং প্রটোকল পাওয়া যায়,

  • ডিস্টেনস ভেক্টর রাউটিং প্রটোকল এবং
  • লিঙ্ক স্টেট রাউটিং প্রটোকল

 

মাল্টিকাস্ট রাউটিং প্রটোকল

মাল্টিকাস্ট রাউটিং প্রটোকল একধরনের অপটিমাল ট্রি ব্যবহার করে রাউটিং এর জন্য,

  • DVMRP - ডিস্টেনস ভেক্টর মাল্টিকাস্ট রাউটিং প্রটোকল
  • MOSPF - মাল্টিকাস্ট ওপেন সর্টেস্ট পাথ ফার্স্ট
  • CBT - কোর বেসড ট্রি
  • PIM - প্রটোকল ইন্ডিপেন্ডেন্ট মাল্টিকাস্ট

 

প্রটোকল ইন্ডিপেন্ডেন্ট মাল্টিকাস্ট বর্তমানে বেশি ব্যবহৃত হয়, এর দুটি প্রকরণ দেখা যায়,

  • পিআইএম ডেনস মোড
  • পিআইএম স্পারস মোড

 

ফ্লাডিং ও সর্টেস্ট পাথ রাউটিংএর এল্গারিদম,

কমন সর্টেস্ট পাথ এল্গারিদম হল,

  • Dijkstra's algorithm
  • Bellman Ford algorithm
  • Floyd Warshall algorithm

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক এড্রেসিং (DCN – Network Addressing)

রিদওয়ান বিন শামীম

 

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

  • আইপি,
  • আইপিএক্স,
  • অ্যাপলটক

নেটওয়ার্ক এড্রেসিং

যেহেতু বর্তমান যুগে কেবল আইপি কার্যকর আছে তাই আমরা সেটি নিয়েই আলোচনা করব। আইপি এড্রেসিং হোষ্ট ও নেটওয়ার্কের মধ্যে কৌশল সৃষ্টি করে, যেহেতু আইপি এড্রেসিং ক্রমানুসারে সজ্জিত তাই হোষ্ট সবসময় কোনও নেটওয়ার্কের আওতার মধ্যে থাকে। সাবনেটের আওতার বাইরের হোষ্টদের সাথে যোগাযোগ করতে গেলে ডেসটিনেশন নেটওয়ার্ক এড্রেস জানা থাকতে হয়। বিভিন্ন সাবনেটের আওতাভুক্ত হোষ্টদের নিজেদের খুঁজে বের করতে কৌশলের আশ্রয় নিতে হয়, এটি ডিএনএসের মাধ্যমে করা হয়। ডিএনএস একরকমের সার্ভার যা রিমোট হোষ্টের লেয়ার-৩ এড্রেস এর ডোমেইন নামের সাথে উপস্থাপন করে। যখন কোনও হোষ্ট এর লেয়ার-৩ এড্রেস বা আইপি এড্রেস পেয়ে যায় তখন এটি এর রাউটার নামক গেটওয়েতে সব ডাটা প্যাকেট প্রেরণ করে। রাউটার রাউটিং টেবিলের সাহায্য নেয়, যেটিতে নেটওয়ার্কে পৌছার পদ্ধতি সম্পর্কে তথ্য থাকে।

 

নেটওয়ার্ক এড্রেস নিচের যেকোনো একরকমের হতে পারে,

  • ইউনিকাস্ট(এক হোষ্টের জন্য নির্ধারিত)
  • মাল্টিকাস্ট(গ্রুপের জন্য নির্ধারিত)
  • ব্রডকাস্ট(সবার জন্য নির্ধারিত)
  • এনিকাস্ট(নিকটতম হোষ্টের জন্য নির্ধারিত)

 

রাউটার বাই ডিফল্ট কখনো ব্রডকাস্ট ট্রাফিককে ফরোয়ার্ড করে না।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক লেয়ার : ভূমিকা (DCN – Network Layer Introduction)

রিদওয়ান বিন শামীম

 

ওএসআই মডেলের লেয়ার-৩ কে নেটওয়ার্ক লেয়ার বলা হয়, নেটওয়ার্ক লেয়ার হোষ্ট ও নেটওয়ার্ক এড্রেসিং সংক্রান্ত বিষয়, সাবনেটওয়ার্ক ব্যবস্থাপনা ও ইন্টারনেটওয়ার্কিং নিয়ন্ত্রণ করে থাকে। সাবনেটের আওতায় বা বাইরে সোর্স থেকে লক্ষ্যে প্যাকেট পৌঁছে দেয়া নেটওয়ার্ক লেয়ারের দায়িত্ব। দুটি ভিন্ন সাবনেটের ভিন্ন এড্রেসিং স্কিম বা অসম্পৃক্ত এড্রেসিং টাইপ থেকে থাকতে পারে। প্রটোকলের ক্ষেত্রেও একই রকম, দুটি ভিন্ন সাবনেট ভিন্ন প্রটোকলের ক্ষেত্রে ক্রিয়াশীল থাকতে পারে। এড্রেসিং স্কিম ও প্রটোকল নিয়ন্ত্রণ করে সোর্স থেকে লক্ষ্যে প্যাকেট পৌঁছে দেয়া নেটওয়ার্ক লেয়ারের দায়িত্ব।

 

লেয়ার-৩ ফাংশনালিটি

নেটওয়ার্ক লেয়ারের কাজ করে এমন যন্ত্রপাতির প্রধান কাজ থাকে রাওটিং। রাওটিং একক কোনও লক্ষ্য অর্জনের জন্য একাধিক কাজের সমন্বয় হতে পারে।যেমন,

  • ডিভাইস এবং নেটওয়ার্কিং এড্রেসিং,
  • রাওটিং টেবিল ও স্ট্যাটিক রাওটিং পূর্ণ করা,
  • ইনকামিং ও আউটগোয়িং ডাটা সাজানো ও সার্ভিসের উপযোগিতা বিশ্লেষণ করে প্যাকেটের সেট অনুসারে ফরোয়ার্ড করা,
  • দুটি ভিন্ন সাবনেটের মধ্যে ইন্টারনেটওয়ার্কিং করা,
  • লক্ষ্যে প্যাকেট পৌঁছে দেয়ার সর্বোচ্চ চেষ্টা করা,
  • সংযোগসহ ও সংযোগবিহীন যন্ত্রকৌশল গঠনের চেষ্টা করা

 

 

নেটওয়ার্ক লেয়ারের বৈশিষ্ট্য

আদর্শ ফাংশনালিটি অর্জিত হলে লেয়ার-৩ যেধরনের সুবিধা দিতে পারে সেগুলো হল,

  • সার্ভিস ম্যানেজমেন্টের মান,
  • ভারসাম্য ও লিঙ্ক ব্যবস্থাপনা,
  • নিরাপত্তা,
  • বিভিন্ন স্কিমের সাবনেট ও প্রটোকলের সমন্বয় সাধন,
  • ফিজিকাল নেটওয়ার্ক ডিজাইনকে ভিত্তি করে বিভিন্ন লজিকাল নেটওয়ার্ক ডিজাইন,
  • L3 VPN ও টানেল এন্ডটু এন্ড কানেক্টিভিটির ক্ষেত্র তৈরি করে দিতে পারে।

 

ইন্টারনেট প্রটোকল নেটওয়ার্ক লেয়ার প্রটোকল হিসেবে এন্ডটু এন্ড ডিভাইসের যোগাযোগের জন্য প্রসিদ্ধ। এটি IPv4 ও IPv6 দুটি প্রকরণে পাওয়া যায়। IPv4 বহুদিন রাজত্ব করার পর একে প্রতিস্থাপিত করতে IPv6 আনা হয়েছে IPv4 এর ক্রুটিগুলো সরিয়ে দিতে।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ডাটা লিঙ্ক কন্ট্রোল এবং প্রটোকল (DCN – Data-link Control & Protocols)

রিদওয়ান বিন শামীম

 

যখন একক মাধ্যমে কোনও ডাটা ফ্রেম(লেয়ার-২ ডাটা) এক হোষ্ট থেকে অন্য হোষ্টে প্রেরণ করা হয় তখন প্রেরণকারী ও গ্রহণকারীর গতি সমান হতে হয়। গতি কোনও কারণে ভিন্ন হলে ডাটা হারিয়ে বা নষ্ট হয়ে যেতে পারে। এই গতিকে নিয়ন্ত্রণ করার জন্য দুই ধরণের ব্যবস্থা করা যায়,

  • থামা এবং আবার শুরু করাঃ এই নিয়ন্ত্রণ পদ্ধতি প্রয়োজনে প্রেরণকারীকে থামিয়ে রাখে সেই পর্যন্ত যতক্ষণ গ্রহণকারীর কাছ থেকে ডাটা ফ্রেম পৌঁছানো নিশ্চিত না হয়।

থামা এবং আবার শুরু করা

  • স্লাইডিং উইন্ডোঃ এই নিয়ন্ত্রণ পদ্ধতিতে প্রেরণকারী ও গ্রহণকারীর দ্বারা নির্ধারিত সংখ্যক ডাটা ফ্রেম পৌঁছানো নিশ্চিত হলেই কেবল প্রক্রিয়া নিশ্চিতকরণ সম্পন্ন হয়।

 

 

ভুল নিয়ন্ত্রণ

ডাটা ফ্রেম ট্রান্সমিশনের সময় এটি ট্রানজিটে হারিয়ে যেতে পারে, করাপ্টেড অবস্থায় গৃহীত হতে পারে। এজন্য প্রেরণকারী ও গ্রহণকারী উভয়কে কিছু প্রটোকল দেয়া থাকে যার মাধ্যমে ডাটা ফ্রেমের হারিয়ে যাওয়া বা ‘মিস হওয়া’ জাতীয় ট্রানজিট এরর নির্ণয় করা যায়। সেক্ষেত্রে  প্রেরণকারী আবার ডাটা প্রেরণ করে এবং গ্রহণকারী আবার প্রেরণের জন্য গ্রহণকারীকে অনুরোধ জানায়। এরর কন্ট্রোল ব্যবস্থার রিকোয়ারমেন্টগুলো হল,

  • ভুল নির্ণয় বা খুঁজে বের করা,
  • ইতিবাচক এসিকে,
  • নেতিবাচক এসিকে,
  • রিট্রান্সমিশন

 

অটোম্যাটিক রিপিট রিকোয়েস্ট বা এআরকিউ ব্যবহার করে ডাটা লিঙ্ক লেয়ারের মাধ্যমে ভুল নিয়ন্ত্রণের কৌশল তিনটি,

 

স্টপ এন্ড ওয়েট এআরকিউ

স্টপ এন্ড ওয়েট এআরকিউ

এই পদ্ধতিতে যে বিষয়গুলো হতে পারে তা হল,

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

 

গো ব্যাক এন এআরকিউ

স্টপ এন্ড ওয়েট এআরকিউ তাদের রিসোর্সের সবচেয়ে বেশি ব্যবহার নিশ্চিত করতে পারে না, গো ব্যাক এন এআরকিউ পদ্ধতিতে প্রেরণকারী ও গ্রহণকারী উভয়ই একটি উইন্ডো বজায় রাখে। প্রেরক উইন্ডোর আকার প্রেরণকারীকে একাধিক ফ্রেম প্রেরণের সুযোগ করে দেয়, আগে প্রেরণকৃত ফ্রেমের কোনও নিশ্চিতকরণ সংবাদ ছাড়াই। গ্রহণকারী উইন্ডো গ্রহণকারীকে একাধিক ফ্রেম গ্রহণের ও সেই সংবাদ নিশ্চিত করার সুযোগ করে দেয়।

গো ব্যাক এন এআরকিউ

সিলেক্টিভ রিপিট এআরকিউ

সিলেক্টিভ রিপিট এআরকিউ প্রক্রিয়ায় প্রেরণকারী কেবল এনএসিকে সম্পন্ন প্যাকেট প্রেরণ করে।

সিলেক্টিভ রিপিট এআরকিউ

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ক্রুটি নির্ণয় ও সংশোধন (DCN – Error Detection & Correction)

রিদওয়ান বিন শামীম

 

ডাটা ট্রান্সমিশনের সময় নয়েজ, ক্রসটকসহ আরও অনেক কারণে ডাটা ক্রুটিযুক্ত হতে পারে।উঁচুশ্রেণীর লেয়ারগুলো নেটওয়ার্ক স্থাপত্যকাঠামোর সরলীকরণের মাধ্যমে কাজ করে বলে হার্ডওয়ারের ডাটা প্রসেসিং সম্পর্কে খুব বেশি অবগত নয়। তারপরও পারে।উঁচুশ্রেণীর লেয়ারগুলো নির্ভুল ট্রান্সমিশন প্রত্যাশা করে। খুব বেশি হার্ডওয়ার ক্রুটিপূর্ণ ডাটার জন্য সেই প্রত্যাশামত কাজ করতে পারেনা।ভয়েজ বা ভিডিও টাইপের এপ্লিকেশন টুকটাক ক্রুটি নিয়েও চলতে পারে।

 

ডাটা লিঙ্ক লেয়ার ক্রুটি নিয়ন্ত্রণের জন্য কিছু কৌশল ব্যবহার করে,যাতে করে ফ্রেম(ডাটা বিট স্ট্রিম) নির্ভুলতার একটি নির্দিষ্ট মান বজায় রাখতে পারে।

 

ক্রুটির প্রকরণগুলো হল

তিন ধরণের ক্রুটি দেখা যায়,

  • সিঙ্গেল বিট এররঃ

সিঙ্গেল বিট এরর

একটি ফ্রেমে কেবল একটি বিটে ক্রুটি,

  • মাল্টিপল বিট এররঃ

মাল্টিপল বিট এরর

ফ্রেম একের বেশি এমন বিট গ্রহণ করে যা ক্রুটিপূর্ণ,

  • বড় ক্রুটিঃ

বড় ক্রুটি

একের বেশি ক্রমিক বিট ক্রুটিপূর্ণ

 

এরর কন্ট্রোল ম্যানেজমেন্ট দুটি পদ্ধতিতে কাজ করে, ক্রুটি নির্ণয় ও ক্রুটি সংশোধন ।

 

ক্রুটি নির্ণয়

রিসিভড ফ্রেমের ক্রুটি নির্ণয় প্যারীটি চেক ও সাইক্লিক রেডানড্যান্সি চেক বা সিআরসি দ্বারা করা হয়। উভয় ক্ষেত্রেই মূল ডাটার সাথে কিছু অতিরিক্ত ডাটা প্রেরণ করা হয়। গ্রহীতা যন্ত্র সেই ডাটা সঠিকভাবে গ্রহণ না করলে বোঝা যায় সিস্টেম ক্রুটিমুক্ত নয়।

 

প্যারীটি চেক

মূল ডাটার সাথে এক বিট অতিরিক্ত ডাটা প্রেরণ করা হয়।তার থেকে অড প্যারীটি বা ইভেন হলে ইভেন প্যারীটি নির্ণয় করে প্রক্রিয়ার মাধ্যমে ক্রুটি নির্ণয় করা হয়।

প্যারীটি চেক

 

সাইক্লিক রেডানড্যান্সি চেক বা সিআরসি

এ প্রক্রিয়ায় ভিন্নভাবে ক্রুটি নির্ণয় করা হয়।প্রেরণকৃত ডাটার বাইনারি ডিভিশনের মাধ্যমে এটি করা হয়।

সাইক্লিক রেডানড্যান্সি চেক বা সিআরসি

 

ক্রুটি সংশোধন

ডিজিটাল জগতে দুইভাবে ক্রুটি সংশোধন করা হয়,

  • ব্যাকওয়ার্ড এরর কারেকশনঃ রিসিভার গৃহীত ডাটায় ক্রুটি পেলে প্রেরককে পুনরায় ডাটা ট্রান্সমিশনের অনুরোধ জানায়,
  • ফরোয়ার্ড এরর কারেকশনঃ রিসিভার গৃহীত ডাটায় ক্রুটি পেলে ভুল সংশোধন কোড ব্যবহার করে ক্রুটি সারায়।

 

প্রথমটি অপেক্ষাকৃত সহজ, যদি পুনরায় ডাটা ট্রান্সমিশনের খরচ কম হয়। ডাটা ফ্রেমে সংশোধনের ক্ষেত্রে রিসিভারকে জানতে হবে ফ্রেমের কোন বিট ক্রুটিপূর্ণ।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ডাটা লিঙ্ক লেয়ার : ভূমিকা (DCN – Data-link Layer Introduction)

রিদওয়ান বিন শামীম

 

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

ডাটা লিঙ্ক লেয়ার এমন দুটি হোষ্টের মাঝে কাজ করে যারা কিছ কিছু ক্ষেত্রে সরাসরি সম্পৃক্ত, এই সরাসরি সম্পৃক্ততা দুটি পয়েন্টের মধ্যে বা সম্প্রচারগতও হতে পারে। ব্রডকাস্ট নেটওয়ার্কের সিস্টেম একই লিঙ্কে থাকে। ডাটা লিঙ্ক লেয়ারের কাজ আরও জটিল হয়ে যায় যখন একক সংঘর্ষ ডোমেইনে সেটিকে অনেকগুলো হোষ্ট নিয়ে কাজ করতে হয়।

ডাটা স্ট্রিমকে বাইট বাই বাইট সিগন্যালে রূপান্তরিত করা ও তাকে সংশ্লিষ্ট হার্ডওয়ারে প্রেরণের দায়িত্বও ডাটা লিঙ্ক লেয়ারের। রিসিভিং এন্ডে ডাটা লিঙ্ক লেয়ার হার্ডওয়ার থেকে ডাটা নিয়ে ফ্রেম ফরমেটে রূপ দিয়ে ঊর্ধ্বতন লেয়ারে প্রেরণ করে। ডাটা লিঙ্ক লেয়ারের দুটি সাব লেয়ার আছে,

  • লজিকাল লিঙ্ক কন্ট্রোলঃ এটি প্রটোকল, ফ্লো কন্ট্রোল ও এরর কন্ট্রোল নিয়ে কাজ করে।
  • মিডিয়া এক্সেস কন্ট্রোলঃ এটি মাধ্যমের প্রকৃত কন্ট্রোল নিয়ে কাজ করে।

 

ডাটা লিঙ্ক লেয়ারের কিছু ফাংশনালিটি আছে, এগুলো হল,

  • ফ্রেমিংঃ ডাটা লিঙ্ক লেয়ার নেটওয়ার্ক লেয়ার থেকে ডাটা প্যাকেট নিয়ে ফ্রেমে প্রক্রিয়াজাত করে।
  • এড্রেসিংঃ ডাটা লিঙ্ক লেয়ার লেয়ার-২ হার্ডওয়ার এড্রেসিং মেকানিজম প্রবর্তন করে।
  • সিনক্রোনাইজেশনঃ যখন ডাটা ফ্রেমকে লিঙ্কে পাঠানো হয় তখন উভয় যন্ত্রকে সমন্বিত হতে হয়।
  • এরর কন্ট্রোলঃ এটি সিগন্যাল সংক্রান্ত ভুল নিয়ন্ত্রণে কার্যকর।
  • ফ্লো কন্ট্রোলঃ দুটি যন্ত্রের ট্রান্সফারের গতি যেন এক হয় তা নিয়ন্ত্রণে ডাটা লিঙ্ক লেয়ার এটি ব্যবহার করে।
  • মাল্টি এক্সেসঃ মাল্টিপল সিস্টেমে সংঘর্ষ ছাড়া শেয়ারড মিডিয়া ব্যবহারের জন্য এই ফাংশনালিটি প্রয়োজন হয়।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক সুইচিং (DCN – Network Switching)

রিদওয়ান বিন শামীম

 

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

 

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

 

সার্কিট সুইচিং

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

সার্কিট স্থায়ী ও অস্থায়ী, দুরকমেরই হয়। সার্কিট সুইচিং ব্যবহার করা এপ্লিকেশনগুলো তিনটি ধাপের মধ্য দিয়ে যায়,

 

  • সার্কিট প্রতিষ্ঠা করা,
  • ডাটা ট্রান্সফার,
  • সার্কিটের সংযোগ বিচ্ছিন্ন করা

সার্কিট সুইচিং

 

সার্কিট সুইচিং ভয়েস এপ্লিকেশনের জন্য তৈরি হয়েছিল। টেলিফোন সার্কিট সুইচিংএর সবচেয়ে ভাল উদাহরণ। কল করার আগে যে কল করছে আর যাকে কল করা হচ্ছে তাদের মধ্যে নেটওয়ার্কে ভার্চুয়াল পাথ তৈরি হচ্ছে।

 

 

ম্যাসেজ সুইচিং

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

ম্যাসেজ সুইচিং

এই পদ্ধতিকে সার্কিট সুইচিংএর বিকল্প হিসেবে ধরা হয়।

 

ম্যাসেজ সুইচিংএর কিছু ড্রব্যাক আছে,

 

  • ট্রানজিট পাথের সকল সার্কিটে ম্যাসেজ সংরক্ষণের উপযুক্ত পর্যাপ্ত জায়গা প্রয়োজন,
  • স্টোর-এন্ড-ফরোয়ার্ড ব্যবস্থা ও রিসোর্স প্রাপ্যতার জন্য অপেক্ষা করার জন্য ম্যাসেজ সুইচিং অনেক ধীর প্রক্রিয়া,
  • ম্যাসেজ সুইচিং স্ট্রিমিং মিডিয়া ও রিয়েলটাইম এপ্লিকেশনের জন্য উপযোগী সমাধান নয়।

 

 

প্যাকেট সুইচিং

ম্যাসেজ সুইচিংএর সময় কমানো থেকে প্যাকেট সুইচিং ধারনার উদ্ভব, এতে ম্যাসেজকে ছোটছোট প্যাকেটে ভাগ করা হয়।সুইচিং তথ্যকে প্রত্যেক প্যাকেটের হিডারে (header) স্বাধীনভাবে সম্প্রচারের জন্য রাখা হয়।

 

প্যাকেট সুইচিং

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : মাল্টিপ্লেক্সিং (DCN – Multiplexing)

রিদওয়ান বিন শামীম

 

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

 

ফ্রিকোয়েন্সি ডিভিশন মাল্টিপ্লেক্সিং

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

 

টাইম ডিভিশন মাল্টিপ্লেক্সিং

টাইম ডিভিশন মাল্টিপ্লেক্সিং প্রাথমিক অবস্থায় ডিজিটাল সিগন্যালের ক্ষেত্রে প্রযোজ্য হলেও এরা এনালগ সিগন্যালের ক্ষেত্রেও প্রযোজ্য হতে পারে। টাইম ডিভিশন মাল্টিপ্লেক্সিংএ শেয়ারড চ্যানেল টাইম স্লটের ভিত্তিতে এর ইউজারদের মধ্যে বন্টিত থাকে। প্রত্যেক ইউজার বরাদ্ধকৃত সময়ের মধ্যে ডাটা ট্রান্সমিট করতে পারে। টাইম ডিভিশন মাল্টিপ্লেক্সিং সমন্বয়মূলক(সিঙ্ক্রোনাইজেশন) মোডে কাজ করে।

 

ওয়েভলেন্থ ডিভিশন মাল্টিপ্লেক্সিং

আলোর বিভিন্ন তরঙ্গদৈর্ঘ্য থাকে। ফাইবার অপটিক মোডে মাল্টিপল অপটিক্যাল কেরিয়ার সিগন্যাল বিভিন্ন তরঙ্গদৈর্ঘ্য ব্যবহার করে অপটিক্যাল ফাইবারে মাল্টিপ্লেক্সড হয়। এটি এনালগ মাল্টিপ্লেক্সিং কৌশল এবং বস্তুত ফ্রিকোয়েন্সি ডিভিশন মাল্টিপ্লেক্সিংএর মতই কাজ করে কিন্তু আলোকে সিগন্যাল হিসেবে ব্যবহার করে।

 

উপরন্তু, প্রতিটা তরঙ্গদৈর্ঘ্যের জন্য টাইম ডিভিশন মাল্টিপ্লেক্সিং অধিক ডাটা সিগন্যাল সংরক্ষণ সমন্বয় করে।

 

কোড ডিভিশন মাল্টিপ্লেক্সিং

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

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ওয়ারলেস ট্রান্সমিশন (DCN – Wireless Transmission)

রিদওয়ান বিন শামীম

 

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

ওয়ারলেস ট্রান্সমিশন

 

রেডিও ট্রান্সমিশন

রেডিও ফ্রিকোয়েন্সি ব্যবহার করা সহজ কারণ এগুলোর বড় তরঙ্গদৈর্ঘ্য দেয়াল বা এরকম কাঠামো ভেদ করে যেতে পারে। এক মিলিমিটারের মত ক্ষুদ্র থেকে ১ লক্ষ কিলোমিটার পর্যন্ত বৃহৎ তরঙ্গদৈর্ঘ্যের বেতার তরঙ্গ হতে পারে। ৩ হার্জ(অত্যন্ত ছোট) থেকে ৩০০ গিগাহার্জ(অত্যন্ত বড়) রেডিও ফ্রিকোয়েন্সি হতে পারে। রেডিও ফ্রিকোয়েন্সি ছয়টি ব্যান্ডে ভাগ করা আছে।

রেডিও ট্রান্সমিশন

 

রেডিও ট্রান্সমিশন আর্থ

 

মাইক্রোওয়েভ ট্রান্সমিশন

১০০ মেগাহার্জের বেশি তাড়িতচৌম্বক তরঙ্গ সোজা লাইনে চলার প্রবণতা দেখায় এবং নির্দিষ্ট ষ্টেশনে বিমিংএর মাধ্যমে এদের দ্বারা সিগন্যাল প্রেরণ করা যায়। যেহেতু মাইক্রোওয়েভ সরল রেখায় চলে, তাই প্রেরক ও গ্রাহক যন্ত্র দৃষ্টিরেখার সমান্তরাল হতে হয়। মাইক্রোওয়েভের তরঙ্গদৈর্ঘ্য ১ মিলিমিটার থেকে ১ মিটার ও ফ্রিকোয়েন্সি ৩০০ গিগাহার্জ থেকে ৪৩০ টেরাহার্জ পর্যন্ত হতে পারে।

 

মাইক্রোওয়েভ ট্রান্সমিশন

 

ইনফ্রারেড ট্রান্সমিশন

ইনফ্রারেড তরঙ্গ দৃশ্যমান আলোক বর্ণালী ও মাইক্রোওয়েভের মাঝামাঝি একটি বিষয়, তরঙ্গদৈর্ঘ্য ৭০০ ন্যানোমিটার থেকে ১ মিলিমিটার ও ফ্রিকোয়েন্সি ৩০০ মেগাহার্জ থেকে ৩০০ গিগাহার্জ পর্যন্ত হতে পারে।স্বল্পদূরত্বে যোগাযোগের ক্ষেত্রে যেমন টেলিভিশনের রিমোট কন্ট্রোলে এদের ব্যবহার করা হয়।

 

আলোক ট্রান্সমিশন

সর্বোচ্চ তাড়িতচৌম্বক বর্ণালী যা ডাটা ট্রান্সফারের জন্য ব্যবহৃত হয় তা হল আলোক বা অপটিক্যাল সিগনালিং। লেজার পদ্ধতিতে এটি সম্ভব হয়। লেজার দেয়াল, বৃষ্টি বা ঘন কুয়াশা ভেদ করতে পারে না, এর ব্যবহৃত ফ্রিকোয়েন্সির কারণে এটি সরল রেখায় চলে।

আলোক ট্রান্সমিশন

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ট্রান্সমিশন মিডিয়া (DCN – Transmission Media)

রিদওয়ান বিন শামীম

 

ট্রান্সমিশন মিডিয়া হল কম্পিউটার নেটওয়ার্কের যোগাযোগের বস্তুগত মাধ্যম।

 

চৌম্বক মাধ্যম

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

 

টুইস্টেড পেয়ার ক্যাবল

টুইস্টেড পেয়ার ক্যাবল একক মাধ্যম থেকে দুটো প্লাস্টিকে মোড়ানো তামার তার যা পরস্পরের উপর জড়ানো থাকে। একটি তার মূল সিগন্যাল বহন করে, অন্যটি গ্রাউন্ড রেফারেন্সের জন্য ব্যবহৃত হয়। টুইস্টগুলো নয়েজ ও ক্রসটক কমায়(তাড়িতচৌম্বক ইন্টারফেরেন্সের জন্য)। দুই ধরণের টুইস্টেড পেয়ার ক্যাবল হয়,

টুইস্টেড পেয়ার ক্যাবল

  • শিল্ডেড টুইস্টেড পেয়ার(এসটিপি)ক্যাবল।
  • আনশিল্ডেড টুইস্টেড পেয়ার(ইউটিপি) ক্যাবল।

 

কোএক্সিয়াল ক্যাবল

কোএক্সিয়াল ক্যাবলে তামার দুটি তার থাকে, মূল তারটি কেন্দ্রে থাকে, এটি নিরেট কন্ডাক্টর দিয়ে তৈরি। মূল অংশটি ইন্সুলেটর মোড়ানো আবরণ দিয়ে আলাদা করা, এটি একটি প্লাস্টিকের আবরণ দিয়ে আবৃত।সেই আবরনের উপরে দ্বিতীয় তারটি জড়ানো থাকে। এর উপরেও ইন্সুলেটর মোড়ানো আবরণ থাকে। পুরো জিনিসটি প্লাস্টিকের আবরণ দ্বারা জড়ানো থাকে। এর কাঠামোগত কারণে এটি টুইস্টেড পেয়ার ক্যাবলের চেয়ে বেশি ফ্রিকোয়েন্সির সিগন্যাল বহন করতে পারে।

কোএক্সিয়াল ক্যাবল

 

পাওয়ার লাইন

পাওয়ার লাইন কমুনিকেশন লেয়ার-১ প্রযুক্তি যা ডাটা সিগন্যাল ট্রান্সমিট করতে পাওয়ার ক্যাবল ব্যবহার করে। পাওয়ার লাইন কমুনিকেশনে তারের মাধ্যমে মডিউলেটেড ডাটা প্রেরণ করা হয়। অপর প্রান্তের গ্রহীতা সেই ডাটাকে ডিমডিউলেটেড করে ইন্টারপ্রেট করে। দুই ধরণের পাওয়ার লাইন পাওয়া যায়,

  • সরু ব্যান্ডের পিএলসি এবং
  • ব্রডব্যান্ড পিএলসি

 

ফাইবার অপটিক্স

ফাইবার অপটিক্স আলোর গুণাবলী অনুসারে কাজ করে। ক্রান্তিকোণে আলো পরলে তা ৯০ ডিগ্রি কোণে প্রতিফলিত হয়। এই মূলনীতি ফাইবার অপটিক্সে কাজে লাগানো হয়। ফাইবার অপটিক্সের মূল(কোর)অংশকে উচ্চ মানের কাঁচ বা প্লাস্টিক দ্বারা তৈরি করা হয়। এর ভিতর দিয়ে আলো প্রবাহিত হয়, অন্য প্রান্তে সেই নিঃসৃত আলোর স্ট্রিমকে বৈদ্যুতিক ডাটায় পরিণত করা হয়। এটি সবচেয়ে বেশি গতির মাধ্যম। একক মোড ফাইবার ও বহু মোড ফাইবার, এই দুই প্রকার ফাইবার একাজে পাওয়া যায়। ফাইবার অপটিক্স একমুখী ও দ্বিমুখী এই দুই প্রকারের সক্ষমতা সম্পন্ন হতে পারে।

ফাইবার অপটিক্স

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : এনালগ ট্রান্সমিশন : (DCN – Analog Transmission)

রিদওয়ান বিন শামীম

 

এনালগ মাধ্যমে ডাটা প্রেরণ করতে হলে ডাটাকে এনালগ সিগন্যালে রূপান্তরিত করে নিতে হয়। ডাটা রূপান্তরের ক্ষেত্রে দুটি বিষয় হয়ে থাকে,

  • ব্যান্ডপাসঃ ফিল্টারের মাধ্যমে চাহিদামত ফ্রিকোয়েন্সি ফিল্টারিং ও অতিক্রম করানো হয়।
  • লো পাসঃ লো পাস একধরনের ফিল্টার যার মধ্য দিয়ে কম ফ্রিকোয়েন্সির সিগন্যাল প্রেরিত হয়।

 

ডিজিটাল থেকে এনলগে রূপান্তর

যখন এক কম্পিউটার থেকে অন্য কোনটিতে এনালগ ক্যারিয়ারের মাধ্যমে ডাটা স্থানান্তর করা হ্য় তখন সেটি প্রথমে এনালগ সিগন্যালে রূপান্তরিত হয়, এনালগ সিগন্যালকে সেই ডাটাকে ডিজিটাল ডাটায় রিফ্লেক্ট করার মত করে মডিফাই করে নেয়া হয়। কোনও এনালগ ডাটা এর এমপ্লিচিউড, ফ্রিকোয়েন্সি ও ফেজের মাধ্যমে বিশেষায়িত হয়। ডিজিটাল থেকে এনলগে রূপান্তর তিন ধরণের হতে পারে,

  • এমপ্লিচিউড শিফট কীইংঃ এই রূপান্তর প্রক্রিয়ায় এনালগ ক্যারিয়ার সিগন্যালের এমপ্লিচিউড বাইনারি ডাটা প্রদর্শনের উদ্দেশে রূপান্তরিত হয়।

এমপ্লিচিউড শিফট কীইং

  • ফ্রিকোয়েন্সি শিফট কীইংঃ এই রূপান্তর প্রক্রিয়ায় এনালগ ক্যারিয়ার সিগন্যালের ফ্রিকোয়েন্সি বাইনারি ডাটা প্রদর্শনের উদ্দেশে রূপান্তরিত হয়। এই পদ্ধতি দুটি ফ্রিকোয়েন্সি ব্যবহার করে।

ফ্রিকোয়েন্সি শিফট কীইং

  • ফেজ শিফট কীইংঃ এই রূপান্তর প্রক্রিয়ায় মূল ক্যারিয়ার সিগন্যালের ফেজ বাইনারি ডাটা প্রদর্শনের উদ্দেশে পরিবর্তিত হয়।

ফেজ শিফট কীইং

  • কোয়াড্রেচার ফেজ শিফট কীইংঃ কোয়াড্রেচার ফেজ শিফট কীইং দুটি বাইনারি ডিজিট একসাথে প্রদর্শনের জন্য ফেজকে রূপান্তরিত করে। এটি দুটি ভিন্ন ফেজে হয়ে থাকে।

 

এনালগ থেকে এনলগে রূপান্তর

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

এনালগ থেকে এনলগে রূপান্তর

  • এমপ্লিচিউড মডুলেশনঃ এই মডুলেশন প্রক্রিয়ায় ক্যারিয়ার সিগন্যালের এমপ্লিচিউড এনালগ ডাটা প্রদর্শনের উদ্দেশে রূপান্তরিত হয়।

এমপ্লিচিউড মডুলেশন

  • ফ্রিকোয়েন্সি মডুলেশনঃ এই মডুলেশন প্রক্রিয়ায় ক্যারিয়ার সিগন্যালের ফ্রিকোয়েন্সি মডুলেশনের ভোল্টেজ লেভেলের পরিবর্তন(এনালগ ডাটা)প্রদর্শনের উদ্দেশে রূপান্তরিত হয়।

ফ্রিকোয়েন্সি মডুলেশন

  • ফেজ মডুলেশনঃ এই মডুলেশন প্রক্রিয়ায় ক্যারিয়ার সিগন্যালের ফেজ মডুলেশনের ভোল্টেজ লেভেলের পরিবর্তন(এনালগ ডাটা)প্রদর্শনের উদ্দেশে পরিবর্তিত হয়।

ফেজ মডুলেশন

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ডিজিটাল ট্রান্সমিশন : (DCN – Digital Transmission)

রিদওয়ান বিন শামীম

 

ডাটা বা তথ্য দুইভাবে সংরক্ষণ করা যায়, ডিজিটাল ও এনালগ পদ্ধতিতে। কম্পিউটারে ডাটা সংরক্ষণ ডিজিটাল পদ্ধতিতে করা হয়। ডাটার মত সিগন্যালও ডিজিটাল ও এনালগ এই দুই পদ্ধতিতে সংরক্ষণ করা যায়। ডাটাকে ডিজিটাল পদ্ধতিতে ট্রান্সমিশনের জন্য একে আগে ডিজিটাল ফরম্যাটে পরিবর্তিত করে নিতে হয়।

 

ডিজিটাল থেকে ডিজিটালে রূপান্তর

লাইন কোডিং ও ব্লক কোডিং, এই দুই ভাবে ডিজিটাল থেকে ডিজিটালে রূপান্তর করা যায়। সব ধরণের যোগাযোগের জন্য লাইন কোডিং জরুরী যেখানে ব্লক কোডিং ঐচ্ছিক।

 

লাইন কোডিং

ডিজিটাল ডাটাকে ডিজিটাল সিগন্যালে পরিণত করার প্রক্রিয়াকে লাইন কোডিং বলে। ডিজিটাল ডাটাকে বাইনারি ফরম্যাটে পাওয়া যায়, একে ১ থেকে ১০ পর্যন্ত সিরিজের অন্তর্নিহিতভাবে সংরক্ষণ করা যায়।

লাইন কোডিং

লাইন কোডিং

 

ইউনিপোলার এনকোডিং

ইউনিপোলার এনকোডিং স্কিম ডাটা রিপ্রেজেন্ট করার জন্য সিঙ্গেল ভোল্টেজ লেভেল ব্যবহার করে, এক্ষেত্রে বাইনারি ১ প্রকাশ করতে উঁচু ভোল্টেজ ও বাইনারি ০ প্রকাশ করতে কোনও ভোল্টেজ ট্রান্সমিটেড হয় না। এদের ইউনিপোলার নন-রিটার্ন-টু-জিরোও বলা হয়।

ইউনিপোলার এনকোডিং

 

পোলার এনকোডিং

পোলার এনকোডিং স্কিম বাইনারি মান প্রকাশের জন্য মাল্টিপল ভোল্টেজ লেভেল ব্যবহার করে। পোলার এনকোডিং কে চার রূপে পাওয়া যায়,

  • পোলার ননরিটার্ন টু জিরো

পোলার ননরিটার্ন টু জিরো

  • রিটার্ন টু জিরো,

রিটার্ন টু জিরো

  • ম্যানচেস্টার,
  • ডিফারেন্সিয়াল ম্যানচেস্টার

 

বাইপোলার এনকোডিং

বাইপোলার এনকোডিং তিন ধরণের ভোল্টেজ লেভেল ব্যবহার করে, পজেটিভ, নেগেটিভ ও জিরো।

বাইপোলার এনকোডিং

 

ব্লক কোডিং

ব্লক কোডিং তিন ধরণের হয়,

  • ডিভিশন,
  • সাবস্টিটিউশন,
  • কম্বিনেশন

 

ব্লক কোডিং সম্পন্ন হওয়ার পর একে লাইন কোডেড করা হয়।

 

এনালগ থেকে ডিজিটাল রূপান্তর

এনালগ তরঙ্গকে ডিজিটাল ডাটায় পরিণত করতে পালস কোড মডুলেশন ব্যবহার করা হয়। এটি তিন ধাপে হয়,

  • সেম্পলিং

সেম্পলিং

  • কোয়ান্টাইজেশন

কোয়ান্টাইজেশন

  • এনকোডিং

এনকোডিং

 

ট্রান্সমিশন মোড

দুটি কম্পিউটারে কীভাবে ডাটা ট্রান্সমিটেড হবে তা নির্ণয় করে ট্রান্সমিশন মোড,এর দুটি প্রকরণ ঘটে,

  • প্যারালাল ট্রান্সমিশন

প্যারালাল ট্রান্সমিশন

  • সিরিয়াল ট্রান্সমিশন।

সিরিয়াল ট্রান্সমিশন

 

সিরিয়াল ট্রান্সমিশন দুই রকমের হয়,

  • এসিনক্রোনাস সিরিয়াল ট্রান্সমিশন
  • সিনক্রোনাস সিরিয়াল ট্রান্সমিশন

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : ফিজিকাল লেয়ার : ভূমিকা (DCN – Physical Layer Introduction)

রিদওয়ান বিন শামীম

 

ওএসআই মডেলে ফিজিকাল লেয়ার মূল হার্ডওয়ার ও সিগনালিং কৌশলের সমন্বয় সাধনে গুরুত্বপূর্ণ ভূমিকা পালন করে, ওএসআই মডেলে ফিজিকাল লেয়ারই একমাত্র লেয়ার যেটি দুটি ভিন্ন ষ্টেশনের বস্তুগত যোগাযোগ নিয়ে কাজ করে। এই লেয়ার হার্ডওয়ার ইকুইপমেন্ট, ক্যাবলিং, ওয়ারিং এবং বাইনারি সিগন্যাল প্রকাশের জন্য প্রয়োজনীয় পালস ও ফ্রিকোয়েন্সি বিবৃত করে।

ফিজিকাল লেয়ার এর সার্ভিসকে ডাটা লিঙ্ক লেয়ারে অর্পণ করে। ডাটা লিঙ্ক লেয়ার ফিজিকাল লেয়ারে ফ্রেম প্রদান করে। ফিজিকাল লেয়ার সেগুলোকে ইলেক্ট্রিক্যাল পালসে পরিণত করে, যা বাইনারি ডাটারূপে প্রতীয়মান হয়। সেই বাইনারি ডাটা তারবিহীন বা তারযুক্ত মাধ্যমে প্রেরিত হয়।

 

সিগন্যাল

ফিজিকাল মাধ্যমে ডাটা যখন প্রেরিত হয়, সেটিকে প্রথমে তাড়িতচৌম্বক সিগন্যালে রূপান্তরিত করে নেয়া হয়। ডাটা নিজে এনালগ(যেমন মানবকণ্ঠ) বা ডিজিটাল(কোনও ডিস্কে একটি ফাইল)হতে পারে, যেকোনো এনালগ বা ডিজিটাল উভয় প্রকার ডাটাকে এনালগ বা ডিজিটাল সিগন্যালে রূপান্তরিত করে নেয়া সম্ভব।

  • ডিজিটাল সিগন্যালঃ ডিজিটাল সিগন্যাল প্রকৃতিগতভাবে পৃথক বা অসংলগ্ন, এরা ভোল্টেজ পালসের ক্রম প্রকাশ করে। কম্পিউটার সিস্টেমের সার্কিটসংক্রান্ত অংশে ডিজিটাল সিগন্যাল ব্যবহৃত হয়।
  • এনালগ সিগন্যালঃ এনালগ সিগন্যাল স্বাভাবিকভাবে পাওয়া ক্রমাগত সিগন্যাল, যা ক্রমাগত আসা তাড়িতচৌম্বক তরঙ্গ দ্বারা প্রকাশিত।

 

ট্রান্সমিশনে বিঘ্ন

সিগন্যালগুলো যখন মাধ্যমগুলোর ভেতর দিয়ে ভ্রমণ করে, অনেক সময় সেখানে বিঘ্ন ঘটতে পারে, এর প্রধান প্রধান কারণগুলো হল,

  • ডাটা অপচয়
  • বিচ্ছুরণ
  • বিলম্ব সংক্রান্ত বিকৃতি
  • নয়েজ

 

নয়েজঃ এনালগ বা ডিজিটাল সিগন্যালে নিয়মিত বিঘ্ন বা অস্থিরতাকে সিগন্যালের নয়েজ বলে। এটি মূল ডাটাকে বিকৃত করে। নয়েজ নিচের যেকোনো রকমের হতে পারে,

  • থারমাল নয়েজ
  • ইন্টারমডুলেশন
  • ক্রসটক
  • ইম্পালস

 

রান্সমিশন মিডিয়া

দুটি কম্পিউটার ব্যবস্থার তথ্য যে মাধ্যমের ভেতর দিয়ে প্রেরিত হয় তাকে ট্রান্সমিশন মিডিয়া বলে, এটি দুই ধরণের হতে পারে,

  • গাইডেড মিডিয়াঃ সকল তারজাতীয় মিডিয়া গাইডেড মিডিয়া, যেমন ইউটিপি, কোএক্সিয়াল ক্যাবল এবং ফাইবার অপটিক্স। এই মিডিয়ায় প্রেরক এবং গ্রহীতা সরাসরি যুক্ত থাকে।
  • আনগাইডেড মিডিয়াঃ তারবিহীন বা বেতার মিডিয়াকে আনগাইডেড মিডিয়া বলে ধরা হয়।

 

চ্যানেল ক্যাপাসিটি

ডাটা ট্রান্সমিশনের গতিকে চ্যানেল ক্যাপাসিটি বলা হয়। এটি বেশ কিছু বিষয়ের উপর নির্ভর করে,

  • ব্যান্ডউইথ
  • এরর রেট
  • এনকোডিং

 

মাল্টিপ্লেক্সিং

একক মাধ্যমে মাল্টিপল ডাটা স্ট্রিম মেশানো এবং প্রেরণের কৌশলকে মাল্টিপ্লেক্সিং বলে।

 

সুইচিং

এর মাধ্যমে ডাটাকে উৎস থেকে এমন গন্তব্যে প্রেরণ করা হয় যা সরাসরি সংযুক্ত নয়।

 

সুইচিং

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : কম্পিউটার নেটওয়ার্ক সিকিউরিটি (DCN – Computer Network Security)

রিদওয়ান বিন শামীম

 

ইন্টারনেটের প্রারম্ভিক সময়গুলোতে এর ব্যবহার কেবল সামরিক ক্ষেত্রে ও বিশ্ববিদ্যালয়গুলোতে উন্নয়ন ও গবেষণাকর্মের মাঝে সীমিত ছিল। পরে যখন সব নেটওয়ার্ক মিলে ইন্টারনেট সৃষ্টি হল, তখন তথ্যব্যবস্থা জনগনের জন্য উন্মুক্ত হয়ে গেল। অতি স্পর্শকাতর তথ্য ও উপাত্ত, মানুষের ব্যাংক ও বাজারসদাই, নাম-পাসওয়ার্ড, ব্যক্তিগত বিষয়আশয় এগুলি সবকিছু নিরাপত্তা ঝুঁকিতে পরে গেল। সকল নিরাপত্তা ঝুঁকি উদ্দেশ্যপ্রণোদিত, এদেরকে কয়েকটি ভাগে ভাগ করা যায়,

  • ইন্টারাপশনঃ কোনও সাইটে ঢুকতে না পারা বা এজাতীয় সমস্যা।
  • গোপনীয়তা লঙ্ঘনঃ কারো ব্যক্তিগত সীমায় প্রবেশ বা তার বিনা অনুমতিতে বা অগোচরে তথ্য গ্রহণ,
  • ইন্টেগ্রিটিঃ ডাটা সংশোধন বা প্রকৃত অধিকার আছে এমন ব্যক্তির সমন্বয়ে সিস্টেমে বিচরণ সংশ্লিষ্ট বিষয়,
  • অথেনটিসিটিঃ যখন আক্রমণকারী ব্যক্তি হিসেবে নিরাপত্তা বিঘ্নিত করে এবং অন্য ব্যক্তি বা প্রতিষ্ঠানের নিরাপত্তার জন্য হুমকি হয়।

কম্পিউটার নেটওয়ার্ক সিকিউরিটি

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

ক্রিপ্টোগ্রাফি হল এক ধরণের কৌশল যাতে সরল টেক্সট ডাটাকে এনক্রিপ্ট করা হয় যাতে ডাটা বোঝা ও ব্যাখ্যা করা কঠিন হয়। ক্রিপ্টোগ্রাফির বেশ কিছু এলগরিদম বর্তমানে পাওয়া যায়,

  • সিক্রেট কী
  • পাবলিক কী
  • ম্যাসেজ ডাইজেস্ট

 

সিক্রেট কী এনক্রিপশন

প্রেরক ও গ্রাহকের কাছে গোপন সূত্র(কী) থাকে।

পাবলিক কী এনক্রিপশনঃ এই এনক্রিপশন ব্যবস্থায় সব ইউজারের কাছে গোপন সূত্র(কী) থাকে। শেয়ারড ডোমেইনে এটি সম্ভব নয়।

 

ম্যাসেজ ডাইজেস্ট

প্রকৃত তথ্য প্রেরণ করা হয় না, সাঙ্কেতিক মান প্রেরণ করা হয়। গ্রহীতার প্রান্ত থেকে সেই সাঙ্কেতিক মান অনুধাবন ও নির্ণয় করে ডাটা নির্ণয় করা হয়। এমডি-৫ হেসিং এরকম ম্যাসেজ ডাইজেস্টের উদাহরণ।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : কম্পিউটার নেটওয়ার্ক মডেল (DCN – Computer Network Models)

রিদওয়ান বিন শামীম

 

নেটওয়ার্কিং ইঞ্জিনিয়ারিং একটি জটিল কাজ, যার মধ্যে আছে সফটওয়ার, ফার্মওয়ার, নিচু শ্রেণীর প্রকৌশল, হার্ডওয়ার, এবং ইলেকট্রিক কর্মকাণ্ড। এই কর্মকাণ্ডকে সহজ করার জন্য এটিকে কয়েকটি লেয়ারে ভাগ করা হয়। এই লেয়ারগুলো স্বতন্ত্র ও তাদের নিজস্ব কাজ থাকে, পুরো নেটওয়ার্কিং এই লেয়ারগুলোর উপর নির্ভর করে। লেয়ারগুলো নিজেদের মধ্যে ডাটা আদানপ্রদান করে, কেবলমাত্র ইনপুট ও আউটপুটের জন্য পরস্পরের উপর নির্ভর করে।

 

লেয়ারের কাজ

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

লেয়ারের কাজ

 

ওএসআই মডেল

ওপেন সিস্টেম ইন্টারকানেক্ট সব কমুনিকেশন সিস্টেমের জন্য আদর্শ, আইএসও দ্বারা প্রতিষ্ঠিত এই মডেলের সাতটি লেয়ার আছে,

 

  • এপ্লিকেশন লেয়ারঃ এপ্লিকেশন ব্যবহারকারীকে ইন্টারফেস ব্যবহারের সুযোগ করে দেয়,
  • প্রেজেন্টেশন লেয়ারঃ নেটিভ ফরম্যাটের ডাটা কীভাবে পরিবেশিত হবে তা এই লেয়ার নির্ধারণ করে,
  • সেশন লেয়ারঃ এই লেয়ার রিমোট হোষ্টের মধ্যবর্তী সেশন নিয়ন্ত্রণ করে,
  • ট্রান্সপোর্ট লেয়ারঃ হোষ্টগুলোর মাঝে বিতরণ এই লেয়ারের দায়িত্ব,
  • নেটওয়ার্ক লেয়ারঃ এসাইনমেন্ট ও নেটওয়ার্কে হোষ্টগুলোর স্বাতন্ত্র্য নির্দেশ করে,
  • ডাটা লিঙ্ক লেয়ারঃ ডাটা পড়া ও লেখা এই লেয়ারে হয়, লিঙ্ক এরর থাকলে সেটিও এই লেয়ারে সনাক্ত হয়,
  • ফিজিকাল লেয়ারঃ এই লেয়ার হার্ডওয়ার, ক্যাবল সংযোগ ও পাউয়ার আউটপুট , পালস রেট এসব নির্দেশ করে।

 

ইন্টারনেট মডেল

ইন্টারনেট টিসিপি বা আইপি প্রটোকল স্যুইট ব্যবহার করে যা ইন্টারনেট মডেলকে বিবৃত করে। এটি চারটি লেয়ারে বিভক্ত,

  • এপ্লিকেশন লেয়ারঃ এপ্লিকেশন ব্যবহারকারীকে নেটওয়ার্ক ব্যবহারের সুযোগ করে দেয়, যেমন এফটিপি, এইচটিটিপি ইত্যাদি।
  • ট্রান্সপোর্ট লেয়ারঃ হোষ্টগুলোর মাঝে কীভাবে ডাটা প্রবাহিত হবে তা ঠিক করা এই লেয়ারের দায়িত্ব।
  • ইন্টারনেট লেয়ারঃ ইন্টারনেট প্রটোকল বা আইপি এই লেয়ারে কাজ করে।
  • লিঙ্ক লেয়ারঃ প্রকৃত ডাটা প্রেরণ বা গ্রহণ করার কৌশল এই লেয়ার নির্ধারণ করে।

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : কম্পিউটার নেটওয়ার্ক টোপোলজি (DCN – Computer Network Toplogies)

রিদওয়ান বিন শামীম

 

নেটওয়ার্ক টপোলজি হল একধরনের ব্যবস্থা যার মাধ্যমে কম্পিউটার সিস্টেম বা নেটওয়ার্ক ডিভাইসগুলো পরস্পরের সাথে সংযুক্ত থাকে। ফিজিকাল ও লজিকাল উভয় দৃষ্টিভঙ্গিতেই টপোলজিকে বিবৃত করা যায়। একই নেটওয়ার্কে ফিজিকাল ও লজিকাল উভয় টপোলজি একই রকম বা ভিন্ন হতে পারে।

 

পয়েন্ট টু পয়েন্ট

পয়েন্ট টু পয়েন্ট নেটওয়ার্কে ঠিক দুটো হোষ্ট যেমন কম্পিউটার, সুইচ, রাউটার বা সার্ভার একটিমাত্র তার ব্যবহার করে সংযুক্ত থাকতে পারে, এক হোষ্টের গ্রহণকারী প্রান্ত অন্য হোষ্টের প্রেরণকারী প্রান্তের সাথে যুক্ত থাকতে পারে। পয়েন্ট টু পয়েন্ট ভাবে দুটো হোষ্ট যুক্ত থাকলে মধ্যবর্তী অনেক ডিভাইস থাকতে পারে।

পয়েন্ট টু পয়েন্ট

 

বাস টপোলজি

বাস টপোলজির ক্ষেত্রে সব যন্ত্রগুলো একটি যোগাযোগ মাধ্যম বা তার শেয়ার করে। একই সময়ে একাধিক হোষ্ট ডাটা প্রেরণ করলে বাস টপোলজির ক্ষেত্রে সমস্যা হতে পারে। এজন্য বাস টপোলজি সিএসএমএ/সিডি প্রযুক্তি ব্যবহার করে অথবা একটি হোষ্টকে বাসমাস্টার ধরে সমস্যা সমাধান করে।

বাস টপোলজি

 

স্টার টপোলজি

স্টার টপোলজিতে সকল হোষ্ট একটি কেন্দ্রীয় ডিভাইসে সংযুক্ত থাকে, যাকে হাব ডিভাইস বলে যা পয়েন্ট টু পয়েন্ট কানেকশনে যুক্ত থাকে। হাব ডিভাইসগুলো নিচের যেকোনো রকমের হতে পারে,

  • লেয়ার-১ ডিভাইস যেমন হাব বা রিপিটার
  • লেয়ার-২ ডিভাইস যেমন সুইচ বা ব্রিজ
  • লেয়ার-৩ ডিভাইস যেমন রাউটার বা গেটওয়ে

স্টার টপোলজি

স্টার টপোলজি সাশ্রয়ী এবং একে কনফিগার করাও সহজ।

 

রিং টপোলজি

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

রিং টপোলজি

 

মেস টেকনোলজি

এক্ষেত্রে হোষ্টগুলো এক বা একাধিক হোষ্টের সাথে যুক্ত থাকতে পারে, এর হোষ্টগুলো পয়েন্ট টু পয়েন্ট কানেকশনে অন্য সবগুলো বা কিছু কিছু হোষ্টের সাথে যুক্ত থাকতে পারে। মেস টেকনোলজি দুই রকমের হতে পারে,

মেস টেকনোলজি

  • ফুল মেসঃ হোষ্টগুলো পয়েন্ট টু পয়েন্ট কানেকশনে অন্য সবগুলো হোষ্টের সাথে যুক্ত থাকে।
  • পারসিয়ালি মেসঃ হোষ্টগুলো পয়েন্ট টু পয়েন্ট কানেকশনে অন্য কয়েকটি(সবগুলোর সাথে না) হোষ্টের সাথে যুক্ত থাকে।

 

ট্রি টপোলজি

বর্তমান সময়ে ব্যবহৃত সবচেয়ে কমন নেটওয়ার্ক টপোলজি, ক্রমবিন্যাসগত টপোলজি নামেও পরিচিত।

ট্রি টপোলজি

 

ডেইজি চেইন

এই টপোলজি সবগুলো হোষ্টকে লিনিয়ার বিন্যাসে সংযুক্ত রাখে।

ডেইজি চেইন

 

হাইব্রিড টপোলজি

কয়েকটি টপোলজি সমন্বিত হয়ে কাজ করে এই নেটওয়ার্ক কাঠামো গঠন করে।

হাইব্রিড টপোলজি

 

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : নেটওয়ার্ক লেন টেকনোলজি (DCN – Network LAN Technologies)

রিদওয়ান বিন শামীম

 

বিভিন্ন নেটওয়ার্ক লেন টেকনোলজি নিয়ে আলোচনা করা যাক,

 

ইথারনেট

লেন টেকনোলজিতে এটি বহুল প্রচলিত, ১৯৭০ সালে Bob Metcalfe এবং D.R. Boggs এটি আবিস্কার করেন। IEEE 802.3 তে ১৯৮০ সালে আদর্শ হিসেবে এটিকে গ্রহণ করা হয়।

 

ইথারনেট মিডিয়া ব্যবহার করে। শেয়ার করা মিডিয়ার ডাটা পরস্পর সংঘর্ষ প্রবণ হতে পারে। ইথারনেট সংঘর্ষ শনাক্ত করার জন্য CSMA/CD প্রযুক্তি ব্যবহার করে। সচরাচর দেখা যাওয়া ইথারনেট 10BASE-T বৈশিষ্ট্যের যার ১০ এমবিপিএস গতি, BASE দ্বারা বেসব্যান্ড, এবং টি দ্বারা Thick Ethernet বোঝায়।

 

দ্রুত ইথারনেট

দ্রুত বর্ধনশীল সফটওয়ার ও হার্ডওয়ার প্রযুক্তির উপযোগী ইথারনেট ইউটিপি, অপটিক্যাল ফাইবার ও তারবিহীন ভাবেও চলতে পারে। ১০০ এমবিপিএস গতি লাভ এর পক্ষে সম্ভব। IEEE 803.2 তে 100BASE-T নামে এটি শনাক্ত করা যায়, Cat-5 twisted pair cable ব্যবহার করে। ইথারনেট হোষ্টের মাঝে তারের মাধ্যমে মিডিয়া শেয়ার করতে CSMA/CD ব্যবহার করে, তারবিহীন উপায় CSMA/CA ব্যবহার করে। অপটিক্যাল ফাইবারে দ্রুত ইথারনেট 100BASE-FX নামে পরিচিত।

 

গিগা ইথারনেট

১৯৯৫ সালে গিগা ইথারনেটের যাত্রা শুরু, এটি 1000 mbits/second গতিসম্পন্ন EEE802.3ab সমর্থিত এই গিগা ইথারনেট at-5, Cat-5e এবং Cat-6 ক্যাবল ব্যবহার করতে পারে। IEEE802.3ah অপটিক্যাল ফাইবারে গিগা ইথারনেট বোঝায়।

 

ভার্চুয়াল লেন

লেন ইথারনেট ব্যবহার করে তখন যখন এটি শেয়ারকৃত মিডিয়া নিয়ে কাজ করে। এক্ষেত্রে একক সম্প্রচার ডোমেইন ও একক সংঘর্ষ ডোমেইন তৈরি করা হয়, একক সম্প্রচার ডোমেইন একাধিক সম্প্রচার ডোমেইনে বিভক্ত হওয়ার সমাধান হল ভার্চুয়াল লেন। ডিফল্ট হিসেবে সব হোষ্ট একক ভার্চুয়াল লেনে সংযুক্ত থাকে।

ভার্চুয়াল লেন

সফটওয়্যার প্রজেক্ট ম্যানেজমেন্ট (Software Project Management)

সৈয়দ আলী শাফিন

 

যে কোন সফটওয়্যার (বা সাধারন মানুষ যাকে বলে আই টি) কোম্পানিতে প্রধানত: দু’ধরণের কাজ হয়ে থাকে ।

  • সফটওয়্যার প্রোগ্রামিং
  • সফটওয়্যার প্রজেক্ট ম্যানেজমেন্ট

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

  • ক্লায়েন্টের কাছ থেকে প্রজেক্ট বোঝা এবং বাজেট আর টাইমিং ফাইনাল করা
  • প্রজেক্ট প্লানিং করা
  • প্রোগ্রামারদের কাজ মনিটর করা
  • ক্লায়েন্টের হস্তান্তর করা

আর এই সব কাজ করার জন্য, বিশেষ করে প্রজেক্ট মনিটর করার জন্য সফটওয়্যার প্রজেক্ট ম্যানেজার বিভিন্ন সফট ওয়্যার ব্যবহার করতে পারেন ।

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : কম্পিউটার নেটওয়ার্ক টাইপ (DCN – Computer Network Types)

রিদওয়ান বিন শামীম

 

সাধারণত নেটওয়ার্কের বিস্তৃতি বলতে এর ভৌগলিক বিস্তৃতি বোঝায়, এটি আমাদের ব্যবহৃত সেলফোন থেকে এর ব্লুটুথ হেডফোন পর্যন্ত ক্ষুদ্র দূরত্বের হতে পারে আবার ইন্টারনেটের মত বিশ্বব্যপী বিস্তৃতও হতে পারে।

 

পারসোনাল এরিয়া নেটওয়ার্ক

ক্ষুদ্রতম নেটওয়ার্ক, ব্যবহারকারীর ব্যক্তিগত ব্যবহারে সীমাবদ্ধ। ব্লুটুথ বা ইনফ্রারেড সমৃদ্ধ যন্ত্রপাতি এই ধরণের নেটওয়ার্ক ব্যবহার করে। ১০ মিটার সীমার এই নেটওয়ার্ক তারবিহীন মাউস, কীবোর্ড, অয়ারলেস প্রিন্টার ও টিভি রিমোটে দেখা যায়। পিকোনেট এরকম একটি পারসোনাল এরিয়া নেটওয়ার্ক যেটিতে ব্লুটুথ ব্যবহার করে আটটি ডিভাইস সমন্বয় করে ব্যবহার করা হয়।

 

লোকাল এরিয়া নেটওয়ার্ক বা লেন

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

 

মেট্রোপলিটন এরিয়া নেটওয়ার্ক বা মেন

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

 

ওয়াইড এরিয়া নেটওয়ার্ক

অনেকখানি জায়গা এমনকি পুরো দেশের নেটওয়ার্কও ধারণ করতে পারে।এটি ব্যয়বহুল ও শক্তিশালী। টেলিযোগাযোগ এক ধরণের ওয়াইড এরিয়া নেটওয়ার্ক। এটি এটিএম, ফ্রেম রিলে, সনেট বা Synchronous Optical Network ইত্যাদি এডভান্সড প্রযুক্তি ব্যবহার করে ।

 

ইন্টারনেটওয়ার্ক

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

  • ওয়েবসাইট,
  • ইমেইল,
  • ইনস্ট্যান্ট ম্যাসেজিং,
  • ব্লগিং,
  • সোশ্যাল মিডিয়া,
  • মার্কেটিং,
  • নেটওয়ার্কিং,
  • রিসোর্স শেয়ারিং

ডেটা কমিউনিকেশন ও কম্পিউটার নেটওয়ার্ক : সংক্ষিপ্ত বিবরণ (DCN – Overview)

রিদওয়ান বিন শামীম

 

পরস্পর সংযুক্ত কম্পিউটার ও তদসংশ্লিষ্ট অনুষঙ্গ (যেমন প্রিন্টার ইত্যাদি) নিয়ে যে ব্যবস্থা তাকে কম্পিউটার নেটওয়ার্ক বলে। এই নেটওয়ার্ক তারযুক্ত বা তারবিহীন উভয় ধরনেরই হতে পারে।

কম্পিউটার নেটওয়ার্ককে বিভিন্ন বিষয়ের উপর নির্ভর করে ভাগ করা যায় যথা,

 

ভৌগলিক কারণ

আমাদের নিজস্ব টেবিল, বিল্ডিং, শহর এসবের তারতম্যের ভিত্তিতে বিভাজন হতে পারে,

আন্তর্সম্পর্ক

প্রত্যেকটি একক যন্ত্রের অন্য যন্ত্রের সাথে সংযুক্ত হওয়ার প্রকরণের উপর নির্ভর করে এই বিভাজন হতে পারে,

এডমিনিস্ট্রেশন

প্রশাসন ব্যক্তি মালিকানাধীণ না পাবলিক তার উপর ভিত্তি করে নেটওয়ার্কিং ভিন্ন হতে পারে,

স্থাপত্যগত কারণ

কম্পিউটার নেটওয়ার্ক বিভিন্ন ধরণের কারণে বিভাজিত হতে পারে যেমন ক্লায়েন্ট সার্ভার, হাইব্রিড ও অন্যান্য কারনেও স্থাপত্যগত পার্থক্য দেখা যেতে পারে।

 

নেটওয়ার্ক এপ্লিকেশন

কম্পিউটার ও তদসংশ্লিষ্ট অনুষঙ্গ নেটওয়ার্কের আকারে সংযুক্ত থাকে, এরা অনেক ধরণের সেবাদান করতে পারে,

  • প্রিন্টার ও স্টোরেজ ডিভাইস ব্যবহার করার সুবিধা দেয়,
  • ইমেইল ও এফটিপি ব্যবহার করে তথ্য আদান প্রদান করতে দেয়,
  • ওয়েব ও ইন্টারনেট ব্যবহার করে তথ্য আদান প্রদান করতে দেয়,
  • ডাইনামিক ওয়েব পেজ ব্যবহার করে অন্য ব্যবহারকারীর সাথে তথ্য আদান প্রদান করতে দেয়,
  • আইপি ফোন, ভয়েজ কনফারেন্সের সুবিধা দেয়,
  • প্যারালাল কম্পিউটিং ,
  • ইনস্ট্যান্ট ম্যাসেজিংএর সুবিধা দেয়।

অ্যাপ এম এল এর ইতিহাস (AppML History)

রিদওয়ান বিন শামীম

 

১৯৯৯ সালে রেফসনেস ডাটা (Refsnes Data) অ্যাপ এম এল এর প্রথম সংস্করণ ডেভলাপ করে।এমনকি তখনও অ্যাপ এম এল মূলত ওয়েব ক্লায়েন্ট ও ওয়েব সার্ভারের মধ্যে এইচটিটিপি কমিউনিকেশনের উপর নির্ভরশীল ছিল। পরবর্তীতে এই পদ্ধতিই এজ্যাক্স নামে পরিচিতি লাভ করে। ২০০০ সালের সেপ্টেম্বরে নরওয়ের একজন গ্রাহকের আগ্রহে প্রায় ৩০টি এপ্লিকেশনের ডাটা উইন্ডোজ ডেক্সটপ থেকে ইন্টারনেটে সরানোর উদ্যোগ নেয়া হয়, কেবল অ্যাপ এম এল ব্যবহার করে।

 

২০০১ সালে অ্যাপ এম এল নির্ভর সিস্টেম প্রথম বাণিজ্যিক এজ্যাক্স এপ্লিকেশন বাজারে আসে। প্রচণ্ড সফল হয়, প্রচলিত ব্যবস্থার ৭৫ শতাংশে নেমে আসে ওয়েব ডেভলাপমেন্টের সময়। তখন থেকে এর উন্নয়ন চলছে, প্রায় ১০০০ চলায়মান এপ্লিকেশন সিস্টেমের আওতায় আছে।

 

ফেব্রুয়ারী ২০১৫তে W3Schools নতুন আঙ্গিকে অ্যাপ এম এল কে বাজারে ছেড়েছে, যা জনসাধারণের জন্য উন্মুক্ত। বর্তমান সময়ের অ্যাপ এম এল এর ডিজাইন লক্ষ্যগুলো হল, ইন্টারনেটে চলবে, প্লাটফর্ম নিরপেক্ষ, প্রয়োজনীয় অনেক এপ্লিকেশন ব্যবহার করবে, ডেভলাপ প্রক্রিয়া সহজ ও নিরাপদ ইত্যাদি।

 

১৯৯৯ সালেই উপলব্ধি করা হয়েছিল, ভবিষ্যতের এপ্লিকেশন যেকোনো প্লাটফর্মেই চালানো যাবে এমন হবে। পরবর্তী সময়ে ওয়েব ডেভলাপাররা বুঝতে পারেন, ওয়েব এপ্লিকেশনগুলো আসলে ইন্টারনেট সার্ভিসে রূপ নিতে যাচ্ছে, কারণ মানুষ ইন্টারনেট সার্ভিসের উপর নির্ভরশীল হয়ে পরছে। এজন্যই ভবিষ্যতের এপ্লিকেশনগুলো SOA (Service Oriented Architecture) পরিকাঠামোতে লেখা নিরাপদ, এগুলোকে হতে হবে সাধারণ ও স্থিতিস্থাপক যাতে বিভিন্ন ধরণের চাহিদা পূরনে তা সক্ষম হয়।

 

সামনের দিনগুলোতে ওয়েব এপ্লিকেশন তৈরি সহজ হবে, হবে সহজে সম্পাদনযোগ্যও। গ্রাহক ও সার্ভার পরস্পরের মধ্যে সহজবোধ্য উপায়ে তথ্য আদানপ্রদান করতে পারবে। এপ্লিকেশনগুলোর পরিবর্তন মডেল নির্ভর হবে, কোড পরিবর্তনের উপর নির্ভর করবে না। সবচেয়ে ভাল হয় এপ্লিকেশন বিবৃতি বা পরিবর্তনের জন্য টেক্সট ফাইল(যেমন জেএসওএন) এবং সম্পাদনার জন্য এইচটিএমএল, সিএসএস ও জাভাস্ক্রিপ্টের মত মাধ্যম ব্যবহার করলে।

 

অ্যাপ এমএল স্থাপত্য (AppML Architecture)

নাজমুল ইসলাম

আধুনিক ওয়েব স্থাপত্য

AppML সমসাময়িক কৌশল এবং আধুনিক ওয়েব ডেভেলপমেন্ট এর ধারনাকে একত্রিত করে।

AppML গতি, সরলতা, এবং কম খরচে উপর নজর দেয়:

  • সেবামূলক MVC আর্কিটেকচার
  • অত্যন্ত কম ব্যান্ডউইথ খরচ
  • ক্লাউড কম্পিউটিং জন্য অনুকূল
  • উপস্থাপনা বা প্রেজেন্টেশন থেকে কন্টেন্টসময়হ সম্পূর্ণ আলাদা করা
  • ইন্টেলিজেন্ট ঘোষণামূলক প্রোগ্রামিং
  • দ্রুত এবং তৎপর ওয়েব ডেভেলপমেন্ট
  • উচ্চ আকার পরিবর্তনযোগ্য এবং পরীক্ষাসক্ষম
  • কনফিগারেশন এবং পুনরায় কনফিগার করা সহজ
  • ব্যবহারকারীর অ্যাকাউন্ট এবং কর্মের জন্য নিপুণ সহায়তা

 

MVC আর্কিটেকচার

AppML এ MVC আর্কিটেকচার ব্যবহার

MVC বলতে বোঝায় মডেল, ভিউ, কন্ট্রোলার

  • মডেল আপনার অ্যাপ্লিকেশন সম্পর্কে বর্ণনা দেয়
  • ভিউ আপনার ডাটা প্রদশন করে
  • কন্ট্রোলার আপনার অ্যাপ্লিকেশনকে নিয়ন্ত্রণ করে

 

উইকিপিডিয়া: মডেল, ভিউ, কন্ট্রোলার

মডেল - কেবল JSON

মডেল অ্যাপ্লিকেশনকে বর্ণনা করে

মডেল বিভিন্ন হার্ডওয়্যার এবং সফটওয়্যার প্ল্যাটফর্ম এ পুনরায় ব্যবহার করা যায় (সার্ভার, পিসি, আইফোন, ট্যাবলেট, ইত্যাদি)

মডেল উপস্থাপনা বা ইউজার ইন্টারফেস (UI) এর সাথে সংশ্লিষ্ট নয়।

মডেল JSON এর মধ্যে লিখিত হয়:

Model


{
 "rowsperpage" : 10,
 "database" : {
     "connection" : "localmysql",
     "sql" : "SELECT CustomerName, City, Country FROM Customers",
     "orderby" : "CustomerName"
 },
 "filteritems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}
 ],
 "sortitems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}
 ]
 }

 

ভিউ - কেবল এইচটিএমএল

ভিউ হচ্ছে ডাটা (এবং ইনপুট) দেখানোর জন্য  ইউজার ইন্টারফেস (UI)

ভিউ  HTML এবং CSS এ লেখা হয়:

এইচটিএমএল ভিউ


<!DOCTYPE html>
 <html lang="en-US">
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container" appml-data="local?model=model_customers">
 <h1>Customers</h1>
 <div appml-include-html="inc_listcommands.htm"></div>
 <div appml-include-html="inc_filter.htm"></div>
 
 <table class="table table-striped table-bordered">
 <tr>
   <th>Customer</th>
   <th>City</th>
   <th>Country</th>
 </tr>
 <tr appml-repeat="records">
   <td>{{CustomerName}}</td>
   <td>{{City}}    </td>
   <td>{{Country}} </td>
 </tr>
 </table>
 </div>
 
 </body>
 </html>

 

 

নিয়ামক (কন্ট্রোলার) - ক্লায়েন্ট এবং / অথবা সার্ভার স্ক্রিপ্ট

একটি ক্লায়েন্ট স্ক্রিপ্ট হচ্ছে একটি ওয়েভ পেজ যা অ্যাপ্লিকেশনকে নিয়ন্ত্রণ করতে পারে।

  • অ্যাপ এমএল মেথড এ সঙ্গায়িত ডাটা প্রদর্শন করতে পারে
  • অ্যাপ এমএল এইচটিএমএল অ্যাট্রিবিউট এ সঙ্গায়িত ডাটা প্রদর্শন করতে পারে
  • অ্যাপ এমএল অ্যাপ্লিকেশন এইচটিএমএল এ কারো সহায়তা ছাড়াই চালু হতে পারে (লুকানো ভাবে)
  •  (ঐচ্ছিক) অ্যাপ এমএল ওয়েব সার্ভার থেকে মডেল ডাটার জন্য অনুরোধ করতে পারে (এসকিউএল সার্ভার)।
  • (ঐচ্ছিক) অ্যাপ এমএল ব্যবহারকারীরা ডাটা সম্পাদনা বা পরিবর্তন করতে পারে।
  • (ঐচ্ছিক) অ্যাপ এমএল ওয়েব সার্ভারে ডাটা প্রদান করতে পারে।

 

সার্ভার স্ক্রিপ্ট অ্যাপ্লিকেশনকে নিন্মক্তভাবে নিয়ন্ত্রণ করতে পারে :

  • গ্রাহকের (ব্রাউজার) কাছ থেকে অনুরোধ গ্রহণ করে
  • গ্রাহককে ডাটা ফেরত দিয়ে
  • গ্রাহকের কাছ থেকে ডাটা গ্রহণ করে
  • সার্ভার এর ডাটা আপডেট করে
  • অনুমোদন ও নিরাপত্তা তদারকী করে

 

প্রোগ্রামিং এর শিল্প

আবেদন আকার এবং কম জটিলতা রাখা, সকল প্রোগ্রামিং এর প্রধান সমস্যা।

কম্পিউটার অ্যাপ্লিকেশন এর জটিলতা নিয়ন্ত্রণ, প্রোগ্রামিং এর সঠিক কৌশল।

ঘোষণামূলক প্রোগ্রামিং

সফটওয়্যার উন্নয়ন প্রায়শই সময়সীমা এবং বাজেটের জন্য ক্ষতিগ্রস্থ হয়। সম্পন্ন সফটওয়্যার এ প্রায়ই প্রচুর কোডিং সমস্যা থাকে। এর কারণ হচ্ছে কোড উন্নয়ন, পরীক্ষা করা এবং পরিচালনা করা কঠিন।

কোডিং এর ক্ষেত্রে আপনাকে কিভাবে করতে হবে থেকে কি করতে হবে তা বর্ণনা করার উপর বেশি গুরুত্ব দিতে হবে।

অ্যাপ এমএল এ মডেল এবং ভিউ এ আপনার অ্যাপ্লিকেশন ঘোষণা করতে হবে।

অ্যাপ এমএল এ খুব কমই (অনেক সময় কিছুই নয়) কোডিং করতে হয়।

 

উইকিপিডিয়া: ঘোষণামূলক প্রোগ্রামিং

 

দ্রুত এবং তৎপর এপ্লিকেশন উন্নয়ন (ডেভেলপমেন্ট)

কম্পিউটার অ্যাপ্লিকেশন এর জটিলতা নিয়ন্ত্রণ, প্রোগ্রামিং এর সঠিক কৌশল।

আবেদন আকার এবং কম জটিলতা রাখা, সকল প্রোগ্রামিং এর প্রধান সমস্যা।

RAD হচ্ছে একটি সফটওয়্যার ডেভেলপমেন্ট মেথড যা দ্রুত প্রোটোটাইপিং এর উদ্দেশ্যে নুন্যতম পরিকল্পনা ব্যবহার করে।

অ্যাপ এমএল অতিদ্রুত প্রোটোটাইপিং সরবরাহ করে, ঐতিহ্যগত উন্নয়ন পদ্ধতির তুলনায় ১০০ গুণ দ্রুত।

অ্যাপ্লিকেশন প্রোটোটাইপ অ্যাপ্লিকেশন মডেল থেকে কোন কোডিং ছাড়াই সরাসরি চালু হতে পারে।

উইকিপিডিয়া: দ্রুত এপ্লিকেশন ডেভেলপমেন্ট

এজাইল সফটওয়্যার উন্নয়ন (Agile software development) হচ্ছে একটি ধাপে ধাপে উন্নয়নের একটি পদ্ধতি, যেখানে ব্যবহারকারী এবং ডেভেলপারদের প্রত্যেক্ষ সহযোগিতায় সমাধান তৈরি করা হয়।

অ্যাপ এমএল দিয়ে অ্যাপ্লিকেশন ধাপে ধাপে  অল্প বৃদ্ধি করে, প্রোটোটাইপ থেকে সম্পন্ন অ্যাপ্লিকেশন লেখা যেতে পারে।

উইকিপিডিয়া: তৎপর সফটওয়্যার ডেভেলপমেন্ট

 

চলবে (To be continue)

 

অ্যাপ এমএল রেফারেন্স – এপিআই (AppML Reference – API)

আদনান নাহিদ

 

অ্যাপ এমএল মেথড

 

মেথড বা পদ্ধতি বিবরণ
new AppML() একটি নতুন AppML অবজেক্ট বা বস্তু তৈরি করুন
appml ("name") নির্দিষ্ট নামের AppML অবজেক্ট বা বস্তু ফেরত দেয়
displayMessage(text) নির্দিষ্ট বার্তা প্রদর্শন করে
getData() অ্যাপ্লিকেশন থেকে তথ্য গ্রহণ করে
run() একটি অ্যাপ্লিকেশন অবজেক্ট বা বস্তু চালু করে
setError(no, description) একটি নির্দিষ্ট ত্রুটি এবং ত্রুটির বর্ণনা সেট করুন

 

AppML প্রোপার্টি

প্রোপার্টি বিবরণ
appName অ্যাপ্লিকেশন নাম (ধারক আইডি)
controller Aplication ধারক উপাদান
data অ্যাপ্লিকেশন ডাটা অবজেক্ট বা বস্তু
dataSource অ্যাপ্লিকেশন তথ্যের উৎস
displayType অ্যাপ্লিকেশন টাইপ ("ফর্ম" অথবা "তালিকা")
message আবেদন বার্তা
error অ্যাপ্লিকেশন অবজেক্ট বা বস্তুর ত্রুটি

 

ডেটা বস্তুর বৈশিষ্ট্যাবলী

প্রোপার্টি বিবরণ
data.model অ্যাপ্লিকেশন তথ্য মডেল
data.records অ্যাপ্লিকেশন রেকর্ড (তথ্য)

 

AppML ফরম মডেল বা পদ্ধতি

পদ্ধতি বিবরণ
newRecord() বর্তমান ফর্ম পুনরায় সেট করা
saveRecord() বর্তমান রেকর্ড সংরক্ষণ
deleteRecord() বর্তমান রেকর্ড মুছে ফেলা
closeForm() বর্তমান ফর্ম বন্ধ করা

 

AppML ফিল্টার প্রোপার্টি

পদ্ধতি বিবরণ
OrderBys ফিল্ডের নাম অনুসারে অ্যারে (Array) এর ক্রম
orderByDirections নির্দেশ অনুসারে অ্যারে (Array) এর ক্রম
queryFields ক্যোয়ারী ফিল্ডের নামের অ্যারে (Array)
queryValues ক্যোয়ারী মানের অ্যারে (Array)
queryTypes ক্যোয়ারী এর প্রকারের অ্যারে (Array)

 

অ্যাপ এম এল রেফারেন্সঃ ডাটাবেস (AppML Reference – Databases)

রিদওয়ান বিন শামীম

 

 

ডাটাবেসের বৈশিষ্ট্য

ডাটাবেসের বৈশিষ্ট্য ডাটাবেসকে ডাটা সোর্সরূপে প্রদর্শন করে। এর কিছু উপবৈশিষ্ট্য আছে,

 

Element (উপাদান)
বর্ণনা
"connection" ডাটাবেসের কানেকশনের নাম
"execute" এসকিউএল বিবৃতির অ্যারি যা ডাটা পুনঃরসজ্জিত করার আগে সম্পাদন করতে হয় (ঐচ্ছিক)
"keyfield" মূল টেবিলের জন্য প্রধান ক্ষেত্র(ঐচ্ছিক)
"maintable" এপ্লিকেশনের জন্য মূল টেবিল(ঐচ্ছিক)
"orderby" নির্ধারিত এসকিউএল আরোপিত ক্লস(ঐচ্ছিক)
"sql" পুনঃরসজ্জিত ডাটার জন্য এসকিউএল বিবৃতি।

 

 

 

ডাটাবেস থেকে ডাটা গ্রহণ

এই মডেল এসকিউএল ডাটাবেসের কাস্টমার টেবিল থেকে কাস্টমার, সিটি, দেশ ইত্যাদি তথ্য গ্রহন করে থাকে।

 

Example


{
 "database": {
     "connection": "mysql",
     "sql"       : "SELECT CustomerName, City, Country FROM Customers",
     "orderby"   : "CustomerName"
 }
 }

 

 

 

ফিল্টার সীমাবদ্ধতা

ব্যবহারকারীদের ফিল্টার ডাটায় প্রবেশযোগ্য করতে মডেলে ফিল্টার তথ্য যোগ করা যায়,


"filteritems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}]

 

 

 

সর্টিং সীমাবদ্ধতা

ব্যবহারকারীদের সর্টিং ডাটায় প্রবেশযোগ্য করতে মডেলে সর্টিং বিষয়ক তথ্য যোগ করা যায়,

 


"sortitems" : [
{"item" : "CustomerName", "label" : "Customer"},
{"item" : "City"},
{"item" : "Country"}]


 

 

 

আপডেট সীমাবদ্ধতা

ব্যবহারকারীদের আপডেট ডাটায় প্রবেশযোগ্য করতে মডেলে আপডেট তথ্য যোগ করা যায়,

 

উদাহরণঃ


"updateItems" : [
     {"item" : "CustomerName"},
     {"item" : "Address"},
     {"item" : "PostalCode"},
     {"item" : "City"},
     {"item" : "Country"}]

 

 

 

বাই ডিফল্ট অ্যাপ এম এল ফিল্টার, সর্টিং বা আপডেটের সুযোগ দেবে কেবল উল্লেখিত মডেল অনুসারে।

 

 

ডাটাবেস কানেকশন

ডাটাবেস কানেকশনকে appml_config.php এর মধ্যে বিবৃত করা হয়,

appml_config.php


<?php echo("Access Forbidden");exit();?>
 {
 "dateformat" : "yyyy-mm-dd",
 "databases": [
     {
     "connection" : "mysql",
     "host"       : "127.0.0.1:3306",
     "dbname"     : "Northwind",
     "username"   : "myUserId",
     "password"   : "myPassword"
     },
     {
     "connection" : "googleDB",
     "host"       : "192.168.1.1:3306",
     "dbname"     : "Northwind",
     "username"   : "myUserId",
     "password"   : "myPassword"
     },
     {
     "connection" : "amazonDB",
     "host"       : "mydbinstance.amazon.com:3306",
     "dbname"     : "Northwind",
     "username"   : "myUserId",
     "password"   : "myPassword"
     },
     {
     "connection" : "azureDB",
     "host"       : "azure.cloudapp.net",
     "dbname"     : "Northwind",
     "username"   : "myUserId",
     "password"   : "myPassword"
     }
 ]
 }

 

কনফিগারেশন ফাইল অনেকগুলো ডাটাবেস কানেকশন ধারন করতে পারে।

 

 

ডাটাবেস তৈরি করা

যেহেতু অ্যাপ এম এল এপ্লিকেশন চালুর আগেই এসকিউএল বিবৃতি সম্পাদনের সুযোগ দেয় তাই কোনও ডাটাবেস তৈরির জন্যও আমরা এটিকে ব্যবহার করতে পারি,

Model


{
 "database" : {
 "connection" : "myCDs",
 "execute" : [
 "DROP TABLE IF EXISTS CD_Catalog",
 "CREATE TABLE IF NOT EXISTS CD_Catalog (CDID INT NOT NULL AUTO_INCREMENT,PRIMARY KEY (CDID),
  Title NVARCHAR(255),Artist NVARCHAR(255),Country NVARCHAR(255),Price NUMBER)"
 ]
 }}

 

দ্রুত প্রোটোটাইপিঙের জন্য উপযুক্ত।

 

অ্যাপ এম এল রেফারেন্সঃ ডাটা ফাইল (AppML Reference – Data Files)

রিদওয়ান বিন শামীম

 

ডাটাবেসের বৈশিষ্ট্য

ডাটাবেসের বৈশিষ্ট্য ডাটাবেসকে ডাটা সোর্সরূপে প্রদর্শন করে।এর কিছু উপবৈশিষ্ট্য আছে,

উপাদান বিবরণ
"type" ডাটা ফাইলের ধরণ ("csvfile", "xmlfile", or "jsonfile")
"filename" ফাইলের নাম
"record" এক্সএমএল ডাটা নডের নাম (যদি xmlfile হয়)
"items" ডাটা আইটেম

 

টেক্সট ফাইল থেকে ডাটা

এই মডেল কমা দিয়ে আলাদা করা টেক্সট ফাইল থেকে টাইটেল, আর্টিস্ট, মূল্য এসব রেকর্ড খুঁজে নেয়,(আইটেম ১, ২, ৫ এর মত)।

উদাহরণ


{
 "data": {
     "type"    : "csvfile",
     "filename": "cd_catalog.txt",
     "items"   : [
         {"name": "Title", "index": 1},
         {"name": "Artist","index": 2},
         {"name": "Price", "index": 5}
     ]
 }
 }

উদাহরণের ব্যাখ্যা টেক্সট ফাইলের অনুরূপ

 

এক্সএমএল ফাইল থেকে ডাটা

এই মডেল এক্সএমএল ফাইলের সিডি নড থেকে টাইটেল, আর্টিস্ট, মূল্য এসব রেকর্ড খুঁজে নেয়।

উদাহরণ


{
 "data": {
     "type"    : "xmlfile",
     "filename": "cd_catalog.xml",
     "record"  : "CD",
     "items"   : [
         {"name": "Artist", "nodename": "ARTIST"},
         {"name": "Title",  "nodename": "TITLE"},
         {"name": "Country","nodename": "COUNTRY"}
     ]
 }
 }

উদাহরণের ব্যাখ্যা এক্সএমএল ফাইলের অনুরূপ

 

জেএসওএন ফাইল থেকে ডাটা

এই মডেল জেএসওএন ফাইলের সিডি অবজেক্টের আরি থেকে টাইটেল, আর্টিস্ট, মূল্য এসব রেকর্ড খুঁজে নেয়।

উদাহরণ


{
 "data" : {
     "type" : "jsonfile",
     "filename" : "cd_catalog.js",
     "record" : "cd",
     "items" : [
         {"name" : "Title", "nodename" : "title"},
         {"name" : "Artist", "nodename" : "artist"},
         {"name" : "Price", "nodename" : "price"}
     ]
 }
 }

উদাহরণের ব্যাখ্যা জেএসওএন ফাইলের অনুরূপ

 

অ্যাপ এম এল রেফারেন্স (AppML Reference)

রিদওয়ান বিন শামীম

 

অ্যাপ এম এল এইচটিএমএল এট্রিবিউট

উদাহরণ,


<div appml-include-html="inc_header.htm"></div>
 
 <h1>Customers</h1>
 <table appml-data="customers.js" appml-controller="myController">
   <tr>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
   </tr>
 </table>
 
<divappml-include-html="inc_footer.htm"></div>

 

 

 

Attribute Description Explained
appml-controller AppML controller হিসাবে বিবৃত AppML Controllers
appml-data এপ্লিকেশনের জন্য ডাটা সোর্স বিবৃত করে AppML Data
appml-include-html যে এইচটিএমএল ব্যবহৃত হবে তার বিবরণ AppML Includes
appml-repeat যে এইচটিএমএল পুনরাবৃত্ত হবে তার বিবরণ AppML Howto

 

অ্যাপ এম এল ম্যাসেজ

উদাহরণ,


function myController($appml) {
     if ($appml.message == "display") {
         if ($appml.display.name == "CustomerName") {
             $appml.display.value = $appml.display.value.toUpperCase();
         }
     }
 }

 

 

 

Message Description
"ready" অ্যাপ এম এল শুরুর পরে দেখায়, লোড করতে প্রস্তুত
"loaded" অ্যাপ এম এল লোডেড, ডাটা দেখাতে প্রস্তুত
"display" অ্যাপ এম এল কোনও ডাটা আইটেম দেখানোর আগে দেখায়।
"done" অ্যাপ এম এল সম্পন্ন হওয়ার পর দেখায়
"submit" অ্যাপ এম এল ডাটা সাবমিটের আগে দেখায়
"error" অ্যাপ এম এল কোনও ভুলের সম্মুখীন হলে দেখায়

 

অ্যাপ এম এল ম্যাসেজ অধ্যায়ে এগুলো আরও বিস্তারিত ব্যাখ্যা করা হবে।

 

অ্যাপ এম এল মডেল

উদাহরণ ,


{
 "security": "admin",
 "rowsperpage" : 10,
 
 "database": {
     "connection": "mysql",
     "sql"       : "SELECT * FROM Customers",
     "orderby"   : "CustomerName"}},
 
 "filteritems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}], 
 
 "sortitems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}]
 }

 

 

অ্যাপ এম এল মডেলের বৈশিষ্ট্য

 

উপাদান বর্ণনা
"data" মডেলের ফাইল সোর্স বর্ণনা করে।
"database" মডেলের ডাটাবেস সোর্স বর্ণনা করে।
"filteritems" ফিল্টারের সীমাবদ্ধতা নির্দেশ করে
"rowsperpage" প্রতি পেজে সারির সংখ্যা খুঁজে, বিবৃত করে
"security" মডেলের নিরাপত্তা বিবৃত করে
"sortitems" সর্টিং সীমাবদ্ধতা বিবৃত করে।

 

এপ্লিকেশন নিরাপত্তা

এপ্লিকেশনে ঢুকতে এডমিন মেম্বার হিসেবে লগ ইন করতে হবে।

উদাহরণ,


{
 "security": "admin",
 "database": {
     "connection": "mysql",
     "sql"       : "SELECT * FROM Customers",
     "orderby"   : "CustomerName"}
 }
প্রাইভেট মডেলঃ মডেলে নিজের প্রাইভেট ডাটা যোগ করার উপায় আছে, এই উদাহরণে ডাটার ক্ষেত্রে সীমাবদ্ধতা দেখানো হল,
"restrictions" : {
     "fname" : {"maxlength": 40},
     "price" : {"max": 999,"min": 100}
     }

 

 

মডেল ডাটা সার্ভার এপ্লিকেশনেও ব্যবহৃত হয়, অ্যাপ এম এল কন্ট্রোলার দ্বারা।

নিচের উদাহরণে ইনপুট ভ্যালিডেশনের জন্য মডেল ডাটা ব্যবহৃত হয়েছে।


function myController($appml) {
     if ($appml.message == "submit") {
         var price = document.getElementById("price").value;
         if (price < $appml.model.restrictions.price.min) {
             $appml.displayError(15, "Price too low!");
             return;
         }
 }

 

 

 

অ্যাপ এমএল এ অ্যামাজন ডাটাবেজ ব্যবহার করা (AppML using Amazon Database)

হ্যালো বন্ধুরা,

আমাদের সাইটে আসার জন্য ধন্যবাদ...

এখানে আমরা আমাজন ডাটাবেজ সম্পর্কে আলোচনা করব। ডাটাবেজ এ সংযুক্ত হওয়া খুব একটা কঠিন কাজ নয়। একটু জানলই তোমরা সহজেই ডাটাবেজ এর সাথে সংযুক্ত হতে পারবে

আস জেনে নেই...

আমাজন রিলেশনাল ডাটাবেস সার্ভিস কি (RDS)

বিভিন্ন ডাটাবেজ প্রতিষ্ঠানের মধ্যে আমাজন হলো একটি প্রতিষ্ঠান। এই প্রতিষ্ঠান বিভিন্ন ডাটাবেজের সুবিধা দিয়ে থাকে।

কেন আমরা আমাজন ডাটাবেজ ব্যবহার করব?

আমাজন রিলেশনাল ডাটাবেস সার্ভিস (RDS) একটি চলমান ডাটাবেজ এর অনেক চ্যালেঞ্জ মুখোমুখি পরিচালনা করে।

আপনার প্রয়োজন অনুসারে আমাজন রিলেশনাল ডাটাবেস সার্ভিস (RDS) এর সাথে কর্মক্ষমতা এবং স্টোরেজে এর পরিমান পরিবর্তন করতে পারেন।

রিলেশনাল ডাটাবেস সার্ভিস (RDS) স্বয়ংক্রিয় ব্যাকআপ, সংস্কার এবং পুনরুদ্ধারের পরিচালনা করে।

এটি জনপ্রিয় ডাটাবেজ পণ্যগুলো সমর্থন করে। যেমন:

  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server
  • and the new, MySQL-compatible Amazon Aurora DB engine

শুরু করা যাক

আমাজন রিলেশনাল ডাটাবেস সার্ভিস (RDS) শুরু করার আগে, অবশ্যই আমাজান ওয়েব সার্ভারে সাইন আপ করে নিতে হবে এবং ডাটাবেস ব্যবহারকারী এবং নিরাপত্তা গ্রুপ সেট আপ করে নিতে হবে।

আমাজন ওয়েব সার্ভিসেস এ সাইন আপ

যখন আপনি আমাজন ওয়েব সার্ভিসেস (AWS) এ সাইন আপ করবেন, AWS অ্যাকাউন্ট স্বয়ংক্রিয়ভাবে আমাজন রিলেশনাল ডাটাবেস সার্ভিস (RDS) সহ AWS এর সকল সেবার সাথে সাইন আপ করা হয়ে যাবে।

আপনি যদি  AWS এর নতুন গ্রাহক হন তাহলে, বিনামূল্যে প্রদত্ত অ্যামাজন RDS দিয়ে শুরু করতে পারেন।

বিনামূল্যে প্রদত্ত AWS সাইন আপ করার ১২ মাস পর্দন্ত বিনামূল্যে ব্যবহার করার সুযোগ দেবে। আরো জানার জন্য দেখুন বিনামূল্যে AWS ব্যবহার

মুক্ত স্তর আপনি সাইন আপ করার পরে আপনাকে 12 মাসের জন্য বিনামূল্যে জন্য Aws চেষ্টা করতে পারবেন না. আরো তথ্যের জন্য, Aws ফ্রী ব্যবহার টিয়ার দেখতে.

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

AWS অ্যাকাউন্ট তৈরি করার জন্য http://aws.amazon.com/, এবং তারপর সাইন আপ এ ক্লিক করুন।

পর্দায় প্রদর্শিত নির্দেশাবলী অনুসরণ করুন। AWS একাউন্ট নম্বর লিখে রাখুন, কেননা এটি পরবর্তীতে প্রয়োজন হবে।

একটি মাইএসকিউএল ডাটাবেস ইনস্ট্যান্স তৈরি

এন এই উদাহরণে আমরা মাইএসকিউএল চলমান একটি বিনামূল্যে ডাটাবেস ইনস্ট্যান্স সেট আপ হবে. (এটা পরীক্ষার জন্য দেয়ার উদ্দেশ্যে করা হচ্ছে, কারণ এটি বিনামূল্যে).

একটি মাইএসকিউএল ডিবি উদাহরণস্বরূপ তৈরি করুন:

  1. আমাজান RDS কনসোল এ যান: https://console.aws.amazon.com/rds/
  2. নেভিগেশন প্যানেল থেকে Instances এ ক্লিক করুন
  3. Launch DB Instance এ ক্লিক করুন
  4. নির্বাচিত ইঞ্জিন পৃষ্ঠায় MySQL আইকন এ ক্লিক করুন এবং তারপর MySQL DB engine এ ক্লিক করে নির্বাচন করুন।
  5. উৎপাদন? (Production?) পৃষ্ঠায় "No, this instance is intended for use outside of production......." লেখা চেক বক্স এ ক্লিক করুন এবং তারপর Next Step এ ক্লিক করুন
  6. Specify DB Details পৃষ্ঠার নির্দেশাবলী অনুসরণ করুন। (বিনামূলে টেস্ট ডাটাবেজ সেটিং করতে এই নির্দেশাবলী অনুসরণ করুন)
  7. Configure Advanced Settings পৃষ্ঠার নির্দেশাবলী অনুসরণ করুন। (বিনামূলে টেস্ট ডাটাবেজ সেটিং করতে এই নির্দেশাবলী অনুসরণ করুন)
  8. Launch DB Instance এ ক্লিক করুন।
  9. View Your DB Instances এ ক্লিক করুন।
  10. ডিবি ইনস্ট্যান্স এর তালিকায় নতুন ডিবি ইনস্ট্যান্স দেখা যাবে (এটি ব্যবহার করার উপযুক্ত অবস্থা আসার আগ পর্যন্ত "creating" অবস্থা দেখাবে)।
  11. যখন অবস্থা পরিবর্তীত হয়ে "available" হবে তখন আপনি ডাটাবেজ এ সংযুক্ত হতে পারবেন।
  12. বিস্তারিত দেখার জন্য details আইকনে ক্লিক করুন এবং "Endpoint" থেকে পোর্ট সহ URL কপি করুন।

নোটঃ URL এর শেষের দিকে অনেকটা এরকম দেখা যেতে পারে:


databasename.aaabbbcccddd.region.rds.amazonaws.com:3306


 

 

আ্যাপ এম এল -এ ডাটাবেজ সংযোগ স্থাপন

AppML ডাটাবেস সংযোগ কনফিগার
ডাটাবেস সংযোগ কনফিগার করার জন্য, appml_config ফাইল এডিট:


{
 "dateformat" : "yyyy-mm-dd",
 "databases" : [{
 "connection" : "mydatabase",
 "host" : "yourDatabaseURL",
 "dbname" : "yourDatabaseName",
 "username" : "yourUserName",
 "password" : "yourPassword"
 }]
 }

 

নিম্নোক্ত বিষয়গুলো পরিবর্তন করুন

  1. mydatabase - আপনার অ্যাপ্লিকেশন এ ডাটাবেজ কানেকশন কল করা প্রয়োজন হলে এটি পরিবর্তন করুন।
  2. yourDatabaseURL - পূর্ববর্তী ধাপ থেকে Endpoint URL পরিবর্তন করুন।
  3. yourDatabaseName - আপনার Amazon RDS এর নাম অনুসারে আপনার ডাটাবেজ এর নাম পরিবর্তন করুন।
  4. yourUserName - আপনার Amazon RDS অনুসারে ইউজার এর নাম পরিবর্তন করুন।
  5. yourPassword - আপনার Amazon RDS অনুসারে পাসওয়ার্ড পরিবর্তন করুন।

অ্যাপ এমএল এখন Amazon RDS এর সাথে সংযুক্ত হওয়ার মতো কনফিগার করা হয়েছে।

আপনি এখন আপনার ডাটাবেজ কে ডাটা দ্বারা পূরণ করতে পারবেন:

 

  • আপনার যদি পিএইচপি সার্ভার এ প্রবেশাধিকার থাকে তাহলে তা AppML PHP অধ্যায় এ আলোচনা করা হয়েছে।
  • আপনার যদি ASP.NET সার্ভার এ প্রবেশাধিকার থাকে তাহলে তা AppML .NET অধ্যায় এ আলোচনা করা হয়েছে।
  • আপনার যদি কোন সার্ভার এ প্রবেশাধিকার না থাকে তাহলে তা AppML WebMatrix অধ্যায় এ আলোচনা করা হয়েছে।

 

অ্যাপ এম এল -এ গুগল ক্লাউড এসকিউএল ব্যবহার করা (AppML using Google Cloud SQL)

রফিকুল ইসলাম

 

গুগল ক্লাউড এসকিউএল কী

গুগল ক্লাউড এসকউএল হচ্ছে ক্লাউড ভিত্তিক ডাটাবেজ সেবা।

 

গুগল ক্লাউড এসকিউএল কেন?

গুগল ক্লাউড এসকিউএল, মাই এসকিউএল ডাটাবেজকে কোন অতিরিক্ত  বিরম্বনা ছাড়াই ক্লাউড এ স্থাপন করে।

গুগল শক্তিশালী ডাটাবেজ অফার করে এবং এর ব্যয় খুবই নমনীয় (যতটুকু ব্যবহার সেইঅনুপাতে বিল প্রদান করতে হয়)

গুগল স্বয়ংক্রিয় ব্যাকআপ, সংস্কার, এবং পুনরুদ্ধার পরিচালনা করে।

 

শুরু করা যাক

গুগল ক্লাউড এসকিউএল এর ব্যবহার শুরু করার আগে আপনার একটি গুগল একাউন্ট থাকতে হবে এবং গুগল ডেভেলপার কনসোল (Google Developers Console) এ সাইন আপ করতে হবে।

আপনার যদি গুগল একাউন্ট না থাকে তাহলে এখান থেকে গুগল একাউন্ট খুলুন।

 

গুগল ডেভেলপার কনসোল (Google Developers Console) এ সাইন আপ করা

যখন আপনি গুগল ডেভেলপার কনসোল এ সাইন আপ করবেন তখন, আপনার গুগল একাউন্ট সয়ংক্রিয়ভাবে গুগল ক্লাউড ও এসকিউএল এর সকল সেবার সাথে সাইন আপ করা হয়ে যাবে।

যদি আপনি ক্লাউড এর নতুন ব্যবহারকারী হন, তাহলে শুরু করার জন্য নির্দিষ্ট সময় বিনা মূল্যে ব্যবহার করতে পারেন। (ক্লাউড এসকিউএল প্রথম ৬০ দিনের জন্য বিনামূল্যে ব্যবহার করা যায়)। আরো জানতে বিনামূল্যে ক্লাউড দেখুন।

আপনার ফ্রী ব্যবহারের সময় শেষ হওয়ার পরও (বা ফ্রী ট্রায়য়াল অফার এর চেয়ে বেশি স্টোরেজ বা কার্যকারিতা প্রয়োজন হলে) আপনি যদি আপনার ব্যবহার চালিয়ে যেতে চান, তাহলে আপনি শুধুমাত্র যে রিসোর্স ব্যবহার করবেন তার উপর ভিত্তি করে মুল্য প্রদান করবেন।

গুগল ডেভেলপার কনসোন একাউন্ট খুলতে গুগল ডেভেলপার কনসোন একাউন্ট এ ক্লিক করুন এবং নির্দেশাবলী অনুসরণ করুন।

 

উদাহরণস্বরূপ মাইএসকিউএল  ডাটাবেজ তৈরি করন

এই উদাহরণে চলন্ত মাইএসকিউএল এ আমরা ডাটাবেস ইনস্ট্যান্স সেট আপ করবো।

মাইএসকিউএল ডিবি ইনস্ট্যান্স তৈরি

  • আপনি যখন আপনার একাউন্ট তৈরি করবেন তখন সয়ংক্রিয়ভাবে গুগল আপনার জন্য "My First Project" নামে একটি প্রোজেক্ট তৈরি করবে। আমরা এই উদাহরণে উক্ত প্রোজেক্টটি ব্যবহার করবো
  • মেনু থেকে "Storage" এ ক্লিক করুন এবং তারপর "Cloud SQL" এ ক্লিক করুন
  • "Create an instance" এ ক্লিক করুন
  • "Create Cloud SQL instance" পেজ এ আপনার ডিবি এসকিউএল ইনস্ট্যান্স এর জন্য নাম, অঞ্চল এবং কর্মক্ষমতা স্তর ইত্যাদি নির্বাচন করুন। এই উদাহরন এর জন্য আপনি এডভান্স অপশন ছেড়ে যেতে পারেন।
  • "Create" এ ক্লিক করুন।
  • ডিবি ইনস্ট্যান্স এর তালিকায় নতুন ডিবি ইনস্ট্যান্স দেখা যাবে (যখন এর অবস্থা "Runnable" থাকবে তখন এটি ব্যবহারের জন্য উপযুক্ত অবস্থায় থাকবে)।
  • ইনস্ট্যান্স এর নামের উপর ক্লিক করুন এবং নেভিগেশন প্যানেল এর "Access Control" এ ক্লিক করুন।
  • সাব নেভিগেশন প্যানেল এর "IP address"  এ ক্লিক করুন এবং "Request IPv4 address" বাটন এ ক্লিক করুন।
  • এই আইপি এড্রেসটি সংরক্ষণ করে রাখুন। এই আইপি এড্রেসটি ডাটাবেজ এ সংযুক্ত হওয়ার সময় প্রয়োজন হবে।
  • সাব নেভিগেশন প্যানেল এর "Users"  এ ক্লিক করুন এবং "New user" বাটন এ ক্লিক করুন।
  • আপনার ডাটাবেজ এর জন্য একটি ইউজার নেম ও পাসওয়ার্ড নির্দিষ্ট করে দিন।
  • সাব নেভিগেশন প্যানেল এর "Authorization"  এ ক্লিক করুন এবং তারপর Allowed Networks এর অধিন "+ Add item" বাটন এ ক্লিক করুন।
  • এখানে আপনি নির্দিষ্ট করে দিতে পারবেন কারা আপনার ডাটাবেজ এ প্রবেশ করতে পারবে, এটা হতে পারে
    • আপনার নিজস্ব আইপি বা আপনার সার্ভার এর আইপি। এভাবে আপনি আপনার ডাটাবেজ এ প্রবেশ করতে পারবেন।
    • বা 0.0.0.0/0, যা বাহিরের যেকোন আইপি এড্রেস আপনার ডাটাবেজ এ প্রবেশ করতে পারবে (এটি নিরাপত্তা ঝুকি সৃষ্টি করতে পারে এবং আপনাকে এর জন্য অতিরিক্ত মুল্য প্রদান করতে হতে পারে)
  • "Save" এ ক্লিক করুন।
  • নেভিগেশন প্যানেল থেকে "Databases" এ ক্লিক করুন এবং "New database" বাটন এ ক্লিক করুন।
  • আপনার ডাটাবেজ এর জন্য একটি নাম নির্দিষ্ট করুন। (আপনার প্রয়োজন অনুসারে অন্যান্য অপশনগুলে ছেড়ে যেতে পারেন)।

এখন আপনার একটি গুগল ক্লাউড এসকিউএল ডাটাবেজ আছে, সাথে আছে একটি আইপি আপনার ডাটাবেজ এ সংযুক্ত হওয়ার জন্য।

 

আ্যাপ এম এল -এ ডাটাবেজ সংযোগ স্থাপন

ডাটাবেজ সংযোগ স্থাপন করতে appml_config ফাইল কি সম্পাদনা করুন

PHP example: appml_config.php


<?php echo("Access Forbidden");exit();?>
{
"dateformat" : "yyyy-mm-dd",
"databases" : [{
"connection" : "mydatabase",
"host" : "yourDatabaseURL",
"dbname" : "yourDatabaseName",
"username" : "yourUserName",
"password" : "yourPassword"
}]
}

 

নিম্নোক্ত বিষয়গুলো পরিবর্তন করুন

  1. mydatabase - আপনার অ্যাপ্লিকেশন এ ডাটাবেজ কানেকশন কল করা প্রয়োজন হলে এটি পরিবর্তন করুন।
  2. yourDatabaseURL - পূর্ববর্তী ধাপ থেকে আইপি পরিবর্তন করুন এবং 3306 পোর্ট যোগ করুন। (উদাহরণ স্বরুপ:  192.168.1.1:3306)
  3. yourDatabaseName - আপনার গুগল ক্লাউড এসকিউএল এর নাম অনুসারে আপনার ডাটাবেজ এর নাম পরিবর্তন করুন।
  4. yourUserName - আপনার গুগল ক্লাউড এসকিউএল অনুসারে ইউজার এর নাম পরিবর্তন করুন।
  5. yourPassword - আপনার গুগল ক্লাউড এসকিউএল অনুসারে পাসওয়ার্ড পরিবর্তন করুন।

অ্যাপ এমএল এখন গুগল ক্লাউড এসকিউএল এর সাথে সংযুক্ত হওয়ার মতো কনফিগার করা হয়েছে।

আপনি এখন আপনার ডাটাবেজ কে ডাটা দ্বারা পূরণ করতে পারবেন।

 

  • আপনার যদি পিএইচপি সার্ভার এ প্রবেশাধিকার থাকে তাহলে তা AppML PHP অধ্যায় এ আলোচনা করা হয়েছে।
  • আপনার যদি ASP.NET সার্ভার এ প্রবেশাধিকার থাকে তাহলে তা AppML .NET অধ্যায় এ আলোচনা করা হয়েছে।
  • আপনার যদি কোন সার্ভার এ প্রবেশাধিকার না থাকে তাহলে তা AppML WebMatrix অধ্যায় এ আলোচনা করা হয়েছে।

 

 

 

অ্যাপ এম এল ওয়েবম্যাট্রিক্স (AppML WebMatrix)

রিদওয়ান বিন শামীম

 

কারো যদি ওয়েব সার্ভার না থাকে তবে অ্যাপ এম এল ওয়েবম্যাট্রিক্স ব্যবহার করে তৈরি করে নেয়া যায়।

 

ওয়েবম্যাট্রিক্স

ওয়েবম্যাট্রিক্স হল এক প্রকার ফ্রী ওয়েব ডেভেলাপমেন্ট টুল যেটি সহজে ওয়েবসাইট তৈরি করতে দেয়। এর উপাদানগুলো হল,

  • ওয়েবের উদাহরণ ও টেম্পলেট,
  • বিভিন্ন ওয়েব ল্যাঙ্গুয়েজের জন্য সাপোর্ট(যেমন পিএইচপি, এএসপি ডট নেট, নড জেএস ইত্যাদি),
  • একটি ওয়েব সার্ভার,
  • ডাটাবেস সার্ভার(মাইএসকিউএল, এসকিউএল সার্ভার কমপ্যাক)

ওয়েবম্যাট্রিক্স দিয়ে একদম ফাঁকা ওয়েব সাইট দিয়ে শুরু করে বা বিভিন্ন টেম্পলেট ব্যবহার করে সাইট তৈরি করা যায়।

ওয়েবম্যাট্রিক্সে কিছু বিল্ট ইন টুল আছে ডাটাবেস, নিরাপত্তা, সার্চ ইঞ্জিন অপটিমাইজেশন ও ওয়েব পাবলিশিং সংক্রান্ত। ওয়েবম্যাট্রিক্স ইন্সটল করার জন্য লিঙ্ক, http://www.microsoft.com/web/webmatrix

 

শূন্য পিএইচপি সাইট

ওয়েবম্যাট্রিক্স থেকে Template Gallery, সেখান থেকে PHP, তার ভেতর থেকে Empty Site সিলেক্ট করতে হয়। সেখান থেকে সাইট নেম চেঞ্জ করে DemoAppml বা অন্য কিছু দিতে হয়। এরপর Next বাটন চাপতে হয়।

new web

 

এইচটিএমএল টেস্ট পেজ তৈরি

ওয়েবম্যাট্রিক্সে New থেকে New File সেটি থেকে HTML টাইপ হিসেবে নির্ধারণ করতে হয়। ফাইল নেমকে customers.htm বা অন্য কোনও নামে চেঞ্জ করে দিতে হয়, এরপর OK বাটনে চাপতে হয়।

pic_matrix

নতুন ফাইলে এইচটিএমএল যেভাবে পরিবর্তিত হবে তা নিচের উদাহরণে দেখানো হল,

customers.htm


<!DOCTYPE html>
 <html lang="en">
 <title>Customers</title>
 <link rel="stylesheet" href=
 "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script> 
 <body>
 
 <div class="container" appml-data="customers">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
 <tr>
   <th>Customer</th>
   <th>City</th>
   <th>Country</th>
 </tr>
 <tr appml-repeat="records">
   <td>{{CustomerName}}</td>
   <td>{{City}}    </td>
   <td>{{Country}} </td>
 </tr>
 </table>
 </div>
 
 <script>
 var customers = {
 "records":[
 {"CustomerName":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"},
 {"CustomerName":"Ana Trujillo Emparedados y helados","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Antonio Moreno Taquería","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Around the Horn","City":"London","Country":"UK"},
 {"CustomerName":"B's Beverages","City":"London","Country":"UK"},
 {"CustomerName":"Berglunds snabbköp","City":"Luleå","Country":"Sweden"},
 {"CustomerName":"Blauer See Delikatessen","City":"Mannheim","Country":"Germany"},
 {"CustomerName":"Blondel père et fils","City":"Strasbourg","Country":"France"},
 {"CustomerName":"Bólido Comidas preparadas","City":"Madrid","Country":"Spain"},
 {"CustomerName":"Bon app'","City":"Marseille","Country":"France"},
 {"CustomerName":"Bottom-Dollar Marketse","City":"Tsawassen","Country":"Canada"},
 {"CustomerName":"Cactus Comidas para llevar","City":"Buenos Aires","Country":"Argentina"},
 {"CustomerName":"Centro comercial Moctezuma","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Chop-suey Chinese","City":"Bern","Country":"Switzerland"},
 {"CustomerName":"Comércio Mineiro","City":"São Paulo","Country":"Brazil"}
 ]};
 </script>
 
 </body>
</html>

 

 

টেস্টপেজ রান করানোর জন্য ওয়েবম্যাট্রিক্সে Right-click করে Launch in browser সিলেক্ট করতে হবে।

 

ডাটাবেস তৈরি করা

ওয়েবম্যাট্রিক্সে Databasesথেকে New Databaseসেখান থেকে MySQL Database নির্দিষ্ট করে দিতে হবে, ডাটাবেস নেম চেঞ্জ করে OK করে দিতে হবে।

 Web Mattix

ওয়েবম্যাট্রিক্সে Files সিলেক্ট করে web.config ফাইল ওপেন করতে হবে।

 

 

অ্যাপ এম এল কনফিগার করা

ফাইলনেম চেঞ্জ করে appml_config.php করতে হয়,

appml_config.php


<?php echo("Access Forbidden");exit();?>
 {
 "dateformat" : "yyyy-mm-dd",
 "databases" : [{
     "connection" : "mydatabase",
     "host" : "localhost",
     "dbname" : "DemoDB",
     "username" : "DemoDBUkbn5",
     "password" : "l6|U6=V(*T+P" 
 }]
 }

 

 

 

কনফিগারেশন ফাইলের ব্যাখ্যা

 

বৈশিষ্ট্য বর্ণনা
dateformat মডেলে ব্যবহৃত ডেট ফরম্যাট
connection মডেলে ব্যবহৃত কানেকশন নেম
host সার্ভারের আইপি বা হোষ্ট নেম
dbname ডাটাবেসে থাকা নাম
username ইউআইডিতে থাকা নাম
password আইডির পাসওয়ার্ড

 

 

অ্যাপ এম এল কপি করা

http://www.w3schools.com/appml/2.0.3/appml.php.txt. থেকে ডাউনলোড করে ওয়েবসাইটে কপি করে appml.php নামে রিনেম করতে হয়।

pic copy

ডাটাবেস টেবিল তৈরি করা

Create_Customers.js


{
"database" : {
"connection" : "mydatabase",
"execute" : [
"DROP TABLE IF EXISTS Customers",
"CREATE TABLE IF NOT EXISTS Customers (CustomerID INT NOT NULL AUTO_INCREMENT,PRIMARY KEY (CustomerID),CustomerName NVARCHAR(255),ContactName NVARCHAR(255),Address NVARCHAR(255),City NVARCHAR(255),PostalCode NVARCHAR(255),Country NVARCHAR(255))",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Alfreds Futterkiste\",\"Maria Anders\",\"Obere Str. 57\",\"Berlin\",\"12209\",\"Germany\")",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Around the Horn\",\"Thomas Hardy\",\"120 Hanover Sq.\",\"London\",\"WA1 1DP\",\"UK\")",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Blauer See Delikatessen\",\"Hanna Moos\",\"Forsterstr. 57\",\"Mannheim\",\"68306\",\"Germany\")"
]
}}


 

 

Create_Customers model রান করাতে এইচটিএমএল পেজ তৈরি করতে হয়,

Create_Customers.htm


<!DOCTYPE html>
 <html lang="en-US">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
<div appml-data="appml.php?model=Create_Customers"></div>
</body>
 </html>

 

 

এইচটিএমএল পেজ রান করাতে ওয়েবম্যাট্রিক্সে Right-click করে Launch in browser সিলেক্ট করতে হবে।

 

এপ্লিকেশন তৈরি করা

কাস্টমার এপ্লিকেশন মডেল তৈরি করে customers.js নামে সংরক্ষণ করতে হয়।

Customers.js


{
 "rowsperpage" : 10,
 "database" : {
 "connection" : "mydatabase",
 "sql" : "SELECT * FROM Customers",
 "orderby" : "CustomerName"
 }
 }

 

 

কাস্টমার এপ্লিকেশন রান করাতে এইচটিএমএল পেজ তৈরি করতে হয়,

customers.htm


<!DOCTYPE html>
 <html lang="en">
 <title>Customers</title>
 <link rel="stylesheet" href= "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
<div class="container" appml-data="appml.php?model=customers">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
 <tr>
 <th>Customer</th>
 <th>City</th>
 <th>Country</th>
 </tr>
 <tr appml-repeat="records">
 <td>{{CustomerName}}</td>
 <td>{{City}}</td>
 <td>{{Country}}</td>
 </tr>
 </table>
 </div>
</body>
 </html>

 

 

এইচটিএমএল পেজ রান করাতে ওয়েবম্যাট্রিক্সে Right-click করে Launch in browser সিলেক্ট করতে হবে।

 

অ্যাপ এম এল ডট নেট (AppML .NET)

রিদওয়ান বিন শামীম

 

ডট নেট সার্ভারে প্রবেশযোগ্যতা থাকলে নিচের প্রক্রিয়ায় অ্যাপ এম এল সার্ভার এপ্লিকেশন তৈরি করা যাবে, প্রবেশযোগ্যতা না থাকলে ওয়েবম্যাট্রিক্সের জন্য প্রযোজ্য প্রক্রিয়া অনুসরণ করতে হবে।

 

টেস্ট পেজ তৈরি করা

প্রথমে টেস্ট পেজ তৈরি করে সেটিকে পিএইচপি সার্ভারে customers.htm নাম দিয়ে(বা অন্য কোনও নামও চলবে) সংরক্ষণ করতে হবে।

customers.htm


<!DOCTYPE html>
 <html lang="en">
 <title>Customers</title>
 <link rel="stylesheet" href=
 "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container" appml-data="customers">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
 <tr>
      <th>Customer</th>
      <th>City</th>
      <th>Country</th>
 </tr>
 <tr appml-repeat="records">
      <td>{{CustomerName}}</td>
      <td>{{City}}    </td>
      <td>{{Country}} </td>
 </tr>
 </table>
 </div>
 
 <script>
 var customers = {
 "records":[
 {"CustomerName":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"},
 {"CustomerName":"Ana Trujillo Emparedados y helados","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Antonio Moreno Taquería","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Around the Horn","City":"London","Country":"UK"},
 {"CustomerName":"B's Beverages","City":"London","Country":"UK"},
 {"CustomerName":"Berglunds snabbköp","City":"Luleå","Country":"Sweden"},
 {"CustomerName":"Blauer See Delikatessen","City":"Mannheim","Country":"Germany"},
 {"CustomerName":"Blondel père et fils","City":"Strasbourg","Country":"France"},
 {"CustomerName":"Bólido Comidas preparadas","City":"Madrid","Country":"Spain"},
 {"CustomerName":"Bon app'","City":"Marseille","Country":"France"},
 {"CustomerName":"Bottom-Dollar Marketse","City":"Tsawassen","Country":"Canada"},
 {"CustomerName":"Cactus Comidas para llevar","City":"Buenos Aires","Country":"Argentina"},
 {"CustomerName":"Centro comercial Moctezuma","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Chop-suey Chinese","City":"Bern","Country":"Switzerland"},
 {"CustomerName":"Comércio Mineiro","City":"São Paulo","Country":"Brazil"}
 ]};
 </script>
 
 </body>
 </html>

 

 

এরপর পেজটিকে ব্রাউজারে টেস্ট করতে হবে।

 

ডাটাবেস কানেকশন তৈরি করতে হবে

এসকিউএল সার্ভার ডাটাবেসে প্রবেশযোগ্যতা থাকলে(বা অন্য কোনও OLEDB ডাটাবেস যেমন এমএস এক্সেস) ডাটাবেস কানেকশন ডিফাইন করে সার্ভারে appml_config.aspx নাম দিয়ে সংরক্ষণ করতে হয়।

appml_config.aspx (SQL Server Example)


<%
 Response.write("Access Forbidden")
 Response.end
 %>
 {
 "dateformat" : "yyyy-mm-dd",
 "databases" : [
 "connection" : "mydatabase",
 "provider"   : "SQLOLEDB",
 "host"       : "myserver",
 "dbname"     : "DemoDB",
 "username"   : "DemoDBUkbn5",
 "password"   : "l6|U6=V(*T+P"
 }]
 }

 

appml_config.aspx (MS Access Example)


<%
 Response.write("Access Forbidden")
 Response.end
 %>
 {
 "dateformat" : "yyyy-mm-dd",
 "databases" : [
 {
 "connection" : "mydatabase",
 "connectionstring" :
 "Provider=Microsoft.Jet.OLEDB.4.0;data source=C:\\database\\Northwind.mdb"
 }
 }

 

উপরের উদাহরণের কানেকশন বাস্তব নয়, নাম ও পাসওয়ার্ড উদাহরণমাত্র।

 

কনফিগারেশন ফাইলের ব্যাখ্যা

বৈশিষ্ট্য বর্ণনা
dateformat মডেলে যে ডেট ফরম্যাট ব্যবহৃত হবে
connection মডেলে যে কানেকশন নেম ব্যবহৃত হবে
connectionstring OLEDB ড্রাইভার যেমন এমএস এক্সেস ইত্যাদির ক্ষেত্রে প্রযোজ্য
provider ডাটাবেস সফটওয়ারের পরিবেশক
host ডাটাবেসের আইডি বা হোষ্ট
dbname ডাটাবেসের নাম
username ডাটাবেসের ইউজারনেম
password ডাটাবেসের পাসওয়ার্ড

 

ডাটাবেস টেবিল তৈরি করা

ডাটাবেসে কাস্টমার টেবিল তৈরির মডেল নিচের উদাহরণে দেয়া হল,

create_customers.js


{
"database" : {
"connection" : "mydatabase",
"execute" : [
"DROP TABLE IF EXISTS Customers",
"CREATE TABLE IF NOT EXISTS Customers (CustomerID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,(CustomerID), CustomerName NVARCHAR(255),ContactName NVARCHAR(255),Address NVARCHAR(255),City NVARCHAR(255),PostalCode NVARCHAR(255),Country NVARCHAR(255))",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Alfreds Futterkiste\",\"Maria Anders\",\"Obere Str. 57\",\"Berlin\",\"12209\",\"Germany\")",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Around the Horn\",\"Thomas Hardy\",\"120 Hanover Sq.\",\"London\",\"WA1 1DP\",\"UK\")",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Blauer See Delikatessen\",\"Hanna Moos\",\"Forsterstr. 57\",\"Mannheim\",\"68306\",\"Germany\")"
]
}}


 

 

create_customers.js model চালু করার জন্য এইচটিএমএল পেজ তৈরি করতে হয়,

create_customers.htm


<!DOCTYPE html>
 <html>
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div appml-data="appml.aspx?model=create_customers"></div>
 
 </body>
 </html>

 

এইচটিএমএল পেজটিকে ওয়েব ব্রাউজারে চালু করতে হয়।

 

 

এপ্লিকেশন তৈরি করা

কাস্টমার এপ্লিকেশনের মডেল তৈরি করে তাকে customers.js নাম দিয়ে সংরক্ষণ করতে হয়।

 

customers.js


{
 "rowsperpage" : 10,
 "database" : {
     "connection" : "mydatabase",
     "sql" : "SELECT * FROM Customers",
     "orderby" : "CustomerName"
 }
 }

 

 

এইচটিএমএল পেজ তৈরি করে তাতে কাস্টমার এপ্লিকেশন রান করাতে হয়,

customers.htm


<!DOCTYPE html>
 <html lang="en">
 <title>Customers</title>
 <link rel="stylesheet" href= "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script> 
 <body>
 
 <div class="container" appml-data="appml.aspx?model=customers">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
   <tr>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
 </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
 </tr>
 </table>
 </div>
 
 </body>
</html>

 

 

 

 

অ্যাপ এম এল পিএইচপি (AppML PHP)

রিদওয়ান বিন শামীম

 

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

 

টেস্ট পেজ তৈরি করা

টেস্ট পেজ তৈরি করে customers.htm রূপে (বা অন্যকোনও রূপে) পিএইপি সার্ভারে সংরক্ষণ করতে হবে।

customers.htm


 <!DOCTYPE html>
 <html lang="en">
 <title>Customers</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container" appml-data="customers">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
 <tr>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
 </tr>
 <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}}    </td>
     <td>{{Country}} </td>
 </tr>
 </table>
 </div>
 
 <script>
 var customers = {
 "records":[
 {"CustomerName":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"},
 {"CustomerName":"Ana Trujillo Emparedados y helados","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Antonio Moreno Taquería","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Around the Horn","City":"London","Country":"UK"},
 {"CustomerName":"B's Beverages","City":"London","Country":"UK"},
 {"CustomerName":"Berglunds snabbköp","City":"Luleå","Country":"Sweden"},
 {"CustomerName":"Blauer See Delikatessen","City":"Mannheim","Country":"Germany"},
 {"CustomerName":"Blondel père et fils","City":"Strasbourg","Country":"France"},
 {"CustomerName":"Bólido Comidas preparadas","City":"Madrid","Country":"Spain"},
 {"CustomerName":"Bon app'","City":"Marseille","Country":"France"},
 {"CustomerName":"Bottom-Dollar Marketse","City":"Tsawassen","Country":"Canada"},
 {"CustomerName":"Cactus Comidas para llevar","City":"Buenos Aires","Country":"Argentina"},
 {"CustomerName":"Centro comercial Moctezuma","City":"México D.F.","Country":"Mexico"},
 {"CustomerName":"Chop-suey Chinese","City":"Bern","Country":"Switzerland"},
 {"CustomerName":"Comércio Mineiro","City":"São Paulo","Country":"Brazil"}
 ]};
 </script>
 
 </body>
</html>

 

ব্রাউজারে সেই ওয়েবপেজটি পরীক্ষা করে দেখতে হয়।

 

একটি ডাটাবেস কানেকশন তৈরি করতে হয়

পিএইচপি ডাটাবেসে প্রবেশযোগ্যতা থাকে তাহলে তাহলে নিচের নির্দেশ মোতাবেক অ্যাপ এম এল ডাটাবেস কানেকশন তৈরি করতে হয়। এক্ষেত্রেও পিএইচপি ডাটাবেসে প্রবেশযোগ্যতা না থাকলে ওয়েবম্যাট্রিক্সের জন্য প্রযোজ্য উপদেশ দেখতে হবে। ডাটাবেস কানেকশন তৈরি করে সার্ভারে appml_config.php নামে সংরক্ষণ করতে হয়,

 

appml_config.php


<?php echo("Access Forbidden");exit();?>
 {
 "dateformat" : "yyyy-mm-dd",
 "databases" : [{
     "connection" : "mydatabase",
     "host" : "localhost",
     "dbname" : "DemoDB",
     "username" : "DemoDBUkbn5",
     "password" : "l6|U6=V(*T+P" 
 }]
 }

 

উপরে বিবৃত কানেকশন বাস্তব নয়, নাম আর পাসওয়ার্ড উদাহরণমাত্র।

 

কনফিগারেশন ফাইলের বিস্তারিত

 

বৈশিষ্ট্য বর্ণনা
ডাটা ফরম্যাট মডেলে যে ডাটা ফরম্যাট ব্যবহৃত হবে
কানেকশন মডেলে যে কানেকশন ব্যবহৃত হবে
হোস্ট ডাটাবেসের আইপি হোস্ট
dbname ডাটাবেসের নাম
username ডাটাবেসের ইউজার নেম
password ডাটাবেসের পাসওয়ার্ড

 

create_customers.js


{
"database" : {
"connection" : "mydatabase",
"execute" : [
"DROP TABLE IF EXISTS Customers",
"CREATE TABLE IF NOT EXISTS Customers (CustomerID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,(CustomerID),CustomerName NVARCHAR(255),ContactName NVARCHAR(255),Address NVARCHAR(255),City NVARCHAR(255),PostalCode NVARCHAR(255),Country NVARCHAR(255))",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Alfreds Futterkiste\",\"Maria Anders\",\"Obere Str. 57\",\"Berlin\",\"12209\",\"Germany\")",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Around the Horn\",\"Thomas Hardy\",\"120 Hanover Sq.\",\"London\",\"WA1 1DP\",\"UK\")",
"INSERT INTO Customers(CustomerName,ContactName,Address,City,PostalCode,Country)VALUES (\"Blauer See Delikatessen\",\"Hanna Moos\",\"Forsterstr. 57\",\"Mannheim\",\"68306\",\"Germany\")"
]
}}


 

create_customers.js model চালানোর জন্য এইচটিএমএল পেজ তৈরি করতে হয়,

create_customers.htm


 <!DOCTYPE html>
 <html>
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div appml-data="appml.php?model=create_customers"></div>
 
 </body>
 </html>

 

এখন ব্রাউজারে এইচটিএমএল পেজটি চালাতে হবে।

 

এপ্লিকেশন মডেল তৈরি করা

কাস্টমারের এপ্লিকেশনের জন্য মডেল তৈরি করতে হয়। এটিকে customers.js নাম দিতে হবে।

customers.js


{
 "rowsperpage" : 10,
 "database" : {
     "connection" : "mydatabase",
     "sql" : "SELECT * FROM Customers",
     "orderby" : "CustomerName"
 }
 }

 

কাস্টমারের এপ্লিকেশন রান করানোর জন্য এইচটিএমএল পেজ তৈরি করতে হবে,

 

customers.htm


<!DOCTYPE html>
 <html lang="en">
 <title>Customers</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container" appml-data="appml.php?model=customers">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
   <tr>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
 </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
 </tr>
 </table>
 </div>
 
 </body>
</html>

 

 

অ্যাপ এম এল ডাটাবেস (AppML Database)

আপনার নিজের ওয়েব SQL ডাটাবেস তৈরি করুন

নীচের ছোট ইউটিলিটি ব্যবহার করে, AppML ব্যবহার করে আপনি আপনার নিজের ওয়েব SQL ডাটাবেস তৈরি করতে পারেন।

নিজেই নিজের এসকিউএল লিখুন, অথবা প্রদত্ত এসকিউএল ব্যবহার করুন:

নোটঃ ওয়েব এসকিউএল শুধুমাত্র ক্রোম এবং সাফারি ব্রাউজারে কাজ করে।

কাস্টোমার


DROP TABLE IF EXISTS Customers;
CREATE TABLE IF NOT EXISTS Customers (CustomerID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,CustomerName NVARCHAR(255),ContactName NVARCHAR(255),Address NVARCHAR(255),City NVARCHAR(255),PostalCode NVARCHAR(255),Country NVARCHAR(255));
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Alfreds Futterkiste","Maria Anders","Obere Str. 57","Berlin","12209","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Ana Trujillo Emparedados y helados","Ana Trujillo","Avda. de la Constitución 2222","México D.F.","05021","Mexico");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Antonio Moreno Taquería","Antonio Moreno","Mataderos 2312","México D.F.","05023","Mexico");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Around the Horn","Thomas Hardy","120 Hanover Sq.","London","WA1 1DP","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Berglunds snabbköp","Christina Berglund","Berguvsvägen 8","Luleå","S-958 22","Sweden");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Blauer See Delikatessen","Hanna Moos","Forsterstr. 57","Mannheim","68306","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Blondel père et fils","Frédérique Citeaux","24, place Kléber","Strasbourg","67000","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Bólido Comidas preparadas","Martín Sommer","C/ Araquil, 67","Madrid","28023","Spain");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Bon app'","Laurence Lebihans","12, rue des Bouchers","Marseille","13008","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Bottom-Dollar Marketse","Elizabeth Lincoln","23 Tsawassen Blvd.","Tsawassen","T2F 8M4","Canada");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("B's Beverages","Victoria Ashworth","Fauntleroy Circus","London","EC2 5NT","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Cactus Comidas para llevar","Patricio Simpson","Cerrito 333","Buenos Aires","1010","Argentina");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Centro comercial Moctezuma","Francisco Chang","Sierras de Granada 9993","México D.F.","05022","Mexico");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Chop-suey Chinese","Yang Wang","Hauptstr. 29","Bern","3012","Switzerland");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Comércio Mineiro","Pedro Afonso","Av. dos Lusíadas, 23","São Paulo","05432-043","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Consolidated Holdings","Elizabeth Brown","Berkeley Gardens 12 Brewery ","London","WX1 6LT","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Drachenblut Delikatessend","Sven Ottlieb","Walserweg 21","Aachen","52066","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Du monde entier","Janine Labrune","67, rue des Cinquante Otages","Nantes","44000","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Eastern Connection","Ann Devon","35 King George","London","WX3 6FW","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Ernst Handel","Roland Mendel","Kirchgasse 6","Graz","8010","Austria");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Familia Arquibaldo","Aria Cruz","Rua Orós, 92","São Paulo","05442-030","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("FISSA Fabrica Inter. Salchichas S.A.","Diego Roel","C/ Moralzarzal, 86","Madrid","28034","Spain");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Folies gourmandes","Martine Rancé","184, chaussée de Tournai","Lille","59000","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Folk och fä HB","Maria Larsson","Åkergatan 24","Bräcke","S-844 67","Sweden");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Frankenversand","Peter Franken","Berliner Platz 43","München","80805","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("France restauration","Carine Schmitt","54, rue Royale","Nantes","44000","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Franchi S.p.A.","Paolo Accorti","Via Monte Bianco 34","Torino","10100","Italy");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Furia Bacalhau e Frutos do Mar","Lino Rodriguez ","Jardim das rosas n. 32","Lisboa","1675","Portugal");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Galería del gastrónomo","Eduardo Saavedra","Rambla de Cataluña, 23","Barcelona","08022","Spain");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Godos Cocina Típica","José Pedro Freyre","C/ Romero, 33","Sevilla","41101","Spain");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Gourmet Lanchonetes","André Fonseca","Av. Brasil, 442","Campinas","04876-786","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Great Lakes Food Market","Howard Snyder","2732 Baker Blvd.","Eugene","97403","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("GROSELLA-Restaurante","Manuel Pereira","5ª Ave. Los Palos Grandes","Caracas","1081","Venezuela");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Hanari Carnes","Mario Pontes","Rua do Paço, 67","Rio de Janeiro","05454-876","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("HILARIÓN-Abastos","Carlos Hernández","Carrera 22 con Ave. Carlos Soublette #8-35","San Cristóbal","5022","Venezuela");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Hungry Coyote Import Store","Yoshi Latimer","City Center Plaza 516 Main St.","Elgin","97827","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Hungry Owl All-Night Grocers","Patricia McKenna","8 Johnstown Road","Cork","","Ireland");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Island Trading","Helen Bennett","Garden House Crowther Way","Cowes","PO31 7PJ","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Königlich Essen","Philip Cramer","Maubelstr. 90","Brandenburg","14776","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("La corne d'abondance","Daniel Tonini","67, avenue de l'Europe","Versailles","78000","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("La maison d'Asie","Annette Roulet","1 rue Alsace-Lorraine","Toulouse","31000","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Laughing Bacchus Wine Cellars","Yoshi Tannamuri","1900 Oak St.","Vancouver","V3F 2K1","Canada");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Lazy K Kountry Store","John Steel","12 Orchestra Terrace","Walla Walla","99362","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Lehmanns Marktstand","Renate Messner","Magazinweg 7","Frankfurt a.M. ","60528","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Let's Stop N Shop","Jaime Yorres","87 Polk St. Suite 5","San Francisco","94117","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("LILA-Supermercado","Carlos González","Carrera 52 con Ave. Bolívar #65-98 Llano Largo","Barquisimeto","3508","Venezuela");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("LINO-Delicateses","Felipe Izquierdo","Ave. 5 de Mayo Porlamar","I. de Margarita","4980","Venezuela");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Lonesome Pine Restaurant","Fran Wilson","89 Chiaroscuro Rd.","Portland","97219","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Magazzini Alimentari Riuniti","Giovanni Rovelli","Via Ludovico il Moro 22","Bergamo","24100","Italy");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Maison Dewey","Catherine Dewey","Rue Joseph-Bens 532","Bruxelles","B-1180","Belgium");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Mère Paillarde","Jean Fresnière","43 rue St. Laurent","Montréal","H1J 1C3","Canada");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Morgenstern Gesundkost","Alexander Feuer","Heerstr. 22","Leipzig","04179","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("North/South","Simon Crowther","South House 300 Queensbridge","London","SW7 1RZ","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Océano Atlántico Ltda.","Yvonne Moncada","Ing. Gustavo Moncada 8585 Piso 20-A","Buenos Aires","1010","Argentina");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Old World Delicatessen","Rene Phillips","2743 Bering St.","Anchorage","99508","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Ottilies Käseladen","Henriette Pfalzheim","Mehrheimerstr. 369","Köln","50739","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Paris spécialités","Marie Bertrand","265, boulevard Charonne","Paris","75012","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Pericles Comidas clásicas","Guillermo Fernández","Calle Dr. Jorge Cash 321","México D.F.","05033","Mexico");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Piccolo und mehr","Georg Pipps","Geislweg 14","Salzburg","5020","Austria");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Princesa Isabel Vinhoss","Isabel de Castro","Estrada da saúde n. 58","Lisboa","1756","Portugal");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Que Delícia","Bernardo Batista","Rua da Panificadora, 12","Rio de Janeiro","02389-673","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Queen Cozinha","Lúcia Carvalho","Alameda dos Canàrios, 891","São Paulo","05487-020","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("QUICK-Stop","Horst Kloss","Taucherstraße 10","Cunewalde","01307","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Rancho grande","Sergio Gutiérrez","Av. del Libertador 900","Buenos Aires","1010","Argentina");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Rattlesnake Canyon Grocery","Paula Wilson","2817 Milton Dr.","Albuquerque","87110","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Reggiani Caseifici","Maurizio Moroni","Strada Provinciale 124","Reggio Emilia","42100","Italy");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Ricardo Adocicados","Janete Limeira","Av. Copacabana, 267","Rio de Janeiro","02389-890","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Richter Supermarkt","Michael Holz","Grenzacherweg 237","Genève","1203","Switzerland");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Romero y tomillo","Alejandra Camino","Gran Vía, 1","Madrid","28001","Spain");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Santé Gourmet","Jonas Bergulfsen","Erling Skakkes gate 78","Stavern","4110","Norway");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Save-a-lot Markets","Jose Pavarotti","187 Suffolk Ln.","Boise","83720","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Seven Seas Imports","Hari Kumar","90 Wadhurst Rd.","London","OX15 4NB","UK");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Simons bistro","Jytte Petersen","Vinbæltet 34","København","1734","Denmark");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Spécialités du monde","Dominique Perrier","25, rue Lauriston","Paris","75016","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Split Rail Beer & Ale","Art Braunschweiger","P.O. Box 555","Lander","82520","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Suprêmes délices","Pascale Cartrain","Boulevard Tirou, 255","Charleroi","B-6000","Belgium");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("The Big Cheese","Liz Nixon","89 Jefferson Way Suite 2","Portland","97201","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("The Cracker Box","Liu Wong","55 Grizzly Peak Rd.","Butte","59801","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Toms Spezialitäten","Karin Josephs","Luisenstr. 48","Münster","44087","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Tortuga Restaurante","Miguel Angel Paolino","Avda. Azteca 123","México D.F.","05033","Mexico");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Tradição Hipermercados","Anabela Domingues","Av. Inês de Castro, 414","São Paulo","05634-030","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Trail's Head Gourmet Provisioners","Helvetius Nagy","722 DaVinci Blvd.","Kirkland","98034","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Vaffeljernet","Palle Ibsen","Smagsløget 45","Århus","8200","Denmark");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Victuailles en stock","Mary Saveley","2, rue du Commerce","Lyon","69004","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Vins et alcools Chevalier","Paul Henriot","59 rue de l'Abbaye","Reims","51100","France");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Die Wandernde Kuh","Rita Müller","Adenauerallee 900","Stuttgart","70563","Germany");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Wartian Herkku","Pirkko Koskitalo","Torikatu 38","Oulu","90110","Finland");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Wellington Importadora","Paula Parente","Rua do Mercado, 12","Resende","08737-363","Brazil");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("White Clover Markets","Karl Jablonski","305 - 14th Ave. S. Suite 3B","Seattle","98128","USA");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Wilman Kala","Matti Karttunen","Keskuskatu 45","Helsinki","21240","Finland");
INSERT INTO Customers (CustomerName,ContactName,Address,City,PostalCode,Country)
VALUES ("Wolski","Zbyszek","ul. Filtrowa 68","Walla","01-012","Poland");


 

পণ্য


DROP TABLE IF EXISTS Products;
CREATE TABLE IF NOT EXISTS Products
(ProductID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,ProductName NVARCHAR(255),SupplierID INT,CategoryID INT,Unit NVARCHAR(255),Price DECIMAL(10,2));
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (1,"Chais",1,1,"10 boxes x 20 bags",18);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (2,"Chang",1,1,"24 - 12 oz bottles",19);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (3,"Aniseed Syrup",1,2,"12 - 550 ml bottles",10);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (4,"Chef Anton's Cajun Seasoning",2,2,"48 - 6 oz jars",22);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (5,"Chef Anton's Gumbo Mix",2,2,"36 boxes",21.35);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (6,"Grandma's Boysenberry Spread",3,2,"12 - 8 oz jars",25);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (7,"Uncle Bob's Organic Dried Pears",3,7,"12 - 1 lb pkgs.",30);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (8,"Northwoods Cranberry Sauce",3,2,"12 - 12 oz jars",40);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (9,"Mishi Kobe Niku",4,6,"18 - 500 g pkgs.",97);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (10,"Ikura",4,8,"12 - 200 ml jars",31);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (11,"Queso Cabrales",5,4,"1 kg pkg.",21);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (12,"Queso Manchego La Pastora",5,4,"10 - 500 g pkgs.",38);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (13,"Konbu",6,8,"2 kg box",6);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (14,"Tofu",6,7,"40 - 100 g pkgs.",23.25);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (15,"Genen Shouyu",6,2,"24 - 250 ml bottles",15.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (16,"Pavlova",7,3,"32 - 500 g boxes",17.45);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (17,"Alice Mutton",7,6,"20 - 1 kg tins",39);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (18,"Carnarvon Tigers",7,8,"16 kg pkg.",62.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (19,"Teatime Chocolate Biscuits",8,3,"10 boxes x 12 pieces",9.2);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (20,"Sir Rodney's Marmalade",8,3,"30 gift boxes",81);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (21,"Sir Rodney's Scones",8,3,"24 pkgs. x 4 pieces",10);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (22,"Gustaf's Knäckebröd",9,5,"24 - 500 g pkgs.",21);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (23,"Tunnbröd",9,5,"12 - 250 g pkgs.",9);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (24,"Guaraná Fantástica",10,1,"12 - 355 ml cans",4.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (25,"NuNuCa Nuß-Nougat-Creme",11,3,"20 - 450 g glasses",14);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (26,"Gumbär Gummibärchen",11,3,"100 - 250 g bags",31.23);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (27,"Schoggi Schokolade",11,3,"100 - 100 g pieces",43.9);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (28,"Rössle Sauerkraut",12,7,"25 - 825 g cans",45.6);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (29,"Thüringer Rostbratwurst",12,6,"50 bags x 30 sausgs.",123.79);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (30,"Nord-Ost Matjeshering",13,8,"10 - 200 g glasses",25.89);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (31,"Gorgonzola Telino",14,4,"12 - 100 g pkgs",12.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (32,"Mascarpone Fabioli",14,4,"24 - 200 g pkgs.",32);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (33,"Geitost",15,4,"500 g",2.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (34,"Sasquatch Ale",16,1,"24 - 12 oz bottles",14);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (35,"Steeleye Stout",16,1,"24 - 12 oz bottles",18);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (36,"Inlagd Sill",17,8,"24 - 250 g jars",19);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (37,"Gravad lax",17,8,"12 - 500 g pkgs.",26);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (38,"Côte de Blaye",18,1,"12 - 75 cl bottles",263.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (39,"Chartreuse verte",18,1,"750 cc per bottle",18);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (40,"Boston Crab Meat",19,8,"24 - 4 oz tins",18.4);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (41,"Jack's New England Clam Chowder",19,8,"12 - 12 oz cans",9.65);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (42,"Singaporean Hokkien Fried Mee",20,5,"32 - 1 kg pkgs.",14);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (43,"Ipoh Coffee",20,1,"16 - 500 g tins",46);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (44,"Gula Malacca",20,2,"20 - 2 kg bags",19.45);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (45,"Røgede sild",21,8,"1k pkg.",9.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (46,"Spegesild",21,8,"4 - 450 g glasses",12);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (47,"Zaanse koeken",22,3,"10 - 4 oz boxes",9.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (48,"Chocolade",22,3,"10 pkgs.",12.75);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (49,"Maxilaku",23,3,"24 - 50 g pkgs.",20);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (50,"Valkoinen suklaa",23,3,"12 - 100 g bars",16.25);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (51,"Manjimup Dried Apples",24,7,"50 - 300 g pkgs.",53);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (52,"Filo Mix",24,5,"16 - 2 kg boxes",7);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (53,"Perth Pasties",24,6,"48 pieces",32.8);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (54,"Tourtière",25,6,"16 pies",7.45);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (55,"Pâté chinois",25,6,"24 boxes x 2 pies",24);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (56,"Gnocchi di nonna Alice",26,5,"24 - 250 g pkgs.",38);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (57,"Ravioli Angelo",26,5,"24 - 250 g pkgs.",19.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (58,"Escargots de Bourgogne",27,8,"24 pieces",13.25);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (59,"Raclette Courdavault",28,4,"5 kg pkg.",55);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (60,"Camembert Pierrot",28,4,"15 - 300 g rounds",34);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (61,"Sirop d'érable",29,2,"24 - 500 ml bottles",28.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (62,"Tarte au sucre",29,3,"48 pies",49.3);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (63,"Vegie-spread",7,2,"15 - 625 g jars",43.9);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (64,"Wimmers gute Semmelknödel",12,5,"20 bags x 4 pieces",33.25);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (65,"Louisiana Fiery Hot Pepper Sauce",2,2,"32 - 8 oz bottles",21.05);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (66,"Louisiana Hot Spiced Okra",2,2,"24 - 8 oz jars",17);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (67,"Laughing Lumberjack Lager",16,1,"24 - 12 oz bottles",14);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (68,"Scottish Longbreads",8,3,"10 boxes x 8 pieces",12.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (69,"Gudbrandsdalsost",15,4,"10 kg pkg.",36);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (70,"Outback Lager",7,1,"24 - 355 ml bottles",15);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (71,"Fløtemysost",15,4,"10 - 500 g pkgs.",21.5);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (72,"Mozzarella di Giovanni",14,4,"24 - 200 g pkgs.",34.8);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (73,"Röd Kaviar",17,8,"24 - 150 g jars",15);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (74,"Longlife Tofu",4,7,"5 kg pkg.",10);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (75,"Rhönbräu Klosterbier",12,1,"24 - 0.5 l bottles",7.75);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (76,"Lakkalikööri",23,1,"500 ml ",18);
INSERT INTO Products (ProductID,ProductName,SupplierID,CategoryID,Unit,Price)
VALUES (77,"Original Frankfurter grüne Soße",12,2,"12 boxes",13);

 

 

সরবরাহকারী


DROP TABLE IF EXISTS Suppliers;
CREATE TABLE Suppliers (SupplierID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,SupplierName NVARCHAR(255),ContactName NVARCHAR(255),Address NVARCHAR(255),City NVARCHAR(255),PostalCode NVARCHAR(255),Country NVARCHAR(255),Phone NVARCHAR(255));
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Exotic Liquid","Charlotte Cooper","49 Gilbert St.","Londona","EC1 4SD","UK","(171) 555-2222");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("New Orleans Cajun Delights","Shelley Burke","P.O. Box 78934","New Orleans","70117","USA","(100) 555-4822");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Grandma Kelly's Homestead","Regina Murphy","707 Oxford Rd.","Ann Arbor","48104","USA","(313) 555-5735");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Tokyo Traders","Yoshi Nagase","9-8 Sekimai Musashino-shi","Tokyo","100","Japan","(03) 3555-5011");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Cooperativa de Quesos 'Las Cabras'","Antonio del Valle Saavedra ","Calle del Rosal 4","Oviedo","33007","Spain","(98) 598 76 54");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Mayumi's","Mayumi Ohno","92 Setsuko Chuo-ku","Osaka","545","Japan","(06) 431-7877");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Pavlova, Ltd.","Ian Devling","74 Rose St. Moonie Ponds","Melbourne","3058","Australia","(03) 444-2343");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Specialty Biscuits, Ltd.","Peter Wilson","29 King's Way","Manchester","M14 GSD","UK","(161) 555-4448");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("PB Knäckebröd AB","Lars Peterson","Kaloadagatan 13","Göteborg","S-345 67","Sweden ","031-987 65 43");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Refrescos Americanas LTDA","Carlos Diaz","Av. das Americanas 12.890","São Paulo","5442","Brazil","(11) 555 4640");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Heli Süßwaren GmbH & Co. KG","Petra Winkler","Tiergartenstraße 5","Berlin","10785","Germany","(010) 9984510");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Plutzer Lebensmittelgroßmärkte AG","Martin Bein","Bogenallee 51","Frankfurt","60439","Germany","(069) 992755");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Nord-Ost-Fisch Handelsgesellschaft mbH","Sven Petersen","Frahmredder 112a","Cuxhaven","27478","Germany","(04721) 8713");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Formaggi Fortini s.r.l.","Elio Rossi","Viale Dante, 75","Ravenna","48100","Italy","(0544) 60323");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Norske Meierier","Beate Vileid","Hatlevegen 5","Sandvika","1320","Norway","(0)2-953010");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Bigfoot Breweries","Cheryl Saylor","3400 - 8th Avenue Suite 210","Bend","97101","USA","(503) 555-9931");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Svensk Sjöföda AB","Michael Björn","Brovallavägen 231","Stockholm","S-123 45","Sweden","08-123 45 67");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Aux joyeux ecclésiastiques","Guylène Nodier","203, Rue des Francs-Bourgeois","Paris","75004","France","(1) 03.83.00.68");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("New England Seafood Cannery","Robb Merchant","Order Processing Dept. 2100 Paul Revere Blvd.","Boston","02134","USA","(617) 555-3267");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Leka Trading","Chandra Leka","471 Serangoon Loop, Suite #402","Singapore","0512","Singapore","555-8787");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Lyngbysild","Niels Petersen","Lyngbysild Fiskebakken 10","Lyngby","2800","Denmark","43844108");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Zaanse Snoepfabriek","Dirk Luchte","Verkoop Rijnweg 22","Zaandam","9999 ZZ","Netherlands","(12345) 1212");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Karkki Oy","Anne Heikkonen","Valtakatu 12","Lappeenranta","53120","Finland","(953) 10956");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("G'day, Mate","Wendy Mackenzie","170 Prince Edward Parade Hunter's Hill","Sydney","2042","Australia","(02) 555-5914");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Ma Maison","Jean-Guy Lauzon","2960 Rue St. Laurent","Montréal","H1J 1C3","Canada","(514) 555-9022");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Pasta Buttini s.r.l.","Giovanni Giudici","Via dei Gelsomini, 153","Salerno","84100","Italy","(089) 6547665");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Escargots Nouveaux","Marie Delamare","22, rue H. Voiron","Montceau","71300","France","85.57.00.07");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Gai pâturage","Eliane Noz","Bat. B 3, rue des Alpes","Annecy","74000","France","38.76.98.06");
INSERT INTO Suppliers (SupplierName,ContactName,Address,City,PostalCode,Country,Phone) VALUES ("Forêts d'érables","Chantal Goulet","148 rue Chasseur","Ste-Hyacinthe","J2S 7S8","Canada","(514) 555-2955");


 

 

শ্রেণীবিভাগ


DROP TABLE IF EXISTS Categories;
CREATE TABLE Categories (CategoryID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,CategoryName NVARCHAR(255),Description NVARCHAR(255));
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (1,"Beverages","Soft drinks, coffees, teas, beers, and ales");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (2,"Condiments","Sweet and savory sauces, relishes, spreads, and seasonings");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (3,"Confections","Desserts, candies, and sweet breads");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (4,"Dairy Products","Cheeses");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (5,"Grains/Cereals","Breads, crackers, pasta, and cereal");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (6,"Meat/Poultry","Prepared meats");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (7,"Produce","Dried fruit and bean curd");
INSERT INTO Categories (CategoryID,CategoryName,Description) VALUES (8,"Seafood","Seaweed and fish");


 

 

চাকুরীরত ব্যক্তি


DROP TABLE IF EXISTS Employees;
CREATE TABLE Employees (EmployeeID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,LastName NVARCHAR(255),FirstName NVARCHAR(255),BirthDate DATE,Photo NVARCHAR(255),Notes LONGTEXT);
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (1,"Davolio","Nancy","1968-12-08","EmpID1.pic","Education includes a BA in psychology from Colorado State University. She also completed (The Art of the Cold Call). Nancy is a member of 'Toastmasters International'.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (2,"Fuller02-19","EmpID2.pic","Andrew received his BTS commercial and a Ph.D. in international marketing from the University of Dallas. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager and was then named vice president of sales. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (3,"Leverling","Janet","1963-08-30","EmpID3.pic","Janet has a BS degree in chemistry from Boston College). She has also completed a certificate program in food retailing management. Janet was hired as a sales associate and was promoted to sales representative.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (4,"Peacock","Margaret","1958-09-19","EmpID4.pic","Margaret holds a BA in English literature from Concordia College and an MA from the American Institute of Culinary Arts. She was temporarily assigned to the London office before returning to her permanent post in Seattle.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (5,"Buchanan","Steven","1955-03-04","EmpID5.pic","Steven Buchanan graduated from St. Andrews University, Scotland, with a BSC degree. Upon joining the company as a sales representative, he spent 6 months in an orientation program at the Seattle office and then returned to his permanent post in London, where he was promoted to sales manager. Mr. Buchanan has completed the courses 'Successful Telemarketing' and 'International Sales Management'. He is fluent in French.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (6,"Suyama","Michael","1963-07-02","EmpID6.pic","Michael is a graduate of Sussex University (MA, economics) and the University of California at Los Angeles (MBA, marketing). He has also taken the courses 'Multi-Cultural Selling' and 'Time Management for the Sales Professional'. He is fluent in Japanese and can read and write French, Portuguese, and Spanish.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (7,"King","Robert","1960-05-29","EmpID7.pic","Robert King served in the Peace Corps and traveled extensively before completing his degree in English at the University of Michigan and then joining the company. After completing a course entitled 'Selling in Europe', he was transferred to the London office.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (8,"Callahan","Laura","1958-01-09","EmpID8.pic","Laura received a BA in psychology from the University of Washington. She has also completed a course in business French. She reads and writes French.");
INSERT INTO Employees (EmployeeID,LastName,FirstName,BirthDate,Photo,Notes) VALUES (9,"Dodsworth","Anne","1969-07-02","EmpID9.pic","Anne has a BA degree in English from St. Lawrence College. She is fluent in French and German.");


 

 

ক্রয় আদেশ


DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders (OrderID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,CustomerID INT,EmployeeID INT,OrderDate DATE,ShipperID INT);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10248,90,5,"1996-07-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10249,81,6,"1996-07-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10250,34,4,"1996-07-08",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10251,84,3,"1996-07-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10252,76,4,"1996-07-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10253,34,3,"1996-07-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10254,14,5,"1996-07-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10255,68,9,"1996-07-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10256,88,3,"1996-07-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10257,35,4,"1996-07-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10258,20,1,"1996-07-17",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10259,13,4,"1996-07-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10260,55,4,"1996-07-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10261,61,4,"1996-07-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10262,65,8,"1996-07-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10263,20,9,"1996-07-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10264,24,6,"1996-07-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10265,7,2,"1996-07-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10266,87,3,"1996-07-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10267,25,4,"1996-07-29",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10268,33,8,"1996-07-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10269,89,5,"1996-07-31",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10270,87,1,"1996-08-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10271,75,6,"1996-08-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10272,65,6,"1996-08-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10273,63,3,"1996-08-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10274,85,6,"1996-08-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10275,49,1,"1996-08-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10276,80,8,"1996-08-08",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10277,52,2,"1996-08-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10278,5,8,"1996-08-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10279,44,8,"1996-08-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10280,5,2,"1996-08-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10281,69,4,"1996-08-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10282,69,4,"1996-08-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10283,46,3,"1996-08-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10284,44,4,"1996-08-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10285,63,1,"1996-08-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10286,63,8,"1996-08-21",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10287,67,8,"1996-08-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10288,66,4,"1996-08-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10289,11,7,"1996-08-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10290,15,8,"1996-08-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10291,61,6,"1996-08-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10292,81,1,"1996-08-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10293,80,1,"1996-08-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10294,65,4,"1996-08-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10295,85,2,"1996-09-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10296,46,6,"1996-09-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10297,7,5,"1996-09-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10298,37,6,"1996-09-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10299,67,4,"1996-09-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10300,49,2,"1996-09-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10301,86,8,"1996-09-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10302,76,4,"1996-09-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10303,30,7,"1996-09-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10304,80,1,"1996-09-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10305,55,8,"1996-09-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10306,69,1,"1996-09-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10307,48,2,"1996-09-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10308,2,7,"1996-09-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10309,37,3,"1996-09-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10310,77,8,"1996-09-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10311,18,1,"1996-09-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10312,86,2,"1996-09-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10313,63,2,"1996-09-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10314,65,1,"1996-09-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10315,38,4,"1996-09-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10316,65,1,"1996-09-27",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10317,48,6,"1996-09-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10318,38,8,"1996-10-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10319,80,7,"1996-10-02",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10320,87,5,"1996-10-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10321,38,3,"1996-10-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10322,58,7,"1996-10-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10323,39,4,"1996-10-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10324,71,9,"1996-10-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10325,39,1,"1996-10-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10326,8,4,"1996-10-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10327,24,2,"1996-10-11",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10328,28,4,"1996-10-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10329,75,4,"1996-10-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10330,46,3,"1996-10-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10331,9,9,"1996-10-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10332,51,3,"1996-10-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10333,87,5,"1996-10-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10334,84,8,"1996-10-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10335,37,7,"1996-10-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10336,60,7,"1996-10-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10337,25,4,"1996-10-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10338,55,4,"1996-10-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10339,51,2,"1996-10-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10340,9,1,"1996-10-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10341,73,7,"1996-10-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10342,25,4,"1996-10-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10343,44,4,"1996-10-31",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10344,89,4,"1996-11-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10345,63,2,"1996-11-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10346,65,3,"1996-11-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10347,21,4,"1996-11-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10348,86,4,"1996-11-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10349,75,7,"1996-11-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10350,41,6,"1996-11-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10351,20,1,"1996-11-11",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10352,28,3,"1996-11-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10353,59,7,"1996-11-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10354,58,8,"1996-11-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10355,4,6,"1996-11-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10356,86,6,"1996-11-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10357,46,1,"1996-11-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10358,41,5,"1996-11-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10359,72,5,"1996-11-21",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10360,7,4,"1996-11-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10361,63,1,"1996-11-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10362,9,3,"1996-11-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10363,17,4,"1996-11-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10364,19,1,"1996-11-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10365,3,3,"1996-11-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10366,29,8,"1996-11-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10367,83,7,"1996-11-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10368,20,2,"1996-11-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10369,75,8,"1996-12-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10370,14,6,"1996-12-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10371,41,1,"1996-12-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10372,62,5,"1996-12-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10373,37,4,"1996-12-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10374,91,1,"1996-12-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10375,36,3,"1996-12-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10376,51,1,"1996-12-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10377,72,1,"1996-12-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10378,24,5,"1996-12-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10379,61,2,"1996-12-11",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10380,37,8,"1996-12-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10381,46,3,"1996-12-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10382,20,4,"1996-12-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10383,4,8,"1996-12-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10384,5,3,"1996-12-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10385,75,1,"1996-12-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10386,21,9,"1996-12-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10387,70,1,"1996-12-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10388,72,2,"1996-12-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10389,10,4,"1996-12-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10390,20,6,"1996-12-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10391,17,3,"1996-12-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10392,59,2,"1996-12-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10393,71,1,"1996-12-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10394,36,1,"1996-12-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10395,35,6,"1996-12-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10396,25,1,"1996-12-27",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10397,60,5,"1996-12-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10398,71,2,"1996-12-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10399,83,8,"1996-12-31",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10400,19,1,"1997-01-01",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10401,65,1,"1997-01-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10402,20,8,"1997-01-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10403,20,4,"1997-01-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10404,49,2,"1997-01-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10405,47,1,"1997-01-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10406,62,7,"1997-01-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10407,56,2,"1997-01-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10408,23,8,"1997-01-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10409,54,3,"1997-01-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10410,10,3,"1997-01-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10411,10,9,"1997-01-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10412,87,8,"1997-01-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10413,41,3,"1997-01-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10414,21,2,"1997-01-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10415,36,3,"1997-01-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10416,87,8,"1997-01-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10417,73,4,"1997-01-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10418,63,4,"1997-01-17",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10419,68,4,"1997-01-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10420,88,3,"1997-01-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10421,61,8,"1997-01-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10422,27,2,"1997-01-22",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10423,31,6,"1997-01-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10424,51,7,"1997-01-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10425,41,6,"1997-01-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10426,29,4,"1997-01-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10427,59,4,"1997-01-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10428,66,7,"1997-01-28",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10429,37,3,"1997-01-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10430,20,4,"1997-01-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10431,10,4,"1997-01-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10432,75,3,"1997-01-31",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10433,60,3,"1997-02-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10434,24,3,"1997-02-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10435,16,8,"1997-02-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10436,7,3,"1997-02-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10437,87,8,"1997-02-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10438,79,3,"1997-02-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10439,51,6,"1997-02-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10440,71,4,"1997-02-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10441,55,3,"1997-02-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10442,20,3,"1997-02-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10443,66,8,"1997-02-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10444,5,3,"1997-02-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10445,5,3,"1997-02-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10446,79,6,"1997-02-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10447,67,4,"1997-02-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10448,64,4,"1997-02-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10449,7,3,"1997-02-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10450,84,8,"1997-02-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10451,63,4,"1997-02-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10452,71,8,"1997-02-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10453,4,1,"1997-02-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10454,41,4,"1997-02-21",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10455,87,8,"1997-02-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10456,39,8,"1997-02-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10457,39,2,"1997-02-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10458,76,7,"1997-02-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10459,84,4,"1997-02-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10460,24,8,"1997-02-28",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10461,46,1,"1997-02-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10462,16,2,"1997-03-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10463,76,5,"1997-03-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10464,28,4,"1997-03-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10465,83,1,"1997-03-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10466,15,4,"1997-03-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10467,49,8,"1997-03-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10468,39,3,"1997-03-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10469,89,1,"1997-03-10",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10470,9,4,"1997-03-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10471,11,2,"1997-03-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10472,72,8,"1997-03-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10473,38,1,"1997-03-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10474,58,5,"1997-03-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10475,76,9,"1997-03-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10476,35,8,"1997-03-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10477,60,5,"1997-03-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10478,84,2,"1997-03-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10479,65,3,"1997-03-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10480,23,6,"1997-03-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10481,67,8,"1997-03-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10482,43,1,"1997-03-21",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10483,89,7,"1997-03-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10484,11,3,"1997-03-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10485,47,4,"1997-03-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10486,35,1,"1997-03-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10487,62,2,"1997-03-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10488,25,8,"1997-03-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10489,59,6,"1997-03-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10490,35,7,"1997-03-31",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10491,28,8,"1997-03-31",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10492,10,3,"1997-04-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10493,41,4,"1997-04-02",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10494,15,4,"1997-04-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10495,42,3,"1997-04-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10496,81,7,"1997-04-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10497,44,7,"1997-04-04",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10498,35,8,"1997-04-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10499,46,4,"1997-04-08",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10500,41,6,"1997-04-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10501,6,9,"1997-04-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10502,58,2,"1997-04-10",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10503,37,6,"1997-04-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10504,89,4,"1997-04-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10505,51,3,"1997-04-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10506,39,9,"1997-04-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10507,3,7,"1997-04-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10508,56,1,"1997-04-16",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10509,6,4,"1997-04-17",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10510,71,6,"1997-04-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10511,9,4,"1997-04-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10512,21,7,"1997-04-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10513,86,7,"1997-04-22",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10514,20,3,"1997-04-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10515,63,2,"1997-04-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10516,37,2,"1997-04-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10517,53,3,"1997-04-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10518,80,4,"1997-04-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10519,14,6,"1997-04-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10520,70,7,"1997-04-29",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10521,12,8,"1997-04-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10522,44,4,"1997-04-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10523,72,7,"1997-05-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10524,5,1,"1997-05-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10525,9,1,"1997-05-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10526,87,4,"1997-05-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10527,63,7,"1997-05-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10528,32,6,"1997-05-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10529,50,5,"1997-05-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10530,59,3,"1997-05-08",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10531,54,7,"1997-05-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10532,19,7,"1997-05-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10533,24,8,"1997-05-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10534,44,8,"1997-05-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10535,3,4,"1997-05-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10536,44,3,"1997-05-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10537,68,1,"1997-05-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10538,11,9,"1997-05-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10539,11,6,"1997-05-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10540,63,3,"1997-05-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10541,34,2,"1997-05-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10542,39,1,"1997-05-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10543,46,8,"1997-05-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10544,48,4,"1997-05-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10545,43,8,"1997-05-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10546,84,1,"1997-05-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10547,72,3,"1997-05-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10548,79,3,"1997-05-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10549,63,5,"1997-05-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10550,30,7,"1997-05-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10551,28,4,"1997-05-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10552,35,2,"1997-05-29",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10553,87,2,"1997-05-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10554,56,4,"1997-05-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10555,71,6,"1997-06-02",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10556,73,2,"1997-06-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10557,44,9,"1997-06-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10558,4,1,"1997-06-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10559,7,6,"1997-06-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10560,25,8,"1997-06-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10561,24,2,"1997-06-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10562,66,1,"1997-06-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10563,67,2,"1997-06-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10564,65,4,"1997-06-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10565,51,8,"1997-06-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10566,7,9,"1997-06-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10567,37,1,"1997-06-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10568,29,3,"1997-06-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10569,65,5,"1997-06-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10570,51,3,"1997-06-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10571,20,8,"1997-06-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10572,5,3,"1997-06-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10573,3,7,"1997-06-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10574,82,4,"1997-06-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10575,52,5,"1997-06-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10576,80,3,"1997-06-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10577,82,9,"1997-06-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10578,11,4,"1997-06-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10579,45,1,"1997-06-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10580,56,4,"1997-06-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10581,21,3,"1997-06-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10582,6,3,"1997-06-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10583,87,2,"1997-06-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10584,7,4,"1997-06-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10585,88,7,"1997-07-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10586,66,9,"1997-07-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10587,61,1,"1997-07-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10588,63,2,"1997-07-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10589,32,8,"1997-07-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10590,51,4,"1997-07-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10591,83,1,"1997-07-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10592,44,3,"1997-07-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10593,44,7,"1997-07-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10594,55,3,"1997-07-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10595,20,2,"1997-07-10",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10596,89,8,"1997-07-11",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10597,59,7,"1997-07-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10598,65,1,"1997-07-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10599,11,6,"1997-07-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10600,36,4,"1997-07-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10601,35,7,"1997-07-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10602,83,8,"1997-07-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10603,71,8,"1997-07-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10604,28,1,"1997-07-18",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10605,51,1,"1997-07-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10606,81,4,"1997-07-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10607,71,5,"1997-07-22",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10608,79,4,"1997-07-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10609,18,7,"1997-07-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10610,41,8,"1997-07-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10611,91,6,"1997-07-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10612,71,1,"1997-07-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10613,35,4,"1997-07-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10614,6,8,"1997-07-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10615,90,2,"1997-07-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10616,32,1,"1997-07-31",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10617,32,4,"1997-07-31",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10618,51,1,"1997-08-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10619,51,3,"1997-08-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10620,42,2,"1997-08-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10621,38,4,"1997-08-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10622,67,4,"1997-08-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10623,25,8,"1997-08-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10624,78,4,"1997-08-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10625,2,3,"1997-08-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10626,5,1,"1997-08-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10627,71,8,"1997-08-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10628,7,4,"1997-08-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10629,30,4,"1997-08-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10630,39,1,"1997-08-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10631,41,8,"1997-08-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10632,86,8,"1997-08-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10633,20,7,"1997-08-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10634,23,4,"1997-08-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10635,49,8,"1997-08-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10636,87,4,"1997-08-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10637,62,6,"1997-08-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10638,47,3,"1997-08-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10639,70,7,"1997-08-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10640,86,4,"1997-08-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10641,35,4,"1997-08-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10642,73,7,"1997-08-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10643,1,6,"1997-08-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10644,88,3,"1997-08-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10645,34,4,"1997-08-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10646,37,9,"1997-08-27",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10647,61,4,"1997-08-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10648,67,5,"1997-08-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10649,50,5,"1997-08-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10650,21,5,"1997-08-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10651,86,8,"1997-09-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10652,31,4,"1997-09-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10653,25,1,"1997-09-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10654,5,5,"1997-09-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10655,66,1,"1997-09-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10656,32,6,"1997-09-04",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10657,71,2,"1997-09-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10658,63,4,"1997-09-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10659,62,7,"1997-09-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10660,36,8,"1997-09-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10661,37,7,"1997-09-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10662,48,3,"1997-09-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10663,9,2,"1997-09-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10664,28,1,"1997-09-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10665,48,1,"1997-09-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10666,68,7,"1997-09-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10667,20,7,"1997-09-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10668,86,1,"1997-09-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10669,73,2,"1997-09-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10670,25,4,"1997-09-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10671,26,1,"1997-09-17",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10672,5,9,"1997-09-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10673,90,2,"1997-09-18",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10674,38,4,"1997-09-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10675,25,5,"1997-09-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10676,80,2,"1997-09-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10677,3,1,"1997-09-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10678,71,7,"1997-09-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10679,7,8,"1997-09-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10680,55,1,"1997-09-24",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10681,32,3,"1997-09-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10682,3,3,"1997-09-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10683,18,2,"1997-09-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10684,56,3,"1997-09-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10685,31,4,"1997-09-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10686,59,2,"1997-09-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10687,37,9,"1997-09-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10688,83,4,"1997-10-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10689,5,1,"1997-10-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10690,34,1,"1997-10-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10691,63,2,"1997-10-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10692,1,4,"1997-10-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10693,89,3,"1997-10-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10694,63,8,"1997-10-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10695,90,7,"1997-10-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10696,89,8,"1997-10-08",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10697,47,3,"1997-10-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10698,20,4,"1997-10-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10699,52,3,"1997-10-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10700,71,3,"1997-10-10",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10701,37,6,"1997-10-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10702,1,4,"1997-10-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10703,24,6,"1997-10-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10704,62,6,"1997-10-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10705,35,9,"1997-10-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10706,55,8,"1997-10-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10707,4,4,"1997-10-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10708,77,6,"1997-10-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10709,31,1,"1997-10-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10710,27,1,"1997-10-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10711,71,5,"1997-10-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10712,37,3,"1997-10-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10713,71,1,"1997-10-22",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10714,71,5,"1997-10-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10715,9,3,"1997-10-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10716,64,4,"1997-10-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10717,25,1,"1997-10-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10718,39,1,"1997-10-27",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10719,45,8,"1997-10-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10720,61,8,"1997-10-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10721,63,5,"1997-10-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10722,71,8,"1997-10-29",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10723,89,3,"1997-10-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10724,51,8,"1997-10-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10725,21,4,"1997-10-31",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10726,19,4,"1997-11-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10727,66,2,"1997-11-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10728,62,4,"1997-11-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10729,47,8,"1997-11-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10730,9,5,"1997-11-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10731,14,7,"1997-11-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10732,9,3,"1997-11-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10733,5,1,"1997-11-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10734,31,2,"1997-11-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10735,45,6,"1997-11-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10736,37,9,"1997-11-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10737,85,2,"1997-11-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10738,74,2,"1997-11-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10739,85,3,"1997-11-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10740,89,4,"1997-11-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10741,4,4,"1997-11-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10742,10,3,"1997-11-14",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10743,4,1,"1997-11-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10744,83,6,"1997-11-17",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10745,63,9,"1997-11-18",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10746,14,1,"1997-11-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10747,59,6,"1997-11-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10748,71,3,"1997-11-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10749,38,4,"1997-11-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10750,87,9,"1997-11-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10751,68,3,"1997-11-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10752,53,2,"1997-11-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10753,27,3,"1997-11-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10754,49,6,"1997-11-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10755,9,4,"1997-11-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10756,75,8,"1997-11-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10757,71,6,"1997-11-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10758,68,3,"1997-11-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10759,2,3,"1997-11-28",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10760,50,4,"1997-12-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10761,65,5,"1997-12-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10762,24,3,"1997-12-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10763,23,3,"1997-12-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10764,20,6,"1997-12-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10765,63,3,"1997-12-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10766,56,4,"1997-12-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10767,76,4,"1997-12-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10768,4,3,"1997-12-08",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10769,83,3,"1997-12-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10770,34,8,"1997-12-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10771,20,9,"1997-12-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10772,44,3,"1997-12-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10773,20,1,"1997-12-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10774,24,4,"1997-12-11",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10775,78,7,"1997-12-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10776,20,1,"1997-12-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10777,31,7,"1997-12-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10778,5,3,"1997-12-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10779,52,3,"1997-12-16",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10780,46,2,"1997-12-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10781,87,2,"1997-12-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10782,12,9,"1997-12-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10783,34,4,"1997-12-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10784,49,4,"1997-12-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10785,33,1,"1997-12-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10786,62,8,"1997-12-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10787,41,2,"1997-12-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10788,63,1,"1997-12-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10789,23,1,"1997-12-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10790,31,6,"1997-12-22",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10791,25,6,"1997-12-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10792,91,1,"1997-12-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10793,4,3,"1997-12-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10794,61,6,"1997-12-24",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10795,20,8,"1997-12-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10796,35,3,"1997-12-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10797,17,7,"1997-12-25",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10798,38,2,"1997-12-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10799,39,9,"1997-12-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10800,72,1,"1997-12-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10801,8,4,"1997-12-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10802,73,4,"1997-12-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10803,88,4,"1997-12-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10804,72,6,"1997-12-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10805,77,2,"1997-12-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10806,84,3,"1997-12-31",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10807,27,4,"1997-12-31",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10808,60,2,"1998-01-01",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10809,88,7,"1998-01-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10810,42,2,"1998-01-01",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10811,47,8,"1998-01-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10812,66,5,"1998-01-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10813,67,1,"1998-01-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10814,84,3,"1998-01-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10815,71,2,"1998-01-05",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10816,32,4,"1998-01-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10817,39,3,"1998-01-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10818,49,7,"1998-01-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10819,12,2,"1998-01-07",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10820,65,3,"1998-01-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10821,75,1,"1998-01-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10822,82,6,"1998-01-08",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10823,46,5,"1998-01-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10824,24,8,"1998-01-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10825,17,1,"1998-01-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10826,7,6,"1998-01-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10827,9,1,"1998-01-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10828,64,9,"1998-01-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10829,38,9,"1998-01-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10830,81,4,"1998-01-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10831,70,3,"1998-01-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10832,41,2,"1998-01-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10833,56,6,"1998-01-15",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10834,81,1,"1998-01-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10835,1,1,"1998-01-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10836,20,7,"1998-01-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10837,5,9,"1998-01-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10838,47,3,"1998-01-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10839,81,3,"1998-01-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10840,47,4,"1998-01-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10841,76,5,"1998-01-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10842,80,1,"1998-01-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10843,84,4,"1998-01-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10844,59,8,"1998-01-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10845,63,8,"1998-01-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10846,76,2,"1998-01-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10847,71,4,"1998-01-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10848,16,7,"1998-01-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10849,39,9,"1998-01-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10850,84,1,"1998-01-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10851,67,5,"1998-01-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10852,65,8,"1998-01-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10853,6,9,"1998-01-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10854,20,3,"1998-01-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10855,55,3,"1998-01-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10856,3,3,"1998-01-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10857,5,8,"1998-01-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10858,40,2,"1998-01-29",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10859,25,1,"1998-01-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10860,26,3,"1998-01-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10861,89,4,"1998-01-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10862,44,8,"1998-01-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10863,35,4,"1998-02-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10864,4,4,"1998-02-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10865,63,2,"1998-02-02",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10866,5,5,"1998-02-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10867,48,6,"1998-02-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10868,62,7,"1998-02-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10869,72,5,"1998-02-04",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10870,91,5,"1998-02-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10871,9,9,"1998-02-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10872,30,5,"1998-02-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10873,90,4,"1998-02-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10874,30,5,"1998-02-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10875,5,4,"1998-02-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10876,9,7,"1998-02-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10877,67,1,"1998-02-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10878,63,4,"1998-02-10",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10879,90,3,"1998-02-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10880,24,7,"1998-02-10",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10881,12,4,"1998-02-11",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10882,71,4,"1998-02-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10883,48,8,"1998-02-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10884,45,4,"1998-02-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10885,76,6,"1998-02-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10886,34,1,"1998-02-13",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10887,29,8,"1998-02-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10888,30,1,"1998-02-16",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10889,65,9,"1998-02-16",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10890,18,7,"1998-02-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10891,44,7,"1998-02-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10892,50,4,"1998-02-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10893,39,9,"1998-02-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10894,71,1,"1998-02-18",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10895,20,3,"1998-02-18",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10896,50,7,"1998-02-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10897,37,3,"1998-02-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10898,54,4,"1998-02-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10899,46,5,"1998-02-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10900,88,1,"1998-02-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10901,35,4,"1998-02-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10902,24,1,"1998-02-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10903,34,3,"1998-02-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10904,89,3,"1998-02-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10905,88,9,"1998-02-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10906,91,4,"1998-02-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10907,74,6,"1998-02-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10908,66,4,"1998-02-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10909,70,1,"1998-02-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10910,90,1,"1998-02-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10911,30,3,"1998-02-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10912,37,2,"1998-02-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10913,62,4,"1998-02-26",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10914,62,6,"1998-02-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10915,80,2,"1998-02-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10916,64,1,"1998-02-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10917,69,4,"1998-03-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10918,10,3,"1998-03-02",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10919,47,2,"1998-03-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10920,4,4,"1998-03-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10921,83,1,"1998-03-03",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10922,34,5,"1998-03-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10923,41,7,"1998-03-03",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10924,5,3,"1998-03-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10925,34,3,"1998-03-04",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10926,2,4,"1998-03-04",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10927,40,4,"1998-03-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10928,29,1,"1998-03-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10929,25,6,"1998-03-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10930,76,4,"1998-03-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10931,68,4,"1998-03-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10932,9,8,"1998-03-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10933,38,6,"1998-03-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10934,44,3,"1998-03-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10935,88,4,"1998-03-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10936,32,3,"1998-03-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10937,12,7,"1998-03-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10938,63,3,"1998-03-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10939,49,2,"1998-03-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10940,9,8,"1998-03-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10941,71,7,"1998-03-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10942,66,9,"1998-03-11",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10943,11,4,"1998-03-11",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10944,10,6,"1998-03-12",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10945,52,4,"1998-03-12",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10946,83,1,"1998-03-12",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10947,11,3,"1998-03-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10948,30,3,"1998-03-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10949,10,2,"1998-03-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10950,49,1,"1998-03-16",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10951,68,9,"1998-03-16",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10952,1,1,"1998-03-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10953,4,9,"1998-03-16",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10954,47,5,"1998-03-17",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10955,24,8,"1998-03-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10956,6,6,"1998-03-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10957,35,8,"1998-03-18",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10958,54,7,"1998-03-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10959,31,6,"1998-03-18",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10960,35,3,"1998-03-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10961,62,8,"1998-03-19",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10962,63,8,"1998-03-19",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10963,28,9,"1998-03-19",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10964,74,3,"1998-03-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10965,55,6,"1998-03-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10966,14,4,"1998-03-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10967,79,2,"1998-03-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10968,20,1,"1998-03-23",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10969,15,1,"1998-03-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10970,8,9,"1998-03-24",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10971,26,2,"1998-03-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10972,40,4,"1998-03-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10973,40,6,"1998-03-24",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10974,75,3,"1998-03-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10975,10,1,"1998-03-25",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10976,35,1,"1998-03-25",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10977,24,8,"1998-03-26",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10978,50,9,"1998-03-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10979,20,8,"1998-03-26",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10980,24,4,"1998-03-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10981,34,1,"1998-03-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10982,10,2,"1998-03-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10983,71,2,"1998-03-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10984,71,1,"1998-03-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10985,37,2,"1998-03-30",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10986,54,8,"1998-03-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10987,19,8,"1998-03-31",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10988,65,3,"1998-03-31",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10989,61,2,"1998-03-31",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10990,20,2,"1998-04-01",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10991,63,1,"1998-04-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10992,77,1,"1998-04-01",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10993,24,7,"1998-04-01",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10994,83,2,"1998-04-02",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10995,58,1,"1998-04-02",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10996,63,4,"1998-04-02",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10997,46,8,"1998-04-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10998,91,8,"1998-04-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (10999,56,6,"1998-04-03",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11000,65,2,"1998-04-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11001,24,2,"1998-04-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11002,71,4,"1998-04-06",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11003,78,3,"1998-04-06",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11004,50,3,"1998-04-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11005,90,2,"1998-04-07",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11006,32,3,"1998-04-07",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11007,60,8,"1998-04-08",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11008,20,7,"1998-04-08",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11009,30,2,"1998-04-08",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11010,66,2,"1998-04-09",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11011,1,3,"1998-04-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11012,25,1,"1998-04-09",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11013,69,2,"1998-04-09",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11014,47,2,"1998-04-10",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11015,70,2,"1998-04-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11016,4,9,"1998-04-10",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11017,20,9,"1998-04-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11018,48,4,"1998-04-13",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11019,64,6,"1998-04-13",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11020,56,2,"1998-04-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11021,63,3,"1998-04-14",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11022,34,9,"1998-04-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11023,11,1,"1998-04-14",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11024,19,4,"1998-04-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11025,87,6,"1998-04-15",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11026,27,4,"1998-04-15",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11027,10,1,"1998-04-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11028,39,2,"1998-04-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11029,14,4,"1998-04-16",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11030,71,7,"1998-04-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11031,71,6,"1998-04-17",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11032,89,2,"1998-04-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11033,68,7,"1998-04-17",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11034,55,8,"1998-04-20",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11035,76,2,"1998-04-20",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11036,17,8,"1998-04-20",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11037,30,7,"1998-04-21",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11038,76,1,"1998-04-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11039,47,1,"1998-04-21",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11040,32,4,"1998-04-22",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11041,14,3,"1998-04-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11042,15,2,"1998-04-22",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11043,74,5,"1998-04-22",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11044,91,4,"1998-04-23",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11045,10,6,"1998-04-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11046,86,8,"1998-04-23",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11047,19,7,"1998-04-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11048,10,7,"1998-04-24",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11049,31,3,"1998-04-24",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11050,24,8,"1998-04-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11051,41,7,"1998-04-27",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11052,34,3,"1998-04-27",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11053,59,2,"1998-04-27",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11054,12,8,"1998-04-28",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11055,35,7,"1998-04-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11056,19,8,"1998-04-28",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11057,53,3,"1998-04-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11058,6,9,"1998-04-29",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11059,67,2,"1998-04-29",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11060,27,2,"1998-04-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11061,32,4,"1998-04-30",3);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11062,66,4,"1998-04-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11063,37,3,"1998-04-30",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11064,71,1,"1998-05-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11065,46,8,"1998-05-01",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11066,89,7,"1998-05-01",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11067,17,1,"1998-05-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11068,62,8,"1998-05-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11069,80,1,"1998-05-04",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11070,44,2,"1998-05-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11071,46,1,"1998-05-05",1);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11072,20,4,"1998-05-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11073,58,2,"1998-05-05",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11074,73,7,"1998-05-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11075,68,8,"1998-05-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11076,9,4,"1998-05-06",2);
INSERT INTO Orders (OrderID,CustomerID,EmployeeID,OrderDate,ShipperID)
VALUES (11077,65,1,"1998-05-06",2)


 

 

জাভাস্ক্রিপ্ট অবজেক্ট নটেশন ভূমিকা (JSON – Introduction)

রিদওয়ান বিন শামীম

 

জেএসওএন(JSON) জাভাস্ক্রিপ্ট অবজেক্টের মূল্যায়ন করে

জেএসওএন ফরম্যাট সিনট্যাক্সভাবে জাভাস্ক্রিপ্ট অবজেক্টের কোডের অনুরূপ। সাদৃশ্য থাকায় জেএসওএন ডাটাকে নেটিভ জাভাস্ক্রিপ্ট অবজেক্টে রূপ দিতে জাভাস্ক্রিপ্ট পারসার(এক্সএমএলের মত) ব্যবহার না করে আদর্শ জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করে থাকে।

 

নিচের কোডগুলো ব্যবহার করে এই উদাহরণটি পরীক্ষা করে দেখা যেতে পারে

জেএসওএন উদাহরণ,


 <!DOCTYPE html>
 <html>
 <body>
 
 <h2>JSON Object Creation in JavaScript</h2>
 
 <p id="demo"></p>
 
 <script>
 var text = '{"name":"John Johnson","street":"Oslo West 16","phone":"555 1234567"}';
 
 var obj = JSON.parse(text);
 
 document.getElementById("demo").innerHTML =
 obj.name + "<br>" +
 obj.street + "<br>" +
 obj.phone;
 </script>
 
 </body>
 </html>

 

 

এটি অনেকটাই এক্সএমএলের মত কারণ

  • এক্সএমএল ও জেএসওএন উভয়ই আত্মবিবৃতি মূলক অর্থাৎ মানুষের দ্বারা পঠনযোগ্য।
  • এক্সএমএল ও জেএসওএন উভয়ই স্তরবিন্যাসগত (মানের ভেতর মান)।
  • এক্সএমএল ও জেএসওএন উভয়ের ক্ষেত্রেই পারসার ব্যবহার করা যায় এবং বিভিন্ন প্রোগ্রামিং ভাষায় ব্যবহৃত হতে পারে।
  • এক্সএমএল ও জেএসওএন উভয়ের ক্ষেত্রেই XMLHttpRequest প্রয়োগযোগ্য হতে পারে।

 

এটি অনেকক্ষেত্রে এক্সএমএলের মত নয় কারণ

 

  • জেএসওএন এন্ড ট্যাগ ব্যবহার করে না।
  • জেএসওএন একটু খাটো।
  • জেএসওএন দ্রুত লিখা ও পড়া যায়।
  • জেএসওএন অ্যারি(arrays) ব্যবহার করতে পারে।

সবচেয়ে বড় পার্থক্য হল, এক্সএমএলকে এক্সএমএল পারসার দ্বারা খণ্ডিত করতে হয় কিন্তু জেএসওএনকে আদর্শ জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করে খণ্ডিত করতে হয়।

 

 

 

জেএসওএন কেন?

 

এজাক্স এপ্লিকেশনে জেএসওএন ব্যবহার এক্সএমএল এরচেয়ে দ্রুত ও সহজ।

 

এক্সএমএল ব্যবহার করে

 

  • এক্সএমএল ডকুমেন্ট আনতে হয়,
  • পুরো ডকুমেন্টের লুপে এক্সএমএল ডোম (XML DOM) ব্যবহার করতে হয়,
  • মান নির্ণয় ও চলকে সংরক্ষণ করতে হয়,

 

জেএসওএন ব্যবহার করে,

  • একটি জেএসওএন স্ট্রিং বের করতে হয়,
  • জেএসওএন ব্যবহার করে সেই স্ট্রিংকে খণ্ডিত করতে হয়।

 

 

 

জাভাস্ক্রিপ্ট অবজেক্ট নটেশন কর্মপ্রণালীঃ JSON How To

রিদওয়ান বিন শামীম

জেএসওএন এর একটি গুরুত্বপূর্ণ ব্যবহার হল ওয়েব সার্ভার থেকে তথ্য বা ডাটা পড়া ও ওয়েব পেজে তা দেখানো। কাজ সহজ করার স্বার্থে ফাইলের পরিবর্তে কোন স্ট্রিংকে ইনপুট হিসেবে ব্যবহার করেও এটি করা যায়।

জেএসওএন উদাহরণঃ অবজেক্ট থেকে স্ট্রিং

জাভাস্ক্রিপ্ট স্ট্রিং তৈরি করা যাক যেটিতে জেএসওএন সিনট্যাক্স আছে,


var text = '{ "employees" : [' +
 '{ "firstName":"John" , "lastName":"Doe" },' +
 '{ "firstName":"Anna" , "lastName":"Smith" },' +
 '{ "firstName":"Peter" , "lastName":"Jones" } ]}';

 

 

জেএসওএন সিনট্যাক্স, জাভাস্ক্রিপ্ট সিনট্যাক্সের একটি সাবসেট। JSON.parse(text) নামক জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করে জেএসওএন টেক্সটকে জাভাস্ক্রিপ্ট অবজেক্টে পরিনত করা যায়।


var obj = JSON.parse(text);


 

 

পেজে নতুন জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করা যাক,


<p id="demo"></p>
<script>
 document.getElementById("demo").innerHTML =
 obj.employees[1].firstName + " " + obj.employees[1].lastName;
 </script>

 

eval() এর ব্যবহার

পূর্ববর্তী ব্রাউজার যাদের JSON.parse ব্যবহারের সুযোগ নেই তাদের জন্য জেএসওএন টেক্সটকে জাভাস্ক্রিপ্ট অবজেক্টে পরিনত করতে eval() ব্যবহার করা একটি উপায়।
উদাহরণ,


var obj = eval ("(" + text + ")");


 

এখানে বলা উচিৎ, eval() ফাংশন যেকোনো জাভাস্ক্রিপ্টকে কম্পাইল ও সম্পাদন করতে পারে, যেটি অনেক নিরাপত্তাজনিত সমস্যা সৃষ্টি করে, তাই একে এড়িয়ে চলাই ভাল।
জেএসওএন টেক্সটকে জাভাস্ক্রিপ্ট অবজেক্টে পরিনত করতে জেএসওএন পারসার ব্যবহার করা উচিৎ, জেএসওএন পারসার কেবল জেএসওএন টেক্সটকে বুঝতে পারে, স্ক্রিপ্টকে কম্পাইল করে না, ব্রাউজারে যা নেটিভ জেএসওএন সাপোর্ট দেয়, জেএসওএন পারসার অনেকটা দ্রুতও। প্রধান প্রধান যেসব ব্রাউজারে নেটিভ জেএসওএন সাপোর্ট সংযুক্ত, এবং সর্বাধুনিক ECMAScript (JavaScript) সম্পন্ন, সেগুলো হল,

Web Browsers Support

  • Firefox 3.5
  • Internet Explorer 8
  • Chrome
  • Opera 10
  • Safari 4

পূর্ববর্তী ব্রাউজারগুলোর জন্য একটি জাভাস্ক্রিপ্ট লাইব্রেরী এখানে আছে, https://github.com/douglascrockford/JSON-js

Douglas Crockford জেএসওএন ফরম্যাটকে গড়ে তুলেছেন।

জাভাস্ক্রিপ্ট অবজেক্ট নটেশন উদাহরণ (JSON Example)

এই উদাহরণটি পিএইচপি এবং মাইএসকউএল দ্বারা চালিত ওয়েব সার্ভার থেকে জেএসওএন ডাটা পড়ে।


<!DOCTYPE html>
 <html>
 <body>
 
 <h1>Customers</h1>
 <div id="id01"></div>
 
 <script>
 var xmlhttp = new XMLHttpRequest();
 var url = "http://www.w3schools.com/website/customers_mysql.php";
 
 xmlhttp.onreadystatechange=function() {
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
         myFunction(xmlhttp.responseText);
     }
 }
 xmlhttp.open("GET", url, true);
 xmlhttp.send();
 
 function myFunction(response) {
     var arr = JSON.parse(response);
     var i;
     var out = "<table>";
 
     for(i = 0; i < arr.length; i++) {
         out += "<tr><td>" +
         arr[i].Name +
         "</td><td>" +
         arr[i].City +
         "</td><td>" +
         arr[i].Country +
         "</td></tr>";
     }
     out += "</table>"
     document.getElementById("id01").innerHTML = out;
 }
 </script>
 
 </body>
 </html>

সার্ভার এ পিএইচপি কোড

সার্ভারে এই পিএইচপি কোড চালিত  হয়


<?php
 header("Access-Control-Allow-Origin: *");
 header("Content-Type: application/json; charset=UTF-8");
 
 $conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
 
 $result = $conn->query("SELECT CompanyName, City, Country FROM Customers");
 
 $outp = "[";
 while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
     if ($outp != "[") {$outp .= ",";}
     $outp .= '{"Name":"'  . $rs["CompanyName"] . '",';
     $outp .= '"City":"'   . $rs["City"]        . '",';
     $outp .= '"Country":"'. $rs["Country"]     . '"}'; 
 }
 $outp .="]";
 
 $conn->close();
 
 echo($outp);
 ?>

 

স্টাইল ভার্সন

Customers.html


<!DOCTYPE html>
 <html>
 
 <head>
 <style>
 h1 {
     border-bottom: 3px solid #cc9900;
     color: #996600;
     font-size: 30px;
 }
 table, th , td {
     border: 1px solid grey;
     border-collapse: collapse;
     padding: 5px;
 }
 table tr:nth-child(odd) {
     background-color: #f1f1f1;
 }
 table tr:nth-child(even) {
     background-color: #ffffff;
 }
 </style>
 </head>
 
 <body>
 
 <h1>Customers</h1>
 <div id="id01"></div>
 
 <script>
 var xmlhttp = new XMLHttpRequest();
 var url = "http://www.w3schools.com/website/customers_mysql.php";
 
 xmlhttp.onreadystatechange=function() {
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
         myFunction(xmlhttp.responseText);
     }
 }
 xmlhttp.open("GET", url, true);
 xmlhttp.send();
 
 function myFunction(response) {
     var arr = JSON.parse(response);
     var i;
     var out = "<table>";
 
     for(i = 0; i < arr.length; i++) {
         out += "<tr><td>" +
         arr[i].Name +
         "</td><td>" +
         arr[i].City +
         "</td><td>" +
         arr[i].Country +
         "</td></tr>";
     }
     out += "</table>"
     document.getElementById("id01").innerHTML = out;
 }
 </script>
 
 </body>
 </html>

 

 

অ্যাপ এম এল ফর্ম (AppML Forms)

রিদওয়ান বিন শামীম

 

এই অধ্যায়ে দেখানো হবে কীভাবে ডাটাবেসের বিপরীতে ইনপুট ফর্ম তৈরি করা যায়।

 

ফর্ম মডেল তৈরি করা

model_customersform.js


{
 "database" : {
     "connection" : "localmysql",
     "maintable" : "Customers",
     "keyfield" : "CustomerID",
     "sql" : "SELECT * FROM Customers"},
 "updateItems" : [
     {"item" : "CustomerName"},
     {"item" : "Address"},
     {"item" : "PostalCode"},
     {"item" : "City"},
     {"item" : "Country"}]
 }

 

 

এইচটিএমএল ফর্ম তৈরি করা

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

HTML Form


<div id="Form01" appml-data="local?model=model_customersform"
 class="jumbotron">
 
 <div class="form-group">
   <label for="customername">Customer:</label>
   <input id="customername" class="form-control">
 </div>
 
 <div class="form-group">
   <label for="address">Address:</label>
   <input id="address" class="form-control">
 </div>
 
 <div class="form-group">
   <label for="city">City:</label>
   <input id="city" class="form-control">
 </div>
 
 <div class="form-group">
   <label for="postalcode">Postal Code:</label>
   <input id="postalcode" class="form-control">
 </div>
 
 <div class="form-group">
   <label for="country">Country:</label>
   <input id="country" class="form-control">
 </div>
 
 </div>

 

 

এইচটিএমএল ফর্মের ব্যাখ্যা

appml-data="local?model=model_customersform" দ্বারা ফরমের জন্য অ্যাপ এম এল এপ্লিকেশন বোঝায়।

 

এইচটিএমএল ফর্ম কমান্ড তৈরি করা

পছন্দসই স্টাইলশিট ব্যবহার করে(এখানে bootstrap ব্যবহার করা হয়েছে) কাঙ্খিত ফর্ম কমান্ড তৈরি করা হয়,

inc_formcommands.htm


<button type="button" class="close" onclick="document.getElementById('Form01').style.display='none';">X</button>
 
 <button type="button" class="close">X</button>
 
 <div class="btn-toolbar" style="margin-bottom:20px;">
 <div class="btn-group">
 
 <button type="button" class="btn btn-default" onclick="appml('Form01').newRecord();">
 <span class="glyphicon glyphicon-new-window"></span> New</button>
 
 <button type="button" class="btn btn-primary" onclick="appml('Form01').saveRecord();">
 <span class="glyphicon glyphicon-floppy-disk"></span> Save</button>
 
 <button type="button" class="btn btn-default" onclick="appml('Form01').deleteRecord();">
 <span class="glyphicon glyphicon-trash"></span> Delete</button>
 
 </div>
 </div>
 
 <div id="appmlmessage" class="alert alert-warning" style="display:none;">
 <button type="button" class="close"
 onclick="this.parentNode.style.display='none';">X</button>
 <div id="message"></div>
 
</div>

 

 

ফর্ম কমান্ড অন্তর্ভুক্তি

ফরমে ফর্ম কমান্ড অন্তর্ভুক্ত করা হয়,

HTML Form


<div id="Form01" appml-data="local?model=model_customersform"
 class="jumbotron">
 
 <div appml-include-html="inc_formcommands.htm"></div>
 
 <div class="form-group">
 <label for="customername">Customer:</label>
 <input id="customername" class="form-control">
 </div>
 
 <label for="address">Address:</label>
 <input id="address" class="form-control">
 </div>
 
 <div class="form-group">
 <label for="city">City:</label>
 <input id="city" class="form-control">
 </div>
 
 <div class="form-group">
 <label for="postalcode">Postal Code:</label>
 <input id="postalcode" class="form-control">
 </div>
 
 <div class="form-group">
 <label for="country">Country:</label>
 <input id="country" class="form-control">
 </div>
 
 </div>

 

 

 

 

ডাটা টেবিলে ক্লিকেবল কলাম যোগ করা

পূর্ববর্তী অধ্যায়ে আমরা দেখেছি কীভাবে ডাটাবেস থেকে রেকর্ড লিস্ট করার জন্য এপ্লিকেশন তৈরি করতে হয়।এখানে আমরা টেবিলে নতুন কলাম যোগ করব।

 

HTML Source


<div appml-data="local?model=model_customerslist">
 
 <h1>Customers</h1>
 <div appml-include-html="inc_listcommands.htm"></div>
 <div appml-include-html="inc_filter.htm"></div>
 
 <table class="table table-striped table-bordered">
   <tr>
     <th></th>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records">
     <td style="cursor:pointer;width:34px;"
         onclick="appml('Form01').run({{CustomerID}})">
         <span class="glyphicon glyphicon-edit"></span></td>
     <td>{{CustomerName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
   </tr>
 </table>
 
</div>

 

 

নতুন কলামের অনক্লিক ইভেন্ট অ্যাপ এম এল এর একটি এপ্লিকেশন রান করায়, যা এইচটিএমএল উপাদানের মধ্যে id="Form01" পরিচিতি নিয়ে অবস্থান করে।

 

  • appml('Form01') অ্যাপ এম এল এর এপ্লিকেশন পুনরাবৃত্তি করায়,
  • run({{CustomerID}}) প্যারামিটাররূপে কাস্টমার আইডির সাথে এপ্লিকেশন রান করায়।

 

চূড়ান্ত পর্যায়ে, ফর্মকে লুকিয়ে রাখা

ফর্মকে লুকিয়ে রাখতে একধরনের স্টাইল ব্যবহার করা হয়,

 

HTML


<div id="Form01" appml-data="local?model=model_customersform"
 appml-controller="myFormController"
 class="jumbotron" style="display:none">

 

ফর্মে একটি কন্ট্রোলার ব্যবহার করা হয় যেন এটি কেবল তখনই দৃশ্যমান হবে যখন এটি লোডেড ও ডাটা প্রদর্শনের জন্য প্রস্তুত।

Controller


<script>
 function myFormController($appml) {
     if ($appml.message == "ready") {return -1;}
     if ($appml.message == "loaded") {
         document.getElementById("Form01").style.display="";
     }
 }
 </script>

 

 

 

অ্যাপ এম এল লিস্ট (AppML Lists)

রিদওয়ান বিন শামীম

 

এই অধ্যায়ে আমরা একটি ডাটাবেস থেকে রেকর্ড লিস্ট করব।

 

নতুন মডেল তৈরি করা

পূর্ববর্তী অধ্যায়ে ডাটাবেস তৈরি করতে মডেল ব্যবহার করা হয়েছে। এখন ফিলটার ও সংক্ষিপ্ত বর্ণনাসহ নতুন মডেল তৈরি করব,

 model_customerslist.js


{
 "rowsperpage" : 10,
 "database" : {
     "connection" : "localmysql",
     "sql" : "SELECT * Customers",
     "orderby" : "CustomerName"
 },
 "filteritems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}
 ],
 "sortitems" : [
     {"item" : "CustomerName", "label" : "Customer"},
     {"item" : "City"},
     {"item" : "Country"}
 ]
 }

 

এপ্লিকেশনে এই মডেল ব্যবহার করতে হবে,


<div appml-data="local?model=model_customerslist">
 <h1>Customers</h1>
 <div appml-include-html="inc_listcommands.htm"></div>
 
 <table class="table table-striped table-bordered">
   <tr> 
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}} </td>
     <td>{{Country}} </td>
   </tr>
 </table>
 </div>

 

আই ই বা ফায়ারফক্স ব্রাউজারে লোকাল ডাটাবেস ব্যবহার কাজে আসবে না। ক্রোম বা সাফারি ব্যবহার করতে হবে।

 

এইচটিএমএল ফিলটার টেম্পলেট তৈরি

ফিলটারের জন্য এইচটিএমএল টেম্পলেট তৈরি করতে হয়,

inc_filter.htm


<div id="appml_filtercontainer" class="jumbotron" style="display:none;">
   <button id="appmlbtn_queryClose" type="button" class="close"><span>&times;</span></button>
   <h2>Filter</h2>
   <div id="appml_filter">
     <div appml-repeat="filteritems">
       <div class="row">
         <div class="col-sm-3">
           <label>{{label||item}}:</label>
         </div>
         <div class="col-sm-2">
           <input id="appml_datatype_{{item}}" type='hidden'>
           <select id="appml_operator_{{item}}" class="form-control">
             <option value="0">=</option>
             <option value="1">&lt;&gt;</option>
             <option value="2">&lt;</option>
             <option value="3">&gt;</option>
             <option value="4">&lt;=</option>
             <option value="5">&gt;=</option>
             <option value="6">%</option>
           </select>
         </div>
         <div class="col-sm-7">
           <input id="appml_query_{{item}}" class="form-control">
         </div>
       </div>
     </div>
   </div>
   <div id="appml_orderby">
     <h2>Order By</h2>
     <div class="row">
       <div class="col-sm-5">
         <select id='appml_orderselect' class="form-control">
           <option value=''></option>
           <option appml-repeat="sortitems" value="{{item}}">{{label || item}}</option>
         </select>
       </div>
       <div class="col-sm-7">
         ASC <input type='radio' id="appml_orderdirection_asc"
         name='appml_orderdirection' value='asc'>
         DESC <input type='radio' id="appml_orderdirection_desc"
         name='appml_orderdirection' value='desc'>
       </div>
     </div>
   </div>
   <br>
   <button id="appmlbtn_queryOK" type="button" class="btn btn-primary">OK</button>
 </div>

 

 

ফিলটার এইচটিএমএলকে "inc_filter.htm" জাতীয় নামের সঠিক ফাইলে সংরক্ষণ করতে হয়, appml-include-html এর সাথে প্রোটোটাইপে ফিলটার এইচটিএমএলকে অন্তর্ভুক্ত করতে হয়,


<div appml-data="local?model=model_customerslist">
 
 <h1>Customers</h1>
 <div appml-include-html="inc_listcommands.htm"></div>
 <div appml-include-html="inc_filter.htm"></div>
 <table class="table table-striped table-bordered">
   <tr> 
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}} </td>
     <td>{{Country}} </td>
   </tr>
 </table>
 </div>

 

 

AppML প্রোটোটাইপ (AppML Prototype)

আদনান নাহিদ

 

এই অধ্যায়ে আমরা একটি ওয়েব অ্যাপ্লিকেশনের জন্য একটি প্রোটোটাইপ তৈরি করবো ।

 

একটি HTML প্রোটোটাইপ তৈরি

প্রথমত, আপনার প্রিয় সিএসএস ব্যবহার করে একটি শালীন এইচটিএমএল প্রোটোটাইপ তৈরি করুন ।

আমরা এই উদাহরণে বুটস্ট্র্যাপ ব্যবহার করেছি :

উদাহরণ


<!DOCTYPE html>
 <html lang="en-US">
 
 <title>Customers</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> 
 
 <body>
 
 <div class="container">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
   <tr>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr>
     <td>{{CustomerName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
   </tr>
 </table>
 </div>
 
 </body>
 </html>

 

{{...}} এই চিহ্নগুলো হলো ভবিষ্যতের তথ্য স্থানধারক ।

 

AppML যোগ

একটি HTML প্রোটোটাইপ তৈরী করার পর আপনি AppML যোগ করতে পারবেন।

উদাহরণ


<!DOCTYPE html>
 <html lang="en-US">
 
 <title>Customers</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> 
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script> 
 <script src="http://www.w3schools.com/appml/2.0.3/appml_sql.js"></script> 
 <body>
 
 <div class="container" appml-data="customers.js" >
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
   <tr>
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records" >
     <td>{{CustomerName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
   </tr>
 </table>
 </div>
 
 </body>
 </html>

 
AppML যোগ:


<script src="http://www.w3schools.com/appml/2.0.3/appml.js">


 

 

একটি local WebSQL ডাটাবেস যোগ করুন:


<script src="http://www.w3schools.com/appml/2.0.3/appml_sql.js">


 

 

একটি তথ্য উৎস নির্ধারণ করুন ;


appml-data="customers.js"


 

 

রেকর্ডের মধ্যে প্রত্যেকটি রেকর্ডের জন্য পুনরাবৃত্তি করার এইচটিএমএল উপাদান নির্ধারণ করুন ;


appml_repeat = "রেকর্ড"


 

 

এটা সহজে করার জন্য একটি ডাটাবেসর সাথে সংযোগ করার পূর্বে customers.js মত লোকাল ডাটা দিয়ে শুরু করুন ।

 

একটি AppML মডেল তৈরি করুন

একটি ডাটাবেস ব্যবহারের উপযোগী করা জন্যে আপনা একটি AppML ডাটাবেস মডেল লাগবে ।

proto_customers.js


 {
 "rowsperpage" : 10,
 "database" : {
 "connection" : "localmysql",
 "sql" : "Select * from Customers",
 "orderby" : "CustomerName",
 }

 

যদি আপনার লোকাল ডাটাবেস না থাকে, তাহলে আপনি একটি ওয়েব SQL ডাটাবেস তৈরি করতে AppML মডেল ব্যবহার করতে পারেন ।

একটি একক রেকর্ডের সঙ্গে একটি টেবিল তৈরি করতে, এই রকম একটি মডেল ব্যবহার করতে পারেন proto_customers_single.js .

নোটঃ একটি তৈরিকৃত লোকাল ডাটাবেস IE বা Firefox মধ্যে কাজ না করলে ক্রোম বা সাফারি ব্যবহার করুন ।

আপনার অ্যাপ্লিকেশনে মডেল ব্যবহার করুন । ডাটার উৎসকে পরিবর্তন করে local?model=proto_customers_single করুন।

উদাহরণ


<div appml-data=" local?model=proto_customers_single ">
<h1>Customers</h1>
<table class="table table-striped table-bordered">
<tr>
<th>Customer</th>
<th>City</th>
<th>Country</th>
</tr>
<tr appml-repeat="records">
<td>{{CustomerName}}</td>
<td>{{City}} </td>
<td>{{Country}} </td>
</tr>
</table>
</div>


 

 

একাধিক রেকর্ডস দ্বারা একটি লোকাল ডাটাবেস তৈরি করুন

একাধিক রেকর্ডের দিয়ে একটি টেবিল তৈরি করতে, এই রকম একটি মডেল ব্যবহার করুন proto_customers_all.js

ডাটার উৎস পরিবর্তন করে local?model=proto_customers_all করুন।

উদাহরণ


<div appml-data=" local?model=proto_customers_all ">
 <h1>Customers</h1>
 <table class="table table-striped table-bordered">
   <tr> 
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}} </td>
     <td>{{Country}} </td>
   </tr>
 </table>
 </div>

 

 

ন্যাভিগেশন টেমপ্লেট যোগ করা

আপনি আপনার সমস্ত অ্যাপ্লিকেশন এই সাধারণ একটি ন্যাভিগেশন টুলবার রাখতে চাইছেন

এটার জন্য একটি এইচটিএমএল টেমপ্লেট তৈরি করুন।

inc_listcommands.htm


<div class="btn-group" role="toolbar" style="margin-bottom:10px;">
 
   <button id='appmlbtn_first' type="button" class="btn btn-default">
   <span class="glyphicon glyphicon-fast-backward"></span></button>
 
   <button id='appmlbtn_previous' type="button" class="btn btn-default">
   <span class="glyphicon glyphicon-backward"></span></button>
 
   <button id='appmlbtn_text' type="button" class="btn btn-default disabled"></button>
 
   <button id='appmlbtn_next' type="button" class="btn btn-default">
   <span class="glyphicon glyphicon-forward"></span></button>
   
   <button id='appmlbtn_last' type="button" class="btn btn-default">
   <span class="glyphicon glyphicon-fast-forward"></span></button>
 
   <button id='appmlbtn_query' type="button" class="btn btn-primary">
   <span class="glyphicon glyphicon-search"></span> Filter</button>
 
 </div>
 
 <div id="appmlmessage"></div>

 

"Inc_listcommands.htm" এই নামে টেমপ্লেট ফাইল সেভ করুন ।

আপনার প্রোটোটাইপের মধ্যে এই টেম্পলেট অন্তর্ভুক্ত করুন appml-include-html:

উদাহরণ


<div appml-data="local?model=proto_customers_all">
 <h1>Customers</h1>
 <div appml-include-html="inc_listcommands.htm" ></div>
 
 <table class="table table-striped table-bordered">
   <tr> 
     <th>Customer</th>
     <th>City</th>
     <th>Country</th>
   </tr>
   <tr appml-repeat="records">
     <td>{{CustomerName}}</td>
     <td>{{City}} </td>
     <td>{{Country}} </td>
   </tr>
 </table>
 </div>

 

 

অ্যাপ এম এল ক্লায়েন্ট (The AppML Client)

রিদওয়ান বিন শামীম

 

পরবর্তী অধ্যায়গুলোতে আমরা ওয়েব ব্রাউজারে ওয়েব এপ্লিকেশন তৈরি করব।

 

অ্যাপ এম এল ক্লায়েন্ট

অ্যাপ এম এল ক্লায়েন্ট হল একধরনের জাভাস্ক্রিপ্ট যা যেকোনো ওয়েব ব্রাউজারে চলতে পারে।

এটি এক লাইনের কোডের মাধ্যমেই যেকোনো এইচটিএমএল পেজে যোগ করা যায়,


<scriptsrc="http://www.w3schools.com/appml/2.0.3/appml.js"></script>


 

অ্যাপ এম এল ক্লায়েন্ট এইচটিএমএল এট্রিবিউট ব্যবহার করে যেকোনো এইচটিএমএল উপাদানে এক্সটারনাল ডাটা যোগ করার সুবিধা দেয়।


<tableappml-data="customers.js">


 

 

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


<td>{{CustomerName}}</td>


 

 

{{ ... }} হল অ্যাপ এম এল ডাটার সংস্থাপন চিহ্ন।

 

এটির বিল্ট ইন আর একটি সুবিধা হল ডাটার ভেতর থাকা কোনও অ্যারি ব্যবহার করে এইচটিএমএলের উপাদানকে পুনরাবৃত্তি করা যায় ।


 <tr appml-repeat="records">
 ..
 .
 </tr>

 

 

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

 

অ্যাপ এম এল ওয়েব এপ্লিকেশন

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


সিআরইউডি বা CRUD: Create, Read, Update, Delete.


 

 

অ্যাপ এম এল সার্ভার

অ্যাপ এম এল দুটি সার্ভার টাইপ ব্যবহার করে, পিএইচপি ও ডটনেট।

অ্যাপ এম এল সার্ভার স্ক্রিপ্ট ব্যবহার করে এসকিউএল ডাটাবেসে যেমন মাইএসকিউএল ও এসকিউএল ডাটাবেসে প্রবেশ করা যায়। এই সার্ভার স্ক্রিপ্ট অত্যন্ত শক্তিশালী, যেকোনো পিএইচপি ও ডটনেট সার্ভারে ইন্সটল করা যায়।

 

অ্যাপ এম এল ওয়েব এসকিউএল

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


<scriptsrc="http://www.w3schools.com/appml/2.0.3/appml_sql.js"></script>


 

 

AppML কেস স্টাডি – কর্মকর্তা-কর্মচারী (AppML Case Study – Employees)

এইচটিএমএল

এইচটিএমএল সোর্স:


<!DOCTYPE html>
 <html lang="en-US">
 <title>Employees</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container">
 <h1>Employees</h1>
 
 <div id="Form01" class="jumbotron" style="display:none" appml-data="local?model=model_employeesform" 
                                                                 appml-controller="myFormController">
   <div appml-include-html="inc_formcommands.htm"></div>
   <div class="form-group">
     <label>Last Name:</label>
     <input id="LastName" class="form-control">
   </div>
   <div class="form-group">
     <label>First Name:</label>
     <input id="FirstName" class="form-control">
   </div>
   <div class="form-group">
     <label>Date of Birth:</label>
     <input id="BirthDate" class="form-control">
   </div>
   <div class="form-group">
     <label>Photo:</label>
     <input id="Photo" class="form-control">
   </div>
   <div class="form-group">
     <label>Notes:</label>
     <input id="Notes" class="form-control">
   </div>
 </div>
 
 <div appml-data="local?model=model_employeeslist">
   <div appml-include-html="inc_listcommands.htm"></div>
   <div appml-include-html="inc_filter.htm"></div>
   <table class="table table-striped table-bordered">
   <tr>
     <th></th>
     <th>Last Name</th>
     <th>First Name</th>
     <th>Date of Birth</th>
   </tr>
   <tr appml-repeat="records">
     <td style="cursor:pointer"
     onclick="appml('Form01').run({{EmployeeID}})">
     <span class="glyphicon glyphicon-edit"></span>
     </td>
     <td>{{LastName}}</td>
     <td>{{FirstName}}</td>
     <td>{{BirthDate}}</td>
   </tr>
   </table>
 </div>
 
 </div>
 
 <script>
 function myFormController($appml) {
     if ($appml.message == "ready") {return -1;}
     if ($appml.message == "loaded") {
         document.getElementById("Form01").style.display = "";
     }
 }
 </script>
 
 </body>
 </html>

 

 

মডেল

এই অ্যাপ্লিকেশনের মধ্যে ব্যবহৃত মডেল

লিস্ট মডেল


 

{
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Employees",
 "orderby" : "LastName"
 },
 "filteritems" : [
 {"item" : "LastName"},
 {"item" : "FirstName"}
 ],
 "sortitems" : [
 {"item" : "LastName"},
 {"item" : "FirstName"}
 ]
 }

 

 

ফরম মডেল


 {
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Employees",
 "maintable" : "Employees",
 "keyfield" : "EmployeeID"
 },
 "updateItems" : [
 {"item" : "LastName"},
 {"item" : "FirstName"},
 {"item" : "BirthDate"},
 {"item" : "Photo"},
 {"item" : "Notes"}
 ]
 }

 

AppML কেস স্টাডি – শ্রেণীবিভাগ সমূহ (AppML Case Study – Categories)

এইচটিএমএল

এইচটিএমএল সোর্স:


<!DOCTYPE html>
 <html lang="en-US">
 <title>Categories</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container">
 <h1>Categories</h1>
 
 <div id="Form01" class="jumbotron" style="display:none" appml-data="local?model=model_categoriesform" 
                                                                 appml-controller="myFormController">
   <div appml-include-html="inc_formcommands.htm"></div>
   <div class="form-group">
     <label>CategoryName:</label>
     <input id="CategoryName" class="form-control">
   </div>
   <div class="form-group">
     <label>Description:</label>
     <input id="Description" class="form-control">
   </div>
 </div>
 
 <div appml-data="local?model=model_categorieslist">
   <div appml-include-html="inc_listcommands_nofilter.htm"></div>
   <table class="table table-striped table-bordered">
   <tr>
     <th></th>
     <th>Category</th>
     <th>Description</th>
   </tr>
   <tr appml-repeat="records">
     <td style="cursor:pointer"
     onclick="appml('Form01').run({{CategoryID}})">
     <span class="glyphicon glyphicon-edit"></span>
     </td>
     <td>{{CategoryName}}</td>
     <td>{{Description}}</td>
     </tr>
   </table>
 </div>
 
 </div>
 
 <script>
 function myFormController($appml) {
     if ($appml.message == "ready") {return -1;}
     if ($appml.message == "loaded") {
         document.getElementById("Form01").style.display = "";
     }
 }
 </script>
 
 </body>
 </html>

 

 

মডেল

এই অ্যাপ্লিকেশনের মধ্যে ব্যবহৃত মডেল

লিস্ট মডেল


 {
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Categories"
 }
 }

 

 

ফরম মডেল


 {
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Categories",
 "maintable" : "Categories",
 "keyfield" : "CategoryID"
 },
 "updateItems" : [
 {"item" : "CategoryName"},
 {"item" : "Description"}
 ]
 }

 

AppML কেস স্টাডি – কোনো পরিবহনে মাল লেনদেনকারী (AppML Case Study – Shippers)

এইচটিএমএল

এইচটিএমএল সোর্স:


<!DOCTYPE html>
 <html lang="en-US">
 <title>Shippers</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container">
 <h1>Shippers</h1>
 
 <div id="Form01" class="jumbotron" style="display:none" appml-data="local?model=model_shippersform" 
                                                                appml-controller="myFormController">
 <div appml-include-html="inc_formcommands.htm"></div>
 <div class="form-group">
 <label>ShipperName:</label>
 <input id="ShipperName" class="form-control">
 </div>
 <div class="form-group">
 <label>Phone:</label>
 <input id="Phone" class="form-control">
 </div>
 </div>
 
 <div appml-data="local?model=model_shipperslist">
   <div appml-include-html="inc_listcommands_nofilter.htm"></div>
   <table class="table table-striped table-bordered">
   <tr>
     <th></th>
     <th>Shipper</th>
     <th>Phone</th>
   </tr>
   <tr appml-repeat="records">
     <td style="cursor:pointer"
     onclick="appml('Form01').run({{ShipperID}})">
     <span class="glyphicon glyphicon-edit"></span>
     </td>
     <td>{{ShipperName}}</td>
     <td>{{Phone}}</td>
   </tr>
   </table>
 </div>
 
 </div>
 
 <script>
 function myFormController($appml) {
     if ($appml.message == "ready") {return -1;}
     if ($appml.message == "loaded") {
         document.getElementById("Form01").style.display = "";
     }
 }
 </script>
 
 </body>
 </html>

 

 

মডেল

এই অ্যাপ্লিকেশনের মধ্যে ব্যবহৃত মডেল

লিস্ট মডেল


 

 {
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Shippers"
 }
 }

 

 

ফরম মডেল


 {
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Shippers",
 "maintable" : "Shippers",
 "keyfield" : "ShipperID"
 },
 "updateItems" : [
 {"item" : "ShipperName"},
 {"item" : "Phone"}
 ]
 }

 

 

 

AppML কেস স্টাডি – সরবরাহকারী পাইকার পরিবেশক (AppML Case Study – Suppliers)

এইচটিএমএল

এইচটিএমএল সোর্স:


<!DOCTYPE html>
 <html lang="en-US">
 <title>Suppliers</title>
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
 <script src="http://www.w3schools.com/appml/2.0.3/appml.js"></script>
 <body>
 
 <div class="container">
 <h1>Suppliers</h1>
 
 <div id="Form01" class="jumbotron" style="display:none" appml-data="local?model=model_suppliersform"
                                                                  appml-controller="myFormController">
   <div appml-include-html="inc_formcommands.htm"></div>
   <div class="form-group">
     <label>SupplierID:</label>
     <input id="SupplierID" class="form-control">
   </div>
   <div class="form-group">
     <label>SupplierName:</label>
     <input id="SupplierName" class="form-control">
   </div>
   <div class="form-group">
     <label>ContactName:</label>
     <input id="ContactName" class="form-control">
   </div>
   <div class="form-group">
     <label>Address:</label>
     <input id="Address" class="form-control">
   </div>
   <div class="form-group">
     <label>PostalCode:</label>
     <input id="PostalCode" class="form-control">
   </div>
   <div class="form-group">
     <label>City:</label>
     <input id="City" class="form-control">
   </div>
   <div class="form-group">
     <label>Country:</label>
     <input id="Country" class="form-control">
   </div>
   <div class="form-group">
     <label>Adress:</label>
     <input id="Phone" class="form-control">
   </div>
 </div>
 
 <div appml-data="local?model=model_supplierslist">
   <div appml-include-html="inc_listcommands.htm"></div>
   <div appml-include-html="inc_filter.htm"></div>
   <table class="table table-striped table-bordered">
   <tr>
     <th></th>
     <th>Supplier</th>
     <th>City</th>
     <th>Country</th>
     <th></th>
   </tr>
   <tr appml-repeat="records">
     <td style="cursor:pointer"
       onclick="appml('Form01').run({{SupplierID}})">
       <span class="glyphicon glyphicon-edit"></span>
     </td>
     <td>{{SupplierName}}</td>
     <td>{{City}}</td>
     <td>{{Country}}</td>
     <td><a href='' onclick="openProducts({{SupplierID}});return false;">Products</a></td>
   </tr>
   </table>
 </div>
 
 <div id="ProductsSection" class="jumbotron" style="display:none" appml-data="local?model=model_productslist" appml-controller="myProductsController">
 <button onclick="document.getElementById('ProductsSection').style.display='none';" type="button" class="close"><span>&times;</span></button>
 <h2>{{records[0]['SupplierName']}}</h2>
 <table class="table table-striped table-bordered">
 <tr>
   <th>Product</th>
   <th>Category</th>
   <th>Supplier</th>
 </tr>
 <tr appml-repeat="records">
   <td>{{ProductName}}</td>
   <td>{{CategoryName}}</td>
   <td>{{SupplierName}}</td>
 </tr>
 </table>
 </div>
 </div>
 
 <script>
 function openProducts(id) {
     appml("ProductsSection").clearQuery();
     appml("ProductsSection").setQuery("Products.SupplierID", id); 
     appml("ProductsSection").run();
 }
 function myFormController($appml) {
     if ($appml.message == "ready") {return -1;}
     if ($appml.message == "loaded") {
         document.getElementById("Form01").style.display = "";
     }
 }
 function myProductsController($appml) {
     if ($appml.message == "ready") {return -1;}
     if ($appml.message == "loaded") {
         document.getElementById("ProductsSection").style.display = "";
     }
 }
 </script>
 
 </body>
 </html>

 

 

মডেল

এই অ্যাপ্লিকেশনের মধ্যে ব্যবহৃত মডেল

লিস্ট মডেল


{
 "database" : {
 "connection" : "localmysql",
 "sql" : "SELECT * FROM Suppliers",
 "orderby" : "SupplierName"
 },
 "filteritems" : [
 {"item" : "SupplierName"},
 {"item" : "City"},
 {"item" : "Country"}
 ],
 "sortitems" : [
 {"item" : "SupplierName"},
 {"item" : "City"},
 {"item" : "Country"}
 ],
 "rowsperpage" : 10
 }

 

 

ফরম মডেল


 

{
 "database" : {
 "connection" : "localmysql",
 "maintable" : "Customers",
 "keyfield" : "CustomerID",
 "sql" : "SELECT * FROM Customers"
 },
 "updateItems" : [
 {"item" : "CustomerName"},
 {"item" : "Address"},
 {"item" : "PostalCode"},
 {"item" : "City"},
 {"item" : "Country"}
 ]
 }