SwiftUI: বুকমার্ক করা URL-এর মাধ্যমে SQLite ডেটাবেসের সাথে পুনরায় সংযোগ করা
সুইফটইউআই-এ ফাইলগুলিতে অ্যাক্সেস পরিচালনা করা, যেমন SQLite ডেটাবেস, যখন নিরাপত্তা এবং অবিরাম স্টোরেজ প্রয়োজন হয় তখন কঠিন হতে পারে। একটি ঘন ঘন সমাধান হল ফাইল রেফারেন্সগুলি ধরে রাখতে বুকমার্কগুলি ব্যবহার করা, অ্যাপগুলিকে পরে তাদের সাথে পুনরায় সংযুক্ত করার অনুমতি দেয়। যাইহোক, এই ডেটাবেসগুলিতে অ্যাক্সেস পুনরুদ্ধার করা কিছু জটিলতা উপস্থাপন করে, বিশেষ করে যখন অনুমতি বা ফাইল পাথ পরিবর্তন হয়।
এই বিষয়টি একটি SQLite ডাটাবেস ফাইলে বুকমার্ক এবং অ্যাক্সেস পুনরুদ্ধার করতে SwiftUI ব্যবহার করার উপর ফোকাস করে। পদ্ধতিতে বুকমার্ক সংরক্ষণ করা, সুরক্ষা-সংবেদনশীল সংস্থানগুলি অ্যাক্সেস করা এবং পরবর্তী সময়ে একটি ডাটাবেসের সাথে পুনরায় সংযোগ করা, এমনকি প্রোগ্রামটি পুনরায় চালু হওয়ার পরেও।
যদিও বুকমার্ক সংরক্ষণ করা এবং অ্যাক্সেস পুনরুদ্ধার করা মৌলিক ফাইল ক্রিয়াকলাপের জন্য ভাল কাজ করে, SQLite ডাটাবেসের সাথে সংযোগ করা আরও জটিল হতে পারে। বিশেষত, SQLite ব্যবহার করে SQL কোয়েরি প্রস্তুত করার ফলে অপ্রত্যাশিত অনুমতি সংক্রান্ত উদ্বেগ দেখা দিতে পারে, যেমন "অ্যাক্সেস অস্বীকার করা" ত্রুটি।
এই পোস্টটি ব্যাখ্যা করবে কেন এই ধরনের সমস্যাগুলি ঘটে এবং সম্পূর্ণ অ্যাক্সেস পুনরুদ্ধারের জন্য একটি ধাপে ধাপে পদ্ধতি প্রদান করে। আপনি কীভাবে আপনার বর্তমানকে সামঞ্জস্য করতে পারেন তাও আমরা দেখব সুইফটইউআই কোডটি মসৃণভাবে চলতে থাকে তা নিশ্চিত করতে, টেবিল ডেটার অনুরোধ করার মতো কাজ করার সময় ডাটাবেস অ্যাক্সেস সমস্যা প্রতিরোধ করে।
আদেশ | ব্যবহৃত প্রোগ্রামিং কমান্ডের বর্ণনা |
---|---|
বুকমার্ক ডেটা | দ বুকমার্ক ডেটা পদ্ধতি একটি ফাইল URL এর জন্য একটি নিরাপত্তা-স্কোপড বুকমার্ক তৈরি করে। এই বুকমার্কটি তারপরে প্রোগ্রামটি পুনরায় চালু করার পরেও ফাইলটিতে অ্যাক্সেস পুনরুদ্ধার করতে সমাধান করা যেতে পারে। সুরক্ষা সুযোগ অ্যাপটিকে প্রথম অ্যাক্সেস বন্ধ করার পরেও ম্যাকওএস থেকে ফাইল অ্যাক্সেস চাইতে সক্ষম করে। |
startAccessingSecurityScopedResource | এই পদ্ধতি নিরাপত্তা-স্কোপড বুকমার্ক মোকাবেলা করার জন্য গুরুত্বপূর্ণ। এটি প্রোগ্রামটিকে ফাইলটি অ্যাক্সেস করতে দেয় যা URL উল্লেখ করে। এই পদ্ধতিটি ব্যবহার না করে, অ্যাপটির কাছে ফাইলটি অ্যাক্সেস করার জন্য প্রয়োজনীয় অনুমতি নাও থাকতে পারে, ফলে ডেটা পড়ার বা লেখার চেষ্টা করার সময় অনুমতি সমস্যা হতে পারে। |
stopAccessingSecurityScopedResource | যখন নিরাপত্তা-ক্ষেত্রযুক্ত সংস্থানগুলিতে অ্যাক্সেসের আর প্রয়োজন হয় না, এই পদ্ধতিটি এটিকে প্রকাশ করে। সিস্টেম রিসোর্স খালি করতে এবং অপ্রয়োজনীয় ফাইল লকগুলি কমাতে এই কৌশলটি ব্যবহার করা গুরুত্বপূর্ণ, তাই অন্যান্য প্রক্রিয়া বা অ্যাপের সাথে সম্ভাব্য দ্বন্দ্ব এড়ানো। |
isReadableFile | প্রদত্ত পাথের ফাইলটি পঠনযোগ্য কিনা এই পদ্ধতিটি নির্ধারণ করে। কোনো ডাটাবেস ক্রিয়া সম্পাদন করার আগে, নিশ্চিত করুন যে ফাইলগুলি অ্যাক্সেসযোগ্য। এই চেকটি ব্যর্থ হলে, প্রোগ্রামটি এমন একটি ফাইল অনুসন্ধান বা পরিবর্তন করার চেষ্টা করা থেকে বাধা দেয় যা এটি অ্যাক্সেস করতে অক্ষম, ফলে ত্রুটি দেখা দেয়। |
প্রস্তুত করা | SQLite এর প্রস্তুত করা ফাংশন একটি এসকিউএল ক্যোয়ারীকে একটি প্রস্তুত বিবৃতিতে রূপান্তর করে যা কার্যকর করা যেতে পারে। প্রস্তুত বিবৃতিটি দক্ষতা উন্নত করতে এবং এসকিউএল ইনজেকশন থেকে রক্ষা করতে ব্যবহৃত হয়। এই পরিস্থিতিতে, এটি SQLite ডাটাবেসের সমস্ত টেবিলের নাম পুনরুদ্ধার করে। |
সংযোগ | এই কমান্ড SQLite ডাটাবেসের সাথে একটি সংযোগ সেট আপ করে। এটি ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয় এবং অ্যাপটিকে ডেটা পড়া এবং লেখার মতো কাজগুলি পরিচালনা করার অনুমতি দেয়। এই সংযোগ ব্যর্থ হলে, অ্যাপটি ডাটাবেসের সাথে ইন্টারফেস করতে পারে না, তাই সংযোগের ধাপটি অ্যাপের কার্যকারিতার জন্য গুরুত্বপূর্ণ। |
সমস্ত টেবিল আনুন | এই ফাংশনটি সংযুক্ত SQLite ডাটাবেসের সমস্ত টেবিলের নাম পেতে একটি SQL কোয়েরি করে। এটি টেবিলের নামগুলির একটি অ্যারে প্রদান করে, যা তারপরে টেবিলের ডেটা অনুসন্ধান বা আপডেট করার মতো আরও ক্রিয়াকলাপের জন্য ব্যবহার করা যেতে পারে। |
সমাধানবুকমার্ক | দ সমাধানবুকমার্ক পদ্ধতিটি পূর্বে সংরক্ষিত বুকমার্ক সমাধান করতে ব্যবহৃত হয়। এটি বুকমার্ক হিসাবে সংরক্ষিত URL পুনরুদ্ধার এবং যাচাই করে। যদি একটি বুকমার্ক পুরানো হয়ে যায়, অ্যাপটি এটি রিফ্রেশ করতে পারে বা ব্যবহারকারীকে ফাইলটি পুনরায় নির্বাচন করতে অনুরোধ করতে পারে। |
SwiftUI-তে নিরাপত্তা-স্কোপড বুকমার্কগুলির সাথে SQLite সংযোগগুলি পরিচালনা করা
আগে দেওয়া সুইফট কোড বুকমার্কের মাধ্যমে নিরাপদে SQLite ডাটাবেস অ্যাক্সেস করার উপর ফোকাস করে। macOS-এ বুকমার্কগুলি সুরক্ষা-স্কোপযুক্ত URLগুলি সংরক্ষণ করে অ্যাপ শুরুর মধ্যে ফাইল অ্যাক্সেস বজায় রাখতে একটি অ্যাপ্লিকেশন সক্ষম করে। প্রোগ্রামের স্যান্ডবক্সের বাইরে অবস্থিত ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার সময় এটি বিশেষভাবে গুরুত্বপূর্ণ, কারণ অ্যাপটি পুনরায় চালু হলে নিরাপত্তা সীমাবদ্ধতা সরাসরি ফাইল অ্যাক্সেসকে বাধা দিতে পারে। দ বুকমার্ক ডেটা এই ফাইলগুলিতে অ্যাক্সেস রাখার জন্য পদ্ধতি অত্যন্ত গুরুত্বপূর্ণ। এটি একটি বুকমার্ক তৈরি করে যা পরে পুনরুদ্ধার করা যেতে পারে, অ্যাপটিকে ডাটাবেসের সাথে একটি সংযোগ পুনরায় স্থাপন করার অনুমতি দেয়।
বুকমার্ক সংরক্ষণ করার পরে, পদ্ধতিটি ব্যবহার করুন startAccessingSecurityScopedResource ফাইলে অ্যাক্সেস পুনরুদ্ধার করতে। এই পদ্ধতিটি ম্যাকওএসকে নির্দেশ দেয় যাতে বুকমার্ক করা URL-এ ফাইলটি পড়তে এবং লিখতে প্রোগ্রাম অ্যাক্সেসের অনুমতি দেওয়া হয়। এই কমান্ড ব্যতীত, ফাইলে নিম্নলিখিত ক্রিয়াকলাপগুলি, যেমন SQLite ডাটাবেস খোলা বা টেবিল ডেটা পড়া, অপর্যাপ্ত অ্যাক্সেসের কারণে ব্যর্থ হবে। পুনঃপ্রবর্তন বা পটভূমি সম্পাদনের পরে মসৃণ ডাটাবেস অ্যাক্সেসের গ্যারান্টি দেওয়ার জন্য এই স্কোপড রিসোর্সের সঠিক প্রশাসন গুরুত্বপূর্ণ।
স্ক্রিপ্ট এর isReadableFile চেক নিশ্চিত করে যে কোনো কার্যক্রমের আগে ফাইলটি অ্যাক্সেসযোগ্য। এটি একটি সুরক্ষা ব্যবস্থা যা প্রোগ্রামটিকে এমন ফাইলগুলিতে অপ্রয়োজনীয় বা অনিরাপদ ক্রিয়াকলাপগুলি সম্পাদন করতে বাধা দেয় যা উপলব্ধ নাও হতে পারে, ত্রুটি পরিচালনা এবং ডিবাগিংকে সহজ করে তোলে। যখন অ্যাপটি পরীক্ষা করে যে ফাইলটি অ্যাক্সেসযোগ্য, এটি ব্যবহার করে ডাটাবেসের সাথে সংযোগ করে সংযোগ SQLite থেকে ক্লাস। এই সংযোগটি সমস্ত ডাটাবেস ইন্টারঅ্যাকশনের জন্য প্রয়োজনীয়, ক্যোয়ারী এক্সিকিউশন সহ।
অবশেষে, প্রস্তুত বিবৃতি ব্যবহার করে প্রস্তুত করা এসকিউএল কোয়েরি তৈরি করতে যা ডাটাবেস থেকে টেবিলের নাম পুনরুদ্ধার করে। এটি সেই বিন্দু যেখানে অনেক অ্যাপ ত্রুটির সম্মুখীন হয়, যেমন "অ্যাক্সেস অস্বীকার করা হয়েছে (কোড: 23)"৷ সমস্যাটি ঘটে যখন প্রোগ্রামটি ডাটাবেসের সাথে সংযোগ করে কিন্তু SQL কোয়েরি চালানোর জন্য উপযুক্ত অনুমতির অভাব হয়। এটি এড়ানোর জন্য, নিশ্চিত করুন যে ফাইল অ্যাক্সেস নিরাপত্তা-স্কোপড রিসোর্সের মাধ্যমে দেওয়া হয়েছে, এবং যে কোনও ডাটাবেস কার্যকলাপ সম্পাদন করার আগে ফাইলটি পঠনযোগ্য এবং বৈধ উভয়ই।
SwiftUI এবং SQLite ডেটাবেস বুকমার্কিং: অ্যাড্রেসিং অ্যাক্সেস ত্রুটি
এই সমাধান একত্রিত হয় সুইফট এবং SQLite অ্যাক্সেস অসুবিধা হ্যান্ডেল করতে. স্থায়ী ফাইল অ্যাক্সেস এবং মডুলার ডাটাবেস প্রশাসনের জন্য নিরাপত্তা-স্কোপড বুকমার্ক ব্যবহার করা হয়।
import Foundation
import SQLite
import SwiftUI
// ViewModel managing SQLite connection
class SQLiteEntityManager: ObservableObject {
@Published var isConnected: Bool = false
private var db: Connection?
// Connect to the SQLite database
func connect(strConnect: String) {
do {
db = try Connection(strConnect)
isConnected = true
} catch {
print("Unable to open database: \(error)")
}
}
// Fetch all tables
func fetchAllTables() -> [String] {
guard let db = db else {
print("Database not connected")
return []
}
do {
let tables = try db.prepare("SELECT name FROM sqlite_master WHERE type='table'")
return tables.map { "\($0[0]!)" }
} catch {
print("Error fetching tables: \(error)")
return []
}
}
}
// Bookmarking methods for persistent URL access
func saveBookmark(for url: URL, key: String) {
do {
let bookmarkData = try url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil)
UserDefaults.standard.set(bookmarkData, forKey: key)
} catch {
print("Failed to create bookmark: \(error)")
}
}
// Restoring bookmark and accessing SQLite database
func restoreSQLiteDatabaseBookmark() {
if let sqliteURL = resolveBookmark(for: "SQLiteBookmark") {
if sqliteURL.startAccessingSecurityScopedResource() {
viewModel.connect(strConnect: sqliteURL.path)
viewModel.fetchAllTables()
sqliteURL.stopAccessingSecurityScopedResource()
} else {
print("Failed to access security-scoped resource")
}
} else {
print("No valid bookmark for SQLite")
}
}
নিরাপত্তা-স্কোপড বুকমার্ক সহ SQLite-এ অনুমতি সংক্রান্ত সমস্যাগুলি পরিচালনা করা
সুইফ্ট সিকিউরিটি বুকমার্ক এবং ফাইল ম্যানেজার ইউটিলিটিগুলি SQLite ডেটাবেস অ্যাক্সেস করার সময় অনুমতি এবং অ্যাক্সেসের সমস্যাগুলি পরিচালনা করতে ব্যবহৃত হয়।
import Foundation
import SQLite
// Check and resolve bookmark for SQLite access
func resolveBookmark(for key: String) -> URL? {
if let bookmarkData = UserDefaults.standard.data(forKey: key) {
var isStale = false
do {
let url = try URL(resolvingBookmarkData: bookmarkData, options: .withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isStale)
if isStale {
print("Bookmark is stale for \(url.path)")
}
return url
} catch {
print("Failed to resolve bookmark: \(error)")
}
}
return nil
}
// Ensuring SQLite file access with FileManager before querying
func accessSQLiteFileAndFetchData() {
if let sqliteURL = resolveBookmark(for: "SQLiteBookmark") {
if sqliteURL.startAccessingSecurityScopedResource() {
if FileManager.default.isReadableFile(atPath: sqliteURL.path) {
// Proceed with SQLite operations
viewModel.connect(strConnect: sqliteURL.path)
let tables = viewModel.fetchAllTables()
print("Fetched tables: \(tables)")
} else {
print("Failed to read SQLite file at \(sqliteURL.path)")
}
sqliteURL.stopAccessingSecurityScopedResource()
} else {
print("Failed to access security-scoped resource for \(sqliteURL.path)")
}
} else {
print("No valid bookmark for SQLite file")
}
}
SQLite ডেটাবেসগুলিতে অ্যাক্সেসের অনুমতিগুলি অতিক্রম করা
SQLite ডাটাবেসের সাথে কাজ করার সময় অ্যাক্সেসের অনুমতি একটি মূল অসুবিধা সুইফটইউআই, বিশেষ করে নিরাপত্তা-ক্ষেত্রযুক্ত সংস্থানগুলির জন্য। যখন একটি অ্যাপ্লিকেশন একটি নিরাপত্তা-স্কোপযুক্ত URL সহ একটি ডাটাবেস ফাইল বুকমার্ক করে, তখন macOS সেশনগুলির মধ্যে ফাইলটিতে অ্যাক্সেস সীমাবদ্ধ করে। যদিও মৌলিক ফাইল কার্যক্রম সফল হতে পারে, ডাটাবেস ইন্টারঅ্যাকশন যেমন প্রশ্ন সম্পাদন করা বা SQL স্টেটমেন্ট তৈরি করার ফলে "অ্যাক্সেস অস্বীকৃত" এর মতো ত্রুটি হতে পারে। এই সমস্যাটি সাধারণত ঘটে যখন সফ্টওয়্যারটি ফাইল বুকমার্ক এবং পুনরুদ্ধার করার পরে পর্যাপ্ত অ্যাক্সেসের অনুমতি পেতে ব্যর্থ হয়।
ফাইল অ্যাক্সেসের জীবনচক্র পরিচালনা করতে, এর মতো পদ্ধতিগুলি ব্যবহার করুন startAccessingSecurityScopedResource এবং stopAccessingSecurityScopedResource. এই কমান্ডগুলি নিশ্চিত করে যে ম্যাকোস অ্যাপটিকে ফাইলটিতে কমান্ডগুলি পড়তে, লিখতে এবং কার্যকর করার প্রয়োজনীয় অনুমতি দেয়। এই নির্দেশাবলী যথাযথভাবে ব্যবহার করতে ব্যর্থ হলে আংশিক অ্যাক্সেস হতে পারে, যা সংযোগের অনুমতি দেয় কিন্তু নির্দিষ্ট কিছু ক্রিয়াকে বাধা দেয়, যেমন ডাটাবেস টেবিল অ্যাক্সেস করা। উপরন্তু, প্রোগ্রাম রিস্টার্টের সময় ফাইলটি অ্যাক্সেসযোগ্য এবং বৈধ থাকে তা নিশ্চিত করা গুরুত্বপূর্ণ, বিশেষ করে যখন স্যান্ডবক্সযুক্ত পরিবেশের সাথে কাজ করা হয়।
অ্যাক্সেসের অসুবিধাগুলির আরেকটি প্রায়শই উপেক্ষা করা পদ্ধতি হল ডাটাবেস খোলার আগে বা কোয়েরি চালানোর আগে ফাইলের অনুমতি পরীক্ষা করা। বিকাশকারীরা যেমন পদ্ধতি ব্যবহার করতে পারেন isReadableFile ফাইলের অ্যাক্সেসিবিলিটি স্ট্যাটাস চেক করতে। ফাইলটি পঠনযোগ্য বা লেখার যোগ্য না হলে, অ্যাপটি ব্যবহারকারীকে এটি পুনরায় নির্বাচন করতে বা বুকমার্ক রিফ্রেশ করতে অনুরোধ করতে পারে। ফাইল অ্যাক্সেসের এই সক্রিয় মনিটরিং রানটাইম ভুলগুলি প্রতিরোধ করতে সাহায্য করে এবং ব্যবহারকারীর আরও নির্বিঘ্ন অভিজ্ঞতা প্রদান করে, বিশেষ করে যখন সুরক্ষিত প্রসঙ্গে SQLite ডাটাবেসের সাথে কাজ করে।
SwiftUI-এ SQLite অ্যাক্সেস সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন
- আমি কীভাবে সুইফটে একটি নিরাপত্তা-ব্যবস্থাযুক্ত URL ব্যবহার করব?
- একটি নিরাপত্তা-স্কোপযুক্ত URL-এ অ্যাক্সেস পেতে, ব্যবহার করুন startAccessingSecurityScopedResource, এবং তারপর এটি দিয়ে ছেড়ে দিন stopAccessingSecurityScopedResource.
- কেন আমি SQLite এ "কোড 23 অ্যাক্সেস অস্বীকার" সমস্যাটি পাচ্ছি?
- এই সমস্যাটি প্রায়শই ঘটে যখন সফ্টওয়্যারটির প্রয়োজনীয় ফাইল অ্যাক্সেস অধিকার থাকে না। কল করার জন্য সতর্কতা অবলম্বন করুন startAccessingSecurityScopedResource কোনো ডাটাবেস ক্রিয়া সম্পাদন করার আগে।
- একটি ফাইল অ্যাক্সেস করার আগে পাঠযোগ্য কিনা তা আমি কিভাবে নির্ধারণ করতে পারি?
- আপনি ব্যবহার করতে পারেন FileManager.default.isReadableFile ফাইলটি খোলার বা অনুসন্ধান করার আগে অ্যাক্সেসযোগ্য কিনা তা পরীক্ষা করতে।
- সুইফটে একটি বুকমার্ক কী এবং আমার কেন এটির প্রয়োজন?
- একটি বুকমার্ক হল একটি ফাইল URL এর একটি অবিরাম রেফারেন্স যা আপনাকে অ্যাপ বন্ধ হওয়ার পরেও এটি অ্যাক্সেস করতে দেয়। ব্যবহার করুন bookmarkData এটা তৈরি করতে
- কিভাবে আমি সুইফটে একটি পূর্বে বুকমার্ক করা ফাইলে ফিরে যেতে পারি?
- ব্যবহার করুন resolveBookmark একটি সংরক্ষিত বুকমার্ক সমাধান এবং রেফারেন্স ফাইল অ্যাক্সেস পুনরুদ্ধার করার ফাংশন।
SwiftUI-তে ডাটাবেস অ্যাক্সেসের বিষয়ে চূড়ান্ত চিন্তাভাবনা
বুকমার্ক করা URL-এর মাধ্যমে সুইফট-এ SQLite ডাটাবেসে নির্বিঘ্ন অ্যাক্সেস নিশ্চিত করা নিরাপদ বা বাহ্যিক ফাইল নিয়ে কাজ করে এমন অ্যাপের জন্য অত্যন্ত গুরুত্বপূর্ণ। সঠিক কৌশল হল বুকমার্কগুলি পরিচালনা করার সময় সতর্কতা অবলম্বন করা এবং নিরাপত্তা-সংবেদনশীল সংস্থানগুলি দক্ষতার সাথে পরিচালনা করা।
তদুপরি, কোয়েরি চালানোর আগে ফাইলের পাঠযোগ্যতা পরীক্ষা করার মতো চেকগুলি সম্পূর্ণ করা রানটাইম সমস্যাগুলি কমাতে সাহায্য করতে পারে। অনুমতি ত্রুটির মতো ঘন ঘন সমস্যার সমাধান করা ব্যবহারকারীর অভিজ্ঞতাকে উন্নত করে, বিশেষ করে যখন SwiftUI-তে বাহ্যিক বা স্যান্ডবক্সযুক্ত পরিবেশের সাথে কাজ করা হয়।
সূত্র এবং তথ্যসূত্র
- ম্যাকওএস-এ সুরক্ষা-স্কোপযুক্ত বুকমার্ক এবং ফাইল অ্যাক্সেস ব্যবহার করার বিশদগুলি অফিসিয়াল অ্যাপল ডকুমেন্টেশনে পাওয়া যাবে। নিরাপত্তা-ক্ষেত্রযুক্ত সংস্থান পরিচালনার বিষয়ে আরও জানতে, দেখুন অ্যাপল ডেভেলপার ডকুমেন্টেশন .
- SQLite ডাটাবেস হ্যান্ডলিং এবং সুইফ্ট ইন্টিগ্রেশন কৌশলগুলি, যার মধ্যে টেবিল আনার উদাহরণ রয়েছে, SQLite Swift ডকুমেন্টেশন থেকে উল্লেখ করা হয়েছে। এ আরও জানুন SQLite.swift GitHub সংগ্রহস্থল .
- বুকমার্ক পরিচালনা এবং সুইফটে অ্যাক্সেস পুনরুদ্ধার করার জন্য অতিরিক্ত নির্দেশিকা স্ট্যাক ওভারফ্লো আলোচনা থেকে পাওয়া যেতে পারে, যেমন ফাইল অ্যাক্সেস পুনরুদ্ধারের বিষয়ে এই পোস্ট: স্ট্যাক ওভারফ্লো বুকমার্কিং আলোচনা .