আসুন C# এ ফোরচ লুপগুলি আয়ত্ত করা এবং আপনার প্রোগ্রামিং দক্ষতা বাড়ানোর বিষয়ে কথা বলি! Foreach loops হল C# প্রোগ্রামিং-এ একটি গুরুত্বপূর্ণ ধারণা - এবং সেই বিষয়ে অন্যান্য অনেক ভাষা। সংগ্রহ এবং অ্যারেগুলির মাধ্যমে পুনরাবৃত্তি করার ক্ষেত্রে, তারা বিশেষভাবে কার্যকর।
এই নিবন্ধের শেষের মধ্যে, আপনি foreach loops এর মৌলিক সিনট্যাক্স, এড়াতে সাধারণ ভুল, চেষ্টা করার জন্য উন্নত কৌশল এবং আপনার নিজের প্রকল্পে কার্যকরভাবে ব্যবহার করার জন্য সর্বোত্তম অনুশীলন সম্পর্কে একটি দৃঢ় বোঝার আশা করতে পারেন।
আপনি একজন শিক্ষানবিস বা একজন অভিজ্ঞ সফ্টওয়্যার প্রকৌশলী হোন না কেন, এই নিবন্ধটি আপনার কোডকে স্ট্রীমলাইন করতে এবং আপনার প্রোগ্রামিং দক্ষতা উন্নত করতে কীভাবে ফোরচ লুপ ব্যবহার করতে হয় সে সম্পর্কে মূল্যবান অন্তর্দৃষ্টি প্রদান করবে।
Foreach loops সফটওয়্যার ইঞ্জিনিয়ার এবং ডেভেলপারদের জন্য অপরিহার্য যারা C# এ সংগ্রহ এবং অ্যারে নিয়ে কাজ করে। তারা একটি সহজ এবং সংক্ষিপ্ত সিনট্যাক্স সহ এই ডেটা স্ট্রাকচারগুলির পুনরাবৃত্তির অনুমতি দেয় যা তাদের সাথে কাজ করা সহজ এবং আরও দক্ষ করে তোলে। foreach loops ব্যবহার করার মূল সুবিধাগুলির মধ্যে একটি হল যে লুপগুলির জন্য ঐতিহ্যগত তুলনায় তাদের জটিলতা কম। পরিসীমা চেকিং এবং ইন্ডেক্সিংকে বিদায় বলুন!
লুপগুলির জন্য একটি সূচক ভেরিয়েবল ব্যবহার করা প্রয়োজন, যার জন্য প্রায়শই অতিরিক্ত ঘোষণা এবং অ্যাসাইনমেন্টের প্রয়োজন হয়। অন্যদিকে, ফোরচ লুপগুলি পর্দার পিছনে সূচক পরিবর্তনশীল এবং পুনরাবৃত্তিমূলক যুক্তি পরিচালনা করে, একটি সংগ্রহ বা অ্যারের মাধ্যমে লুপ করার জন্য প্রয়োজনীয় কোডের পরিমাণ হ্রাস করে। এই সরলতা ক্লিনার কোডের দিকে নিয়ে যায় যা পড়া এবং বজায় রাখা সহজ।
foreach loops ব্যবহার করার আরেকটি সুবিধা হল সহজ ডিবাগিং। যেহেতু পুনরাবৃত্ত যুক্তিটি বিমূর্ত করা হয়েছে, পুনরাবৃত্তি প্রক্রিয়ায় ঘটে যাওয়া কোডিং ত্রুটিগুলি নির্ণয় করা সহজ। এটি বিশেষভাবে প্রাসঙ্গিক যখন লুপগুলির জন্য ব্যবহার করা হয় যেখানে একটি অফ-বাই-ওয়ান ত্রুটির সম্ভাব্যতা বিদ্যমান থাকে যা সনাক্ত করা এবং সমাধান করা কঠিন হতে পারে।
C# এ একটি foreach লুপের মৌলিক সিনট্যাক্স নিম্নরূপ:
dataType[] collectionName = new dataType[10]; foreach (dataType variableName in collectionName) { //Execute code for each item in collectionName using variableName as you go. }
dataType হল সংগ্রহের আইটেমগুলির ধরন, variableName হল সংগ্রহের বর্তমান আইটেমের জন্য বরাদ্দ করা নাম যেটি পুনরাবৃত্তি করা হচ্ছে এবং collectionName হল সংগ্রহের নাম। 'ইন' কীওয়ার্ডটি C# কে বলে যে লুপটি একটি ফোরচ লুপ, এবং কোঁকড়া ধনুর্বন্ধনীর ভিতরের লজিকটি সংগ্রহের প্রতিটি আইটেমের জন্য কার্যকর করা হয়।
ফোরচ লুপগুলি IEnumerable ইন্টারফেসের সাথে একত্রে ব্যবহার করা যেতে পারে, যা একবারে একটি সংগ্রহের মানগুলি অ্যাক্সেস করার একটি উপায় প্রদান করে। IEnumerable ইন্টারফেস এবং foreach loops এর ব্যবহার মেমরির ব্যবহার কমাতে পারে এবং ডেভেলপারদের যখন প্রয়োজন তখনই সংগ্রহ থেকে মান পেতে অনুমতি দিয়ে কর্মক্ষমতা বাড়াতে পারে — কিন্তু এটা সবসময় কালো-সাদা নয় ।
এই পদ্ধতিটি সাধারণত ব্যবহৃত হয় যখন বড় ডেটাসেটগুলির সাথে ডিল করা হয় যা একবারে প্রক্রিয়া করা অব্যবহার্য হবে।
foreach loops ব্যবহার করার সময়, ডেভেলপাররা সতর্ক না হলে বেশ কিছু সাধারণ ভুলের সম্মুখীন হতে পারে। এই ভুলগুলি এড়াতে সতর্কতা অবলম্বন করা গুরুত্বপূর্ণ কারণ এগুলি বাগ, ক্র্যাশ এবং রানটাইম ত্রুটিগুলি সমাধান করা কঠিন হতে পারে৷ কিছু সাধারণ ভুল কীভাবে এড়ানো যায় এবং সমাধান করা যায় সে সম্পর্কে টিপস সহ নীচে আলোচনা করা হয়েছে৷
একটি ভুল লুপের সময় পুনরাবৃত্ত হওয়া সংগ্রহটি সংশোধন করার চেষ্টা করছে। সংশোধিত সংগ্রহগুলি অনিচ্ছাকৃত আচরণের কারণ হতে পারে, যেমন একটি অসীম লুপ বা নির্দিষ্ট আইটেমগুলি এড়িয়ে যাওয়া। এই ভুলটি এড়ানোর জন্য, সংকলনের একটি অনুলিপি তৈরি করা গুরুত্বপূর্ণ যদি পরিবর্তনের প্রয়োজন হয়, যার ফলে পুনরাবৃত্তি প্রক্রিয়া চলাকালীন মূল সংগ্রহের সরাসরি পরিবর্তনের সম্ভাবনাকে সরিয়ে দেওয়া হয়।
আরেকটি সাধারণ ভুল পুনরাবৃত্তি করার চেষ্টা করার আগে নাল রেফারেন্সের জন্য পরীক্ষা করা হয় না। এই ভুলটি নাল রেফারেন্স ব্যতিক্রম হতে পারে, যা প্রোগ্রামটি ক্র্যাশ করতে পারে এবং ধরা এবং সমাধান করা কঠিন হতে পারে। পুনরাবৃত্তি প্রক্রিয়া শুরু করার আগে নাল রেফারেন্সের জন্য পরীক্ষা করা এই ভুল এড়ানোর একটি কার্যকর উপায়।
সমসাময়িক পরিবর্তন সমস্যাগুলিও হতাশাজনক হতে পারে, যার ফলে প্রোগ্রামের অপ্রত্যাশিত আচরণ এবং পুনরুত্পাদন করা কঠিন ত্রুটির সৃষ্টি হয়। এটি ঘটতে পারে যদি একাধিক থ্রেড একই সংগ্রহ অ্যাক্সেস করে এবং পরিবর্তন করে। বিকাশকারীরা একটি সিঙ্ক্রোনাইজড কালেকশন ক্লাস ব্যবহার করে বা লক ব্যবহার করে সমসাময়িক পরিবর্তনের সমস্যাগুলি এড়াতে পারে তা নিশ্চিত করতে যে শুধুমাত্র একটি থ্রেড একবারে সংগ্রহটি পরিবর্তন করতে পারে।
একটি বিরতি বিবৃতি কার্যকর করা হলে লুপটি অবিলম্বে বন্ধ করে দেবে, সংগ্রহটি পুনরাবৃত্তি করা শেষ হয়েছে কিনা তা নির্বিশেষে। বিকল্পভাবে, একটি অবিরত বিবৃতি অবিলম্বে লুপের পরবর্তী পুনরাবৃত্তিতে চলে যাবে, বর্তমান পুনরাবৃত্তিতে কোডের অবশিষ্ট লাইনগুলি এড়িয়ে যাবে। এই বিবৃতিগুলি ত্রুটি-পরীক্ষা সহজ করতে এবং কোড পাঠযোগ্যতা উন্নত করতে ব্যবহার করা যেতে পারে।
উদাহরণস্বরূপ, একটি সংগ্রহে একটি নির্দিষ্ট আইটেম অনুসন্ধান করার সময় একটি বিরতি বিবৃতি কার্যকর হতে পারে এবং আইটেমটি পাওয়া মাত্রই লুপ বন্ধ করা যেতে পারে। সঠিকভাবে ব্যবহার করা হলে, ব্রেক এবং কন্টিনিউ স্টেটমেন্ট কোডের জটিলতা কমাতে পারে, এর কার্যকারিতা বাড়াতে পারে এবং অনুসরণ করা এবং বোঝা সহজ করে তোলে।
বিরতি কীওয়ার্ডের উদাহরণের জন্য এই কোডটি দেখুন।
Item? foundItem = null; foreach (var item in collection) { if (item.Name == "Dev Leader") { foundItem = item; break; } }
আপনি C# এ foreach loops ব্যবহারে আরও স্বাচ্ছন্দ্য বোধ করলে, তারা তাদের কাছে উপলব্ধ কিছু উন্নত কৌশল অন্বেষণ করতে চাইতে পারে। ফোরচ লুপ সহ উন্নত কৌশলগুলি কোডকে আরও অপ্টিমাইজ করতে এবং কর্মক্ষমতা উন্নত করতে সাহায্য করতে পারে। এই বিভাগটি উচ্চ স্তরে বিভিন্ন কৌশল অন্বেষণ করবে, যার মধ্যে রয়েছে LINQ প্রশ্ন এবং ল্যাম্বডাস, গণনা এবং ফিল্টারিং এবং সমান্তরালকরণ।
এই প্রতিটি তাদের নিজস্ব সম্পূর্ণ নিবন্ধের যোগ্য বিষয়.
একটি উন্নত কৌশল হল LINQ ক্যোয়ারী এবং ফোরচ লুপ সহ ল্যাম্বডাস ব্যবহার করা। LINQ বিকাশকারীদের আরও সংক্ষিপ্ত এবং অভিব্যক্তিপূর্ণ কোড লিখতে অনুমতি দেয়। LINQ সিনট্যাক্স ব্যবহার করে প্রশ্নগুলি লেখা যেতে পারে, এবং ল্যাম্বডাস লুপের মধ্যে সরাসরি ডেটা ফিল্টারিং, বাছাই এবং ম্যানিপুলেট করার জন্য ব্যবহার করা যেতে পারে, পরবর্তী লুপের প্রয়োজনীয়তা হ্রাস করে।
আসুন একটি উদাহরণ দেখি:
public sealed record Item( int Id, string Name, DateTime CreatedDateTimeUtc); // Use .Select() from LINQ to change what we're operating on foreach (var item in collection.Select(x => new { Id = x.Id, Name = x.Name })) { if (item.Name == "Dev Leader") { // we're only interested in the ID, so return it! return item.Id; } }
আরেকটি কৌশল হল গণনা এবং ফিল্টারিং, যা বড় ডেটাসেটের মেমরি পদচিহ্ন কমাতে সাহায্য করতে পারে। এই কৌশলটি কেবলমাত্র ডেটার উপসেট তৈরি করতে দেয় যা বর্তমান অপারেশনের সাথে প্রাসঙ্গিক এবং যা একটি নির্দিষ্ট মানদণ্ড পূরণ করে। বড় ডেটাসেটগুলির সাথে কাজ করার সময় এটি অনেক উপকারী হতে পারে কারণ এটি একবারে পুরো ডেটাসেটটি প্রক্রিয়া করার প্রয়োজন এড়ায়, যা সময়সাপেক্ষ হতে পারে এবং এর ফলে কর্মক্ষমতা সমস্যা হতে পারে।
আসুন একটি কোড উদাহরণ তাকান:
public sealed record Item( int Id, string Name, DateTime CreatedDateTimeUtc); // Put the filtering right in the foreach line by using .Where() from LINQ foreach (var item in collection.Where(x => x.Name == "Dev Leader")) { // we're only interested in the ID, so return it! return item.Id; }
সমান্তরালকরণ হল আরেকটি উন্নত কৌশল যা foreach loops দিয়ে ব্যবহার করা যেতে পারে। একটি foreach লুপ সমান্তরাল মাল্টি-কোর প্রসেসরের সুবিধা নেওয়ার একটি উপায় হতে পারে এবং কর্মক্ষমতা উন্নত করতে পারে। সমান্তরাল LINQ অপারেটর, PLINQ ব্যবহারের মাধ্যমে সমান্তরালকরণ অর্জন করা যেতে পারে, যা পুনরাবৃত্তি প্রক্রিয়াটিকে ছোট ছোট টুকরোগুলিতে বিভক্ত করতে পারে এবং আলাদা থ্রেডে চালাতে পারে।
আমরা Parallel.Foreach
, Parallel.ForeachAsync
এর মতো জিনিসগুলিও ব্যবহার করতে পারি এবং এমনকি ডেডিকেটেড টাস্কগুলিতে ওয়ার্ক আউটকে বিভক্ত করতে এবং Task.WhenAll()
ব্যবহার করে ফলাফলের জন্য অপেক্ষা করতে পারি। আপনি এই বিকল্পগুলি খুঁজছেন যখন কিছু কর্মক্ষমতা পার্থক্য জন্য এই ভিডিও চেক আউট আগ্রহী হতে পারে!
LINQ বা ল্যাঙ্গুয়েজ ইন্টিগ্রেটেড ক্যোয়ারী হল C#-এ একটি শক্তিশালী ভাষা বৈশিষ্ট্য যা ডেভেলপারদের আরও অভিব্যক্তিপূর্ণ এবং দক্ষ উপায়ে বিভিন্ন ডেটা উৎসের সাথে যোগাযোগ করতে দেয় । ফোরচ লুপগুলির সাথে একত্রে LINQ ক্যোয়ারীগুলি ব্যবহার করার ক্ষমতা কোডকে সহজ করতে পারে এবং জটিলতা কমাতে পারে, কোডটিকে আরও পাঠযোগ্য এবং বজায় রাখতে পারে৷
ফোরচ লুপগুলির সাথে LINQ ব্যবহার করতে, ক্যোয়ারীটি লুপের বাইরে সঞ্চালিত হয় এবং একটি ভেরিয়েবলে সংরক্ষণ করা হয়। ক্যোয়ারী ভেরিয়েবল তারপর foreach লুপ ব্যবহার করে পুনরাবৃত্তি করা হয়. সাধারণ LINQ ক্যোয়ারীগুলির মধ্যে রয়েছে OrderBy
, যা ঊর্ধ্বমুখী বা অবরোহী ক্রমে ডেটা সাজায় এবং Where()
, যা একটি নির্দিষ্ট মানদণ্ড পূরণ করে এমন আইটেমগুলির একটি উপসেট প্রদান করে৷ কাস্টম LINQ প্রশ্নগুলি লেম্বডা এক্সপ্রেশন ব্যবহার করে করা যেতে পারে, যার ফলে ডেভেলপারদের অর্থপূর্ণ উপায়ে ডেটা ম্যানিপুলেট করার অনুমতি দেওয়া হয়।
C# এ foreach loops নিয়ে কাজ করার সময়, মনে রাখার জন্য বেশ কিছু সেরা অনুশীলন রয়েছে। এই অনুশীলনগুলি অনুসরণ করে, বিকাশকারীরা নিশ্চিত করতে পারে যে তাদের কোডটি দক্ষ এবং রক্ষণাবেক্ষণযোগ্য, ত্রুটিমুক্ত এবং শিল্পের মানগুলির সাথে সামঞ্জস্যপূর্ণ। কিছু সবচেয়ে গুরুত্বপূর্ণ সেরা অনুশীলন নীচে আলোচনা করা হয়েছে.
ফোরচ লুপগুলির সাথে কাজ করার জন্য পুনরাবৃত্তি করার জন্য উপযুক্ত ডেটা টাইপ নির্বাচন করা একটি গুরুত্বপূর্ণ সেরা অনুশীলন। কিছু ডেটা টাইপ, যেমন তালিকা এবং অ্যারে, ফোরচ লুপের জন্য বেশি উপযোগী, যখন হ্যাশ টেবিলের মতো অন্যান্যগুলি ততটা দক্ষ নাও হতে পারে। পুনরাবৃত্ত করার জন্য উপযুক্ত ডেটা টাইপ নির্বাচন করার সময় ডেটা কাঠামো এবং ডেটার ধরন উভয়ই বিবেচনা করা গুরুত্বপূর্ণ।
ডটনেটের আরও সাম্প্রতিক সংস্করণে (লেখার সময়!), অ্যারে এবং তালিকার জন্য কিছু অবিশ্বাস্য কর্মক্ষমতা লাভ হয়েছে। ঐতিহাসিকভাবে, একটি foreach লুপ একটি সূচক সহ একটি লুপের তুলনায় ততটা কার্যকরী নাও হতে পারে। তবে ডটনেট টিম কিছু জাদু কাজ করেছে! কিছু পারফরম্যান্সের বিশদ বিবরণের জন্য আমি আপনাকে এই ভিডিওটি দেখার সুপারিশ করছি:
ফোরচ লুপগুলির সাথে কাজ করার সময় যেখানেই সম্ভব সেখানে শুধুমাত্র পঠনযোগ্য সংগ্রহগুলি ব্যবহার করা আরেকটি গুরুত্বপূর্ণ সেরা অনুশীলন। শুধুমাত্র-পঠন সংগ্রহগুলি পুনরাবৃত্তি প্রক্রিয়া চলাকালীন ডেটা কাঠামোর পরিবর্তন রোধ করতে সাহায্য করতে পারে, যার ফলে ত্রুটির ঝুঁকি হ্রাস পায়। যদি পরিবর্তনের প্রয়োজন হয়, তবে মূলটি পরিবর্তন না করে সংগ্রহের একটি অনুলিপি তৈরি করা এবং অনুলিপি নিয়ে কাজ করা ভাল।
গণনার সময় একটি সংগ্রহ পরিবর্তন করা হয়েছে এমন সমস্যাগুলির বিরুদ্ধে লড়াই করা নিতম্বে সম্পূর্ণ ব্যথা।
কোডটি সরল রাখা এবং অপ্রয়োজনীয় জটিলতা এড়ানো আরেকটি সেরা অভ্যাস যা সময় বাঁচাতে এবং ত্রুটি কমাতে পারে। কোড পরিষ্কার এবং পঠনযোগ্য রাখা উচিত, একটি পরিষ্কার এবং যৌক্তিক কাঠামো যা অনুসরণ করা সহজ। এটি বর্ণনামূলক পরিবর্তনশীল নাম ব্যবহার করে এবং ফাংশন এবং ক্লাসে কোড গ্রুপ করে অর্জন করা যেতে পারে।
আমি দেখেছি যে আমরা প্রোগ্রামার হিসাবে আমাদের কাছে থাকা কিছু LINQ বিকল্পের দিকে ঝুঁকে পড়ার প্রবণতা আছে। ফলাফল কখনও কখনও হয় যে আমাদের কাছে এই জটিল শৃঙ্খলিত LINQ প্রশ্নগুলি রয়েছে যা কিছু দুর্দান্ত জিনিস করে তবে… সেগুলি পড়া কঠিন। ডেটা ফিল্টার এবং ম্যানিপুলেট করার চেষ্টা করার সময় কেবল এটি মনে রাখবেন।
অকাল অপ্টিমাইজেশান এড়িয়ে চলা ফরিচ লুপগুলির সাথে কাজ করার আরেকটি গুরুত্বপূর্ণ দিক। কোনটি অপ্টিমাইজ করা দরকার সে সম্পর্কে তাদের পরিষ্কার বোঝার আগে বিকাশকারীদের অপ্টিমাইজ করা কোড এড়ানো উচিত। খুব তাড়াতাড়ি কোড অপ্টিমাইজ করা স্বচ্ছতার অভাব হতে পারে এবং রিগ্রেশন বাগ হতে পারে।
নিবন্ধের আগে সমান্তরাল সম্পর্কে পয়েন্ট মনে রাখবেন? আপনি যদি সবে শুরু করছেন... এখনও সেই জিনিসগুলিতে আপনার সময় নষ্ট করবেন না। বেসিক নিচে পান. আরও উন্নত দিকগুলিতে যাওয়ার আগে একটি শক্ত ভিত্তি পান।
সংক্ষিপ্ত এবং বর্ণনামূলক ভেরিয়েবলের নাম ব্যবহার করা ফরিচ লুপগুলির সাথে কাজ করার সময় আরেকটি গুরুত্বপূর্ণ সেরা অনুশীলন। পরিবর্তনশীল নাম সংক্ষিপ্ত এবং বর্ণনামূলক হওয়া উচিত এবং পরিবর্তনশীলের উদ্দেশ্য প্রতিফলিত করা উচিত। এটি কোড পঠনযোগ্যতা উন্নত করতে এবং কোড বোঝা সহজ করতে সাহায্য করতে পারে।
এই টিপ foreach loops জন্য নির্দিষ্ট? একেবারে না. কিন্তু এটি প্রোগ্রামিংয়ে এত গুরুত্বপূর্ণ যে আমি পঠনযোগ্য কোডের গুরুত্ব সম্পর্কে লোকেদের মনে করিয়ে দেওয়ার জন্য এটি লুকিয়ে রাখার উপায় খুঁজে বের করতে থাকব।
ফোরচ লুপগুলির সাথে কাজ করার সময় সঠিক ত্রুটি-পরীক্ষা এবং ব্যতিক্রম হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ সেরা অনুশীলন। ত্রুটি-পরীক্ষা কোড জুড়ে অন্তর্ভুক্ত করা উচিত, বিশেষ করে সংগ্রহ এবং অ্যারেগুলির সাথে কাজ করার সময়। পুনরাবৃত্তি প্রক্রিয়ার সময় নিক্ষিপ্ত কোনো ব্যতিক্রম চেষ্টা-ক্যাচ স্টেটমেন্ট ব্যবহার করে সঠিকভাবে পরিচালনা করা উচিত। এটি প্রোগ্রাম ক্র্যাশ প্রতিরোধ করতে এবং কোড রক্ষণাবেক্ষণযোগ্যতা উন্নত করতে সাহায্য করতে পারে।
C# এ foreach loops বোঝা ডেভেলপারদের জন্য একটি মৌলিক দক্ষতা। ফোরচ লুপ ব্যবহার করে, আপনি সময় বাঁচাতে পারেন, ক্লিনার এবং আরও সংক্ষিপ্ত কোড লিখতে পারেন এবং লুপগুলির জন্য ঐতিহ্যগত সাথে সম্পর্কিত সাধারণ সমস্যাগুলি এড়াতে পারেন। এই নিবন্ধটি জুড়ে, আমি C# এ ফোরচ লুপগুলির প্রাথমিক বাক্য গঠন, সাধারণ ভুলগুলি এড়াতে, উন্নত কৌশলগুলি যেমন LINQ ক্যোয়ারী এবং ল্যাম্বডাস এবং ফোরচ লুপগুলি ব্যবহার করার জন্য সর্বোত্তম অনুশীলনগুলি কভার করেছি৷
পুনরাবৃত্তি করার জন্য সর্বদা উপযুক্ত ডেটা টাইপ বেছে নিতে ভুলবেন না, যখনই সম্ভব তখনই পঠনযোগ্য সংগ্রহগুলি ব্যবহার করুন এবং আপনার কোডটি সহজ এবং সংক্ষিপ্ত রাখুন। অনুশীলন এবং প্রয়োগের মাধ্যমে, আপনি C# এ সর্বাধিক ব্যবহৃত সরঞ্জামগুলির মধ্যে একটি লিখতে আরও ভাল হয়ে উঠতে পারেন।
আমি আশা করি আপনি এই নিবন্ধে কিছু দরকারী খুঁজে পেয়েছেন! আপনি যদি আরও শেখার সুযোগ পেতে আগ্রহী হন, আমার বিনামূল্যের সাপ্তাহিক নিউজলেটারে সাবস্ক্রাইব করুন এবং !
এছাড়াও এখানে প্রকাশিত