কম্পিউটার টিউটোরিয়াল

রিয়েল-টাইম ইমার্জেন্সি রেসপন্স সিস্টেম:লিভারেজিং আপস্ট্যাশ, রেডিস এবং কিউস্ট্যাশ

আজকের নিবন্ধে আমরা Redis ব্যবহার করে একটি দেশের আশ্রয় মানচিত্র সম্পর্কে তথ্য নিরাপদে সংরক্ষণ এবং অ্যাক্সেস করতে এবং QStash-এর মাধ্যমে রিয়েলটাইমে ডাটাবেস আপডেট করার জন্য আপনি কীভাবে Upstash-এর সুবিধা নিতে পারেন সে সম্পর্কে কথা বলতে যাচ্ছি৷

পরিচয়

বর্তমান বৈশ্বিক প্রেক্ষাপটে প্রাকৃতিক দুর্যোগ ও সামরিক হুমকি দিন দিন প্রবল হয়ে উঠছে। সামাজিক পরিষেবার ক্ষেত্রে ডিজিটালাইজেশনের প্রয়োজনীয়তাও তাই।

জরুরী সম্প্রচার সিস্টেম যেমন AMBER সতর্কতা থেকে শুরু করে COVID-19 ট্র্যাকিং অ্যাপ এবং SOS সিস্টেমের মধ্যে, আমরা দেখেছি যে কোনও দেশের বিপজ্জনক পরিস্থিতির প্রতিক্রিয়া হিসাবে বিস্তৃত প্রযুক্তি ব্যবহার করা হচ্ছে।

এখন, আমরা কিভাবে Redis এবং সার্ভারবিহীন কাজের চাপ একটি রিয়েলটাইম জরুরী প্রতিক্রিয়া সিস্টেম তৈরিতে একটি মুখ্য ভূমিকা পালন করতে যাচ্ছি তা দেখতে যাচ্ছি যা নাগরিকদের নিকটতম বাঙ্কারগুলি খুঁজে পেতে সাহায্য করে, পাশাপাশি তাদের ক্ষমতা, বৈশিষ্ট্য (যেমন প্রতিবন্ধী ব্যক্তিদের সুবিধা) এবং উপলব্ধ সংস্থান (পানি, বিদ্যুৎ, ওষুধ ইত্যাদি) সম্পর্কে অবহিত করে৷

রিয়েল-টাইম ইমার্জেন্সি রেসপন্স সিস্টেম:লিভারেজিং আপস্ট্যাশ, রেডিস এবং কিউস্ট্যাশ প্রজেক্ট ক্লাউড৪ এর সৌজন্যে

সার্ভারহীন কেন?

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

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

  1. বাজেট :যদি একটি দেশ একটি উদীয়মান বিপর্যয়ের মধ্য দিয়ে না যায়, তাহলে সিদ্ধান্ত গ্রহণের ভূমিকায় থাকা কোন ব্যক্তি কি অব্যবহৃত গণনা শক্তির জন্য অর্থপ্রদান অনুমোদন করতে সক্ষম হবেন? আমার সন্দেহ আছে।
  2. ট্রাফিক স্পাইকস :কল্পনা করুন যে একটি অ্যালার্ম ট্রিগার হয়েছে এবং লক্ষ লক্ষ লোক নিকটতম আশ্রয় খুঁজে পেতে ওয়েব প্ল্যাটফর্ম অ্যাক্সেস করছে৷ আপনার REST API কীভাবে এই আকস্মিক rps(প্রতি-সেকেন্ডে অনুরোধ) বাড়াবে? প্রয়োজনীয় রিয়েলটাইম উপাদান সম্পর্কে কি?

এই সমস্ত বিভিন্ন প্রশ্নের উত্তর দেওয়া যেতে পারে সত্যিকারের সার্ভারহীন প্ল্যাটফর্ম যেমন Upstash এবং Ably ব্যবহার করে হেভি-লিফটিং সার্ভারগুলিকে পাওয়ার আপ করে যা স্বয়ংক্রিয়ভাবে স্কেল করে এবং শুধুমাত্র আপনি যে সংস্থানগুলি ব্যবহার করছেন তার জন্য চার্জ করে৷

কেন রেডিস?

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

কেন QStash?

প্রথাগত বার্তা সারিগুলি ইভেন্ট-চালিত সিস্টেমগুলিকে আর্কিটেক্ট করার জন্য একটি কঠিন উপায় প্রদান করে, তবে একটি সতর্কতা রয়েছে:তাদের বেশিরভাগই সম্পূর্ণরূপে AMPQ এর মতো রাষ্ট্রীয় প্রোটোকলের উপর নির্ভর করে, যার অর্থ তারা সার্ভারহীন ফাংশনগুলির মতো স্বল্প-চলমান পরিবেশে ব্যবহার করার জন্য প্রস্তুত নয়৷

QStash HTTP ব্যবহার করে অনুরোধ করার অনুমতি দিয়ে এই সমস্যার সমাধান করে, সাধারণত এই ধরনের পরিবেশে ব্যবহৃত স্টেটলেস প্রোটোকল। ওয়েবহুকের সাথে এটিকে একত্রিত করে, আমরা ডেটাবেস থেকে এবং ডেটাবেস থেকে আপডেট এবং আনার জন্য রিয়েলটাইম পাইপলাইন তৈরি করতে পারি।

প্রয়োজনীয়তা

P.S .:আপনি যদি নমুনাগুলি দেখতে চান তবে প্রয়োজনীয়তা এবং সেটআপ বিভাগটি এড়িয়ে যান। আমরা কী এবং কীভাবে ব্যবহার করছি তা দেখানোর জন্য তারা।

আপনি যদি নিজেরাই এই ধরনের সিস্টেম তৈরি করতে চান, তাহলে আপনার নিম্নলিখিতগুলির প্রয়োজন হবে:

  • একটি Upstash অ্যাকাউন্ট, যেখান থেকে আপনি একটি Redis ডাটাবেস তৈরি করবেন এবং একটি QStash এন্ডপয়েন্ট বা বিষয় ব্যবহার করবেন;
  • একটি অ্যাবলি অ্যাকাউন্ট এবং একটি ওয়েবহুক ইন্টিগ্রেশন সেট আপ
  • একটি Next.js প্রকল্প;
  • এনগ্রোকের মতো একটি টানেলিং পরিষেবা যদি আপনি একটি ইন্টারনেট উপলব্ধ URL-এ স্থানীয় অনুরোধগুলি প্রক্সি করতে চান;
  • অনুরোধিত লাইব্রেরি সমর্থন করে এমন যেকোনো প্যাকেজ ম্যানেজার। এই নিবন্ধটি npm ব্যবহার করবে, কিন্তু এটি বাধ্যতামূলক নয়।

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

সেটআপ

সার্ভারহীন ফাংশন

ব্যবহারকারীর অবস্থানের কাছাকাছি সার্ভারহীন ওয়ার্কলোড চালানোর জন্য আমরা Next.js-এর প্রান্ত API রুটগুলি ব্যবহার করতে যাচ্ছি৷

একটি Next.js প্রকল্প তৈরি করতে npx create-next-app@latest <your-app-name> চালান মূল ডিরেক্টরিতে। এর পরে আপনি npm run dev চালাতে পারেন ডেভেলপমেন্ট সার্ভার শুরু করতে, npm run build একটি প্রোডাকশন বান্ডেল এবং npm run start তৈরি করতে উৎপাদন সার্ভার শুরু করতে।

Next.js ডিফল্ট হিসাবে API রুটের জন্য নোড পরিবেশ ব্যবহার করে। আমরা এটি দুটি উপায়ে পরিবর্তন করতে পারি:

  1. প্রতি রুট পদ্ধতি। পছন্দসই রুটে নিম্নলিখিত এক্সপোর্ট যোগ করুন:
    export const config = {
     runtime: "experimental-edge",
    };
  2. বিশ্বব্যাপী পদ্ধতি। এজ তৈরি করতে ডিফল্ট রানটাইম, আপনার next.config, js ফাইলে নিম্নলিখিত যোগ করুন:
    const nextConfig = {
     // ...
     experimental: {
     runtime: "experimental-edge",
     },
     // ...
    };

আপস্ট্যাশ

একটি Upstash প্রদানকারী তৈরি করতে এই নির্দেশিকা অনুসরণ করুন৷

একটি QStash-রিসিভার রুট সেটআপ করতে, এই নির্দেশিকা অনুসরণ করুন৷ মনে রাখবেন যে Ably আমাদের ওয়েবহুক বার্তা এনকোডিংয়ের জন্য দুটি বিকল্প প্রদান করে, JSON এবং MessagePack৷ আপনি যদি প্রাক্তনটি ব্যবহার করতে চান তবে সম্ভাব্য এনক্রিপশন সামঞ্জস্যতা সমস্যাগুলির সাথে কাজ করার জন্য আপনাকে JWT এর পরিবর্তে একটি অনুমোদন শিরোনাম ব্যবহার করতে হবে। সরলতার জন্য আমরা JSON এ লেগে থাকব।

সাধ্য

রিয়েলটাইম কার্যকারিতার জন্য, আমরা Ably-এর প্রোটোকল ব্যবহার করব, যা সম্ভব হলে WebSockets-এ ডিফল্ট। শুরু করার জন্য এই নির্দেশিকাটি অনুসরণ করুন এবং আমরা যেমন Next.js ব্যবহার করছি, আপনি @ably-labs/react-hooks npm প্যাকেজটি দেখে নিতে পারেন।

আমাদের QStash URL-এ নির্দেশ করার জন্য একটি ওয়েবহুক ইন্টিগ্রেশন সেট আপ করা উচিত এবং প্রয়োজনীয় শিরোনাম যোগ করা উচিত।

আপনি যদি উত্পাদন করতে যাচ্ছেন, তবে প্রমাণীকরণ এবং সুরক্ষাও পরীক্ষা করুন৷

ঐচ্ছিক:স্থানীয় টানেলিং

Ngrok

দিয়ে শুরু করতে এই নির্দেশিকা অনুসরণ করুন

স্থাপত্য

প্রবাহ

আমাদের অ্যাপ্লিকেশনের প্রবাহ আরও ভালভাবে বোঝার জন্য, আসুন এই চিত্রটি দেখি(excalidraw.com দিয়ে তৈরি):

রিয়েল-টাইম ইমার্জেন্সি রেসপন্স সিস্টেম:লিভারেজিং আপস্ট্যাশ, রেডিস এবং কিউস্ট্যাশ

আপনি দেখতে পাচ্ছেন আমরা দুই ধরনের ব্যবহারকারীকে সংজ্ঞায়িত করেছি:

  1. নাগরিক , যিনি একটি আশ্রয় বা অবস্থানের তথ্য অ্যাক্সেস করতে পারেন এবং একটি বাঙ্কারে যাওয়ার তার অভিপ্রায় ঘোষণা করতে পারেন
  2. প্রশাসক , যিনি একটি বাঙ্কারের লজিস্টিক ডেটা পরিবর্তন করতে পারেন এবং প্রাপ্যতা পরিবর্তন করতে পারেন (উদাহরণস্বরূপ, নিশ্চিত করুন যে কোনও ব্যক্তি/পরিবার লোকেশনে পৌঁছেছেন)

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

এছাড়াও, আমরা ব্যাকএন্ড থেকে বার্তা প্রকাশ করতে Ably-এর REST API ব্যবহার করব, কারণ আমাদের কোনো প্রকার রাষ্ট্রীয় সংযোগ ব্যবহার করা উচিত নয়।

ডেটা

বর্তমানে আমাদের দুটি প্রধান ডেটা প্রকার সংরক্ষণ করতে হবে:

  • একটি আশ্রয়ের তথ্য, যা একটি Redis হ্যাশের রূপ নিতে পারে এবং নিম্নলিখিত বৈশিষ্ট্যগুলি থাকতে পারে:

    • কীটির নাম country-city-number (যেমন:RO-CJ-01 )
    • উপলভ্যতা (যেমন:300 )
    • বৈশিষ্ট্য (যেমন:["disabled persons special acces", "counseling"] )
    • সম্পদ:
      {
       resource: quantity,
       or
       resource: list
       ...
      }
      যেমন:
      {
       "water": "200 liters",
       "medicine": ["insuline", ...]
      }
    • বিদ্যুৎ:yes/no
    • হিটিং:yes/no
    • অবস্থান:[longitude, latitude] অথবা
      {
       longitude: number,
       latitude: number
      }
    • _id:আমরা এলোমেলোভাবে এটি তৈরি করব
  • একটি অবস্থানের তথ্য

    যখন আমরা পারব নির্দিষ্ট অবস্থানের জন্য উপলব্ধ আশ্রয় খুঁজে পেতে একটি নেস্টেড ক্যোয়ারী করুন, ক্যোয়ারীটি সরল ও অপ্টিমাইজ করার জন্য একটি পৃথক ডেটা স্ট্রাকচার হিসাবে সেগুলি সংরক্ষণ করা একটি ভাল ধারণা হতে পারে। এটি করার জন্য, আমরা একটি Redis সেট ব্যবহার করতে পারি এবং উপাদানগুলির নাম <geographical-unit>-<name> হিসাবে রাখতে পারি (যেমন:country-RO অথবা city-CJ ) এইভাবে আমরা ডুপ্লিকেশন রোধ করছি

    যেমন:

     city-CJ : ["RO-CJ-01", "RO-CJ-02", "RO-CJ-03"]

কিন্তু এখনও একটি সমস্যা রয়ে গেছে:কীভাবে আমরা একজন নাগরিকের আশ্রয়ে যাওয়ার অভিপ্রায় এবং একটি প্রকৃত এর মধ্যে পার্থক্য করতে পারি? আশ্রয়ের অ্যাডমিন নিশ্চিতকরণ দ্বারা ট্রিগার হওয়া দখলের আপডেট? আমরা এটি দুটি উপায়ে করতে পারি:

  1. প্রতিনিয়ত আপডেট করুন আশ্রয়ের প্রাপ্যতা কী:একজন ব্যবহারকারী তার আসার উদ্দেশ্য ঘোষণা করেন (একা বা পরিবারের সাথে

    এখানে সমস্যা হল অ্যাডমিনকে সত্যের উৎস হিসেবে কাজ করতে হবে এবং নাগরিকের অবস্থানের খোঁজ রাখতে হবে; এছাড়াও, আশ্রয়ের ডেটা অবিলম্বে বিশ্বাস করা যায় না

  2. একটি পৃথক স্ট্রিং কী তৈরি করুন shelter-"availability" নামে (যেমন:RO-CJ-01-availability ) এবং রিয়েলটাইম-আপডেটেড মান সংরক্ষণ করুন। এইভাবে আমরা রিয়েলটাইম আপডেট করতে পারি, এবং সত্যের উৎস হিসাবে আমাদের হ্যাশের উপলব্ধতা কী রাখতে পারি।

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

বাছাই করা হচ্ছে

সর্টেড সেট নামে আরেকটি রেডিস ডেটা টাইপের সুবিধা নেওয়া যাক। বলুন আমরা প্রাপ্যতা, সুবিধা বা উপলব্ধ সংস্থানগুলির দ্বারা একটি অবস্থানে বাঙ্কারগুলিকে সাজাতে চাই:যেমন আমি আগে উল্লেখ করেছি, আমরা একটি নেস্টেড কোয়েরি করতে পারি তবে সময়ের খরচে এবং অনেক বড় ডেটা লোডের সাথে। একটি ভাল সমাধান হবে প্রতিটি ফিল্টারিং মানদণ্ডের জন্য সাজানো সেট তৈরি করা (আমরা তাদের নাম দিতে পারি <geographical-unit>-<name>-<criteria> , যেমন city-CJ-availability অথবা country-RO-food )

যেমন:city-B-availability

স্কোর সামগ্রী 200RO-B-02100RO-B-01

এই উদাহরণে, উপলব্ধতা স্কোরকে total seats - current occupation হিসাবে গণনা করা হয়েছিল .

উদাহরণ

আমরা আমাদের API এবং ক্লায়েন্টের আচরণ প্রদর্শন করতে কিছু মৌলিক কোড লিখতে পারি

শেষ পয়েন্ট

প্রধানত, আমাদের থাকতে হবে:

  • একটি ডেটা এন্ডপয়েন্ট যা ক্লায়েন্টকে অনুরোধ করা তথ্য প্রদান করবে এবং
  • আমাদের ডেটা প্রকার তৈরি বা আপডেট করার জন্য একটি এডপয়েন্ট

ক্লায়েন্ট

ব্যবহারকারীর অবস্থান ট্র্যাক করার পরে আমরা স্বয়ংক্রিয়ভাবে "উপলভ্যতা" চ্যানেলের সাথে সংযোগ স্থাপন করব এবং নাগরিক যদি একটি বাঙ্কারে যেতে চায় তাহলে একটি বার্তা প্রকাশ করব৷

প্রথমে /_app.js থেকে একটি সংযোগ করা যাক ফাইল:

import { useEffect, useState } from "react";
 
import "../styles/globals.css";
 
import { configureAbly } from "@ably-labs/react-hooks";
 
export default function App({ Component, pageProps }) {
 const [loaded, setLoaded] = useState(false);
 useEffect(() => {
 configureAbly({
 // In a production system, you should use authentication
 key: process.env.NEXT_PUBLIC_ABLY_API_KEY,
 });
 setLoaded(true);
 }, []);
 
 if (!loaded) return <div>loading...</div>;
 return <Component {...pageProps} />;
}

এবং তারপর চ্যানেলের সাথে সংযোগ করুন যে কোনো উপাদানে আমাদের প্রয়োজন:

import { useChannel } from "@ably-labs/react-hooks";
 
export default function Test() {
 const [availability] = useChannel("availability", (msg) => {
 console.log(msg);
 });
 
 return <></>;
}

ডাটাবেসের সাথে কাজ করা

নতুন ডেটা যোগ করা হচ্ছে

Redis-এ নতুন ডেটা যোগ করতে আমরা HSET, SET এবং SADD কমান্ড ব্যবহার করতে পারি

export default async (req) => {
 let data = await req.json();
 
 if (data.type === "shelter") {
 // Remove the 'type' key as it is not neccesary anymore
 delete data.type;
 const { name: shelter, availability } = data;
 
 let shelterData = data;
 // Generate a random id.
 shelterData._id = Math.random()
 .toString(36)
 .replace(/[^a-z]+/g, "")
 .substring(0, 7);
 
 // Store the shelter's info as a hash
 await redis.hset(shelter, shelterData);
 
 // Store the realtime-updated availability as a string
 await redis.set(shelter + "-availability", availability);
 return new Response("ok");
 } else if (data.type === "location") {
 const { name: location, shelters } = data;
 
 await redis.sadd(location, ...shelters);
 
 return new Response("ok");
 }
};

বিদ্যমান ডেটা আপডেট করা হচ্ছে

মৌলিক UD (আপডেট-মুছে ফেলা) ক্রিয়াকলাপগুলি ছাড়া, আমরা আশ্রয়কেন্দ্রগুলির প্রাপ্যতা পরিবর্তন করতে Redis INCRBY এবং HINCRBY কমান্ডগুলি ব্যবহার করতে পারি৷

যদি একজন নাগরিক তার বাঙ্কারে যাওয়ার ইচ্ছা প্রকাশ করে, আমরা ক্লায়েন্ট অ্যাপ থেকে একটি বার্তা প্রকাশ করতে পারি

availability.publish("update", {
 shelter: "RO-CJ-01",
 availability: 1, // Or -x, if the user cancels.
});

আর্কিটেকচারে যেমন ব্যাখ্যা করা হয়েছে, এটি একটি ওয়েবহুক ট্রিগার করবে যেখান থেকে আমরা ডেটা নিতে পারি এবং shelter-"availability" আপডেট করতে পারি। কী।

await redis.incrby(shelter + "-availability", value);

আপনি যদি সার্ভার থেকে আপডেট করছেন (যেমন:প্রশাসক নিশ্চিতকরণ), পরিবর্তে REST API ব্যবহার করতে ভুলবেন না৷

ডেটা পুনরুদ্ধার করা হচ্ছে

সার্ভারে, আমরা GET , SMEMBERS এবং HGETALL কমান্ডগুলি ব্যবহার করতে পারি৷

ক্লায়েন্টে, আমরা চ্যানেলে বার্তা শুনতে পারি এবং সেই অনুযায়ী অবস্থা আপডেট করতে পারি।

সংক্ষেপে

আজ আমরা একটি বাস্তব-বিশ্ব জরুরী ট্র্যাকিং অ্যাপ তৈরি করতে কীভাবে আমরা একটি শক্তিশালী সার্ভারবিহীন আর্কিটেকচারের সুবিধা নিতে পারি তা দেখেছি। যদিও এটি সম্পন্ন করার জন্য একাধিক পদ্ধতি রয়েছে, আমি ব্যক্তিগতভাবে এই ধরনের প্রবাহের সাথে চলার পরামর্শ দিচ্ছি কারণ সরলীকৃত বিকাশকারী অভিজ্ঞতার কারণে৷

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

আপনি এই নিবন্ধটি সম্পর্কে কি মনে করেন তা আমাকে জানান, এবং যদি আপনার কোন প্রশ্ন থাকে তাহলে আমাকে LinkedIn-এ মেসেজ করুন বা Github-এ আমার অন্যান্য কোড চেক করুন।


  1. আমি কিভাবে একটি Tkinter উইন্ডোতে বোতামগুলি অবস্থান করব?

  2. "সেরা" ওয়ার্ডপ্রেস ম্যালওয়্যার স্ক্যানার আপনি যা ভাবেন তা নয়

  3. কিভাবে একটি HTML ফাইল পরিদর্শন এবং বিশ্লেষণ করতে হয়:একটি ধাপে ধাপে নির্দেশিকা

  4. HTML DOM টাচএন্ড ইভেন্ট