Google App Engine Java অ্যাপ থেকে বিল্ডপ্যাক সহ ক্লাউড রানে স্থানান্তরিত হচ্ছে

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

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

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

অ্যাপ ইঞ্জিন থেকে ক্লাউড রানে যাওয়ার প্রয়োজনীয় পদক্ষেপগুলি শেখানোর পাশাপাশি, আপনি জাভা 8 অ্যাপ ইঞ্জিন অ্যাপকে জাভা 17 এ আপগ্রেড করতে শিখবেন।

আপনি যে অ্যাপ্লিকেশনটি স্থানান্তরিত করতে আগ্রহী সেটি যদি অ্যাপ ইঞ্জিনের লিগ্যাসি বান্ডিল পরিষেবা, বা অন্যান্য অ্যাপ ইঞ্জিন নির্দিষ্ট বৈশিষ্ট্যগুলির ব্যাপক ব্যবহার করে, তবে Java 11/17 গাইডের জন্য অ্যাক্সেসিং অ্যাপ ইঞ্জিন বান্ডিল পরিষেবাগুলি এই কোডল্যাবের চেয়ে ভাল ফিট হতে পারে৷

আপনি কিভাবে শিখবেন

  • ক্লাউড শেল ব্যবহার করুন
  • ক্লাউড রান, আর্টিফ্যাক্ট রেজিস্ট্রি এবং ক্লাউড বিল্ড এপিআই সক্ষম করুন
  • ক্লাউড বিল্ডে বিল্ডপ্যাক ব্যবহার করে আপনার অ্যাপকে কন্টেইনারাইজ করুন
  • ক্লাউড রানে আপনার কন্টেইনার ইমেজ স্থাপন করুন

আপনি কি প্রয়োজন হবে

জরিপ

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

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

জাভা নিয়ে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

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

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

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

2. পটভূমি

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

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

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

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

3. সেটআপ/প্রিওয়ার্ক

1. সেটআপ প্রকল্প

এই টিউটোরিয়ালের জন্য, আপনি একটি নতুন প্রকল্পে appengine-java-migration-samples repository থেকে একটি নমুনা অ্যাপ ব্যবহার করবেন। প্রকল্পের একটি সক্রিয় বিলিং অ্যাকাউন্ট আছে তা নিশ্চিত করুন।

আপনি যদি একটি বিদ্যমান অ্যাপ ইঞ্জিন অ্যাপ্লিকেশনটিকে ক্লাউড রানে স্থানান্তর করতে চান তবে আপনি পরিবর্তে অনুসরণ করতে সেই অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন।

আপনার প্রকল্পের জন্য প্রয়োজনীয় API গুলি সক্ষম করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com

2. বেসলাইন নমুনা অ্যাপ পান

আপনার নিজের মেশিনে বা ক্লাউড শেল থেকে নমুনা অ্যাপটি ক্লোন করুন, তারপর বেসলাইন ফোল্ডারে নেভিগেট করুন।

নমুনাটি একটি জাভা 8, সার্ভলেট-ভিত্তিক ডেটাস্টোর অ্যাপ যা অ্যাপ ইঞ্জিনে স্থাপনার উদ্দেশ্যে। অ্যাপ ইঞ্জিন স্থাপনের জন্য এই অ্যাপটি কীভাবে প্রস্তুত করবেন সে সম্পর্কে README-এর নির্দেশাবলী অনুসরণ করুন।

3. (ঐচ্ছিক) বেসলাইন অ্যাপ স্থাপন করুন

আমরা ক্লাউড রানে স্থানান্তরিত করার আগে অ্যাপটি অ্যাপ ইঞ্জিনে কাজ করে কিনা তা নিশ্চিত করতে চাইলেই নিম্নলিখিতগুলি প্রয়োজনীয়৷

README.md-এর ধাপগুলি পড়ুন:

  1. gcloud CLI এর সাথে নিজেকে ইনস্টল/পুনরায় পরিচিত করুন
  2. gcloud init দিয়ে আপনার প্রকল্পের জন্য gcloud CLI আরম্ভ করুন
  3. gcloud app create করে অ্যাপ ইঞ্জিন প্রকল্প তৈরি করুন
  4. অ্যাপ ইঞ্জিনে নমুনা অ্যাপটি স্থাপন করুন
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
  1. অ্যাপটি অ্যাপ ইঞ্জিনে কোন সমস্যা ছাড়াই চলে তা নিশ্চিত করুন

4. একটি আর্টিফ্যাক্ট রেজিস্ট্রি সংগ্রহস্থল তৈরি করুন

আপনার অ্যাপ কন্টেইনারাইজ করার পরে, আপনার ছবিগুলি পুশ এবং সংরক্ষণ করার জন্য আপনার কোথাও প্রয়োজন হবে৷ Google ক্লাউডে এটি সম্পর্কে যাওয়ার প্রস্তাবিত উপায় হল আর্টিফ্যাক্ট রেজিস্ট্রি

এইভাবে gcloud দিয়ে migration নামের সংগ্রহস্থল তৈরি করুন:

gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"

মনে রাখবেন যে এই সংগ্রহস্থলটি docker ফর্ম্যাট টাইপ ব্যবহার করে, তবে বিভিন্ন ধরনের সংগ্রহস্থল উপলব্ধ রয়েছে।

এই মুহুর্তে, আপনার কাছে আপনার বেসলাইন অ্যাপ ইঞ্জিন অ্যাপ রয়েছে এবং আপনার Google ক্লাউড প্রকল্প এটিকে ক্লাউড রানে স্থানান্তর করার জন্য প্রস্তুত।

4. অ্যাপ্লিকেশন ফাইলগুলি সংশোধন করুন৷

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

1. জাভা 17 এ আপগ্রেড করা হচ্ছে

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

নিম্নলিখিতগুলি অন্তর্ভুক্ত করতে আপনার pom.xml এর বৈশিষ্ট্যগুলি আপডেট করে শুরু করুন:

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

এটি প্রকল্প সংস্করণটিকে 17 এ সেট করবে, কম্পাইলার প্লাগইনকে জানাবে যে আপনি java 17 ভাষার বৈশিষ্ট্যগুলিতে অ্যাক্সেস চান এবং কম্পাইল করা ক্লাসগুলি Java 17 JVM-এর সাথে সামঞ্জস্যপূর্ণ হতে চান।

2. একটি ওয়েব সার্ভার সহ

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

নিম্নলিখিত নির্ভরতা যোগ করুন:

<dependencies>
<!-- ... -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <version>2.6.6</version>
       <exclusions>
           <!-- Exclude the Tomcat dependency -->
           <exclusion>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-tomcat</artifactId>
           </exclusion>
       </exclusions>
   </dependency>
   <!-- Use Jetty instead -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jetty</artifactId>
       <version>2.6.6</version>
   </dependency>
<!-- ... -->
</dependencies>

স্প্রিং বুট ডিফল্টরূপে একটি টমক্যাট সার্ভার এম্বেড করে, কিন্তু এই নমুনাটি সেই শিল্পকর্মটি বাদ দেবে এবং মাইগ্রেশনের পরে ডিফল্ট আচরণে পার্থক্য কমাতে জেটির সাথে লেগে থাকবে।

3. স্প্রিং বুট সেটআপ

স্প্রিং বুট পরিবর্তন ছাড়াই আপনার সার্লেটগুলি পুনরায় ব্যবহার করতে সক্ষম হবে, সেগুলি আবিষ্কারযোগ্য কিনা তা নিশ্চিত করার জন্য কিছু কনফিগারেশনের প্রয়োজন হবে৷

com.example.appengine প্যাকেজে নিম্নলিখিত MigratedServletApplication.java ক্লাস তৈরি করুন:

package com.example.appengine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
    public static void main(String[] args) {
        SpringApplication.run(MigratedServletApplication.class, args);
    }
}

মনে রাখবেন যে এতে @ServletComponentScan টীকা অন্তর্ভুক্ত রয়েছে, যা যেকোনো @WebServlets এর জন্য (ডিফল্টরূপে বর্তমান প্যাকেজে ) দেখাবে এবং সেগুলিকে প্রত্যাশিত হিসাবে উপলব্ধ করবে।

4. কনফিগারেশন তৈরি করুন

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

pom.xml ফাইলে packaging ট্যাগটি সরান:

<packaging>war</packaging>

এরপরে, spring-boot-maven-plugin যোগ করুন:

<plugins>
<!-- ... -->
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.6.6</version>
  </plugin>
<!-- ... -->
</plugins>

5. অ্যাপ ইঞ্জিন কনফিগারেশন, পরিষেবা এবং নির্ভরতা থেকে দূরে সরে যাওয়া৷

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

নমুনা অ্যাপটি লিগ্যাসি বান্ডিল করা পরিষেবাগুলি ব্যবহার করে না, তবে ব্যবহারকারীরা যাদের অ্যাপগুলি করে তারা নিম্নলিখিত নির্দেশিকাগুলি উল্লেখ করতে পারেন:

যেহেতু আপনি এখন থেকে ক্লাউড রানে স্থাপন করবেন, appengine-maven-plugin সরানো যেতে পারে:

<plugin>
 <groupId>com.google.cloud.tools</groupId>
 <artifactId>appengine-maven-plugin</artifactId>
 <version>2.4.1</version>
 <configuration>
   <!-- can be set w/ -DprojectId=myProjectId on command line -->
   <projectId>${app.projectId}</projectId>
   <!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
   <version>GCLOUD_CONFIG</version>
 </configuration>
</plugin>

5. কন্টেইনারাইজ করুন এবং অ্যাপ্লিকেশন স্থাপন করুন

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

সেই সমস্ত পূর্বশর্তগুলি যথাস্থানে রেখে, কেবলমাত্র আপনার উত্স ডিরেক্টরি থেকে নিম্নলিখিতগুলি চালান:

gcloud run deploy SERVICE --source .

রান ডিপ্লোয় কমান্ডের সময় আপনাকে কয়েকটি জিনিসের জন্য অনুরোধ করা হবে যেমন:

  • উৎস কোড অবস্থান প্রদান
  • পরিষেবার নাম প্রদান
  • Cloud Run API সক্ষম করা হচ্ছে
  • আপনার অঞ্চল নির্বাচন করা হচ্ছে

এই প্রম্পটগুলিতে সাড়া দেওয়ার পরে বিল্ড এবং স্থাপন প্রক্রিয়া শুরু হয়, যার সময় ক্লাউড বিল্ড নিম্নলিখিতগুলি করে:

  • জিপ করে এবং একটি ক্লাউড স্টোরেজ বালতিতে আপনার উৎস সংরক্ষণ করে
  • আপনার ইমেজ তৈরি করতে ব্যাকগ্রাউন্ডে ক্লাউড নেটিভ কম্পিউটিং ফাউন্ডেশন বিল্ডপ্যাক ব্যবহার করে
  • ফলস্বরূপ ধারক চিত্র সংরক্ষণ করার জন্য একটি রেজিস্ট্রি তৈরি করে (যদি ইতিমধ্যে উপস্থিত না থাকে)
  • এবং আপনার অ্যাপ হোস্ট করার জন্য একটি ক্লাউড রান পরিষেবা তৈরি করে (যদি ইতিমধ্যে উপস্থিত না থাকে)

একবার বিল্ড এবং স্থাপন করা সম্পূর্ণ হলে, আপনি একটি বার্তা পাবেন যাতে ব্যাখ্যা করা হয় যে একটি নতুন সংশোধন লাইভ এবং 100% ট্রাফিক পরিবেশন করছে৷

6. সারাংশ/পরিষ্কার

অভিনন্দন, আপনি আপগ্রেড করেছেন, কন্টেইনারাইজ করেছেন, স্থানান্তর করেছেন এবং আপনার অ্যাপ, যা এই টিউটোরিয়ালটি শেষ করেছে!

এখান থেকে, পরবর্তী ধাপ হল CI/CD এবং সফ্টওয়্যার সাপ্লাই চেইন সুরক্ষা বৈশিষ্ট্যগুলি সম্পর্কে আরও জানতে যা এখন নাগালের মধ্যে রয়েছে যা আপনি ক্লাউড বিল্ডের সাথে স্থাপন করতে পারেন:

ঐচ্ছিক: পরিষ্কার করুন এবং/অথবা পরিষেবা অক্ষম করুন

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

অন্যদিকে, আপনি যদি মাইগ্রেশন চালিয়ে যেতে না চান এবং সবকিছু সম্পূর্ণরূপে মুছে ফেলতে চান, আপনি হয় আপনার পরিষেবা মুছে ফেলতে পারেন বা আপনার প্রকল্প সম্পূর্ণরূপে বন্ধ করে দিতে পারেন

7. অতিরিক্ত সম্পদ

অ্যাপ ইঞ্জিন মাইগ্রেশন মডিউল কোডল্যাব সমস্যা/প্রতিক্রিয়া

আপনি যদি এই কোডল্যাবের সাথে কোনো সমস্যা খুঁজে পান, অনুগ্রহ করে ফাইল করার আগে প্রথমে আপনার সমস্যাটি অনুসন্ধান করুন। অনুসন্ধান এবং নতুন সমস্যা তৈরি করার লিঙ্ক:

মাইগ্রেশন সম্পদ

অনলাইন সম্পদ

নীচে অনলাইন সংস্থান রয়েছে যা এই টিউটোরিয়ালের জন্য প্রাসঙ্গিক হতে পারে:

অ্যাপ ইঞ্জিন

অন্যান্য ক্লাউড তথ্য

ভিডিও

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।