গোপনীয়তা

আপনার লেখা ডিভাইস ছাড়ে না

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

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

আইফোন, আইপ্যাড আর ম্যাকে অবাধ আজ পাওয়া যাচ্ছে; লিনাক্স, অ্যান্ড্রয়েড, উইন্ডোজ আর ক্রোমওএস আসছে। নিচে প্ল্যাটফর্মের নাম এসেছে কেবল সেখানেই, যেখানে ফাইলের ঠিকানা বা অনুমতি এক সিস্টেম থেকে আরেক সিস্টেমে আলাদা। উত্তরটি আলাদা নয়।

আপনার সম্পর্কে কিছুই নেওয়া হয় না

কোনো অ্যাকাউন্ট নেই, সাইন-ইন নেই, ইমেইল ঠিকানা নেই, বিজ্ঞাপনের কোনো শনাক্তকারী নেই, অ্যানালিটিকসের SDK নেই, ক্র্যাশ রিপোর্টার নেই, কোনো ধরনের টেলিমেট্রিও নেই। কত মানুষ অবাধ ব্যবহার করেন তা প্রকল্পটি জানে না, আর এই খরচটুকু সে মেনে নিয়েছে।

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

সবকিছু হয় আপনার ডিভাইসেই

চাইলেও এর কোনো অংশ কিছু পাঠাতে পারত না। ইঞ্জিনটি সব প্ল্যাটফর্মে একই রাস্ট কোড, আর তার নির্ভরতার পুরো তালিকা বলতে একটি সিরিয়ালাইজেশন লাইব্রেরি, একটি ফাইনাইট-স্টেট ট্রান্সডিউসার লাইব্রেরি, মেমরি ম্যাপিং আর একটি হ্যাশ ফাংশন। তার উপরের স্তরটিও নেটওয়ার্কের কিছু যোগ করে না: iOS কিবোর্ড এক্সটেনশন, iOS অ্যাপ, macOS ইনপুট মেথড, কোনোটিতেই নেটওয়ার্কের কোড নেই, URLSession নেই, সকেট নেই, নিজের সঙ্গে নেটওয়ার্কের কোড বয়ে আনতে পারে এমন বাইরের কোনো SDK নেই, আর কোথাও কোনো HTTP ক্লায়েন্টও নেই।

লিপ্যন্তর, অটোকারেক্ট, পরের শব্দের পরামর্শ আর ইমোজি খোঁজা, সবই চলে আপনার ডিভাইসে, অ্যাপের ভেতরে, তার সঙ্গে দেওয়া ডেটা ফাইল থেকে: 8.8 MB-র অটোকারেক্টের শব্দভাণ্ডার, আর আরও 29 MB-র পরের শব্দের মডেল, দুটিই ডাউনলোডের সঙ্গে এসেছে। অ্যাপের আকার মূলত এই কারণেই এত, আর ফোন এয়ারপ্লেন মোডে থাকলেও যে সবটা চলে, তারও কারণ এটাই।

যে শব্দটি লিখছেন সেটুকু পড়ে, তারপর ভুলে যায়

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

কোন কিবোর্ড ব্যবহার করছেন তা নির্বিশেষে একটা জিনিস iOS নিজেই সামলায়: সুরক্ষিত লেখার ঘরে বাইরের কোনো কিবোর্ড ঢুকতে পারে না। পাসওয়ার্ডের ঘরে ট্যাপ করলেই সিস্টেমের নিজের কিবোর্ড এসে দায়িত্ব নেয়।

আইফোনে যা যা জমা থাকে, তার পুরো তালিকা

ব্যক্তিগত পরামর্শের স্ন্যাপশট হলো ইঞ্জিনের এক্সপোর্ট করা একটি ছোট বাইনারি ফাইল; কোন শব্দের পরে সাধারণত কোন শব্দ আসে, তা নিয়ে যা শেখা হয়েছে সেটুকু এতে থাকে, ছোট ছোট শব্দগুচ্ছের হিসাব, আগের তিনটি পর্যন্ত শব্দ আর তার পরে কোনটি এসেছিল, সঙ্গে মডেলের শব্দতালিকায় নেই এমন শব্দের বানানটুকু। অ্যাপ আর কিবোর্ড যে জায়গাটা ভাগাভাগি করে, এটি থাকে সেখানেই, Library/Application Support/ObadhKeyboard/personal-autosuggest.snapshot-এ। এর আকারের একটা সীমা বাঁধা আছে, আর লোড হওয়ার সময় সঙ্গে দেওয়া মডেলের ফিঙ্গারপ্রিন্টের সঙ্গে মিলিয়ে দেখা হয়, ফলে অন্য প্রজন্মের ডেটা থেকে আসা স্ন্যাপশট নেওয়া হয় না, ফেলে দেওয়া হয়।

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

একবার লিখলেই বিশ্বাস করা হয় না। প্রতিটি শব্দের পক্ষে প্রমাণ জমতে থাকে, আর সেই প্রমাণ একটা সীমা পেরোলে তবেই শব্দটি আড়াল পায়, ফলে একবারের একটা টাইপো নিজেকে বাঁচিয়ে নিতে পারে না। সংশোধন ফিরিয়ে দিলে শব্দটি তখনই আড়াল পেয়ে যায়; এমনিতে ব্যবহার করলে তিনবার লাগে। ত্রিশ দিন ব্যবহার না হলে প্রমাণ অর্ধেক হয়ে যায়, তাই যে শব্দ আপনি আর লেখেন না সেটি নিজে থেকেই মিলিয়ে যায়। তালিকাটি থাকে ভাগ করা প্রেফারেন্সে, keyboard.learnedWords কি-র নিচে; সর্বোচ্চ 500 শব্দ ধরে, আর প্রতিটির জন্য একটি স্কোর আর একটি সময় রাখে।

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

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

ম্যাকে আপনার প্রতিটি কি-চাপ সে দেখে

ইনপুট মেথড জিনিসটাই তাই, সব প্ল্যাটফর্মে, যে-ই বানিয়ে থাকুক: যতক্ষণ সেটি নির্বাচিত ইনপুট সোর্স, ততক্ষণ আপনার লেখা সবই তার ভেতর দিয়ে যায়। অবাধের ইনপুট মেথডটি আবার অ্যাপ স্যান্ডবক্সের বাইরেও চলে, কারণ Text Input Services স্যান্ডবক্সে থাকা কোনো ইনপুট সোর্সকে নিবন্ধন করে না। এক ইনপুট মেথডের সঙ্গে আরেকটির তফাত হয় কি-চাপের পরের ধাপে, আর এখানে পরের ধাপ হলো একটি লিপ্যন্তর, নিজের ভেতরের শব্দভাণ্ডারে একটি খোঁজ, আর ভুলে যাওয়া।

ম্যাকে যা যা জমা থাকে

macOS ইনপুট মেথড তার সেটিংস রাখে নিজের প্রেফারেন্স ডোমেইনে, com.nsssayom.inputmethod.obadh-এ: ক্যান্ডিডেট বার দেখানো হবে কি না, কয়টি পরামর্শ দেবে, সংশোধন নিজে থেকে বসবে কি না। iOS-এর মতো একই ধরনের শেখা শব্দের তালিকা এটিও রাখে, একই ডোমেইনে learnedWords কি-র নিচে, একই কারণে। দুই প্ল্যাটফর্মেই নিজে থেকে সংশোধন বসানো ডিফল্টে বন্ধ। পরের শব্দের মডেলটি এর সঙ্গে দেওয়া নেই, তাই ম্যাকে ব্যক্তিগত স্ন্যাপশট বলে কিছুই নেই।

যা শিখেছে, মুছে ফেলুন

আইফোন আর আইপ্যাডে অবাধ অ্যাপ খুলে Privacy-তে গিয়ে Clear Learned Words বেছে নিন। এতে একবারেই ব্যক্তিগত স্ন্যাপশট মুছে যায় আর শেখা শব্দের তালিকা খালি হয়ে যায়। সঙ্গে দেওয়া শব্দভাণ্ডার থেকে আসা পরামর্শে কিছু বদলায় না, কারণ ওগুলো কখনো আপনার ছিলই না।

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

ম্যাকে মেনু বারে ইনপুট সোর্সের মেনু থেকে সেটিংস খুলুন। Autocorrect-এর নিচে একটি সারিতে লেখা থাকে এই মুহূর্তে কতগুলো শব্দ সংশোধন থেকে আড়াল পাচ্ছে, আর তার পাশে থাকে একটি Reset বোতাম, যা গোটা তালিকাটাই খালি করে দেয়। শেখাটা চোখে পড়ে বা ফিরিয়ে দেওয়া যায় কেবল ওই সারিতেই, সংখ্যাটা সে কারণেই দেখানো হয়। সংখ্যাটি কেবল আড়াল পাওয়া শব্দই গোনে, আর সেটি শূন্য হলে বোতামটি নিষ্ক্রিয় থাকে; তাই সীমা না পেরোনো শব্দ জমে থাকলে টার্মিনাল থেকে মুছতে হয়, defaults delete com.nsssayom.inputmethod.obadh learnedWords সেই কাজটাই করে।

আইওএসে ফুল অ্যাক্সেস দিলে পাবেন হ্যাপটিক আর নিজের সেটিংস

iOS চায়, কিবোর্ড এক্সটেনশন দুটো কাজ করার আগে আপনি ফুল অ্যাক্সেসের অনুমতি দিন, আর অবাধের ঠিক ওই দুটোই দরকার: হ্যাপটিক ফিডব্যাক দেওয়া, আর নিজের অ্যাপের সঙ্গে ভাগ করা জায়গাটিতে পড়া ও লেখা। কিবোর্ড চালু করার তৃতীয় ধাপটি এই সুইচ, আর ওখান থেকেই আবার বন্ধ করা যায়।

এটি ছাড়াও কিবোর্ড চলে। লিপ্যন্তর, অটোকারেক্ট আর পরামর্শ সবই কাজ করে, কারণ যে ডেটা এদের লাগে তা এক্সটেনশনের ভেতরেই দেওয়া আছে। যা হারাবেন তা হলো হ্যাপটিক, আর ভাগ করা যে জায়গাটিতে এটি ছাড়া এক্সটেনশন পৌঁছাতেই পারে না তার সবকিছু: অ্যাপে বেছে দেওয়া সেটিংস, আর যে শব্দগুলো ছেড়ে দিতে কিবোর্ড শিখত সেগুলো।

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

পুরোটা নিজে যাচাই করে নিন

obadh-ios ক্লোন করে তাতে URLSession খুঁজুন, http খুঁজুন, নেটওয়ার্কের যে নামই মাথায় আসে সেটাই খুঁজুন। http খুঁজলে যা পাবেন তা হলো প্রতিটি plist-এর উপরের DTD লাইনটি, মন্তব্যে দেওয়া গুটিকয় ঠিকানা, আর scripts/generate-emoji-data.py, ইমোজির তালিকা নতুন করে বানানোর সময় এটি ডেভেলপারের যন্ত্রে ইউনিকোড আর CLDR-এর ডেটা নামায়। ওই স্ক্রিপ্ট আর obadh_engine/tools/-এ শব্দভাণ্ডারের ডেটা নামানোর স্ক্রিপ্টটি, দুটোই বানানোর সময়ের সরঞ্জাম, কোথাও কম্পাইল হয় না।

Config/ObadhKeyboard.entitlements খুলে এনটাইটেলমেন্ট গুনে দেখুন: একটি, আর সেটি অ্যাপ গ্রুপ। ডিস্কে যা যা লেখা হয় তার পুরোটা আছে Shared/Sources/Engine/PersonalAutosuggestStore.swift-এ, 73 লাইনের মধ্যে। আর Shared/Sources/Settings/LearnedWordStore.swift-এ আছে জমা রাখার গড়নটা, শব্দ থেকে স্কোর আর সময়ের একটি ডিকশনারি।

obadh-macos আর ইঞ্জিনের বেলাতেও একই কথা। এই পাতায় বলা নেই এমন কিছু যদি পেয়ে যান, সেটি এই পাতারই বাগ, আর সেভাবে জানালে ভালোই হয়।

এই সাইটেও কোনো অ্যানালিটিকস নেই

সাইটটি কতগুলো স্ট্যাটিক পাতা। এতে কোনো অ্যানালিটিকস চলে না, কুকি বসে না, অন্য কোনো ডোমেইন থেকে কিছু আনা হয় না, বাইরের কোনো ফন্ট বা স্ক্রিপ্টও লোড হয় না; হরফগুলোও বাকি সবকিছুর মতো এই সাইট থেকেই আসে। একটি জিনিসই জমা থাকে (আলো না আঁধার, কোন থিম আপনি বেছেছেন) আপনার ব্রাউজারের লোকাল স্টোরেজে obadh-theme নামে, আর সেটি এই সাইট ছাড়া কেউ পড়ে না।

যে বাক্সে আপনি বাংলা লিখে দেখতে পারেন, সেটি ইঞ্জিনটিকে WebAssembly হিসেবে আপনার ব্রাউজারের ট্যাবেই চালায়। লেখার সময় সেটি কোনো অনুরোধ পাঠায় না, কোথাও কিছুই পাঠায় না। ওখানে যা লেখেন তা ট্যাবেই থাকে, আর ট্যাব বন্ধ করলে আর থাকে না।

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

পরামর্শ কখনো সবার কাছ থেকে শিখলেও আপনার লেখা এখানেই থাকবে

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

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

কোথায় প্রশ্ন করবেন, কোথায় ভুল ধরিয়ে দেবেন

এই পাতার যেকোনো কিছু নিয়ে প্রশ্ন, আর এতে কোনো সংশোধন, যে রিপোজিটরির সঙ্গে সম্পর্ক সেখানেই ইস্যু খুলে বলুন: obadh_engine, obadh-ios, কিংবা obadh-macos। ইস্যু সবার চোখের সামনে থাকে, আর সেটাই দরকার: গোপনীয়তার উত্তর আড়ালে দিলে একজন মানুষের উপকার হয়। এসব প্রশ্নের ছোট উত্তরগুলো আছে প্রশ্ন-উত্তরের পাতায়, আর প্রকল্পের আর কী কী দরকার তা বলা আছে অবদানের পাতায়

সর্বশেষ হালনাগাদ