পাইথন ব্যবহার করে মৌলিক লসলেস ডেটা কম্প্রেশন অ্যালগরিদম হাফম্যান কোডিং-এর নীতি ও ব্যবহারিক বাস্তবায়ন অন্বেষণ করুন। ডেভেলপার ও ডেটা উৎসাহীদের জন্য একটি ব্যাপক নির্দেশিকা।
ডেটা কম্প্রেশন আয়ত্ত করা: পাইথনে হাফম্যান কোডিং-এর গভীর অনুসন্ধান
আজকের ডেটা-চালিত বিশ্বে, দক্ষ ডেটা স্টোরেজ এবং ট্রান্সমিশন অত্যন্ত গুরুত্বপূর্ণ। আপনি একটি আন্তর্জাতিক ই-কমার্স প্ল্যাটফর্মের জন্য বিশাল ডেটাসেট পরিচালনা করুন বা বৈশ্বিক নেটওয়ার্ক জুড়ে মাল্টিমিডিয়া সামগ্রী বিতরণের অপ্টিমাইজেশন করুন, ডেটা কম্প্রেশন একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। বিভিন্ন কৌশলের মধ্যে, হাফম্যান কোডিং লসলেস ডেটা কম্প্রেশনের একটি মূল ভিত্তি হিসেবে দাঁড়িয়ে আছে। এই নিবন্ধটি আপনাকে হাফম্যান কোডিং-এর জটিলতা, এর অন্তর্নিহিত নীতি এবং বহুমুখী পাইথন প্রোগ্রামিং ভাষা ব্যবহার করে এর ব্যবহারিক বাস্তবায়নের মাধ্যমে নির্দেশনা দেবে।
ডেটা কম্প্রেশনের প্রয়োজনীয়তা বোঝা
ডিজিটাল তথ্যের ক্রমবর্ধমান বৃদ্ধি উল্লেখযোগ্য চ্যালেঞ্জ তৈরি করে। এই ডেটা সংরক্ষণের জন্য ক্রমাগত ক্রমবর্ধমান স্টোরেজ ক্ষমতা প্রয়োজন, এবং নেটওয়ার্কের মাধ্যমে এটি প্রেরণ করতে মূল্যবান ব্যান্ডউইথ এবং সময় ব্যয় হয়। লসলেস ডেটা কম্প্রেশন কোনো তথ্য হারানো ছাড়াই ডেটার আকার হ্রাস করে এই সমস্যাগুলির সমাধান করে। এর মানে হল, মূল ডেটা তার সংকুচিত রূপ থেকে নিখুঁতভাবে পুনর্গঠিত করা যেতে পারে। হাফম্যান কোডিং এমন একটি কৌশলের প্রধান উদাহরণ, যা ফাইল সংরক্ষণাগার (যেমন ZIP ফাইল), নেটওয়ার্ক প্রোটোকল এবং ছবি/অডিও এনকোডিং সহ বিভিন্ন অ্যাপ্লিকেশনে ব্যাপকভাবে ব্যবহৃত হয়।
হাফম্যান কোডিং-এর মূল নীতিগুলি
হাফম্যান কোডিং একটি লোভী অ্যালগরিদম (greedy algorithm) যা ইনপুট অক্ষরগুলিকে তাদের পুনরাবৃত্তির ফ্রিকোয়েন্সির উপর ভিত্তি করে পরিবর্তনশীল দৈর্ঘ্যের কোড বরাদ্দ করে। মৌলিক ধারণাটি হল, বেশি ঘন ঘন অক্ষরগুলিতে ছোট কোড এবং কম ঘন ঘন অক্ষরগুলিতে দীর্ঘ কোড বরাদ্দ করা। এই কৌশলটি এনকোড করা বার্তার সামগ্রিক দৈর্ঘ্য হ্রাস করে, যার ফলে কম্প্রেশন অর্জন হয়।
ফ্রিকোয়েন্সি বিশ্লেষণ: ভিত্তি
হাফম্যান কোডিং-এর প্রথম ধাপ হল ইনপুট ডেটাতে প্রতিটি অনন্য অক্ষরের ফ্রিকোয়েন্সি নির্ধারণ করা। উদাহরণস্বরূপ, একটি ইংরেজি টেক্সটে, 'e' অক্ষরটি 'z' এর চেয়ে অনেক বেশি সাধারণ। এই ঘটনাগুলি গণনা করে, আমরা সনাক্ত করতে পারি কোন অক্ষরগুলি সংক্ষিপ্ত বাইনারি কোডগুলি গ্রহণ করবে।
হাফম্যান ট্রি তৈরি করা
হাফম্যান কোডিং-এর মূল হল একটি বাইনারি ট্রি তৈরি করা, যা প্রায়শই হাফম্যান ট্রি নামে পরিচিত। এই ট্রি পুনরাবৃত্তিমূলকভাবে তৈরি করা হয়:
- প্রাথমিককরণ: প্রতিটি অনন্য অক্ষরকে একটি লিফ নোড হিসাবে বিবেচনা করা হয়, যার ওজন তার ফ্রিকোয়েন্সি।
- একত্রীকরণ: সর্বনিম্ন ফ্রিকোয়েন্সি সহ দুটি নোডকে বারবার একত্রিত করে একটি নতুন প্যারেন্ট নোড তৈরি করা হয়। প্যারেন্ট নোডের ফ্রিকোয়েন্সি তার শিশুদের ফ্রিকোয়েন্সির যোগফল।
- পুনরাবৃত্তি: এই একত্রীকরণ প্রক্রিয়াটি চলতে থাকে যতক্ষণ না শুধুমাত্র একটি নোড অবশিষ্ট থাকে, যা হাফম্যান ট্রির রুট।
এই প্রক্রিয়াটি নিশ্চিত করে যে সর্বোচ্চ ফ্রিকোয়েন্সি সহ অক্ষরগুলি ট্রির রুটের কাছাকাছি থাকে, যা ছোট পথ দৈর্ঘ্য এবং এইভাবে সংক্ষিপ্ত বাইনারি কোডগুলিতে নিয়ে যায়।
কোড তৈরি করা
একবার হাফম্যান ট্রি তৈরি হয়ে গেলে, প্রতিটি অক্ষরের জন্য বাইনারি কোডগুলি রুট থেকে সংশ্লিষ্ট লিফ নোড পর্যন্ত ট্রি অতিক্রম করে তৈরি করা হয়। প্রচলিতভাবে, বাম চাইল্ডে যাওয়ার জন্য '0' এবং ডান চাইল্ডে যাওয়ার জন্য '1' বরাদ্দ করা হয়। পথে যে '0' এবং '1' এর ক্রম দেখা যায়, তা সেই অক্ষরের জন্য হাফম্যান কোড তৈরি করে।
উদাহরণ:
একটি সহজ স্ট্রিং বিবেচনা করুন: "this is an example"।
আসুন ফ্রিকোয়েন্সিগুলি গণনা করি:
- 't': 2
- 'h': 1
- 'i': 2
- 's': 3
- ' ': 3
- 'a': 2
- 'n': 1
- 'e': 2
- 'x': 1
- 'm': 1
- 'p': 1
- 'l': 1
হাফম্যান ট্রি নির্মাণে সর্বনিম্ন ফ্রিকোয়েন্সিযুক্ত নোডগুলিকে বারবার একত্রিত করা জড়িত থাকবে। ফলস্বরূপ কোডগুলি এমনভাবে বরাদ্দ করা হবে যাতে 's' এবং ' ' (স্পেস) 'h', 'n', 'x', 'm', 'p', বা 'l' এর চেয়ে ছোট কোড পেতে পারে।
এনকোডিং এবং ডিকোডিং
এনকোডিং: মূল ডেটা এনকোড করতে, প্রতিটি অক্ষরকে তার সংশ্লিষ্ট হাফম্যান কোড দ্বারা প্রতিস্থাপন করা হয়। বাইনারি কোডগুলির ফলস্বরূপ ক্রম সংকুচিত ডেটা গঠন করে।
ডিকোডিং: ডেটা ডিকম্প্রেস করতে, বাইনারি কোডগুলির ক্রম অতিক্রম করা হয়। হাফম্যান ট্রির রুট থেকে শুরু করে, প্রতিটি '0' বা '1' ট্রির নিচে ট্রাভার্সালকে গাইড করে। যখন একটি লিফ নোডে পৌঁছানো হয়, তখন সংশ্লিষ্ট অক্ষরটি আউটপুট করা হয় এবং পরবর্তী কোডের জন্য রুট থেকে ট্রাভার্সাল পুনরায় শুরু হয়।
পাইথনে হাফম্যান কোডিং বাস্তবায়ন
পাইথনের সমৃদ্ধ লাইব্রেরি এবং স্পষ্ট সিনট্যাক্স হাফম্যান কোডিং-এর মতো অ্যালগরিদম বাস্তবায়নের জন্য এটিকে একটি চমৎকার পছন্দ করে তোলে। আমরা আমাদের পাইথন বাস্তবায়ন তৈরি করতে একটি ধাপে ধাপে পদ্ধতি ব্যবহার করব।
ধাপ 1: অক্ষরের ফ্রিকোয়েন্সি গণনা করা
ইনপুট স্ট্রিং-এ প্রতিটি অক্ষরের ফ্রিকোয়েন্সি দক্ষতার সাথে গণনা করতে আমরা পাইথনের `collections.Counter` ব্যবহার করতে পারি।
from collections import Counter
def calculate_frequencies(text):
return Counter(text)
ধাপ 2: হাফম্যান ট্রি তৈরি করা
হাফম্যান ট্রি তৈরি করতে, আমাদের নোডগুলিকে উপস্থাপন করার একটি উপায় প্রয়োজন হবে। একটি সাধারণ ক্লাস বা একটি নামযুক্ত টিউপল এই উদ্দেশ্যে কাজ করতে পারে। সর্বনিম্ন ফ্রিকোয়েন্সি সহ দুটি নোড দক্ষতার সাথে বের করতে আমাদের একটি প্রায়োরিটি কিউও প্রয়োজন হবে। পাইথনের `heapq` মডিউল এর জন্য উপযুক্ত।
import heapq
class Node:
def __init__(self, char, freq, left=None, right=None):
self.char = char
self.freq = freq
self.left = left
self.right = right
# Define comparison methods for heapq
def __lt__(self, other):
return self.freq < other.freq
def __eq__(self, other):
if(other == None):
return False
if(not isinstance(other, Node)):
return False
return self.freq == other.freq
def build_huffman_tree(frequencies):
priority_queue = []
for char, freq in frequencies.items():
heapq.heappush(priority_queue, Node(char, freq))
while len(priority_queue) > 1:
left_child = heapq.heappop(priority_queue)
right_child = heapq.heappop(priority_queue)
merged_node = Node(None, left_child.freq + right_child.freq, left_child, right_child)
heapq.heappush(priority_queue, merged_node);
return priority_queue[0] if priority_queue else None
ধাপ 3: হাফম্যান কোড তৈরি করা
প্রতিটি অক্ষরের জন্য বাইনারি কোড তৈরি করতে আমরা তৈরি করা হাফম্যান ট্রি অতিক্রম করব। একটি রিকার্সিভ ফাংশন এই কাজের জন্য উপযুক্ত।
def generate_huffman_codes(node, current_code="", codes={}):
if node is None:
return
# If it's a leaf node, store the character and its code
if node.char is not None:
codes[node.char] = current_code
return
# Traverse left (assign '0')
generate_huffman_codes(node.left, current_code + "0", codes)
# Traverse right (assign '1')
generate_huffman_codes(node.right, current_code + "1", codes)
return codes
ধাপ 4: এনকোডিং এবং ডিকোডিং ফাংশন
কোড তৈরি হয়ে গেলে, আমরা এখন এনকোডিং এবং ডিকোডিং প্রক্রিয়াগুলি বাস্তবায়ন করতে পারি।
def encode(text, codes):
encoded_text = ""
for char in text:
encoded_text += codes[char]
return encoded_text
def decode(encoded_text, root_node):
decoded_text = ""
current_node = root_node
for bit in encoded_text:
if bit == '0':
current_node = current_node.left
else: # bit == '1'
current_node = current_node.right
# If we reached a leaf node
if current_node.char is not None:
decoded_text += current_node.char
current_node = root_node # Reset to root for next character
return decoded_text
সব একসাথে: একটি সম্পূর্ণ হাফম্যান ক্লাস
আরও সংগঠিত বাস্তবায়নের জন্য, আমরা এই কার্যকারিতাগুলিকে একটি ক্লাসের মধ্যে আবদ্ধ করতে পারি।
import heapq
from collections import Counter
class HuffmanNode:
def __init__(self, char, freq, left=None, right=None):
self.char = char
self.freq = freq
self.left = left
self.right = right
def __lt__(self, other):
return self.freq < other.freq
class HuffmanCoding:
def __init__(self, text):
self.text = text
self.frequencies = self._calculate_frequencies(text)
self.root = self._build_huffman_tree(self.frequencies)
self.codes = self._generate_huffman_codes(self.root)
def _calculate_frequencies(self, text):
return Counter(text)
def _build_huffman_tree(self, frequencies):
priority_queue = []
for char, freq in frequencies.items():
heapq.heappush(priority_queue, HuffmanNode(char, freq))
while len(priority_queue) > 1:
left_child = heapq.heappop(priority_queue)
right_child = heapq.heappop(priority_queue)
merged_node = HuffmanNode(None, left_child.freq + right_child.freq, left_child, right_child)
heapq.heappush(priority_queue, merged_node)
return priority_queue[0] if priority_queue else None
def _generate_huffman_codes(self, node, current_code="", codes={}):
if node is None:
return
if node.char is not None:
codes[node.char] = current_code
return
self._generate_huffman_codes(node.left, current_code + "0", codes)
self._generate_huffman_codes(node.right, current_code + "1", codes)
return codes
def encode(self):
encoded_text = ""
for char in self.text:
encoded_text += self.codes[char]
return encoded_text
def decode(self, encoded_text):
decoded_text = ""
current_node = self.root
for bit in encoded_text:
if bit == '0':
current_node = current_node.left
else: # bit == '1'
current_node = current_node.right
if current_node.char is not None:
decoded_text += current_node.char
current_node = self.root
return decoded_text
# Example Usage:
text_to_compress = "this is a test of huffman coding in python. it is a global concept."
huffman = HuffmanCoding(text_to_compress)
encoded_data = huffman.encode()
print(f"Original Text: {text_to_compress}")
print(f"Encoded Data: {encoded_data}")
print(f"Original Size (approx bits): {len(text_to_compress) * 8}")
print(f"Compressed Size (bits): {len(encoded_data)}")
decoded_data = huffman.decode(encoded_data)
print(f"Decoded Text: {decoded_data}")
# Verification
assert text_to_compress == decoded_data
হাফম্যান কোডিং-এর সুবিধা এবং সীমাবদ্ধতা
সুবিধা:
- সর্বোত্তম প্রিফিক্স কোড: হাফম্যান কোডিং সর্বোত্তম প্রিফিক্স কোড তৈরি করে, যার অর্থ কোনো কোড অন্য কোডের প্রিফিক্স নয়। এই বৈশিষ্ট্যটি দ্ব্যর্থহীন ডিকোডিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ।
- দক্ষতা: এটি অ-ইউনিফর্ম ক্যারেক্টার বিতরণ সহ ডেটার জন্য ভালো কম্প্রেশন অনুপাত প্রদান করে।
- সরলতা: অ্যালগরিদমটি বোঝা এবং বাস্তবায়ন করা তুলনামূলকভাবে সহজ।
- লসলেস: মূল ডেটার নিখুঁত পুনর্গঠনের গ্যারান্টি দেয়।
সীমাবদ্ধতা:
- দুটি পাসের প্রয়োজন: অ্যালগরিদম সাধারণত ডেটার উপর দুটি পাসের প্রয়োজন হয়: একটি ফ্রিকোয়েন্সি গণনা করতে এবং ট্রি তৈরি করতে, এবং অন্যটি এনকোড করতে।
- সমস্ত বিতরণের জন্য সর্বোত্তম নয়: খুব ইউনিফর্ম ক্যারেক্টার বিতরণ সহ ডেটার জন্য, কম্প্রেশন অনুপাত নগণ্য হতে পারে।
- ওভারহেড: হাফম্যান ট্রি (বা কোড টেবিল) সংকুচিত ডেটার সাথে অবশ্যই প্রেরণ করতে হবে, যা কিছু ওভারহেড যোগ করে, বিশেষ করে ছোট ফাইলগুলির জন্য।
- প্রসঙ্গ স্বাধীনতা: এটি প্রতিটি অক্ষরকে স্বাধীনভাবে বিবেচনা করে এবং অক্ষরগুলি যে প্রসঙ্গে প্রদর্শিত হয় তা বিবেচনা করে না, যা নির্দিষ্ট ধরণের ডেটার জন্য এর কার্যকারিতা সীমিত করতে পারে।
বৈশ্বিক অ্যাপ্লিকেশন এবং বিবেচনা
হাফম্যান কোডিং, এর বয়স সত্ত্বেও, একটি বৈশ্বিক প্রযুক্তিগত ল্যান্ডস্কেপে প্রাসঙ্গিক রয়েছে। এর নীতিগুলি অনেক আধুনিক কম্প্রেশন স্কিমের মৌলিক।
- ফাইল সংরক্ষণাগার: ডেটা স্ট্রিম সংকুচিত করতে Deflate (ZIP, GZIP, PNG-তে পাওয়া যায়) এর মতো অ্যালগরিদমে ব্যবহৃত হয়।
- ছবি এবং অডিও কম্প্রেশন: আরও জটিল কোডেকগুলির একটি অংশ গঠন করে। উদাহরণস্বরূপ, JPEG কম্প্রেশনে, কম্প্রেশনের অন্যান্য ধাপগুলির পরে এন্ট্রপি কোডিংয়ের জন্য হাফম্যান কোডিং ব্যবহার করা হয়।
- নেটওয়ার্ক ট্রান্সমিশন: ডেটা প্যাকেটের আকার কমাতে প্রয়োগ করা যেতে পারে, যার ফলে আন্তর্জাতিক নেটওয়ার্ক জুড়ে দ্রুত এবং আরও দক্ষ যোগাযোগ হয়।
- ডেটা স্টোরেজ: একটি বৈশ্বিক ব্যবহারকারী বেসকে পরিষেবা দেয় এমন ডেটাবেস এবং ক্লাউড স্টোরেজ সমাধানগুলিতে স্টোরেজ স্পেস অপ্টিমাইজ করার জন্য অপরিহার্য।
বৈশ্বিক বাস্তবায়ন বিবেচনা করার সময়, ক্যারেক্টার সেট (Unicode বনাম ASCII), ডেটা ভলিউম এবং কাঙ্ক্ষিত কম্প্রেশন অনুপাতের মতো বিষয়গুলি গুরুত্বপূর্ণ হয়ে ওঠে। অত্যন্ত বৃহৎ ডেটাসেটের জন্য, সেরা কার্যকারিতা অর্জনের জন্য আরও উন্নত অ্যালগরিদম বা হাইব্রিড পদ্ধতি প্রয়োজনীয় হতে পারে।
অন্যান্য কম্প্রেশন অ্যালগরিদমগুলির সাথে হাফম্যান কোডিং-এর তুলনা
হাফম্যান কোডিং একটি মৌলিক লসলেস অ্যালগরিদম। তবে, অন্যান্য বিভিন্ন অ্যালগরিদম কম্প্রেশন অনুপাত, গতি এবং জটিলতার মধ্যে বিভিন্ন ট্রেড-অফ সরবরাহ করে।
- রান-লেংথ এনকোডিং (RLE): পুনরাবৃত্তিমূলক অক্ষরের দীর্ঘ রান সহ ডেটার জন্য সহজ এবং কার্যকর (যেমন, `AAAAABBBCC` হয়ে যায় `5A3B2C`)। এই ধরনের প্যাটার্ন ছাড়া ডেটার জন্য কম কার্যকর।
- ল্যাম্পেল-জিভ (LZ) পরিবার (LZ77, LZ78, LZW): এই অ্যালগরিদমগুলি ডিকশনারি-ভিত্তিক। তারা অক্ষরের পুনরাবৃত্ত ক্রমগুলিকে পূর্ববর্তী ঘটনাগুলির রেফারেন্স দিয়ে প্রতিস্থাপন করে। DEFLATE (ZIP এবং GZIP-এ ব্যবহৃত) এর মতো অ্যালগরিদমগুলি উন্নত কার্যকারিতার জন্য LZ77 এর সাথে হাফম্যান কোডিংকে একত্রিত করে। LZ ভেরিয়েন্টগুলি বাস্তবে ব্যাপকভাবে ব্যবহৃত হয়।
- অ্যারিথমেটিক কোডিং: সাধারণত হাফম্যান কোডিংয়ের চেয়ে উচ্চতর কম্প্রেশন অনুপাত অর্জন করে, বিশেষ করে স্কিউড প্রোবাবিলিটি বিতরণের জন্য। তবে, এটি গণনাগতভাবে আরও নিবিড় এবং পেটেন্ট করা হতে পারে।
হাফম্যান কোডিংয়ের প্রাথমিক সুবিধা হল এর সরলতা এবং প্রিফিক্স কোডগুলির জন্য সর্বোত্তমতার গ্যারান্টি। অনেক সাধারণ-উদ্দেশ্য কম্প্রেশন কাজের জন্য, বিশেষ করে যখন LZ এর মতো অন্যান্য কৌশলগুলির সাথে মিলিত হয়, তখন এটি একটি শক্তিশালী এবং দক্ষ সমাধান প্রদান করে।
উন্নত বিষয় এবং আরও অন্বেষণ
যারা আরও গভীরে যেতে চান তাদের জন্য, বেশ কয়েকটি উন্নত বিষয় অন্বেষণ করার মতো:
- অ্যাডাপ্টিভ হাফম্যান কোডিং: এই বৈচিত্র্যে, ডেটা প্রক্রিয়া করার সময় হাফম্যান ট্রি এবং কোডগুলি গতিশীলভাবে আপডেট করা হয়। এটি একটি পৃথক ফ্রিকোয়েন্সি বিশ্লেষণ পাসের প্রয়োজনীয়তা দূর করে এবং স্ট্রিমিং ডেটার জন্য বা যখন অক্ষরের ফ্রিকোয়েন্সি সময়ের সাথে পরিবর্তিত হয় তখন আরও কার্যকর হতে পারে।
- ক্যানোনিকাল হাফম্যান কোড: এগুলি হল মানসম্মত হাফম্যান কোড যা আরও সংক্ষিপ্তভাবে উপস্থাপন করা যেতে পারে, কোড টেবিল সংরক্ষণের ওভারহেড হ্রাস করে।
- অন্যান্য অ্যালগরিদমগুলির সাথে ইন্টিগ্রেশন: DEFLATE এর মতো শক্তিশালী কম্প্রেশন স্ট্যান্ডার্ড তৈরি করতে LZ77 এর মতো অ্যালগরিদমগুলির সাথে হাফম্যান কোডিং কীভাবে একত্রিত হয় তা বোঝা।
- ইনফরমেশন থিওরি: এন্ট্রপি এবং শ্যাননের সোর্স কোডিং উপপাদ্যের মতো ধারণাগুলি অন্বেষণ করা ডেটা কম্প্রেশনের সীমাবদ্ধতা সম্পর্কে একটি তাত্ত্বিক ধারণা প্রদান করে।
উপসংহার
হাফম্যান কোডিং ডেটা কম্প্রেশনের ক্ষেত্রে একটি মৌলিক এবং মার্জিত অ্যালগরিদম। তথ্য হারানো ছাড়াই ডেটার আকারে উল্লেখযোগ্য হ্রাস অর্জনের ক্ষমতা এটিকে অসংখ্য অ্যাপ্লিকেশন জুড়ে অমূল্য করে তোলে। আমাদের পাইথন বাস্তবায়নের মাধ্যমে, আমরা প্রদর্শন করেছি যে এর নীতিগুলি কীভাবে ব্যবহারিকভাবে প্রয়োগ করা যেতে পারে। প্রযুক্তি যেমন বিকশিত হতে থাকে, হাফম্যান কোডিংয়ের মতো অ্যালগরিদমগুলির পিছনের মূল ধারণাগুলি বোঝা যে কোনও ডেভেলপার বা ডেটা বিজ্ঞানীর জন্য অপরিহার্য, যারা ভৌগোলিক সীমানা বা প্রযুক্তিগত পটভূমি নির্বিশেষে দক্ষতার সাথে তথ্য নিয়ে কাজ করেন। এই বিল্ডিং ব্লকগুলি আয়ত্ত করার মাধ্যমে, আপনি আমাদের ক্রমবর্ধমান আন্তঃসংযুক্ত বিশ্বে জটিল ডেটা চ্যালেঞ্জ মোকাবেলা করার জন্য নিজেকে প্রস্তুত করেন।