ক্লাউড স্প্যানার: C# দিয়ে একটি গেমিং লিডারবোর্ড তৈরি করুন

1. সংক্ষিপ্ত বিবরণ

গুগল ক্লাউড স্প্যানার একটি সম্পূর্ণরূপে পরিচালিত অনুভূমিকভাবে স্কেলেবল, বিশ্বব্যাপী বিতরণযোগ্য, রিলেশনাল ডাটাবেস পরিষেবা যা কর্মক্ষমতা এবং উচ্চ প্রাপ্যতা ত্যাগ না করেই ACID লেনদেন এবং SQL শব্দার্থবিদ্যা প্রদান করে।

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

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

তুমি কি শিখবে

  • কিভাবে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করবেন।
  • কিভাবে একটি ডাটাবেস এবং টেবিল তৈরি করবেন।
  • কমিট টাইমস্ট্যাম্প কলাম কীভাবে ব্যবহার করবেন।
  • টাইমস্ট্যাম্প ব্যবহার করে আপনার ক্লাউড স্প্যানার ডাটাবেস টেবিলে ডেটা কীভাবে লোড করবেন।
  • আপনার ক্লাউড স্প্যানার ডাটাবেস কীভাবে জিজ্ঞাসা করবেন।
  • আপনার ক্লাউড স্প্যানার ইনস্ট্যান্সটি কীভাবে মুছে ফেলবেন।

তোমার যা লাগবে

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলি সম্পূর্ণ করুন।

গুগল ক্লাউড প্ল্যাটফর্মের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবীন মধ্যবর্তী দক্ষ

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

যদি আপনার ইতিমধ্যেই একটি Google অ্যাকাউন্ট (Gmail বা Google Apps) না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে। Google Cloud Platform কনসোলে ( console.cloud.google.com ) সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন।

যদি আপনার ইতিমধ্যেই একটি প্রকল্প থাকে, তাহলে কনসোলের উপরের বাম দিকে প্রকল্প নির্বাচন পুল ডাউন মেনুতে ক্লিক করুন:

6c9406d9b014760.png সম্পর্কে

এবং একটি নতুন প্রকল্প তৈরি করতে ফলাফলের ডায়ালগে 'নতুন প্রকল্প' বোতামে ক্লিক করুন:

f708315ae07353d0.png

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

870a3cbd6541ee86.png সম্পর্কে

পরবর্তী প্রকল্প তৈরির ডায়ালগ আপনাকে আপনার নতুন প্রকল্পের বিশদ বিবরণ প্রবেশ করতে দেয়:

6a92c57d3250a4b3.png সম্পর্কে

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রোজেক্টের জন্য একটি অনন্য নাম (উপরের নামটি ইতিমধ্যেই নেওয়া হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে পরে এটিকে PROJECT_ID হিসাবে উল্লেখ করা হবে।

এরপর, যদি আপনি ইতিমধ্যেই এটি না করে থাকেন, তাহলে Google ক্লাউড রিসোর্স ব্যবহার করতে এবং Cloud Spanner API সক্ষম করতে আপনাকে Developers Console-এ বিলিং সক্ষম করতে হবে।

15d0ef27a8fbab27.png সম্পর্কে

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

গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা $300 এর বিনামূল্যে ট্রায়ালের জন্য যোগ্য, যার ফলে এই কোডল্যাবটি সম্পূর্ণ বিনামূল্যে হবে।

গুগল ক্লাউড শেল সেটআপ

যদিও গুগল ক্লাউড এবং স্প্যানার আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে পূর্ণ। এটি একটি স্থায়ী 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এর অর্থ হল এই কোডল্যাবের জন্য আপনার যা প্রয়োজন তা হল একটি ব্রাউজার (হ্যাঁ, এটি একটি Chromebook এ কাজ করে)।

  1. ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল ক্লাউড শেল সক্রিয় করুন ক্লিক করুন gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (পরিবেশের সাথে সংযোগ স্থাপন এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে)।

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSr Dc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

স্ক্রিন শট ২০১৭-০৬-১৪ রাত ১০.১৩.৪৩.png

একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি ইতিমধ্যেই প্রমাণিত এবং প্রকল্পটি ইতিমধ্যেই আপনার PROJECT_ID এ সেট করা আছে।

gcloud auth list

কমান্ড আউটপুট

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি, কোনও কারণে, প্রকল্পটি সেট না করা থাকে, তাহলে কেবল নিম্নলিখিত কমান্ডটি জারি করুন:

gcloud config set project <PROJECT_ID>

আপনার PROJECT_ID খুঁজছেন? সেটআপ ধাপে আপনি কোন আইডি ব্যবহার করেছেন তা দেখুন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি দেখুন:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

ক্লাউড শেল ডিফল্টরূপে কিছু পরিবেশ ভেরিয়েবল সেট করে, যা ভবিষ্যতের কমান্ড চালানোর সময় কার্যকর হতে পারে।

echo $GOOGLE_CLOUD_PROJECT

কমান্ড আউটপুট

<PROJECT_ID>
  1. অবশেষে, ডিফল্ট জোন এবং প্রকল্প কনফিগারেশন সেট করুন।
gcloud config set compute/zone us-central1-f

আপনি বিভিন্ন ধরণের অঞ্চল বেছে নিতে পারেন। আরও তথ্যের জন্য, অঞ্চল এবং অঞ্চল দেখুন।

সারাংশ

এই ধাপে, আপনি আপনার পরিবেশ সেটআপ করুন।

পরবর্তী

এরপর, আপনি একটি ক্লাউড স্প্যানার ইন্সট্যান্স সেটআপ করবেন।

৩. একটি ক্লাউড স্প্যানার ইন্সট্যান্স সেটআপ করুন

এই ধাপে আমরা এই কোডল্যাবের জন্য আমাদের ক্লাউড স্প্যানার ইন্সট্যান্স সেটআপ করব। স্প্যানার এন্ট্রিটি অনুসন্ধান করুন। 1a6580bd3d3e6783.png সম্পর্কে বাম দিকের উপরের হ্যামবার্গার মেনুতে 3129589f7bc9e5ce.png সম্পর্কে অথবা "/" টিপে "Spanner" টাইপ করে Spanner অনুসন্ধান করুন।

36e52f8df8e13b99.png সম্পর্কে

এরপর, ক্লিক করুন 95269e75bc8c3e4d.png সম্পর্কে এবং আপনার ইনস্ট্যান্সের জন্য cloudspanner-leaderboard নামটি প্রবেশ করিয়ে ফর্মটি পূরণ করুন, একটি কনফিগারেশন নির্বাচন করুন (একটি আঞ্চলিক ইনস্ট্যান্স নির্বাচন করুন), এবং নোডের সংখ্যা সেট করুন, এই কোডল্যাবের জন্য আমাদের কেবল 1টি নোডের প্রয়োজন হবে। উৎপাদন ইনস্ট্যান্সের জন্য এবং ক্লাউড স্প্যানার SLA-এর জন্য যোগ্যতা অর্জনের জন্য আপনাকে আপনার ক্লাউড স্প্যানার ইনস্ট্যান্সে 3 বা তার বেশি নোড চালাতে হবে।

সবশেষে, কিন্তু সর্বনিম্ন নয়, "তৈরি করুন" এ ক্লিক করুন এবং কয়েক সেকেন্ডের মধ্যেই আপনার হাতে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স থাকবে।

dceb68e9ed3801e8.png সম্পর্কে

পরবর্তী ধাপে আমরা আমাদের নতুন ইনস্ট্যান্সে একটি ডাটাবেস এবং স্কিমা তৈরি করতে C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করব।

৪. একটি ডাটাবেস এবং স্কিমা তৈরি করুন

এই ধাপে আমরা আমাদের নমুনা ডাটাবেস এবং স্কিমা তৈরি করব।

আসুন C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে দুটি টেবিল তৈরি করি; প্লেয়ারের তথ্যের জন্য একটি প্লেয়ার্স টেবিল এবং প্লেয়ারের স্কোর সংরক্ষণের জন্য একটি স্কোর টেবিল। এটি করার জন্য আমরা ক্লাউড শেলে একটি C# কনসোল অ্যাপ্লিকেশন তৈরির ধাপগুলি অনুসরণ করব।

প্রথমে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি টাইপ করে Github থেকে এই কোডল্যাবের নমুনা কোডটি ক্লোন করুন:

git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git

তারপর ডিরেক্টরিটি "অ্যাপ্লিকেশন" ডিরেক্টরিতে পরিবর্তন করুন যেখানে আপনি আপনার অ্যাপ্লিকেশন তৈরি করবেন।

cd dotnet-docs-samples/applications/

এই কোডল্যাবের জন্য প্রয়োজনীয় সমস্ত কোড বিদ্যমান dotnet-docs-samples/applications/leaderboard ডিরেক্টরিতে Leaderboard নামে একটি রানযোগ্য C# অ্যাপ্লিকেশন হিসেবে অবস্থিত যা কোডল্যাবের মধ্য দিয়ে এগিয়ে যাওয়ার সাথে সাথে রেফারেন্স হিসেবে কাজ করবে। আমরা একটি নতুন ডিরেক্টরি তৈরি করব এবং পর্যায়ক্রমে লিডারবোর্ড অ্যাপ্লিকেশনের একটি অনুলিপি তৈরি করব।

অ্যাপ্লিকেশনটির জন্য "codelab" নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করে ডিরেক্টরিটি এতে পরিবর্তন করুন:

mkdir codelab && cd $_

নিম্নলিখিত কমান্ড ব্যবহার করে "লিডারবোর্ড" নামে একটি নতুন .NET C# কনসোল অ্যাপ্লিকেশন তৈরি করুন:

dotnet new console -n Leaderboard

এই কমান্ডটি একটি সহজ কনসোল অ্যাপ্লিকেশন তৈরি করে যার মধ্যে দুটি প্রাথমিক ফাইল, প্রজেক্ট ফাইল Leaderboard.csproj এবং প্রোগ্রাম ফাইল Program.cs রয়েছে।

চলুন এটি রান করি। ডিরেক্টরিটি নতুন তৈরি লিডারবোর্ড ডিরেক্টরিতে পরিবর্তন করুন যেখানে অ্যাপ্লিকেশনটি থাকে:

cd Leaderboard

তারপর এটি চালানোর জন্য নিম্নলিখিত কমান্ডটি প্রবেশ করান।

dotnet run

তুমি "হ্যালো ওয়ার্ল্ড!" অ্যাপ্লিকেশন আউটপুট দেখতে পাবে।

এবার আসুন আমাদের কনসোল অ্যাপটি আপডেট করি Program.cs এডিট করে C# Spanner ক্লায়েন্ট লাইব্রেরি ব্যবহার করে দুটি টেবিল Players এবং Scores সমন্বিত একটি লিডারবোর্ড তৈরি করতে। আপনি এটি সরাসরি Cloud Shell Editor এ করতে পারেন:

নিচে হাইলাইট করা আইকনে ক্লিক করে ক্লাউড শেল এডিটর খুলুন:

73cf70e05f653ca.png সম্পর্কে

এরপর, ক্লাউড শেল এডিটরে Program.cs ফাইলটি খুলুন এবং ফাইলের বিদ্যমান কোডটি leaderboard ডাটাবেস এবং Players এবং Scores টেবিল তৈরি করার জন্য প্রয়োজনীয় কোড দিয়ে প্রতিস্থাপন করুন, নিম্নলিখিত C# অ্যাপ্লিকেশন কোডটি Program.cs ফাইলে পেস্ট করুন:

using System;
using System.Threading.Tasks;
using Google.Cloud.Spanner.Data;
using CommandLine;

namespace GoogleCloudSamples.Leaderboard
{
    [Verb("create", HelpText = "Create a sample Cloud Spanner database "
        + "along with sample 'Players' and 'Scores' tables in your project.")]
    class CreateOptions
    {
        [Value(0, HelpText = "The project ID of the project to use "
            + "when creating Cloud Spanner resources.", Required = true)]
        public string projectId { get; set; }
        [Value(1, HelpText = "The ID of the instance where the sample database "
            + "will be created.", Required = true)]
        public string instanceId { get; set; }
        [Value(2, HelpText = "The ID of the sample database to create.",
            Required = true)]
        public string databaseId { get; set; }
    }

    public class Program
    {
        enum ExitCode : int
        {
            Success = 0,
            InvalidParameter = 1,
        }

        public static object Create(string projectId,
            string instanceId, string databaseId)
        {
            var response =
                CreateAsync(projectId, instanceId, databaseId);
            Console.WriteLine("Waiting for operation to complete...");
            response.Wait();
            Console.WriteLine($"Operation status: {response.Status}");
            Console.WriteLine($"Created sample database {databaseId} on "
                + $"instance {instanceId}");
            return ExitCode.Success;
        }

        public static async Task CreateAsync(
            string projectId, string instanceId, string databaseId)
        {
            // Initialize request connection string for database creation.
            string connectionString =
                $"Data Source=projects/{projectId}/instances/{instanceId}";
            using (var connection = new SpannerConnection(connectionString))
            {
                string createStatement = $"CREATE DATABASE `{databaseId}`";
                string[] createTableStatements = new string[] {
                  // Define create table statement for Players table.
                  @"CREATE TABLE Players(
                    PlayerId INT64 NOT NULL,
                    PlayerName STRING(2048) NOT NULL
                  ) PRIMARY KEY(PlayerId)",
                  // Define create table statement for Scores table.
                  @"CREATE TABLE Scores(
                    PlayerId INT64 NOT NULL,
                    Score INT64 NOT NULL,
                    Timestamp TIMESTAMP NOT NULL OPTIONS(allow_commit_timestamp=true)
                  ) PRIMARY KEY(PlayerId, Timestamp),
                      INTERLEAVE IN PARENT Players ON DELETE NO ACTION" };
                // Make the request.
                var cmd = connection.CreateDdlCommand(
                    createStatement, createTableStatements);
                try
                {
                    await cmd.ExecuteNonQueryAsync();
                }
                catch (SpannerException e) when
                    (e.ErrorCode == ErrorCode.AlreadyExists)
                {
                    // OK.
                }
            }
        }

        public static int Main(string[] args)
        {
            var verbMap = new VerbMap<object>();
            verbMap
                .Add((CreateOptions opts) => Create(
                    opts.projectId, opts.instanceId, opts.databaseId))
                .NotParsedFunc = (err) => 1;
            return (int)verbMap.Run(args);
        }
    }
}

প্রোগ্রাম কোডের একটি পরিষ্কার চিত্র প্রদানের জন্য, এখানে প্রোগ্রামের একটি চিত্র দেওয়া হল যার প্রধান উপাদানগুলি লেবেলযুক্ত:

b70b1b988ea3ac8a.png সম্পর্কে

কোড যোগ করার পর আপনার Program.cs ফাইলটি কেমন দেখাবে তার একটি উদাহরণ দেখতে dotnet-docs-samples/applications/leaderboard/step4 ডিরেক্টরিতে থাকা Program.cs ফাইলটি ব্যবহার করে create কমান্ড সক্রিয় করতে পারেন।

এরপর ক্লাউড শেল এডিটর ব্যবহার করে প্রোগ্রামের প্রজেক্ট ফাইল Leaderboard.csproj খুলুন এবং সম্পাদনা করুন, এটিকে নিম্নলিখিত কোডের মতো দেখতে আপডেট করুন। ক্লাউড শেল এডিটরের "ফাইল" মেনু ব্যবহার করে আপনার সমস্ত পরিবর্তন সংরক্ষণ করুন।

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Google.Cloud.Spanner.Data" Version="3.3.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\..\commandlineutil\Lib\CommandLineUtil.csproj" />
  </ItemGroup>

</Project>

এই পরিবর্তনটি C# Spanner Nuget প্যাকেজ Google.Cloud.Spanner.Data তে একটি রেফারেন্স যোগ করেছে যা আমাদের Cloud Spanner API-এর সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজন। এই পরিবর্তনটি CommandLineUtil প্রকল্পের একটি রেফারেন্সও যোগ করেছে যা dotnet-doc-samples Github রিপোজিটরির অংশ এবং ওপেন সোর্স CommandLineParser এ একটি দরকারী "verbmap" এক্সটেনশন প্রদান করে; কনসোল অ্যাপ্লিকেশনের জন্য কমান্ড লাইন ইনপুট পরিচালনা করার জন্য একটি সহজ লাইব্রেরি।

কোড যোগ করার পর আপনার Leaderboard.csproj ফাইলটি কেমন দেখাবে তার একটি উদাহরণ দেখতে আপনি dotnet-docs-samples/applications/leaderboard/step4 ডিরেক্টরিতে Leaderboard.csproj ফাইলটি ব্যবহার করতে পারেন। create কমান্ড সক্রিয় করার জন্য কোডটি যোগ করার পরে আপনার Leaderboard.csproj ফাইলটি কেমন দেখাবে তার একটি উদাহরণ দেখতে পারেন।

এখন আপনি আপনার আপডেট করা নমুনা চালানোর জন্য প্রস্তুত। আপনার আপডেট করা অ্যাপ্লিকেশনের ডিফল্ট প্রতিক্রিয়া দেখতে নিম্নলিখিতটি টাইপ করুন:

dotnet run

আপনি নিম্নলিখিত মত আউটপুট দেখতে পাবেন:

Leaderboard 1.0.0
Copyright (C) 2018 Leaderboard

ERROR(S):
  No verb selected.

  create     Create a sample Cloud Spanner database along with sample 'Players' and 'Scores' tables in your project.

  help       Display more information on a specific command.

  version    Display version information.

এই উত্তর থেকে আমরা দেখতে পাচ্ছি যে এটি Leaderboard অ্যাপ্লিকেশন যা তিনটি সম্ভাব্য কমান্ডের একটি দিয়ে চালানো যেতে পারে: create , help , এবং version .

Spanner ডাটাবেস এবং টেবিল তৈরি করতে create কমান্ডটি চেষ্টা করে দেখা যাক। কমান্ডের প্রত্যাশিত আর্গুমেন্টগুলি দেখতে আর্গুমেন্ট ছাড়াই কমান্ডটি চালান।

dotnet run create

আপনার নিচের মতো একটি প্রতিক্রিয়া দেখা উচিত:

Leaderboard 1.0.0
Copyright (C) 2018 Leaderboard

ERROR(S):
  A required value not bound to option name is missing.

  --help          Display this help screen.

  --version       Display version information.

  value pos. 0    Required. The project ID of the project to use when creating Cloud Spanner resources.

  value pos. 1    Required. The ID of the instance where the sample database will be created.

  value pos. 2    Required. The ID of the sample database to create.

এখানে আমরা দেখতে পাচ্ছি যে create কমান্ডের প্রত্যাশিত আর্গুমেন্টগুলি হল Project ID, Instance ID, এবং Database ID।

এবার নিচের কমান্ডটি চালান। এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন

dotnet run create PROJECT_ID cloudspanner-leaderboard leaderboard

কয়েক সেকেন্ড পরে আপনি নিচের মত একটি প্রতিক্রিয়া দেখতে পাবেন:

Waiting for operation to complete...
Operation status: RanToCompletion
Created sample database leaderboard on instance cloudspanner-leaderboard

ক্লাউড কনসোলের ক্লাউড স্প্যানার বিভাগে , বাম দিকের মেনুতে আপনার নতুন ডাটাবেস এবং টেবিলগুলি প্রদর্শিত হবে।

ba9008bb84cb90b0.png সম্পর্কে

পরবর্তী ধাপে আমরা আপনার নতুন ডাটাবেসে কিছু ডেটা লোড করার জন্য আমাদের অ্যাপ্লিকেশনটি আপডেট করব।

৫. ডেটা লোড করুন

এখন আমাদের কাছে leaderboard নামে একটি ডাটাবেস আছে যেখানে দুটি টেবিল রয়েছে; Players এবং Scores । এবার C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আমাদের Players টেবিলে খেলোয়াড় এবং আমাদের Scores টেবিলে প্রতিটি খেলোয়াড়ের জন্য র‍্যান্ডম স্কোর তৈরি করা যাক।

নিচে হাইলাইট করা আইকনে ক্লিক করে ক্লাউড শেল এডিটর খুলুন:

4d17840699d8e7ce.png সম্পর্কে

এরপর, ক্লাউড শেল এডিটরে Program.cs ফাইলটি সম্পাদনা করে একটি insert কমান্ড যোগ করুন যা Players টেবিলে 100 জন খেলোয়াড় সন্নিবেশ করতে ব্যবহার করা যেতে পারে অথবা Players টেবিলে প্রতিটি খেলোয়াড়ের জন্য Scores টেবিলে 4টি র্যান্ডম স্কোর সন্নিবেশ করতে ব্যবহার করা যেতে পারে।

প্রথমে প্রোগ্রামের উপরে "Verbmap"-এ বিদ্যমান create কমান্ড ব্লকের নীচে একটি নতুন insert কমান্ড ব্লক যুক্ত করুন:

[Verb("insert", HelpText = "Insert sample 'players' records or 'scores' records "
        + "into the database.")]
    class InsertOptions
    {
        [Value(0, HelpText = "The project ID of the project to use "
            + "when managing Cloud Spanner resources.", Required = true)]
        public string projectId { get; set; }
        [Value(1, HelpText = "The ID of the instance where the sample database resides.",
            Required = true)]
        public string instanceId { get; set; }
        [Value(2, HelpText = "The ID of the database where the sample database resides.",
            Required = true)]
        public string databaseId { get; set; }
        [Value(3, HelpText = "The type of insert to perform, 'players' or 'scores'.",
            Required = true)]
        public string insertType { get; set; }
    }

এরপর বিদ্যমান CreateAsync পদ্ধতির নিচে নিম্নলিখিত Insert , InsertPlayersAsync , এবং InsertScoresAsync পদ্ধতিগুলি যোগ করুন:

        public static object Insert(string projectId,
            string instanceId, string databaseId, string insertType)
        {
            if (insertType.ToLower() == "players")
            {
                var responseTask =
                    InsertPlayersAsync(projectId, instanceId, databaseId);
                Console.WriteLine("Waiting for insert players operation to complete...");
                responseTask.Wait();
                Console.WriteLine($"Operation status: {responseTask.Status}");
            }
            else if (insertType.ToLower() == "scores")
            {
                var responseTask =
                    InsertScoresAsync(projectId, instanceId, databaseId);
                Console.WriteLine("Waiting for insert scores operation to complete...");
                responseTask.Wait();
                Console.WriteLine($"Operation status: {responseTask.Status}");
            }
            else
            {
                Console.WriteLine("Invalid value for 'type of insert'. "
                    + "Specify 'players' or 'scores'.");
                return ExitCode.InvalidParameter;
            }
            Console.WriteLine($"Inserted {insertType} into sample database "
                + $"{databaseId} on instance {instanceId}");
            return ExitCode.Success;
        }

       public static async Task InsertPlayersAsync(string projectId,
            string instanceId, string databaseId)
        {
            string connectionString =
                $"Data Source=projects/{projectId}/instances/{instanceId}"
                + $"/databases/{databaseId}";

            long numberOfPlayers = 0;
            using (var connection = new SpannerConnection(connectionString))
            {
                await connection.OpenAsync();
                await connection.RunWithRetriableTransactionAsync(async (transaction) =>
                {
                    // Execute a SQL statement to get current number of records
                    // in the Players table to use as an incrementing value 
                    // for each PlayerName to be inserted.
                    var cmd = connection.CreateSelectCommand(
                        @"SELECT Count(PlayerId) as PlayerCount FROM Players");
                    numberOfPlayers = await cmd.ExecuteScalarAsync<long>();
                    // Insert 100 player records into the Players table.
                    SpannerBatchCommand cmdBatch = connection.CreateBatchDmlCommand();
                    for (int i = 0; i < 100; i++)
                    {
                        numberOfPlayers++;
                        SpannerCommand cmdInsert = connection.CreateDmlCommand(
                            "INSERT INTO Players "
                            + "(PlayerId, PlayerName) "
                            + "VALUES (@PlayerId, @PlayerName)",
                                new SpannerParameterCollection {
                                    {"PlayerId", SpannerDbType.Int64},
                                    {"PlayerName", SpannerDbType.String}});
                        cmdInsert.Parameters["PlayerId"].Value =
                            Math.Abs(Guid.NewGuid().GetHashCode());
                        cmdInsert.Parameters["PlayerName"].Value =
                            $"Player {numberOfPlayers}";
                        cmdBatch.Add(cmdInsert);
                    }
                    await cmdBatch.ExecuteNonQueryAsync();
                });
            }
            Console.WriteLine("Done inserting player records...");
        }

        public static async Task InsertScoresAsync(
            string projectId, string instanceId, string databaseId)
        {
            string connectionString =
            $"Data Source=projects/{projectId}/instances/{instanceId}"
            + $"/databases/{databaseId}";

            // Insert 4 score records into the Scores table for each player
            // in the Players table.
            using (var connection = new SpannerConnection(connectionString))
            {
                await connection.OpenAsync();
                await connection.RunWithRetriableTransactionAsync(async (transaction) =>
                {
                    Random r = new Random();
                    bool playerRecordsFound = false;
                    SpannerBatchCommand cmdBatch =
                                connection.CreateBatchDmlCommand();
                    var cmdLookup =
                    connection.CreateSelectCommand("SELECT * FROM Players");
                    using (var reader = await cmdLookup.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            playerRecordsFound = true;
                            for (int i = 0; i < 4; i++)
                            {
                                DateTime randomTimestamp = DateTime.Now
                                        .AddYears(r.Next(-2, 1))
                                        .AddMonths(r.Next(-12, 1))
                                        .AddDays(r.Next(-28, 0))
                                        .AddHours(r.Next(-24, 0))
                                        .AddSeconds(r.Next(-60, 0))
                                        .AddMilliseconds(r.Next(-100000, 0));
                                SpannerCommand cmdInsert =
                                connection.CreateDmlCommand(
                                    "INSERT INTO Scores "
                                    + "(PlayerId, Score, Timestamp) "
                                    + "VALUES (@PlayerId, @Score, @Timestamp)",
                                    new SpannerParameterCollection {
                                        {"PlayerId", SpannerDbType.Int64},
                                        {"Score", SpannerDbType.Int64},
                                        {"Timestamp",
                                            SpannerDbType.Timestamp}});
                                cmdInsert.Parameters["PlayerId"].Value =
                                    reader.GetFieldValue<int>("PlayerId");
                                cmdInsert.Parameters["Score"].Value =
                                    r.Next(1000, 1000001);
                                cmdInsert.Parameters["Timestamp"].Value =
                                    randomTimestamp.ToString("o");
                                cmdBatch.Add(cmdInsert);
                            }
                        }
                        if (!playerRecordsFound)
                        {
                            Console.WriteLine("Parameter 'scores' is invalid "
                            + "since no player records currently exist. First "
                            + "insert players then insert scores.");
                            Environment.Exit((int)ExitCode.InvalidParameter);
                        }
                        else
                        {
                            await cmdBatch.ExecuteNonQueryAsync();
                            Console.WriteLine(
                                "Done inserting score records..."
                            );
                        }
                    }
                });
            }
        }

তারপর, insert কমান্ডটি কার্যকরী করতে, আপনার প্রোগ্রামের "Main" পদ্ধতিতে নিম্নলিখিত কোডটি যোগ করুন:

                .Add((InsertOptions opts) => Insert(
                    opts.projectId, opts.instanceId, opts.databaseId, opts.insertType))

কোড যোগ করার পর আপনার Program.cs ফাইলটি কেমন দেখাবে তার একটি উদাহরণ দেখতে dotnet-docs-samples/applications/leaderboard/step5 ডিরেক্টরিতে থাকা Program.cs ফাইলটি ব্যবহার করে আপনি insert কমান্ড সক্রিয় করতে পারেন।

এখন প্রোগ্রামটি রান করে নিশ্চিত করা যাক যে নতুন insert কমান্ডটি প্রোগ্রামের সম্ভাব্য কমান্ডের তালিকায় অন্তর্ভুক্ত আছে। নিম্নলিখিত কমান্ডটি চালান:

dotnet run

প্রোগ্রামের ডিফল্ট আউটপুটে এখন আপনি insert কমান্ডটি দেখতে পাবেন:

Leaderboard 1.0.0
Copyright (C) 2018 Leaderboard

ERROR(S):
  No verb selected.

  create     Create a sample Cloud Spanner database along with sample 'Players' and 'Scores' tables in your project.

  insert     Insert sample 'players' records or 'scores' records into the database.

  help       Display more information on a specific command.

  version    Display version information.

এবার insert কমান্ডটি রান করে এর ইনপুট আর্গুমেন্টগুলি দেখা যাক। নিম্নলিখিত কমান্ডটি লিখুন।

dotnet run insert

এটি নিম্নলিখিত প্রতিক্রিয়াটি ফিরিয়ে দেবে:

Leaderboard 1.0.0
Copyright (C) 2018 Leaderboard

ERROR(S):
  A required value not bound to option name is missing.

  --help          Display this help screen.

  --version       Display version information.

  value pos. 0    Required. The project ID of the project to use when managing Cloud Spanner resources.

  value pos. 1    Required. The ID of the instance where the sample database resides.

  value pos. 2    Required. The ID of the database where the sample database resides.

  value pos. 3    Required. The type of insert to perform, 'players' or 'scores'.

আপনি উত্তর থেকে দেখতে পাচ্ছেন যে প্রজেক্ট আইডি, ইনস্ট্যান্স আইডি এবং ডাটাবেস আইডি ছাড়াও আরেকটি আর্গুমেন্ট value pos. 3 প্রত্যাশিত যা "ইনসার্টের ধরণ"। এই আর্গুমেন্টের 'প্লেয়ার' বা 'স্কোর' মান থাকতে পারে।

এখন create কমান্ড কল করার সময় আমরা যে একই আর্গুমেন্ট মান ব্যবহার করে insert কমান্ডটি চালাই, অতিরিক্ত "টাইপ অফ ইনসার্ট" আর্গুমেন্ট হিসেবে "players" যোগ করি। এই কোডল্যাবের শুরুতে তৈরি করা Project ID দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

dotnet run insert PROJECT_ID cloudspanner-leaderboard leaderboard players

কয়েক সেকেন্ড পরে আপনি নিচের মত একটি প্রতিক্রিয়া দেখতে পাবেন:

Waiting for insert players operation to complete...
Done inserting player records...
Operation status: RanToCompletion
Inserted players into sample database leaderboard on instance cloudspanner-leaderboard

এবার C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আমাদের Scores টেবিলে চারটি র‍্যান্ডম স্কোর এবং Players টেবিলের প্রতিটি খেলোয়াড়ের জন্য টাইমস্ট্যাম্প তৈরি করা যাক।

Scores টেবিলের Timestamp কলামটিকে নিম্নলিখিত SQL স্টেটমেন্টের মাধ্যমে "কমিট টাইমস্ট্যাম্প" কলাম হিসাবে সংজ্ঞায়িত করা হয়েছিল যা আমরা পূর্বে create কমান্ড চালানোর সময় কার্যকর করা হয়েছিল:

CREATE TABLE Scores(
  PlayerId INT64 NOT NULL,
  Score INT64 NOT NULL,
  Timestamp TIMESTAMP NOT NULL OPTIONS(allow_commit_timestamp=true)
) PRIMARY KEY(PlayerId, Timestamp),
    INTERLEAVE IN PARENT Players ON DELETE NO ACTION

OPTIONS(allow_commit_timestamp=true) অ্যাট্রিবিউটটি লক্ষ্য করুন। এটি Timestamp একটি "কমিট টাইমস্ট্যাম্প" কলাম করে তোলে এবং একটি প্রদত্ত টেবিল সারিতে INSERT এবং UPDATE ক্রিয়াকলাপের জন্য সঠিক লেনদেনের টাইমস্ট্যাম্প দিয়ে এটি স্বয়ংক্রিয়ভাবে পূর্ণ হতে সক্ষম করে।

আপনি "কমিট টাইমস্ট্যাম্প" কলামে আপনার নিজস্ব টাইমস্ট্যাম্প মানগুলিও সন্নিবেশ করতে পারেন যতক্ষণ না আপনি অতীতের মান সহ একটি টাইমস্ট্যাম্প সন্নিবেশ করেন, যা আমরা এই কোডল্যাবের উদ্দেশ্যে করব।

এখন আসুন insert কমান্ডটি সেই একই আর্গুমেন্ট ভ্যালু দিয়ে রান করি যা আমরা create কমান্ড কল করার সময় ব্যবহার করেছিলাম এবং অতিরিক্ত "টাইপ অফ ইনসার্ট" আর্গুমেন্ট হিসেবে "scores" যোগ করেছিলাম। এই কোডল্যাবের শুরুতে তৈরি করা Project ID দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

dotnet run insert PROJECT_ID cloudspanner-leaderboard leaderboard scores

কয়েক সেকেন্ড পরে আপনি নিচের মত একটি প্রতিক্রিয়া দেখতে পাবেন:

Waiting for insert players operation to complete...
Done inserting player records...
Operation status: RanToCompletion
Inserted players into sample database leaderboard on instance cloudspanner-leaderboard

scores হিসেবে নির্দিষ্ট "টাইপ অফ ইনসার্ট" দিয়ে insert চালানোর জন্য InsertScoresAsync পদ্ধতিটি কল করা হয় যা নিম্নলিখিত কোড স্নিপেটগুলি ব্যবহার করে অতীতে ঘটে যাওয়া তারিখ-সময় সহ একটি এলোমেলোভাবে তৈরি টাইমস্ট্যাম্প সন্নিবেশ করায়:

DateTime randomTimestamp = DateTime.Now
    .AddYears(r.Next(-2, 1))
    .AddMonths(r.Next(-12, 1))
    .AddDays(r.Next(-28, 0))
    .AddHours(r.Next(-24, 0))
    .AddSeconds(r.Next(-60, 0))
    .AddMilliseconds(r.Next(-100000, 0));
...
 cmdInsert.Parameters["Timestamp"].Value = randomTimestamp.ToString("o");

"Insert" লেনদেন ঠিক কখন হবে তার টাইমস্ট্যাম্প দিয়ে Timestamp কলামে স্বয়ংক্রিয়ভাবে পূর্ণ করার জন্য, আপনি নিম্নলিখিত কোড স্নিপেটের মতো C# ধ্রুবক SpannerParameter.CommitTimestamp সন্নিবেশ করতে পারেন:

cmd.Parameters["Timestamp"].Value = SpannerParameter.CommitTimestamp;

এখন যেহেতু আমরা ডেটা লোডিং সম্পন্ন করেছি, আসুন আমাদের নতুন টেবিলে লেখা মানগুলি যাচাই করি। প্রথমে leaderboard ডাটাবেস নির্বাচন করুন এবং তারপর Players টেবিল নির্বাচন করুন। Data ট্যাবে ক্লিক করুন। আপনি দেখতে পাবেন যে টেবিলের PlayerId এবং PlayerName কলামে আপনার ডেটা আছে।

7bc2c96293c31c49.png সম্পর্কে

এরপর Scores টেবিলে ক্লিক করে Data ট্যাব নির্বাচন করে Scores টেবিলেও ডেটা আছে কিনা তা যাচাই করা যাক। আপনি দেখতে পাবেন যে টেবিলের PlayerId , Timestamp এবং Score কলামে আপনার ডেটা আছে।

d8a4ee4f13244c19.png সম্পর্কে

দারুন! আসুন আমাদের প্রোগ্রামটি আপডেট করি যাতে কিছু কোয়েরি চালানো যায় যা দিয়ে আমরা একটি গেমিং লিডারবোর্ড তৈরি করতে পারি।

৬. লিডারবোর্ড কোয়েরি চালান

এখন যেহেতু আমরা আমাদের ডাটাবেস সেট আপ করেছি এবং আমাদের টেবিলে তথ্য লোড করেছি, আসুন এই ডেটা ব্যবহার করে একটি লিডারবোর্ড তৈরি করি। এটি করার জন্য আমাদের নিম্নলিখিত চারটি প্রশ্নের উত্তর দিতে হবে:

  1. সর্বকালের "শীর্ষ দশ" খেলোয়াড় কোন কোন?
  2. বছরের "শীর্ষ দশ" খেলোয়াড় কোন কোন?
  3. মাসের "শীর্ষ দশ" খেলোয়াড় কোন কোন?
  4. সপ্তাহের "সেরা দশ" খেলোয়াড় কোন কোন?

এই প্রশ্নের উত্তর দেওয়ার জন্য SQL কোয়েরিগুলি চালানোর জন্য আমাদের প্রোগ্রামটি আপডেট করা যাক।

আমরা একটি query কমান্ড যুক্ত করব যা আমাদের লিডারবোর্ডের জন্য প্রয়োজনীয় তথ্য তৈরি করবে এমন প্রশ্নের উত্তর দেওয়ার জন্য কোয়েরিগুলি চালানোর একটি উপায় প্রদান করবে।

ক্লাউড শেল এডিটরে Program.cs ফাইলটি সম্পাদনা করে প্রোগ্রামটি আপডেট করে একটি query কমান্ড যোগ করুন।

প্রথমে প্রোগ্রামের উপরে "Verbmap"-এ বিদ্যমান insert কমান্ড ব্লকের নীচে একটি নতুন query কমান্ড ব্লক যুক্ত করুন:

    [Verb("query", HelpText = "Query players with 'Top Ten' scores within a specific timespan "
        + "from sample Cloud Spanner database table.")]
    class QueryOptions
    {
        [Value(0, HelpText = "The project ID of the project to use "
            + "when managing Cloud Spanner resources.", Required = true)]
        public string projectId { get; set; }
        [Value(1, HelpText = "The ID of the instance where the sample data resides.",
            Required = true)]
        public string instanceId { get; set; }
        [Value(2, HelpText = "The ID of the database where the sample data resides.",
            Required = true)]
        public string databaseId { get; set; }
        [Value(3, Default = 0, HelpText = "The timespan in hours that will be used to filter the "
            + "results based on a record's timestamp. The default will return the "
            + "'Top Ten' scores of all time.")]
        public int timespan { get; set; }
    }

এরপর বিদ্যমান InsertScoresAsync পদ্ধতির নিচে নিম্নলিখিত Query এবং QueryAsync পদ্ধতিগুলি যোগ করুন:

public static object Query(string projectId,
            string instanceId, string databaseId, int timespan)
        {
            var response = QueryAsync(
                projectId, instanceId, databaseId, timespan);
            response.Wait();
            return ExitCode.Success;
        }        

public static async Task QueryAsync(
            string projectId, string instanceId, string databaseId, int timespan)
        {
            string connectionString =
            $"Data Source=projects/{projectId}/instances/"
            + $"{instanceId}/databases/{databaseId}";
            // Create connection to Cloud Spanner.
            using (var connection = new SpannerConnection(connectionString))
            {
                string sqlCommand;
                if (timespan == 0)
                {
                    // No timespan specified. Query Top Ten scores of all time.
                    sqlCommand =
                        @"SELECT p.PlayerId, p.PlayerName, s.Score, s.Timestamp
                            FROM Players p
                            JOIN Scores s ON p.PlayerId = s.PlayerId
                            ORDER BY s.Score DESC LIMIT 10";
                }
                else
                {
                    // Query Top Ten scores filtered by the timepan specified.
                    sqlCommand =
                        $@"SELECT p.PlayerId, p.PlayerName, s.Score, s.Timestamp
                            FROM Players p
                            JOIN Scores s ON p.PlayerId = s.PlayerId
                            WHERE s.Timestamp >
                            TIMESTAMP_SUB(CURRENT_TIMESTAMP(),
                                INTERVAL {timespan.ToString()} HOUR)
                            ORDER BY s.Score DESC LIMIT 10";
                }
                var cmd = connection.CreateSelectCommand(sqlCommand);
                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    while (await reader.ReadAsync())
                    {
                        Console.WriteLine("PlayerId : "
                          + reader.GetFieldValue<string>("PlayerId")
                          + " PlayerName : "
                          + reader.GetFieldValue<string>("PlayerName")
                          + " Score : "
                          + string.Format("{0:n0}",
                            Int64.Parse(reader.GetFieldValue<string>("Score")))
                          + " Timestamp : "
                          + reader.GetFieldValue<string>("Timestamp").Substring(0, 10));
                    }
                }
            }
        }

তারপর, query কমান্ডটি কার্যকরী করতে, আপনার প্রোগ্রামের "মেইন" পদ্ধতিতে নিম্নলিখিত কোডটি যুক্ত করুন:

                .Add((QueryOptions opts) => Query(
                    opts.projectId, opts.instanceId, opts.databaseId, opts.timespan))

কোড যোগ করার পর আপনার Program.cs ফাইলটি কেমন দেখাবে তার একটি উদাহরণ দেখতে dotnet-docs-samples/applications/leaderboard/step6 ডিরেক্টরিতে থাকা Program.cs ফাইলটি ব্যবহার করে আপনি query কমান্ড সক্রিয় করতে পারেন।

এখন প্রোগ্রামটি রান করে নিশ্চিত করা যাক যে নতুন query কমান্ডটি প্রোগ্রামের সম্ভাব্য কমান্ডের তালিকায় অন্তর্ভুক্ত আছে। নিম্নলিখিত কমান্ডটি চালান:

dotnet run

প্রোগ্রামের ডিফল্ট আউটপুটে এখন একটি নতুন কমান্ড বিকল্প হিসেবে query কমান্ডটি অন্তর্ভুক্ত দেখতে পাবেন:

Leaderboard 1.0.0
Copyright (C) 2018 Leaderboard

ERROR(S):
  No verb selected.

  create     Create a sample Cloud Spanner database along with sample 'Players' and 'Scores' tables in your project.

  insert     Insert sample 'players' records or 'scores' records into the database.

  query      Query players with 'Top Ten' scores within a specific timespan from sample Cloud Spanner database table.

  help       Display more information on a specific command.

  version    Display version information.

এবার আসুন query কমান্ডটি রান করে এর ইনপুট আর্গুমেন্টগুলি দেখি। নিম্নলিখিত কমান্ডটি লিখুন:

dotnet run query

এটি নিম্নলিখিত প্রতিক্রিয়াটি ফিরিয়ে দেবে:

Leaderboard 1.0.0
Copyright (C) 2018 Leaderboard

ERROR(S):
  A required value not bound to option name is missing.

  --help          Display this help screen.

  --version       Display version information.

  value pos. 0    Required. The project ID of the project to use when managing Cloud Spanner resources.

  value pos. 1    Required. The ID of the instance where the sample data resides.

  value pos. 2    Required. The ID of the database where the sample data resides.

  value pos. 3    (Default: 0) The timespan in hours that will be used to filter the results based on a record's timestamp. The default will return the 'Top Ten' scores of all time.

আপনি উত্তর থেকে দেখতে পাচ্ছেন যে প্রজেক্ট আইডি, ইনস্ট্যান্স আইডি এবং ডাটাবেস আইডি ছাড়াও আরেকটি আর্গুমেন্ট value pos. 3 প্রত্যাশিত যা আমাদের Scores টেবিলের Timestamp কলামে রেকর্ড ফিল্টার করার জন্য ব্যবহৃত ঘন্টার সংখ্যার একটি টাইমস্প্যান নির্দিষ্ট করতে দেয়। এই আর্গুমেন্টের ডিফল্ট মান 0 যার অর্থ কোনও রেকর্ড টাইমস্ট্যাম্প দ্বারা ফিল্টার করা হবে না। তাই আমরা "টাইমসপেন" মান ছাড়াই query কমান্ড ব্যবহার করে আমাদের সর্বকালের "শীর্ষ দশ" খেলোয়াড়দের তালিকা পেতে পারি।

"টাইমস্প্যান" উল্লেখ না করেই query কমান্ডটি রান করা যাক, create কমান্ড চালানোর সময় আমরা যে আর্গুমেন্ট মান ব্যবহার করেছিলাম সেই একই মান ব্যবহার করে। এই কোডল্যাবের শুরুতে তৈরি করা Project ID দিয়ে PROJECT_ID প্রতিস্থাপন করতে ভুলবেন না

dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard

আপনি এমন একটি প্রতিক্রিয়া দেখতে পাবেন যেখানে সর্বকালের "শীর্ষ দশ" খেলোয়াড়দের অন্তর্ভুক্ত থাকবে, যেমন:

PlayerId : 1843159180 PlayerName : Player 87 Score : 998,955 Timestamp : 2016-03-23
PlayerId : 61891198 PlayerName : Player 19 Score : 998,720 Timestamp : 2016-03-26
PlayerId : 340906298 PlayerName : Player 48 Score : 993,302 Timestamp : 2015-08-27
PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 857460496 PlayerName : Player 68 Score : 988,010 Timestamp : 2015-05-25
PlayerId : 1826646419 PlayerName : Player 91 Score : 984,022 Timestamp : 2016-11-26
PlayerId : 1002199735 PlayerName : Player 35 Score : 982,933 Timestamp : 2015-09-26
PlayerId : 2002563755 PlayerName : Player 23 Score : 979,041 Timestamp : 2016-10-25
PlayerId : 1377548191 PlayerName : Player 2 Score : 978,632 Timestamp : 2016-05-02
PlayerId : 1358098565 PlayerName : Player 65 Score : 973,257 Timestamp : 2016-10-30

এবার আসুন "শীর্ষ দশ" খেলোয়াড়দের জিজ্ঞাসা করার জন্য প্রয়োজনীয় আর্গুমেন্ট সহ query কমান্ডটি চালাই, যা বছরে ঘন্টার সংখ্যার সমান "সময়কাল" নির্দিষ্ট করে, যা 8760। এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard 8760

আপনি এমন একটি প্রতিক্রিয়া দেখতে পাবেন যেখানে বছরের "শীর্ষ দশ" খেলোয়াড়দের নাম অন্তর্ভুক্ত থাকবে, যেমন:

PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 228469898 PlayerName : Player 82 Score : 967,177 Timestamp : 2018-01-26
PlayerId : 1131343000 PlayerName : Player 26 Score : 944,725 Timestamp : 2017-05-26
PlayerId : 396780730 PlayerName : Player 41 Score : 929,455 Timestamp : 2017-09-26
PlayerId : 61891198 PlayerName : Player 19 Score : 921,251 Timestamp : 2018-05-01
PlayerId : 634269851 PlayerName : Player 54 Score : 909,379 Timestamp : 2017-07-24
PlayerId : 821111159 PlayerName : Player 55 Score : 908,402 Timestamp : 2017-05-25
PlayerId : 228469898 PlayerName : Player 82 Score : 889,040 Timestamp : 2017-12-26
PlayerId : 1408782275 PlayerName : Player 27 Score : 874,124 Timestamp : 2017-09-24
PlayerId : 1002199735 PlayerName : Player 35 Score : 864,758 Timestamp : 2018-04-24

এবার আসুন মাসের "শীর্ষ দশ" খেলোয়াড়দের জিজ্ঞাসা করার জন্য query কমান্ডটি চালাই, যা মাসে ঘন্টার সংখ্যার সমান "সময়কাল" নির্দিষ্ট করে, যা 730। এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard 730

আপনি নিম্নলিখিতগুলির মতো মাসের "শীর্ষ দশ" খেলোয়াড়দের অন্তর্ভুক্ত একটি প্রতিক্রিয়া দেখতে পাবেন:

PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 61891198 PlayerName : Player 19 Score : 921,251 Timestamp : 2018-05-01
PlayerId : 1002199735 PlayerName : Player 35 Score : 864,758 Timestamp : 2018-04-24
PlayerId : 1228490432 PlayerName : Player 11 Score : 682,033 Timestamp : 2018-04-26
PlayerId : 648239230 PlayerName : Player 92 Score : 653,895 Timestamp : 2018-05-02
PlayerId : 70762849 PlayerName : Player 77 Score : 598,074 Timestamp : 2018-04-22
PlayerId : 1671215342 PlayerName : Player 62 Score : 506,770 Timestamp : 2018-04-28
PlayerId : 1208850523 PlayerName : Player 21 Score : 216,008 Timestamp : 2018-04-30
PlayerId : 1587692674 PlayerName : Player 63 Score : 188,157 Timestamp : 2018-04-25
PlayerId : 992391797 PlayerName : Player 37 Score : 167,175 Timestamp : 2018-04-30

এবার আসুন সপ্তাহের "শীর্ষ দশ" খেলোয়াড়দের জিজ্ঞাসা করার জন্য query কমান্ডটি চালাই, সপ্তাহে যত ঘন্টা সময় লাগে তার সমান "সময়কাল" নির্দিষ্ট করে, যা হল ১৬৮। এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard 168

আপনি সপ্তাহের "শীর্ষ দশ" খেলোয়াড়দের অন্তর্ভুক্ত করে একটি প্রতিক্রিয়া দেখতে পাবেন, যেমন:

PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 61891198 PlayerName : Player 19 Score : 921,251 Timestamp : 2018-05-01
PlayerId : 228469898 PlayerName : Player 82 Score : 853,602 Timestamp : 2018-04-28
PlayerId : 1131343000 PlayerName : Player 26 Score : 695,318 Timestamp : 2018-04-30
PlayerId : 1228490432 PlayerName : Player 11 Score : 682,033 Timestamp : 2018-04-26
PlayerId : 1408782275 PlayerName : Player 27 Score : 671,827 Timestamp : 2018-04-27
PlayerId : 648239230 PlayerName : Player 92 Score : 653,895 Timestamp : 2018-05-02
PlayerId : 816861444 PlayerName : Player 83 Score : 622,277 Timestamp : 2018-04-27
PlayerId : 162043954 PlayerName : Player 75 Score : 572,634 Timestamp : 2018-05-02
PlayerId : 1671215342 PlayerName : Player 62 Score : 506,770 Timestamp : 2018-04-28

দারুন কাজ!

এখন আপনি রেকর্ড যোগ করার সাথে সাথে স্প্যানার আপনার ডাটাবেসকে যত বড়ই হোক না কেন স্কেল করবে।

আপনার ডাটাবেস যতই বৃদ্ধি পাক না কেন, স্প্যানার এবং এর ট্রুটাইম প্রযুক্তির সাহায্যে আপনার গেমের লিডারবোর্ড নির্ভুলতার সাথে স্কেল করা চালিয়ে যেতে পারে।

৭. পরিষ্কার-পরিচ্ছন্নতা

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

৮. অভিনন্দন!

আমরা যা কভার করেছি:

  • লিডারবোর্ডের জন্য গুগল ক্লাউড স্প্যানার ইনস্ট্যান্স, ডাটাবেস এবং টেবিল স্কিমা
  • কিভাবে .NET Core C# কনসোল অ্যাপ্লিকেশন তৈরি করবেন
  • C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে একটি স্প্যানার ডাটাবেস এবং টেবিল তৈরি করবেন
  • C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে স্প্যানার ডাটাবেসে ডেটা কীভাবে লোড করবেন
  • স্প্যানার কমিট টাইমস্ট্যাম্প এবং C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার ডেটা থেকে "টপ টেন" ফলাফল কীভাবে অনুসন্ধান করবেন

পরবর্তী পদক্ষেপ:

আপনার মতামত জানান

  • আমাদের খুব ছোট জরিপটি সম্পূর্ণ করার জন্য একটু সময় নিন।