ক্লায়েন্ট বনাম সার্ভার

পাইথন এবং জাভাস্ক্রিপ্টের জন্য আর্থ ইঞ্জিন ক্লায়েন্ট লাইব্রেরিগুলি আর্থ ইঞ্জিন অনুরোধগুলিতে জটিল ভূ-স্থানিক বিশ্লেষণগুলি অনুবাদ করে৷ ক্লায়েন্ট লাইব্রেরির জন্য আপনি যে কোডটি লেখেন তাতে ক্লায়েন্ট-সাইড অবজেক্ট এবং ভেরিয়েবলের রেফারেন্সের মিশ্রণ থাকতে পারে যা সার্ভার-সাইড অবজেক্টের প্রতিনিধিত্ব করে।

অন্যান্য পাইথন বা জাভাস্ক্রিপ্ট অবজেক্ট বা আপনার কোডে থাকতে পারে এমন আদিম বস্তুগুলি থেকে আর্থ ইঞ্জিন অবজেক্টগুলিকে আলাদা করা গুরুত্বপূর্ণ৷ আপনি আপনার স্ক্রিপ্টে ক্লায়েন্ট-সাইড "প্রক্সি" অবজেক্টগুলিকে ম্যানিপুলেট করে সার্ভারে বস্তুগুলিকে ম্যানিপুলেট করতে পারেন৷ আপনি একটি প্রক্সি অবজেক্টকে ee দিয়ে শুরু করে যেকোনো কিছু হিসেবে চিনতে পারেন। এই আর্থ ইঞ্জিন প্রক্সি অবজেক্টে কোনো প্রকৃত তথ্য থাকে না এবং সার্ভারে থাকা বস্তুর জন্য শুধুমাত্র হ্যান্ডেল হয়। শুরু করতে, একটি ক্লায়েন্ট-সাইড স্ট্রিং অবজেক্ট বিবেচনা করুন (যা একটি প্রক্সি অবজেক্ট নয়):

কোড এডিটর (জাভাস্ক্রিপ্ট)

var clientString = 'I am a String';
print(typeof clientString);  // string

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

client_string = 'I am a String'
print(type(client_string))  # str

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

কোড এডিটর (জাভাস্ক্রিপ্ট)

var serverString = ee.String('I am not a String!');
print(typeof serverString);  // object
print('Is this an EE object?',
    serverString instanceof ee.ComputedObject);  // true

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

server_string = ee.String('I am not a String!')
print(type(server_string))  # ee.ee_string.String
print(
    'Is this an EE object?', isinstance(server_string, ee.ee_string.String)
)  # True

আউটপুট থেকে লক্ষ্য করুন যে ee.String একটি object , string নয়। আরও নির্দিষ্টভাবে, এটি একটি ee.computedObject , যার মানে এটি সার্ভারে কিছুর জন্য একটি প্রক্সি অবজেক্ট। Google-এ পাঠানোর জন্য একটি পাত্রে একটি জিনিস রাখার উপায় হিসাবে ee.Thing এর কথা ভাবুন৷ আপনার ক্লায়েন্ট জানেন না যে পাত্রে কী আছে, তবে আপনি এটি মুদ্রণ করে খুঁজে পেতে পারেন:

কোড এডিটর (জাভাস্ক্রিপ্ট)

print(serverString);  // I am not a String

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

print(server_string.getInfo())  # I am not a String

ধারকটি দেখতে কেমন তা দেখতে, বস্তুর স্ট্রিং উপস্থাপনা মুদ্রণ করুন:

কোড এডিটর (জাভাস্ক্রিপ্ট)

print(serverString.toString());  // ee.String("I am not a String!")

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

print(server_string)  # ee.String({"constantValue": "I am not a String!"})

যদি, কোনো কারণে, আপনাকে ক্লায়েন্টে চলমান পাইথন বা জাভাস্ক্রিপ্ট ব্যবহার করতে হয় যা কন্টেইনারে আছে তা ম্যানিপুলেট করার জন্য, তারপর কন্টেইনারের বিষয়বস্তু পেতে getInfo() ব্যবহার করুন এবং এটি একটি পরিবর্তনশীলে বরাদ্দ করুন:

কোড এডিটর (জাভাস্ক্রিপ্ট)

var someString = serverString.getInfo();
var strings = someString + '  Am I?';
print(strings);  // I am not a String!  Am I?

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

some_string = server_string.getInfo()
strings = some_string + '  Am I?'
print(strings)  # I am not a String!  Am I?

লুপিং

কারণ ক্লায়েন্ট জানে না যে সার্ভার-সাইড ee.Thing এ কী আছে। জিনিসপত্র, ক্লায়েন্ট-সাইড অপারেশন যেমন কন্ডিশনাল এবং ফর-লুপ তাদের সাথে কাজ করে না। সেই কারণে, এবং getInfo() এ সিঙ্ক্রোনাস কল এড়াতে, যতটা সম্ভব সার্ভার ফাংশন ব্যবহার করুন। উদাহরণস্বরূপ, একটি তালিকা তৈরি করার নিম্নলিখিত দুটি উপায় বিবেচনা করুন:

প্রস্তাবিত নয় — ক্লায়েন্ট-সাইড ফর লুপ

কোড এডিটর (জাভাস্ক্রিপ্ট)

var clientList = [];
for(var i = 0; i < 8; i++) {
  clientList.push(i + 1);
}
print(clientList);

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

client_list = []
for i in range(8):
  client_list.append(i + 1)
print(client_list)

প্রস্তাবিত — সার্ভার-সাইড ম্যাপিং

কোড এডিটর (জাভাস্ক্রিপ্ট)

var serverList = ee.List.sequence(0, 7);
serverList = serverList.map(function(n) {
  return ee.Number(n).add(1);
});
print(serverList);

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

server_list = ee.List.sequence(0, 7)
server_list = server_list.map(lambda n: ee.Number(n).add(1))
print(server_list.getInfo())

সার্ভার-সাইড ম্যাপিং উদাহরণটি একটু মূর্খ কারণ আপনি একই তালিকাটি সহজভাবে ee.List.sequence(1, 8) দিয়ে তৈরি করতে পারেন, কিন্তু এটি কিছু গুরুত্বপূর্ণ ধারণাকে চিত্রিত করে। প্রথম ধারণাটি হল map() যা তালিকার সবকিছুতে একই ফাংশন প্রয়োগ করে। যেহেতু এই ফাংশনটি সার্ভারে কার্যকর করা হয়েছে, ক্লায়েন্ট-সাইড ফাংশন যেমন getInfo() এবং print() ম্যাপ করা ফাংশনে কাজ করবে না। সেই কারণে, i + 1 কোডটিকে সমতুল্য সার্ভার-সাইড কোড দিয়ে প্রতিস্থাপন করতে হবে: ee.Number(n).add(1) । গুরুত্বপূর্ণভাবে, n একটি বস্তু যা শুধুমাত্র সার্ভারে বিদ্যমান। কারণ ফাংশনটি তার আর্গুমেন্টের ধরন জানে না, এটি একটি ee.Number এ কাস্ট করা দরকার।

(ক্লায়েন্টে কোন ফাংশন চালানো হয় তার বিবরণের জন্য ক্লায়েন্ট এবং সার্ভার ফাংশনের বিভাগটি দেখুন।)

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

কোড এডিটর (জাভাস্ক্রিপ্ট)

var toServerList = ee.List(clientList);

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

to_server_list = ee.List(client_list)

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

শর্তাবলী

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

কোড এডিটর (জাভাস্ক্রিপ্ট)

var myList = ee.List([1, 2, 3]);
var serverBoolean = myList.contains(5);
print(serverBoolean);  // false

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

my_list = ee.List([1, 2, 3])
server_boolean = my_list.contains(5)
print(server_boolean.getInfo())  # False

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

প্রস্তাবিত নয় — ক্লায়েন্ট-সাইড শর্তাধীন

কোড এডিটর (জাভাস্ক্রিপ্ট)

var clientConditional;
if (serverBoolean) {
  clientConditional = true;
} else {
  clientConditional = false;
}
print('Should be false:', clientConditional);  // True!

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

if server_boolean:
  client_conditional = True
else:
  client_conditional = False
print('Should be False:', client_conditional)  # True!

প্রস্তাবিত — সার্ভার-সাইড শর্তাধীন

কোড এডিটর (জাভাস্ক্রিপ্ট)

var serverConditional = ee.Algorithms.If(serverBoolean, 'True!', 'False!');
print('Should be false:', serverConditional);  // False!

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহার করার জন্য পাইথন এনভায়রনমেন্ট পৃষ্ঠাটি দেখুন।

import ee
import geemap.core as geemap

Colab (পাইথন)

server_conditional = ee.Algorithms.If(server_boolean, 'True!', 'False!')
print('Should be False:', server_conditional.getInfo())  # False!

ক্লায়েন্ট এবং সার্ভার ফাংশন

ক্লায়েন্ট এবং সার্ভার বস্তু এবং ফাংশন মিশ্রিত করা অদক্ষ বা অযৌক্তিক কেন তা পূর্ববর্তী বিভাগগুলি বিভিন্ন কারণ বর্ণনা করে। কোন বস্তু এবং ফাংশন ক্লায়েন্ট-সাইড এবং কোনটি সার্ভার-সাইড? সাধারণভাবে, ee.Thing হিসাবে আরম্ভ করা যেকোনো কিছু। থিং হল একটি সার্ভার অবজেক্ট এবং সেই বস্তুর যেকোনো পদ্ধতি, ee.Thing.method() , একটি সার্ভার ফাংশন। পাইথন বা জাভাস্ক্রিপ্ট রেফারেন্সে উপস্থিত অবজেক্ট এবং ফাংশনগুলি ক্লায়েন্ট-সাইড। পূর্বে উল্লিখিত হিসাবে, আপনি একটি অবজেক্ট তৈরি করতে ক্লায়েন্ট-সাইড কার্যকারিতা ব্যবহার করতে পারেন, তারপর একটি আর্থ ইঞ্জিন কনস্ট্রাক্টরকে ক্লায়েন্ট-সাইড অবজেক্ট সরবরাহ করে এটি মোড়ানো করতে পারেন, উদাহরণস্বরূপ ee.String()