এটি কি সত্য যে কোনও একটি উত্পাদন কোডে NSLog () ব্যবহার করা উচিত নয়?


155

আমাকে এই সাইটে কয়েক বার বলা হয়েছিল, তবে আমি নিশ্চিত হয়েছি যে এটি সত্যিই ঘটনা।

আমি আশা করছিলাম যে আমার কোড জুড়ে এনএসএলগ ফাংশন কলগুলি ছিটিয়ে দিতে সক্ষম হবে এবং আমার রিলিজ / ডিস্ট্রিবিউশন বিল্ডগুলি তৈরি করার সময় Xcode / gcc স্বয়ংক্রিয়ভাবে সেই কলগুলি সরিয়ে ফেলবে।

আমি এই ব্যবহার এড়ানো উচিত? যদি তা হয় তবে অভিজ্ঞ অবজেক্টিভ-সি প্রোগ্রামারদের মধ্যে কোন বিকল্পগুলি সর্বাধিক সাধারণ?


7
আমি জানি এই প্রশ্নটি এখন অনেক পুরানো, তবে আপনি যদি এখনও করতে পারেন তবে আমি মার্ক চার্বনউয়ের উত্তরকে স্বীকৃত হিসাবে চিহ্নিত করব। আমি তার প্রতি ইঙ্গিত করার জন্য আমার উত্তরটি পরিবর্তন করেছি, তবে তার উত্তরটি সঠিক।
e. জামেস 26'09

5
কঠোর উপায় খুঁজে পেয়ে তিনি বলেছিলেন যে ঘন ঘন লুপের ভিতরে এনএসলগ () আপনার পারফরম্যান্সকে একেবারে হত্যা করবে।
willc2

উত্তর:


197

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

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

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

ওহ, এবং মনে রাখবেন #define DEBUG_MODEআপনার অ্যাপ্লিকেশনের বিভিন্ন জায়গায় আবার ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, আমার অ্যাপ্লিকেশনটিতে আমি লাইসেন্স কী চেকগুলি অক্ষম করতে এবং এটি নির্দিষ্ট তারিখের আগেই অ্যাপ্লিকেশনটি চালানোর অনুমতি দেয় run এটি আমার পক্ষে সর্বনিম্ন প্রচেষ্টা সহ একটি সীমিত, সম্পূর্ণ কার্যকরী বিটা কপি বিতরণ করতে দেয়।


8
একটি দুর্দান্ত উত্তরের জন্য +1। আপনার # ডেফাইন ম্যাক্রোগুলি যাওয়ার পথে এবং আমি আশা করি যে ওপি গ্রহণযোগ্য উত্তরটি স্যুইচ করবে (আমি তাকে একটি মন্তব্য রেখেছি) I've আমি ডামি ফাংশনটি ব্যবহার করছিলাম কারণ আপনি জানেন না যে আপনি কোনও ম্যাক্রোতে যুক্তিগুলি ব্যবহার করতে পারেন ... বাঁচা শেখা!
জেমস

15
একটি দুর্দান্ত উত্তর, যদিও আমি আপনার "DEBUG_MODE" সংজ্ঞায়িতের মতো একটি ব্যক্তিগত উপসর্গ ব্যবহার করার পরামর্শ দিই, যেমন এটিকে "JPM_DEBUG" বা এর মতো বলার মতো। খুব বেশিবার আমি তৃতীয় পক্ষের কোডটির মুখোমুখি হয়েছি যা DEBUG বা DEBUG_MODE বা এর মতো ব্যবহার করে এবং কখনও কখনও সেই কোডটি DEBUG মোডে সঠিকভাবে কাজ করবে না। আপনি যদি তৃতীয় পক্ষের লাইব্রেরি ডিবাগিং চালু করতে চান তবে আপনার এটি ইচ্ছাকৃতভাবে করা উচিত। (অবশ্যই, এটি গ্রন্থাগারের লেখক যারা তাদের প্রতীকগুলির উপসর্গ করা উচিত, তবে অনেক সি এবং সি ++ ফ্রেমওয়ার্ক বিশেষত এটি সংজ্ঞায়িত করার জন্য নয়)।
রব নেপিয়ার

1
একটি এক্সকোড পূর্বনির্ধারিত ম্যাক্রো রয়েছে যা কনফিগারেশনটি ডিবাগ করার সময় সেট করা থাকলে এটি চালু করতে ব্যবহার করা যেতে পারে? আমি বরং প্রতিটি প্রকল্পে নিজেই এই প্রিপ্রেসেসর ম্যাক্রো সেট করি না। আমরা কি সিউডোকোড #if XCODE_CONFIGURATION == DEBUG অনুসরণ করার মতো কিছু করতে পারি?
ফ্র্যাঙ্কোডওয়ায়ার

1
# অন্তর্ভুক্ত <টার্গেটকন্ডিশনালস h>
slf

2
লগিং স্টেটমেন্টগুলি মধ্যবর্তী ভেরিয়েবলগুলি লগের জন্য গণনার একক উদ্দেশ্যে ব্যবহার করার সময় এই পদ্ধতিটি রিলিজ মোডে সংকলকটির উদ্দীপক "অব্যবহৃত পরিবর্তনশীল" সতর্কতাগুলির দিকে নিয়ে যায়। আপনি যদি আমার মতো কম্পাইলার সতর্কতাগুলি ঘৃণা করেন তবে তা এড়ানোর সবচেয়ে স্মার্ট উপায় কী হবে?
জিন-ডেনিস মিউজ

78

প্রিফিক্স.পিচ ফাইলের শেষে এই 3 টি লাইন রাখুন:

#ifndef DEBUG
  #define NSLog(...) /* suppress NSLog when in release mode */
#endif

আপনার প্রকল্পে আপনাকে কোনও সংজ্ঞা দেওয়ার দরকার নেই, কারণ DEBUGআপনি যখন আপনার প্রকল্পটি তৈরি করেন তখন ডিফল্টরূপে আপনার বিল্ড সেটিংয়ে সংজ্ঞায়িত হয়।


2
সবচেয়ে ভাল সমাধান। আপনাকে এক্সকোড from থেকে ম্যানুয়ালি উপসর্গ.pch যুক্ত করতে হবে
টেডি

তবুও কি আমাদের মুক্তির আগে বিল্ড সেটিংটি পরিবর্তন করতে হবে অর্থাৎ মুক্তি পেতে ডিবাগ করতে হবে
ইউজারডেভ ২

25

এনএসএলগ কলগুলি প্রডাকশন কোডে রেখে দেওয়া যেতে পারে, তবে কেবলমাত্র সত্যিকারের ব্যতিক্রমী কেসগুলির জন্য বা তথ্যটি এটির জন্য প্রয়োজনীয় হওয়া উচিত যা এটি সিস্টেম লগ-এ লগইন হবে।

সিস্টেম লগকে যে সমস্ত অ্যাপ্লিকেশনগুলি লিটার করে তা বিরক্তিকর এবং অকার্যকর হিসাবে দেখা দেয় as


14
দুঃখিত - কার কাছে পেশাগত হিসাবে এসেছেন? কে সম্ভবত একটি প্রকাশিত অ্যাপ্লিকেশনটিতে আপনার লগগুলি পরীক্ষা করে এবং তার ভিত্তিতে আপনার পেশাদারিত্বের বিচার করছে? (স্পষ্টতই, আমি পুরোপুরি সম্মত হই যে আপনার আবেদনের প্রকাশ সংস্করণে আপনার এক টন এনএসএলগ রাখা উচিত নয়, তবে আমি 'পেশাদারিত্ব' যুক্তি দিয়ে বিভ্রান্ত হয়েছি।)
WendiKidd

4
অন্যান্য বিকাশকারীরা আপনি যা করছেন তা বিরক্ত করবেন। কিছু বিকাশকারীদের সত্যিই খারাপ হওয়ার সাথে অ্যান্ড্রয়েডের একই সমস্যা রয়েছে Plus.google.com/110166527124367568225/posts/h4jK38n4XYR
রজার বিনস

24

আমি মার্ক চার্বোনয়ের উত্তর সম্পর্কে মন্তব্য করতে পারি না , তাই আমি এটি উত্তর হিসাবে পোস্ট করব।

আপনার প্রাক-সংকলিত শিরোনামে ম্যাক্রো যুক্ত করার পরে, আপনি সংজ্ঞাটি (বা সংজ্ঞায়নের অভাব) নিয়ন্ত্রণ করতে টার্গেট বিল্ড কনফিগারেশন ব্যবহার করতে পারেন DEBUG_MODE

আপনি যদি " ডিবাগ " সক্রিয় কনফিগারেশন নির্বাচন করেন DEBUG_MODEতবে সংজ্ঞা দেওয়া হবে এবং ম্যাক্রো সম্পূর্ণ NSLogসংজ্ঞাতে প্রসারিত হবে ।

" রিলিজ " সক্রিয় কনফিগারেশন নির্বাচন করা সংজ্ঞায়িত হবে না DEBUG_MODEএবং আপনার NSLogজিঙটি প্রকাশের বিল্ড থেকে বাদ দেওয়া হবে।

পদক্ষেপ:

  • লক্ষ্য> তথ্য পান
  • ট্যাব তৈরি করুন
  • "প্রিপ্রসেসর ম্যাক্রোস" (বা GCC_PREPROCESSOR_DEFINITIONS) অনুসন্ধান করুন
  • কনফিগারেশন নির্বাচন করুন: ডিবাগ
  • এই স্তরে সংজ্ঞাটি সম্পাদনা করুন
  • যোগ DEBUG_MODE=1
  • কনফিগারেশন নির্বাচন করুন: মুক্তি
  • নিশ্চিত করা DEBUG_MODEহয় নিGCC_PREPROCESSOR_DEFINITIONS

আপনি সংজ্ঞাতে '=' অক্ষরটি বাদ দিলে আপনি প্রিপ্রসেসর থেকে ত্রুটি পাবেন

এছাড়াও, ম্যাক্রো সংজ্ঞা উপরে এই মন্তব্যটি (নীচে দেখানো) আটকান যেখানে আপনাকে DEBUG_MACROসংজ্ঞায়িত করতে পারে যে সংজ্ঞাটি এসেছে;)

// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS
// Configuration = Release: <empty>
//               = Debug:   DEBUG_MODE=1

1
এটি প্রশ্নের মূল্যবান অতিরিক্ত উত্তর কমেন্টের চেয়ে বেশি হওয়ার দাবিদার।
সকাল সকাল

DEBUG_MODEএবং DEBUG_MACROপ্রচলিত। আমি কেবল DEBUG_MACROঅ্যাপলের সাইটে ( ওপেনসোর্স.এপল.কম / সোর্স / জিএম 4 / gm4-15 / src / m4.h ? txt ) একটি উল্লেখ পেয়েছি । সম্ভবত আরও মান DEBUGএবং NDEBUGভাল পছন্দ হবে? NDEBUGপসিক্স দ্বারা নির্দিষ্ট করা হয়; যখন DEBUGকনভেনশন দ্বারা ব্যবহার করা হয়।
jww

+1 হ্যাঁ এটি একটি পুরানো পোস্ট, তবে এটিই মূল বিষয় ... আমার এক্সকোড সংস্করণে (4 বছর পরে), জিসিসিপিআরপিআরসিএসসিআর_ডিএফআইএনআইটিএস অনুসন্ধানের জন্য কিছু আলাদা ভাষা ফিরে আসে। স্পষ্টতার জন্য দয়া করে এই দুর্দান্ত উত্তরটি আপডেট করার বিষয়টি বিবেচনা করুন।
ডেভিড

11

সম্পাদনা: মার্ক চার্বোনউ পোস্ট করেছেন , এবং আমার চোখে শিওর দ্বারা এনেছে, এই পদ্ধতির চেয়ে অনেক ভাল।

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


এক্সকোডে স্বয়ংক্রিয় (এবং প্রত্যাশিত) আচরণ অর্জন করতে:

প্রকল্পের সেটিংসে, "বিল্ড" ট্যাবে যান এবং "ডিবাগ" কনফিগারেশন নির্বাচন করুন। "প্রিপ্রসেসর ম্যাক্রোস" বিভাগটি সন্ধান করুন এবং একটি ম্যাক্রো নাম যুক্ত করুন DEBUG_MODE

...

সম্পাদনা: ম্যাক্রোর সাথে লগিং সক্ষম ও অক্ষম করার সঠিক উপায়ের জন্য মার্ক চার্বোনয়ের উত্তর দেখুন DEBUG_MODE


7

আমি ম্যাথিউ সাথে একমত। প্রোডাকশন কোডে এনএসএলগের কোনও সমস্যা নেই। আসলে এটি ব্যবহারকারীর পক্ষে কার্যকর হতে পারে। এটি বলেছিল, আপনি যদি এনএসএলগ ব্যবহার করছেন কেবলমাত্র কারণ যদি ডিবাগে সহায়তা করা হয় তবে হ্যাঁ, এটি প্রকাশের আগে আপনাকে মুছে ফেলা উচিত।

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


4

সাধারণ সত্যটি হ'ল এনএসএলগ কেবল সাধারণ ধীর।

কিন্তু কেন? এই প্রশ্নের উত্তরের জন্য, আসুন এনএসলগ কী করে তা খুঁজে বের করুন এবং তারপরে এটি কীভাবে তা করে।

এনএসলগ ঠিক কী করে?

এনএসলগ 2 টি কাজ করে:

এটি অ্যাপল সিস্টেম লগিং (এসএসএল) সুবিধার জন্য লগ বার্তা লিখেছে। এটি কনসোল.অ্যাপে লগ বার্তাগুলি প্রদর্শিত হতে দেয়। এটি অ্যাপ্লিকেশনটির স্টারডার স্ট্রিম কোনও টার্মিনালে যাচ্ছে কিনা তাও পরীক্ষা করে (যেমন অ্যাপ্লিকেশনটি যখন এক্সকোডের মাধ্যমে চলমান)। যদি তাই হয় তবে এটি স্টডারারে লগ বার্তাটি লিখে দেয় (যাতে এটি এক্সকোড কনসোলে প্রদর্শিত হয়)।

এসটিডিআরআর-তে লেখা কঠিন মনে হচ্ছে না। এটি এফপ্রিন্টফ এবং স্টার্ডার ফাইল বর্ণনাকারী রেফারেন্স সহ সম্পন্ন করা যায়। তবে এসএসএল কী হবে?

ASL সম্পর্কে আমি যে সেরা ডকুমেন্টেশন পেয়েছি তা হ'ল পিটার হোসিঃ লিঙ্কের একটি 10 ​​ভাগ ব্লগ পোস্ট

খুব বেশি বিশদে না গিয়ে হাইলাইটটি (যেমন এটি পারফরম্যান্সের সাথে সম্পর্কিত) এটি হ'ল:

এএসএল সুবিধাটিতে একটি লগ বার্তা প্রেরণ করতে, আপনি মূলত এএসএল ডেমনটিতে একটি ক্লায়েন্ট সংযোগটি খুলুন এবং বার্তাটি প্রেরণ করুন। কিন্তু - প্রতিটি থ্রেডে পৃথক ক্লায়েন্ট সংযোগ ব্যবহার করতে হবে। সুতরাং, থ্রেড সুরক্ষিত হওয়ার জন্য, এনএসএলগকে যতবার বলা হয় এটি একটি নতুন আসল ক্লায়েন্ট সংযোগ খোলে, বার্তাটি প্রেরণ করে এবং সংযোগটি বন্ধ করে দেয়।

সংস্থানগুলি এখানে এবং এখানে পাওয়া যেতে পারে ।


পাঠ্য সম্পাদনা। সংস্থানগুলি কেবল ফুটারে থাকা দরকার।
জোহান কার্লসন

2

অন্যান্য উত্তরে উল্লিখিত হিসাবে আপনি সংকলনের সময় এনএসএলজি ব্যবহৃত হয়েছে কিনা তা পরিবর্তনের জন্য আপনি একটি # নির্দিষ্ট ব্যবহার করতে পারেন।

তবে আরও নমনীয় উপায় হ'ল কোকো লম্বারজ্যাকের মতো লগিং লাইব্রেরি ব্যবহার করা যা আপনাকে রানটাইমের সময় লগইন করা হয়েছে কিনা তা পরিবর্তনের অনুমতি দেয় না।

আপনার কোডে NSLog কে DDLogVerbose বা DDLogError ইত্যাদি দ্বারা প্রতিস্থাপন করুন, ম্যাক্রো সংজ্ঞা ইত্যাদির জন্য একটি # আমদানি যুক্ত করুন এবং প্রায়শই অ্যাপ্লিকেশনডিডফিনিশলঞ্চিং পদ্ধতিতে লগার সেটআপ করুন।

কনফিগারেশন কোড হিসাবে এনএসএলগের মতো একই প্রভাব ফেলতে হবে

[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];

2

সুরক্ষা দৃষ্টিকোণ থেকে এটি লগ করা হচ্ছে তার উপর নির্ভর করে। যদি NSLog(বা অন্যান্য লগার) সংবেদনশীল তথ্য লিখতে থাকে তবে আপনার উত্পাদন কোডের লগারটি সরানো উচিত remove

অডিটিং দৃষ্টিকোণ থেকে, নিরীক্ষক NSLogতার সংবেদনশীল তথ্য লগ না করা নিশ্চিত করতে প্রতিটি ব্যবহারের দিকে নজর দিতে চান না। তিনি / সে কেবল আপনাকে লগার অপসারণ করতে বলবে।

আমি উভয় গ্রুপ নিয়ে কাজ করি। আমরা কোড নিরীক্ষণ করি, কোডিং গাইড ইত্যাদি লিখি etc. সুতরাং অভ্যন্তরীণ দলগুলি এটি চেষ্টা করতে না জানে;)

আমরা এমন একটি বাহ্যিক অ্যাপ্লিকেশনও প্রত্যাখাত করব যা উত্পাদনে লগ ইন করে কারণ আমরা দুর্ঘটনাক্রমে সংবেদনশীল তথ্য ফাঁস হওয়ার সাথে জড়িত ঝুঁকি গ্রহণ করতে চাই না। বিকাশকারী আমাদের কী বলবে তা আমরা যত্ন করি না। এটি তদন্ত করার জন্য কেবল আমাদের মূল্যবান নয়।

এবং মনে রাখবেন, আমরা সংবেদনশীলকে সংজ্ঞায়িত করি, বিকাশকারীকে নয়;)

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

আপনি যদি কখনও কোনও সুরক্ষা আর্কিটেকচার (সেকআর্চ) পর্যালোচনা করে না এসে থাকেন তবে এগুলি আমরা দেখি এমন ধরণের জিনিস।


1

রিলিজ কোডে আপনাকে প্রিন্টফ বা এনএসএলগ দিয়ে অকারণে ভার্বোজ দেওয়া উচিত নয়। অ্যাপ্লিকেশনটির কিছু খারাপ ঘটে থাকলে কেবল একটি প্রিন্টফ বা এনএসএলগ করার চেষ্টা করুন, IE একটি অপরিবর্তনযোগ্য ত্রুটি।


1

মনে রাখবেন যে এনএসলোগগুলি ইউআই / মূল থ্রেডটি ধীর করতে পারে। একেবারে প্রয়োজনীয় না হলে রিলিজ বিল্ডগুলি থেকে তাদের সরিয়ে ফেলা ভাল।


0

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


টেস্টফ্লাইট অ্যাপ্লিকেশনটিতে যুক্ত হওয়া ওভারহেডটি বিবেচনা করা উচিত। কেবলমাত্র টেস্টফ্লাইটের লগিং অংশ যুক্ত করা সম্ভব?
জোহান কার্লসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.