পাইথনের বেসিক ধারণা (পুরানো)
পাইথন দিয়ে নেটওয়ার্ক অটোমেশন: হাটি হাটি পা পা¶
একটা যুগ ছিল যখন নেটওয়ার্ক ইঞ্জিনিয়াররা প্রোগ্রামিংকে ভয়ের জিনিস মনে করতো। তাদের জগৎটা ছিল আলাদা - রাউটার, সুইচ আর ফায়ারওয়াল নিয়ে। প্রোগ্রামিং? ওটা ছিল যেন অন্য গ্রহের ভাষা।
রাশাদ ছিল এমনই একজন। ৪৫ বছর বয়সে চুলে পাক ধরলেও মনটা ছিল চঞ্চল। তার ধারণা ছিল, "কোডিং-টোডিং আমার বয়সের জন্য নয়।"
কিন্তু একদিন অফিসের এক মিটিংয়ে হঠাৎ করে শুনলো পাইথনের কথা। জুনিয়ররা বলাবলি করছিলো, "এই ল্যাঙ্গুয়েজটা নাকি এতই সিম্পল যে মনে হয় বাংলায় কথা বলছি।"
রাশাদ প্রথমে হাসলো। কিন্তু সেদিন রাতে ল্যাপটপ খুলে বসলো। সার্চ বারে লিখলো - "পাইথন টিউটোরিয়াল ফর নেটওয়ার্ক ইঞ্জিনিয়ারস"। আর তখনই শুরু হলো তার নতুন যাত্রা। যন্ত্রকে দিয়ে "কমলা" খাটানো।
প্রথম দিকে রাশাদের মাথায় যেন ঘুরপাক খেতো সব। কিন্তু ধীরে ধীরে জিনিসটা পরিষ্কার হতে লাগলো। সে নিজের মনে বললো, "আরে, এটা তো সত্যিই সোজা! এই বুড়ো বয়সেও যদি আমি পারি, তাহলে সবাই পারবে।"
দিন গড়ালো। রাশাদ এখন অফিসে একটা লিভিং লেজেন্ড। সে এখন পাইথন দিয়ে নেটওয়ার্কের কমপ্লেক্স টাস্কগুলো অটোমেট করে ফেলে। তার কলিগরা অবাক হয়ে দেখে, কীভাবে একজন "পুরনো" ইঞ্জিনিয়ার নতুন টেকনোলজিকে এমন স্মার্টলি ম্যানেজ করছে।
রাশাদ এখন অন্য নেটওয়ার্ক ইঞ্জিনিয়ারদের মোটিভেট করে। সে বলে, "দ্যাখো ভাই, বয়স তো শুধু একটা নাম্বার। শেখার জন্য কখনো লেট হয় না। পাইথন শিখে দ্যাখো, লাইফটা কত ইজি হয়ে যাবে।"
আজকাল রাশাদের অফিসে নতুন একটা 'ভাইব'। নতুন জেনারেশনের ইঞ্জিনিয়াররা আর সিনিয়রদের ভয় পায় না। সবাই মিলেমিশে শিখছে, উপরে উঠছে। কারণ তারা জানে, টেক ওয়ার্ল্ডে একসাথে কাজ করাটাই আসল।
রাশাদের গল্প শুনে অনেকেই এখন বলে, "বয়স নিয়ে ভাবছি কেন? চলো, আমরাও পাইথন শিখি।" আর এভাবেই, একটু একটু করে, পুরো ইন্ডাস্ট্রিটাই পাল্টে যাচ্ছে।
প্র্যাকটিস, প্র্যাকটিস এবং প্র্যাকটিস
ব্যাপারটা নিয়ে একদম ভয় পাবেন না। নিচের কাজগুলো একটু দেখুন, নেটওয়ার্ক ইঞ্জিনিয়ারদের কাজ আরো কঠিন। এটা অনেক সহজ মনে হবে। শুরুতেই দেখি, পাইথনের ডাটা কিভাবে থাকে। প্লিজ, প্রতিটা কোড কপি করে নিজের পাইথন ইন্টারপ্রেটারে (ভিএস কোড) অবশ্যই চালিয়ে দেখবেন। চালালেই শিখবেন। প্রতিটা মানুষই ভুল করে, আর প্রোগ্রামাররা তো উঠতে বসতে ভুল করেন। এখন ভুল থেকে শেখার উপায় হচ্ছে, চালিয়ে দেখা, এবং কোথায় ভুল হচ্ছে সেটা বোঝা। সেই বুঝতে পারাটাই হচ্ছে একটা ভুলের প্রতি আমাদের রেসপন্স। ভুল হবার ভয়েই অনেকে জিনিসপত্র শিখতে পারেন না। আরেকটা জিনিস, প্রোগ্রামিং নিয়ে কাজ করতে করতে বিরক্ত হয়ে গেলে অন্য চ্যাপ্টারের ঘুরে আসবেন। একবার ভয়/বিরক্ত হয়ে গেলে এই রাস্তায় আগানো কষ্টকর।
0. ভ্যারিয়েবল¶
নেটওয়ার্ক প্রোগ্রামিংয়ে আমাদেরকে কাজ করতে হবে ডাটা নিয়ে। তো, ওই ডাটা রাখবো কোথায়? একটা ভ্য়ারিয়েবলে। সেটা আবার কী? এটা কিছুটা বাক্সের মতো, যেটার মধ্যে ভ্যালু রাখা যায়। অথবা, ভ্যারিয়েবলকে আমরা লেবেল হিসেবে বলতে পারি যেটার মধ্যে ভ্যালু অ্যাসাইন করা যায়। এর মানে, ভ্যারিয়েবলের একটা রেফারেসিং হতে পারে একটা 'সার্টেন'ভ্যালুতে।
১. ডাটা টাইপ (অল্প পানিতে নামা)¶
স্ট্রিং (String)¶
স্ট্রিং হল টেক্সট ডাটা হিসেবে রাখার জন্য ব্যবহার হয়। বলতে গেলে এটা অক্ষরের সিরিজ। এটা সাধারণত কোটেশন মার্কের মধ্যে থাকে। কি হতে পারে?
ip_address = "192.168.1.1" # এটা অংকের মতো মনে হলেও আসলে টেক্সট, এটা যোগ বিয়োগ করা যায় না
username = "admin"
ইন্টিজার (Integer)¶
ইন্টিজার হল অংকের পূর্ণসংখ্যা সংরক্ষণের জন্য ব্যবহার হয়। যেমন:
নেটওয়ার্ক প্রোগ্রামিংয়ে ইন্টিজার প্রায়ই পোর্ট নম্বর, VLAN আইডি ইত্যাদি ইত্যাদি স্টোর করতে ব্যবহার হয়।ফ্লোট (Float)¶
ফ্লোট হল দশমিক সংখ্যাসহ অংক সংরক্ষণের জন্য ব্যবহার হয়। উদাহরণ:
ফ্লোট প্রায়ই বিভিন্ন মেট্রিক্স যেমন সার্ভার রেসপন্স টাইম, ব্যান্ডউইথ ইত্যাদি সংরক্ষণ করতে ব্যবহার হয়।লিস্ট (List) (আমার প্রিয়, যা না শিখলেই নয়)¶
লিস্ট অনেকগুলো আইটেম একটা জায়গায় রাখার জন্য ব্যবহার হয়। আমাদের বড় বড় বিশাল সিরিজের ডাটা রাখতে দরকার লিস্ট। আমি অনেক সময়ই মিলিয়নের নিচে লিস্ট দেখি না। এটা পাইথনের একটা শক্তিশালী ফিচার, বিশেষ করে নতুন প্রোগ্রামারদের জন্য - যা তাদেরকে সহজেই অনেক ঝামেলার কাজ সহজেই করে দেয়। এটা (যেকোন জিনিস রাখতে পারেন এখানে) স্কয়ার ব্র্যাকেটের মধ্যে থাকে এবং কমা দিয়ে আলাদা করা থাকে। দেখুন:
নেটওয়ার্ক প্রোগ্রামিংয়ে লিস্ট প্রায়ই বিভিন্ন আইপি অ্যাড্রেস, VLAN আইডি ইত্যাদি সংরক্ষণ করতে ব্যবহার হয়। আমার দেখা মতে, সবচেয়ে বেশি ব্যবহার হয় এই লিস্ট, ফর লুপে (আসছি সামনে) - অটোমেশনের কাজে। লিস্টের মধ্যে যেহেতু একের বেশি জিনিস থাকে, তাহলে এর নাম প্লুরাল হওয়া ভালো। এখানে, অনেকগুলো ভিল্যান, তাই vlan_ids, অথবা devices, ইত্যাদি।ডিকশনারি (Dictionary) (আমার প্রিয়, যা না শিখলেই নয়)¶
আপনার কাছে তো ডাটা এলো। লিস্ট নিয়ে ডাটা স্টোর করছেন। কিন্তু, রিলেটেড ডাটা আমরা কিভাবে রাখবো? কিভাবে কানেক্ট করবো কার সাথে কে থাকবে? এটা করবে ডিকশনারি। এই ডিকশনারি কী-ভ্যালু পেয়ারের মাধ্যমে ডাটা সংরক্ষণ করতে ব্যবহার হয়। কিভাবে?
ডিকশনারি প্রায়ই বিভিন্ন ডিভাইসের ডাটা যেমন আইপি অ্যাড্রেস, ইউজারনেম, পাসওয়ার্ড ইত্যাদি সংরক্ষণ করতে ব্যবহার হয়। এটাকে আরো সুন্দর করে লেখবো আমরা নিচে।২. লুপ (অল্প পানিতে নামা)¶
for লুপ¶
for লুপ ব্যবহার করে নির্দিষ্ট রেঞ্জ বা তালিকার উপর ভিত্তি করে আইটেমগুলো পুনরাবৃত্তি/রিপিট করা যায়, যতক্ষণ পর্যন্ত আমরা চাই। এটা একটা লেভেলের অটোমেশন। উদাহরণ:
vlan_ids = [10, 20, 30, 40]
for vlan in vlan_ids: #vlan এর জায়গায় যেকোন শব্দ ব্যবহার করা যায়
print(vlan)
while লুপ (অতো বেশি দরকার হয় না)¶
while লুপ ব্যবহার করে নির্দিষ্ট শর্ত পূরণ হওয়া পর্যন্ত লুপ চলতে থাকবে। উদাহরণ:
এই লুপটি শর্ত পূরণ না হওয়া পর্যন্ত চলতে থাকবে।৩. কন্ডিশনাল স্টেটমেন্ট (পরে বুঝলেও হবে)¶
কন্ডিশনাল স্টেটমেন্ট ব্যবহার করে প্রোগ্রামে সিদ্ধান্ত নেয়া যায়। উদাহরণ:
ip_address = "192.168.1.1"
if ip_address.startswith("192.168"):
print("This is a private IP address.")
else:
print("This is a public IP address.")
৪. ফাংশন এবং মেথড (পরে বুঝলেও হবে)¶
ফাংশন এবং মেথড ব্যবহার করে কোড রিইউজেবল এবং স্ট্রাকচার্ড করা যায়। উদাহরণ:
def check_ip(ip_address):
if ip_address.startswith("192.168"):
return "Private IP"
else:
return "Public IP"
result = check_ip("192.168.1.1")
print(result)
৫. ফাইল অপারেশন (অল্প পানিতে নামা)¶
ফাইল অপারেশন শিখে আপনি সহজেই ফাইল থেকে ডাটা পড়তে এবং ফাইলে ডাটা লিখতে পারবেন।
ফাইল পড়া (Reading a file)¶
এই কোডটি একটা ফাইল থেকে ডাটা পড়ে এবং প্রিন্ট করে।ফাইলে লেখা (Writing to a file)¶
এই কোডটি একটা ফাইলে ডাটা লিখে।উপরের বিষয়গুলো শিখলে নেটওয়ার্ক ইঞ্জিনিয়াররা পাইথন ব্যবহার করে নেটওয়ার্ক ডিভাইস কনফিগারেশন, মনিটরিং এবং ট্রাবলশুটিং সহজেই করতে পারবেন। পাইথন শিখে আপনি নেটওয়ার্কিং কাজগুলোকে আরও কার্যকর এবং দক্ষ করতে পারবেন।
পাইথনে ভেরিয়েবল: (একটু ডিপ ডাইভ)¶
পাইথন ভেরিয়েবল হল একটা স্টোরেজ কন্টেইনার বা একটা নামযুক্ত মেমোরি অবস্থান যা সাময়িকভাবে একটা মান বা ডাটা সংরক্ষণ করে এবং পরে আপনার কোডে সেই মানের উল্লেখ করতে ব্যবহার হয়। ভেরিয়েবল যেকোনো প্রোগ্রামিং ভাষার মৌলিক উপাদান।
ভেরিয়েবল ডিক্লেয়ার
পাইথন একটা ডাইনামিক টাইপড ভাষা, যেখানে আপনি প্রথমবার একটা মান নির্ধারণ করলেই একটা ভেরিয়েবল তৈরি হয়। ভেরিয়েবলগুলোকে কোনো নির্দিষ্ট টাইপ দিয়ে ঘোষণা করার প্রয়োজন নেই, এবং সেট করার পরেও এদের পরিবর্তন করা যায়।
# একটা স্ট্রিং মান ভেরিয়েবলে নির্ধারণ
device_name = "Router1"
# একটা পূর্ণসংখ্যা মান ভেরিয়েবলে নির্ধারণ
device_port = 22
# একটা বুলিয়ান মান ভেরিয়েবলে নির্ধারণ
is_connected = True
আপনি type()
ফাংশন ব্যবহার করে একটা ভেরিয়েবলের ডাটা টাইপ পেতে পারেন।
আউটপুট:
একটা স্টেটমেন্টে একাধিক ভেরিয়েবলে মান নির্ধারণ করা:
আউটপুট:
একই মান একাধিক ভেরিয়েবলে একসাথে নির্ধারণ করা:
আউটপুট:
যদি আপনার কাছে একটা লিস্ট, টাপল ইত্যাদিতে মানের সংগ্রহ থাকে, পাইথন আপনাকে সেই মানগুলো ভেরিয়েবলে বের করতে দেয়:
ip_addr_list = ["10.10.10.10", "172.16.10.10", "192.168.10.10"]
ip_addr1, ip_addr2, ip_addr3 = ip_addr_list
print(ip_addr1)
print(ip_addr2)
print(ip_addr3)
আউটপুট:
অ্যাসাইনমেন্ট স্টেটমেন্ট¶
একটা অপারেটর হল একটা চিহ্ন যা এক বা একাধিক মানের উপর কাজ করে। একটা বিশেষ চিহ্ন যাকে অ্যাসাইনমেন্ট অপারেটর =
বলা হয় তা ব্যবহার করে ভেরিয়েবলে মান নির্ধারণ করা হয়। =
অপারেটর অপারেটরের ডান দিকের মানটি নেয় এবং এটা বাম দিকের নামে নির্ধারণ করে।
আউটপুট:
স্ট্রিং ভেরিয়েবল একক উদ্ধৃতি চিহ্ন 'R-01'
অথবা দ্বি-উদ্ধৃতি চিহ্ন "R-01"
ব্যবহার করে ঘোষণা করা যায়।
আউটপুট:
আউটপুট:
৩. স্ট্রিং ফরম্যাটিং (বাঁচতে হলে, জানতে হবে)
স্ট্রিং ফরম্যাটিং হচ্ছে এমন একটা প্রক্রিয়া যেখানে বিভিন্ন ভেরিয়েবল বা ডাটা টাইপ (যেমন, সংখ্যা, স্ট্রিং, তালিকা) থেকে ডাটা নিয়ে সেটিকে একটা স্ট্রিংয়ে রূপান্তর করা হয়। এটা প্রধানত ব্যবহার হয়:
- ডাটা দেখানোর জন্য: আপনার কোডে ডাটা বা ভেরিয়েবলের মান সহজে এবং পরিষ্কারভাবে প্রিন্ট করার জন্য স্ট্রিং ফরম্যাটিং ব্যবহার করা হয়।
- ডাইনামিক কন্টেন্ট: আপনি যখন বিভিন্ন ডাটার উপর ভিত্তি করে পরিবর্তনশীল স্ট্রিং তৈরি করতে চান, তখন স্ট্রিং ফরম্যাটিং খুবই কার্যকরী হয়।
- রিপোর্ট এবং লগ: ডাটা বিশ্লেষণ, রিপোর্ট তৈরি, লগিং বা ডিবাগিং-এর সময় বিভিন্ন মান সহজে এবং স্পষ্টভাবে দেখানোর জন্য এটি ব্যবহার করা হয়।
নেটওয়ার্কে ডাটা নিয়ে কাজ করতে (ডাটা ঠিকমতো প্রিন্ট করতে পারতে হবে) পাইথনে তিনটি স্ট্রিং ফরম্যাটিং পদ্ধতি রয়েছে:
%
পদ্ধতি: নিচের উদাহরণগুলোতে আমরা একটা নেটওয়ার্ক কনফিগারেশনের উদাহরণ ব্যবহার করে%
সিস্টেম দিয়ে স্ট্রিং ফরম্যাটিং দেখাবো:
একক স্ট্রিং ফরম্যাটিং¶
এখানে%s
প্লেসহোল্ডার ব্যবহার করে ip_addr
এর ভ্যালু প্রিন্ট করা হয়েছে।
একাধিক স্ট্রিং ফরম্যাটিং¶
interface = "GigabitEthernet0/1"
status = "up"
print("Interface: %s, Status: %s" % (interface, status))
%s
প্লেসহোল্ডার ব্যবহার করা হয়েছে এবং (interface, status)
টাপল পাস করা হয়েছে। প্রথম %s
এর জায়গায় interface
এর ভ্যালু এবং দ্বিতীয় %s
এর জায়গায় status
এর ভ্যালু বসবে।
ইন্টিজার ফরম্যাটিং¶
এখানে%d
প্লেসহোল্ডার ব্যবহার করে mtu
এর ইন্টিজার ভ্যালু প্রিন্ট করা হয়েছে।
একাধিক ভ্যালু ফরম্যাটিং¶
ip_addr = "172.16.10.1"
subnet_mask = "255.255.255.0"
interface = "GigabitEthernet0/1"
status = "up"
mtu = 1500
print("IP Address: %s" % ip_addr)
print("Subnet Mask: %s" % subnet_mask)
print("Interface: %s, Status: %s" % (interface, status))
print("MTU: %d" % mtu)
উদাহরণ বিশ্লেষণ¶
- প্লেসহোল্ডার:
%s
স্ট্রিং ভ্যালু ধারণ করে।-
%d
ইন্টিজার ভ্যালু ধারণ করে। -
ফরম্যাটিং ভ্যালু প্রদান:
- প্রতিটি
%
চিহ্নের পরে একটা ভ্যালু বা ভ্যালুগুলোর টাপল প্রদান করা হয়েছে যা প্লেসহোল্ডারের জায়গায় বসবে।
এভাবে আপনি নেটওয়ার্ক কনফিগারেশন সম্পর্কিত ডাটাগুলো সুন্দরভাবে প্রিন্ট করতে পারবেন %
সিস্টেম ব্যবহার করে।
2. স্ট্রিং ফরম্যাটিং ব্যবহার করে format()
পদ্ধতি¶
পাইথনের format()
পদ্ধতি একটা স্ট্রিংকে ফরম্যাট করার জন্য ব্যবহার হয়, যেখানে আমরা প্লেসহোল্ডারগুলোর মাধ্যমে ভেরিয়েবলগুলোর মান বসাতে পারি। এটি বিশেষ করে স্ট্রিং তৈরি এবং ম্যানেজ করার জন্য খুবই উপকারী। আসুন আমরা উদাহরণ এবং ব্যাপারটা বুঝতে চাই সহ বিস্তারিতভাবে শিখি।
উদাহরণ ১: সাধারণ ফরম্যাটিং¶
ip_addr = "172.16.10.1"
mask = "255.255.255.0"
print("IP Address: {} Mask: {}".format(ip_addr, mask))
# Output: IP Address: 172.16.10.1 Mask: 255.255.255.0
ব্যাপারটা বুঝতে চাই:¶
- স্ট্রিং টেমপ্লেট:
-
"IP Address: {} Mask: {}"
: এখানে{}
দুটি প্লেসহোল্ডার আছে, যেখানে ভেরিয়েবলগুলো বসবে। -
format() পদ্ধতি:
.format(ip_addr, mask)
: এখানেip_addr
এবংmask
যথাক্রমে{}
প্লেসহোল্ডারগুলোতে বসানো হবে।
উদাহরণ ২: নামযুক্ত প্লেসহোল্ডার¶
ip_addr = "172.16.10.1"
subnet = "255.255.255.0"
print("IP Address: {ip} Mask: {mask}".format(ip=ip_addr, mask=subnet))
# Output: IP Address: 172.16.10.1 Mask: 255.255.255.0
ব্যাপারটা বুঝতে চাই:¶
- স্ট্রিং টেমপ্লেট:
-
"IP Address: {ip} Mask: {mask}"
: এখানে{ip}
এবং{mask}
নামযুক্ত প্লেসহোল্ডার আছে। -
format() পদ্ধতি:
.format(ip=ip_addr, mask=subnet)
: এখানেip_addr
{ip}
প্লেসহোল্ডারে এবংsubnet
{mask}
প্লেসহোল্ডারে বসানো হবে।
উদাহরণ ৩: ডিকশনারি থেকে ভ্যালু পাস করা¶
credentials = {"user": "admin", "pass": "P@ssW0rd"}
print("Username: {user} \nPassword: {pass}".format(**credentials))
# Output:
# Username: admin
# Password: P@ssW0rd
ব্যাপারটা বুঝতে চাই:¶
- স্ট্রিং টেমপ্লেট:
-
"Username: {user} \nPassword: {pass}"
: এখানে{user}
এবং{pass}
নামযুক্ত প্লেসহোল্ডার আছে। -
format() পদ্ধতি:
.format(**credentials)
: ডাবল অ্যাস্টেরিস্ক (**
) ব্যবহার করে ডিকশনারির কীগুলো প্লেসহোল্ডার হিসাবে ব্যবহার করা হয়েছে।credentials
ডিকশনারিরuser
এবংpass
এর মান{user}
এবং{pass}
প্লেসহোল্ডারে বসানো হয়েছে।
উদাহরণ ৪: মাল্টিলাইন স্ট্রিং ফরম্যাটিং¶
description = """
Device: {}
IP: {}
"""
output = description.format('SW-01', '10.10.10.10')
print(output)
# Output:
# Device: SW-01
# IP: 10.10.10.10
ব্যাপারটা বুঝতে চাই:¶
- স্ট্রিং টেমপ্লেট:
-
"""Device: {}\nIP: {}"""
: মাল্টিলাইন স্ট্রিং, যেখানে দুটি{}
প্লেসহোল্ডার আছে। -
format() পদ্ধতি:
-
.format('SW-01', '10.10.10.10')
: এখানে'SW-01'
প্রথম{}
প্লেসহোল্ডারে এবং'10.10.10.10'
দ্বিতীয়{}
প্লেসহোল্ডারে বসানো হয়েছে। -
স্ট্রিং ফরম্যাটিং ব্যবহার করে
f-strings
Python এ (আমার পছন্দ)¶
Python এ f-strings
(ফরম্যাটেড স্ট্রিং লিটারেল) একটা সুবিধাজনক উপায় স্ট্রিং-এর ভিতরে এক্সপ্রেশন (যেমন ভ্যারিয়েবল বা কোনো ক্যালকুলেশন) ইনলাইন করার জন্য। এটি Python 3.6
থেকে ইন্ট্রোডিউস করা হয়েছে এবং এটি f
বা F
দিয়ে শুরু হয় স্ট্রিংয়ের আগে।
উদাহরণ এবং বিশ্লেষণ¶
ip_addr = '172.16.10.1'
mask = "255.255.255.0"
print(f'IP Address {ip_addr} Mask: {mask}') # IP Address 172.16.10.1 Mask: 255.255.255.0
১. ভ্যারিয়েবল ডিক্লেয়ারেশন¶
প্রথমে আমরা দুটি ভ্যারিয়েবল ডিক্লেয়ার করি:
-ip_addr
ভ্যারিয়েবলে আইপি অ্যাড্রেস সেভ করা আছে।
- mask
ভ্যারিয়েবলে সাবনেট মাস্ক সেভ করা আছে।
২. f-string
এর ব্যবহার¶
এখানে f-string
ব্যবহার করে print
স্টেটমেন্ট তৈরি করা হয়েছে।
f-string
কীভাবে কাজ করে?¶
f'...'
স্ট্রিং-এর শুরুতেf
বাF
ব্যবহার করা হয়, যা Python কে নির্দেশ করে যে এটি একটা ফরম্যাটেড স্ট্রিং।{}
কিউরলি ব্রেসের ভিতরে যেকোনো ভ্যারিয়েবল, এক্সপ্রেশন বা ফাংশন কল করা যায় এবং Python সেই ভ্যারিয়েবলের মান বা এক্সপ্রেশনের রেজাল্টকে স্ট্রিং-এর ভিতরে প্রতিস্থাপন করবে।
উদাহরণটিতে কী হচ্ছে?¶
f'IP Address {ip_addr} Mask: {mask}'
এই স্ট্রিং-এর মধ্যে{ip_addr}
এবং{mask}
প্লেসহোল্ডার আছে।{ip_addr}
প্লেসহোল্ডারের জায়গায়ip_addr
ভ্যারিয়েবলের মান172.16.10.1
প্রতিস্থাপিত হবে।{mask}
প্লেসহোল্ডারের জায়গায়mask
ভ্যারিয়েবলের মান255.255.255.0
প্রতিস্থাপিত হবে।
আউটপুট¶
কেন f-strings
ব্যবহার করবেন?¶
- সহজতা ও পড়তে সুবিধা:
f-strings
অন্যান্য স্ট্রিং ফরম্যাটিং মেথডের চেয়ে সহজ ও পরিষ্কার। - ফাস্ট:
f-strings
দ্রুত কাজ করে, কারণ এটি কম্পাইল-টাইমে রেজল্ভ হয়, রানটাইমে নয়। - পাওয়ারফুল: আপনি শুধু ভ্যারিয়েবলই নয়, বরং এক্সপ্রেশন, ফাংশন কল ইত্যাদিও
f-strings
এর মধ্যে রাখতে পারেন।
৬. রাউটিং (লুপের একটা খেলা)¶
রাউটিং নেটওয়ার্ক ডাটা প্যাকেটগুলোকে গন্তব্যস্থলে পৌঁছানোর জন্য ব্যবহার প্রক্রিয়া। রাউটিং টেবিল তৈরি করা এবং কনফিগার করা খুবই গুরুত্বপূর্ণ।
নিচের এই পাইথন কোডটি একটা রাউটিং টেবিলকে প্রিন্ট করার জন্য লেখা হয়েছে। এখানে routing_table
নামক একটা লিস্ট রয়েছে, যার প্রতিটি এলিমেন্ট একটা ডিকশনারি। প্রতিটি ডিকশনারিতে দুটি কী রয়েছে: destination
এবং next_hop
। লুপ ব্যবহার করে এই লিস্টের প্রতিটি ডিকশনারি এলিমেন্ট থেকে destination
এবং next_hop
প্রিন্ট করা হয়েছে।
একদম ভেতর থেকে বিশ্লেষণ¶
routing_table = [
{"destination": "0.0.0.0/0", "next_hop": "192.168.1.1"},
{"destination": "192.168.1.0/24", "next_hop": "192.168.1.1"},
{"destination": "192.168.2.0/24", "next_hop": "192.168.2.1"},
]
routing_table
নামক একটা লিস্ট তৈরি করা হয়েছে, যেখানে তিনটি ডিকশনারি রয়েছে। প্রতিটি ডিকশনারিতে destination
এবং next_hop
নামক দুটি কী রয়েছে।
-
প্রথম ডিকশনারি:
এটি ডিফল্ট রুট নির্দেশ করে। -
দ্বিতীয় ডিকশনারি:
এটি একটা স্থানীয় নেটওয়ার্কের রুট নির্দেশ করে। -
তৃতীয় ডিকশনারি:
এটি অন্য একটা স্থানীয় নেটওয়ার্কের রুট নির্দেশ করে।
লুপ এবং প্রিন্টিং¶
# রাউটিং টেবিল প্রিন্ট করা
for route in routing_table:
print(f"Destination: {route['destination']}, Next Hop: {route['next_hop']}")
for
লুপ ব্যবহার করে routing_table
লিস্টের প্রতিটি ডিকশনারি এলিমেন্ট থেকে destination
এবং next_hop
প্রিন্ট করা হয়েছে।
- for route in routing_table:
-
এখানে
route
প্রতিটি লুপ ইটারেশনের জন্যrouting_table
লিস্টের একটা এলিমেন্ট ধারণ করে। প্রথম লুপেroute
হবে: -
print(f"Destination: {route['destination']}, Next Hop: {route['next_hop']}"):
route
এরdestination
এবংnext_hop
মানগুলো ফরম্যাটেড স্ট্রিং (f-string
) ব্যবহার করে প্রিন্ট করা হয়েছে। প্রথম লুপে প্রিন্ট আউটপুট হবে:
লুপের কাজ¶
লুপের প্রতিটি ইটারেশনে, routing_table
লিস্টের একটা করে এলিমেন্ট (route
) নেয়া হয়। এরপর এই এলিমেন্ট থেকে destination
এবং next_hop
মানগুলো প্রিন্ট করা হয়।
লুপটি তিনবার চলবে, কারণ routing_table
লিস্টে তিনটি এলিমেন্ট আছে। প্রতিটি ইটারেশনে, নিচের মত করে আউটপুট হবে:
-
প্রথম ইটারেশন:
-
দ্বিতীয় ইটারেশন:
-
তৃতীয় ইটারেশন:
এভাবে একটা লুপের মাধ্যমে সম্পূর্ণ রাউটিং টেবিলটি প্রিন্ট করা হয়। পারবেন তো নিজের মতো করে লিখতে?
১. আইপি এড্রেস (IP Address)¶
নেটওয়ার্ক এড্রেস ফরম্যাটিং কিন্তু একটা চমৎকার জিনিস। এটা কিভাবে করলাম?
# একটা আইপি অ্যাড্রেস স্ট্রিং হিসেবে সংরক্ষণ করা
ip_address = "192.168.1.1"
# একটা সাবনেট মাস্ক সহ আইপি অ্যাড্রেস
subnet_mask = "255.255.255.0"
# পূর্ণ নেটওয়ার্ক অ্যাড্রেস তৈরি করা
network_address = f"{ip_address}/{subnet_mask}"
print(network_address) # আউটপুট: 192.168.1.1/255.255.255.0
২. MAC অ্যাড্রেস (MAC Address)¶
MAC অ্যাড্রেস হল একটা নেটওয়ার্ক ইন্টারফেস কার্ডের (NIC) ইউনিক সনাক্তকারী। এটা সাধারণত 48-বিটের হয় এবং হেক্সাডেসিমাল ফরম্যাটে লেখা হয়।
# একটা MAC অ্যাড্রেস স্ট্রিং হিসেবে সংরক্ষণ করা
mac_address = "00:1A:2B:3C:4D:5E"
print(f"MAC Address: {mac_address}")
# আউটপুট: MAC Address: 00:1A:2B:3C:4D:5E
৩. VLAN (Virtual Local Area Network)¶
VLAN একটা লজিক্যাল গ্রুপ যা একই নেটওয়ার্কের বিভিন্ন অংশকে আলাদা করতে ব্যবহার হয়।
# VLAN আইডি সংরক্ষণ করা
vlan_id = 10
# VLAN নাম সংরক্ষণ করা
vlan_name = "Management"
print(f"VLAN ID: {vlan_id}, VLAN Name: {vlan_name}")
# আউটপুট: VLAN ID: 10, VLAN Name: Management
৪. AS সংখ্যা (Autonomous System Number)¶
AS সংখ্যা একটা অনন্য সনাক্তকারী যা একটা ইন্টারনেট রাউটিং ডোমেনকে সনাক্ত করে।
# AS সংখ্যা সংরক্ষণ করা
as_number = 65000
print(f"AS Number: {as_number}")
# আউটপুট: AS Number: 65000
নেটওয়ার্ক প্রোগ্রামিং-এ পাইথন লিস্ট ব্যবহার (আমার প্রিয়)¶
লিস্ট সংযোজন (List Concatenation)¶
পাইথনে +
অপারেটর ব্যবহার করে দুটি লিস্টকে একত্রিত করা যায়। এটা একটা লিস্টের শেষে আরেকটি লিস্ট যোগ করে এবং রেজাল্ট একটা নতুন লিস্ট হিসেবে প্রদর্শিত হয়।
list1 = [10, 11, 12, 13, 14]
list2 = [20, 30, 42]
result = list1 + list2
print(result)
# আউটপুট: [10, 11, 12, 13, 14, 20, 30, 42]
লিস্ট মেথড (List Methods)¶
পাইথনের লিস্টগুলোতে কিছু ফাংশন বা মেথড আছে যা লিস্টে থাকা ডাটা নিয়ন্ত্রণ এবং ম্যানেজমেন্ট করতে ব্যবহার হয়।
append()
মেথড¶
এই মেথডটি একটা এক্জিস্টিং লিস্টে নতুন আইটেম যোগ করার সুযোগ দেয়।
vlan_name = ["mgmt", "prod", "tech", "acct"]
print(vlan_name)
vlan_name.append("guest")
print(vlan_name)
# আউটপুট:
# ["mgmt", "prod", "tech", "acct"]
# ["mgmt", "prod", "tech", "acct", "guest"]
insert()
মেথড¶
এই ফাংশনটি append()
মেথডের মত কাজ করে কিন্তু এটা নির্দিষ্ট পজিশনে নতুন আইটেম যোগ করতে ব্যবহার হয়।
vlan_name = ["mgmt", "prod", "tech", "acct"]
print(vlan_name)
vlan_name.insert(2, "guest")
print(vlan_name)
# আউটপুট:
# ["mgmt", "prod", "tech", "acct"]
# ["mgmt", "prod", "guest", "tech", "acct"]
remove()
এবং pop()
মেথড¶
এই মেথডগুলো লিস্ট থেকে আইটেম মুছে ফেলতে ব্যবহার হয়। একটা আইটেম লিস্টে একাধিকবার থাকলে, remove()
শুধুমাত্র প্রথম আইটেমটি মুছে দেয়।
vlan_name = ["mgmt", "prod", "guest", "tech", "acct"]
print(vlan_name)
vlan_name.remove("guest")
print(vlan_name)
# আউটপুট:
# ["mgmt", "prod", "guest", "tech", "acct"]
# ["mgmt", "prod", "tech", "acct"]
যদি লিস্টে থাকা আইটেম যদি না থাকে - সেরকম আইটেম উল্লেখ করা হয়, তাহলে একটা ValueError ফেরত দেয়।
```python
vlan_name = ["mgmt", "prod", "guest", "tech", "acct"]
vlan_name.remove("tomato")
print(vlan_name)
# আউটপুট:
# ValueError: list.remove(x): x not in list
pop()
মেথড পজিশন উল্লেখ করে আইটেম মুছে ফেলতে ব্যবহার হয়। পজিশন উল্লেখ না করলে এটা সর্বশেষ আইটেম মুছে দেয়।
vlan_name = ["mgmt", "prod", "guest", "tech", "acct"]
print(vlan_name.pop()) # সর্বশেষ আইটেম মুছে যাবে
# আউটপুট: 'acct'
extend()
মেথড¶
এই মেথডটি একটা লিস্টের শেষে আরেকটি লিস্ট যোগ করে। এটা append()
থেকে আলাদা কারণ এটা দুটি লিস্টকে একত্রিত করে।
লিস্ট স্লাইসিং (List Slicing)¶
লিস্ট স্লাইসিং একটা পদ্ধতি যা লিস্টের একটা নির্দিষ্ট অংশকে নতুন লিস্ট হিসেবে ফেরত দেয়।
vlan_name = ["mgmt", "prod", "guest", "tech", "acct"]
print(vlan_name[:4])
print(vlan_name[1:3]) # ৩ নম্বর পজিশনের আগ পর্যন্ত
print(vlan_name[0:])
# আউটপুট:
# ['mgmt', 'prod', 'guest', 'tech']
# ['prod', 'guest']
# ['mgmt', 'prod', 'guest', 'tech', 'acct']
লিস্টের ফাংশনগুলো নেটওয়ার্ক প্রোগ্রামিং-এ ব্যবহারের উদাহরণ¶
নেটওয়ার্ক প্রোগ্রামিং-এ লিস্ট ব্যবহার করে বিভিন্ন কাজ করা যায়, যেমন IP অ্যাড্রেসগুলো সংরক্ষণ করা, VLAN নামগুলো ম্যানেজমেন্ট করা ইত্যাদি।
IP অ্যাড্রেসর লিস্ট তৈরি এবং ম্যানেজমেন্ট¶
# IP অ্যাড্রেসর লিস্ট
ip_addresses = ["192.168.1.1", "192.168.2.1", "192.168.3.1"]
# নতুন IP অ্যাড্রেস যোগ করা
ip_addresses.append("192.168.4.1")
# নির্দিষ্ট পজিশনে IP অ্যাড্রেস যোগ করা
ip_addresses.insert(2, "192.168.1.100")
# একটা IP অ্যাড্রেস মুছে ফেলা
ip_addresses.remove("192.168.2.1")
# লিস্ট থেকে শেষ IP অ্যাড্রেস মুছে ফেলা
last_ip = ip_addresses.pop()
print(ip_addresses)
# আউটপুট: ['192.168.1.1', '192.168.1.100', '192.168.3.1']
print(f"Removed IP: {last_ip}")
# আউটপুট: Removed IP: 192.168.4.1
VLAN নামের লিস্ট তৈরি এবং ম্যানেজমেন্ট¶
# VLAN নামের লিস্ট
vlan_names = ["mgmt", "prod", "tech", "acct"]
# নতুন VLAN নাম যোগ করা
vlan_names.append("guest")
# নির্দিষ্ট পজিশনে VLAN নাম যোগ করা
vlan_names.insert(2, "dev")
# একটা VLAN নাম মুছে ফেলা
vlan_names.remove("prod")
# লিস্ট থেকে শেষ VLAN নাম মুছে ফেলা
last_vlan = vlan_names.pop()
print(vlan_names)
# আউটপুট: ['mgmt', 'dev', 'tech', 'acct']
print(f"Removed VLAN: {last_vlan}")
# আউটপুট: Removed VLAN: guest
এই ধরনের লিস্ট অপারেশনগুলো নেটওয়ার্ক প্রোগ্রামিং-এ প্রায়ই ব্যবহার হয় যেখানে বড় নেটওয়ার্কের জন্য ডাটা প্রসেসিং ও অ্যানালাইজ করতে হয়।
এখানে ইথারনেট ইন্টারফেস সম্পর্কিত আরও কিছু উদাহরণ যোগ করছি, যেখানে আমরা Python-এর ডিকশনারি, টাপল এবং লিস্ট ব্যবহার করব। এই উদাহরণগুলো নেটওয়ার্ক অটোমেশনে খুবই উপযোগী:
- ইথারনেট ইন্টারফেস ডাটা ডিকশনারিতে:
>>> ethernet_interface = {
... 'name': 'GigabitEthernet0/0',
... 'ip_address': '192.168.1.1',
... 'subnet_mask': '255.255.255.0',
... 'status': 'up',
... 'speed': '1000Mbps',
... 'duplex': 'full'
... }
>>> print(ethernet_interface['name'])
GigabitEthernet0/0
>>> print(ethernet_interface['ip_address'])
192.168.1.1
ব্যাপারটা বুঝতে চাই: এখানে আমরা একটা ইথারনেট ইন্টারফেসের বিভিন্ন বৈশিষ্ট্য একটা ডিকশনারিতে সংরক্ষণ করেছি। এভাবে আমরা সহজে যেকোনো বৈশিষ্ট্যের মান পেতে পারি।
- একাধিক ইন্টারফেস ডাটা লিস্টে:
>>> interfaces = [
... {'name': 'Gi0/0', 'ip': '192.168.1.1', 'status': 'up'},
... {'name': 'Gi0/1', 'ip': '10.0.0.1', 'status': 'down'},
... {'name': 'Fa0/0', 'ip': '172.16.0.1', 'status': 'up'}
... ]
>>> for interface in interfaces:
... print(f"ইন্টারফেস: {interface['name']}, আইপি: {interface['ip']}, স্ট্যাটাস: {interface['status']}")
ইন্টারফেস: Gi0/0, আইপি: 192.168.1.1, স্ট্যাটাস: up
ইন্টারফেস: Gi0/1, আইপি: 10.0.0.1, স্ট্যাটাস: down
ইন্টারফেস: Fa0/0, আইপি: 172.16.0.1, স্ট্যাটাস: up
ব্যাপারটা বুঝতে চাই: এখানে আমরা একাধিক ইন্টারফেসের ডাটা একটা লিস্টে রেখেছি, যেখানে প্রতিটি ইন্টারফেস একটা ডিকশনারি। এরপর আমরা একটা লুপ ব্যবহার করে সব ইন্টারফেসের ডাটা প্রিন্ট করেছি।
- ইন্টারফেস কনফিগারেশন টাপল ব্যবহার করে:
>>> interface_config = ('GigabitEthernet0/0', '192.168.1.1', '255.255.255.0', 'up')
>>> name, ip, mask, status = interface_config
>>> print(f"ইন্টারফেস নাম: {name}")
>>> print(f"আইপি অ্যাড্রেস: {ip}")
>>> print(f"সাবনেট মাস্ক: {mask}")
>>> print(f"স্ট্যাটাস: {status}")
ইন্টারফেস নাম: GigabitEthernet0/0
আইপি অ্যাড্রেস: 192.168.1.1
সাবনেট মাস্ক: 255.255.255.0
স্ট্যাটাস: up
ব্যাপারটা বুঝতে চাই: এখানে আমরা একটা টাপল ব্যবহার করে ইন্টারফেস কনফিগারেশন সংরক্ষণ করেছি। টাপল ব্যবহার করে আমরা একাধিক ভেরিয়েবলে মান অ্যাসাইন করতে পারি, যা কোড পঠনযোগ্যতা বাড়ায়।
৪. ইন্টারফেস এবং VLAN ডাটা মিশিয়ে ডাটা স্ট্রাকচার (উদাহরণ)¶
ধরুন আপনি একজন নেটওয়ার্ক ইঞ্জিনিয়ার এবং আপনার সুইচ কনফিগারেশন করার দায়িত্ব পেয়েছেন। আপনার সুইচের বিভিন্ন সেটিংস এবং কনফিগারেশনগুলো একটা নির্দিষ্ট ফরম্যাটে সংরক্ষণ করতে চান যাতে সেগুলো সহজে পড়া ও বোঝা যায়। এটা করার জন্য আমরা পাইথন প্রোগ্রামিং ভাষা ব্যবহার করে একটা স্ক্রিপ্ট লিখেছি।
প্রথমে, কনফিগারেশনের ডাটা সংরক্ষণ করা¶
switch_config = {
'hostname': 'SW-Core-01',
'interfaces': [
{'name': 'Gi0/0', 'vlan': 10, 'ip': '192.168.10.1'},
{'name': 'Gi0/1', 'vlan': 20, 'ip': '192.168.20.1'}
],
'vlans': {
10: 'Management',
20: 'Data',
30: 'Voice'
}
}
এখানে আমরা একটা ডিকশনারি (dictionary) তৈরি করেছি যার নাম switch_config
। এটাকে তিনটি প্রধান ডাটা সেগমেন্টে ভাগ করেছি:
- hostname: সুইচের নাম
'SW-Core-01'
। - interfaces: ইন্টারফেসগুলোর একটা লিস্ট (list)। এখানে প্রতিটি ইন্টারফেসের নাম, VLAN নম্বর এবং আইপি এড্রেস রয়েছে।
- প্রথম ইন্টারফেসের নাম
'Gi0/0'
, VLAN নম্বর 10 এবং আইপি এড্রেস'192.168.10.1'
। - দ্বিতীয় ইন্টারফেসের নাম
'Gi0/1'
, VLAN নম্বর 20 এবং আইপি এড্রেস'192.168.20.1'
। - vlans: একটা ডিকশনারি যেখানে VLAN নম্বর এবং তাদের নাম রয়েছে (যেমন, 10 নম্বর VLAN এর নাম 'Management')।
তারপর, ডাটাগুলো প্রিন্ট করা¶
এটা সুইচের নাম প্রিন্ট করবে। যেমন:
print("\nInterface Data:")
for interface in switch_config['interfaces']:
print(f" {interface['name']} - VLAN: {interface['vlan']}, IP: {interface['ip']}")
এই অংশে ইন্টারফেসের ডাটা প্রিন্ট করা হয়। এখানে for
লুপ ব্যবহার করা হয়েছে যাতে interfaces
লিস্টের প্রতিটি ইন্টারফেসের ডাটা নিয়ে প্রিন্ট করা হয়। আউটপুট হবে:
print("\nVLAN Data:")
for vlan_id, vlan_name in switch_config['vlans'].items():
print(f" VLAN {vlan_id}: {vlan_name}")
এই অংশে VLAN এর ডাটা প্রিন্ট করা হয়। এখানে আবারও for
লুপ ব্যবহার করা হয়েছে যাতে vlans
ডিকশনারির প্রতিটি আইটেম নিয়ে প্রিন্ট করা হয়। আউটপুট হবে:
পূর্ণাঙ্গ আউটপুট¶
Switch Name: SW-Core-01
Interface Data:
Gi0/0 - VLAN: 10, IP: 192.168.10.1
Gi0/1 - VLAN: 20, IP: 192.168.20.1
VLAN Data:
VLAN 10: Management
VLAN 20: Data
VLAN 30: Voice
এই প্রোগ্রামের মাধ্যমে আপনি সহজেই আপনার সুইচের কনফিগারেশন দেখতে পারবেন এবং কোন ইন্টারফেস কোন VLAN এ যুক্ত আছে এবং তাদের আইপি এড্রেসগুলো জানতে পারবেন। একইভাবে, আপনি আপনার VLAN গুলোর নামও জানতে পারবেন। এটা একটা সহজ পদ্ধতি যাতে আপনি আপনার নেটওয়ার্কের কনফিগারেশন গুছিয়ে রাখতে পারবেন এবং প্রয়োজনে দ্রুত চেক করতে পারবেন।
৭. ফাইল অপারেশন¶
নেটওয়ার্ক ইঞ্জিনিয়ারদের প্রায়ই বিভিন্ন ফাইল থেকে আইপি অ্যাড্রেস পড়া এবং ফরম্যাট করা প্রয়োজন হয়।
৭.১. ফাইল থেকে আইপি অ্যাড্রেস পড়া¶
# ফাইল থেকে আইপি অ্যাড্রেস পড়া
with open("ip_addresses.txt", "r") as file:
ip_addresses = file.readlines()
# পড়া আইপি অ্যাড্রেসগুলো ফরম্যাট করা
formatted_ips = [ip.strip() for ip in ip_addresses]
# ফরম্যাট করা আইপি অ্যাড্রেসগুলো প্রিন্ট করা
for ip in formatted_ips:
print(f"IP Address: {ip}")
৭.২. ফাইল এ আইপি অ্যাড্রেস লেখা¶
# আইপি অ্যাড্রেসগুলো একটা তালিকায় সংরক্ষণ করা
ip_addresses = ["192.168.1.1", "192.168.2.1", "192.168.3.1"]
# আইপি অ্যাড্রেসগুলো একটা ফাইলে লেখা
with open("ip_addresses_output.txt", "w") as file:
for ip in ip_addresses:
file.write(f"{ip}\n")
print("IP addresses have been written to ip_addresses_output.txt")
কিছু ধারণা তো হলো?¶
এই ম্যানুয়ালে আমরা পাইথনের বিভিন্ন গুরুত্বপূর্ণ কনসেপ্ট এবং ফিচারগুলো সহজ ভাষায় আলোচনা করেছি যা নেটওয়ার্ক ইঞ্জিনিয়ারদের জন্য উপযোগী। এই জ্ঞান ব্যবহার করে নেটওয়ার্ক কনফিগারেশন এবং ম্যানেজমেন্টের কাজগুলো সহজ ও দ্রুত করা যায়।
এই গাইডটি নেটওয়ার্ক অটোমেশনের জন্য পাইথন প্রোগ্রামিংয়ের মৌলিক ধারণাগুলো কভার করে। এটা ভেরিয়েবল, লিস্ট এবং স্ট্রিং ফরম্যাটিং সম্পর্কে বিস্তারিত জ্ঞান প্রদান করে, যা নেটওয়ার্ক স্ক্রিপ্ট লেখার জন্য অত্যন্ত গুরুত্বপূর্ণ।