DNS on Ubuntu 18.04 or up

For years it’s been simple to set up DNS on a Linux machine. Just add a couple of entries to /etc/resolv.conf and you’re done.

# Use Google's public DNS servers.
nameserver 8.8.4.4
nameserver 8.8.8.8

But things change and now it’s not that simple. If you now edit /etc/resolv.conf on Ubuntu you’ll find that the edits are ephemeral. If you restart (or even hibernate) your machine then they’ll be overwritten by default content.

nameserver 127.0.0.53

This is pretty simple to fix though.

1. Install the resolvconf package by executing sudo apt install resolvconf

2. Edit /etc/resolvconf/resolv.conf.d/head and add the following:

# Make edits to /etc/resolvconf/resolv.conf.d/head.
nameserver 8.8.4.4
nameserver 8.8.8.8

3. Restart the resolvconf service by executing sudo service resolvconf restart

Fix should be permanent.

ধর্ষণ এবং আমরা…

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

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

ইদানীং আরো বেশ কিছু খবর দেখা যাচ্ছে, “কেউ ইন্টারনেটে ধর্ম বা রাজনীতিবিদদের বিপরীতে কোন মন্তব্য করেছে, পুলিশ তাদেরকে অভিযোগের ১-১২ ঘণ্টার মাঝে গ্রেপ্তার করে ফেলছে”। কিন্তু দুঃখ এখানেই, একজন ধর্ষিতা কখনো এই দ্রুত গ্রেপ্তার দেখতে পায় না। তাকে আগে পুলিশে অভিযোগ করতে হয়, এরপর পুলিশ যদি মামলা নেয় তারপর মেডিক্যাল টেস্ট করতে হয়, এরপর মামলার খবর ধর্ষক জানতে পারে তারা প্রথমে হুমকি দেয় মামলা তুলে নিতে, তারপর আমাদের রাজনীতিবিদরা সেই হুমকিতে যুক্ত হন, তারা স্যাটেলম্যান্ট করেন, সেটা না পারলে মেরে ফেলার ব্যবস্থা করেন, আর ধর্ষিতা এই সব পার করে যদি বিচারের জন্য আসতে পারেন তবে আমরা ধর্ষিতার চরিত্র আর তার পোশাক ঠিক ছিলো কিনা তা নিয়ে গবেষণা করি, আর ধর্ষককে কিভাবে মুক্ত করা যায় তা নিয়ে চিন্তা করি। এইতো গেলো যারা সাহস করে অভিযোগ করেছেন তাদের কথা, কিন্তু যারা সেই সুযোগ পাননি বা যাদের পরিবার এই ঘটনা চেপে যেতে চাপ দিয়েছে তাদের কথা কে জানে? মনে রাখবেন, যারা সুযোগ পাননি তারা কিন্তু জীবিত নেই।

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

আজ পহেলা বৈশাখ, কিন্তু বাঙ্গালী বা বাংলাদেশি হিসাবে নিজেকে শুধু অপরাধীই মনে হচ্ছে, অন্য কিছু না। আমি কোন ধর্ষিতার কাছে ক্ষমা চাই না, আমি শুধু ন্যায় বিচারটা চাই আর কিছু না। দয়া করে ন্যায় বিচারটুকু দিন।

মাইএসকুয়েলঃ গ্রুপ রেপ্লিকেশন

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

এই পোস্টে দেখানো হয়েছে কিভাবে একটি “মাইএসকুয়েল গ্রুপ রেপ্লিকেশন” সিস্টেম কনফিগার করতে হয়।

যা যা লাগবেঃ 

  • একাধিক মাইএসকুয়েল ডাটাবেস সার্ভার (রুট এক্সেস সহ)।
  • উবুন্টু অপারেটিং সিস্টেম (যে কোন *নিক্স ভিত্তিক সিস্টেম হলেও চলবে)।

প্রাইমারী ডাটাবেস সার্ভার সেটআপঃ

মাইএসকুয়েল ৫.৭* এর অফিশিয়াল বিল্ডে গ্রুপ রেপ্লিকেশন প্লাগিন ডিফল্ট ভাবে থাকে না, তাই এখানে মাইএসকুয়েল কমিউনিটি বিল্ড ব্যবহার করা হয়েছে। নিচের কমান্ড দিয়ে কমিউনিটি বিল্ড ভার্শন ইন্সটল করুন।

 curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.3-1_all.deb && sudo dpkg -i mysql-apt-config* && sudo apt-get update && sudo apt-get install mysql-server

ইন্সটল প্রসেস শুরু হবার পর আপনাকে একটি কনফিগারেশন স্ক্রিন দেখানেও হবে, তাতে প্রথমে মাইএসকুয়েল ৫.৭ সিলেক্ট করুন, এরপর সব ওকে চেপে কনফার্ম করুন। বিস্তারিত সেটআপ প্রসেস সম্পর্কে জানতে চাইলে এই পোস্টটি দেখুন।

ডাটাবেসের রুট পাসওয়ার্ড সেট করুন।

uuidgen কমান্ড দিয়ে একটি আইডি জেনারেট করুন, এবং আইডিটি সেভ করে রাখুন এটি আমাদের গ্রুপের UUID হিসাবে ব্যবহার করা হবে।

sudo nano /etc/mysql/my.cnf কমান্ড দিয়ে মাইএসকুয়েল কনফিগ ওপেন করুন। !includedir এর নিচে , নিচের কোড টুকু যুক্ত করুন (সামান্য এডিট করে)।

# সার্ভার এর নাম (এটা দরকারি না)
[mysqld]
# General replication settings
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = ON
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1

# Shared replication group configuration
loose-group_replication_group_name = "গ্রুপ UUID" #এটা জেনারেট করে সেভ করতে বলা হয়েছিলো
loose-group_replication_ip_whitelist = "প্রাইমারী সার্ভারের আইপি, সেকেন্ডারি সার্ভারের আইপি"
loose-group_replication_group_seeds = "প্রাইমারী সার্ভারের আইপি:33061, সেকেন্ডারি সার্ভারের আইপি:33061"

# Host specific replication configuration
server_id = 1 # সার্ভার নাম্বার (১২৩ এই স্টাইলে)
bind-address = "প্রাইমারী সার্ভারের আইপি"
report_host = "প্রাইমারী সার্ভারের আইপি"
loose-group_replication_local_address = " প্রাইমারী সার্ভারের আইপি:33061"

sudo systemctl restart mysql কমান্ড দিয়ে মাইএসকুয়েল সার্ভিস রিস্টার্ট করুন এবং sudo ufw allow 33061 && sudo ufw allow 3306 কমান্ড দিয়ে উবুন্টু ফায়ারওয়ালে 330613306 পোর্ট আলাউ করুন। mysql -u root -p কমান্ড দিয়ে মাইএসকুয়েল কমান্ডলাইন ইন্টারফেসে প্রবেস করুন। এবার রুট পাসোয়ার্ড দিয়ে অথেন্টিকেট করুন।

নিচের কমান্ডগুলো দিয়ে  SQL_LOG_BIN এর ভ্যালু 0 সেট করুন এরপর রেপ্লিকেশওন এর জন্য একটি ইউজার যুক্ত করুন এবং তাকে রেপ্লিকেশন এর জন্য পারমিশন দিন। এবং শেষে SQL_LOG_BIN এর ভ্যালু 1 সেট করে নিন।

SET SQL_LOG_BIN=0;
CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1; 

এবার group_replication_recovery চ্যানেলে রেপ্লিকেশন ইউজার এবং পাসোয়ার্ড সেট করতে হবে, এই ইউজার এবং পাসোয়ার্ড গ্রুপের সকল ডাটাবেস সার্ভার রেপ্লিকেশন এর জন্য ব্যবহার করবে।

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='এখানে পাসোয়ার্ড দিন' FOR CHANNEL 'group_replication_recovery';

নিচের কমান্ড দিয়ে রেপ্লিকেশন প্লাগিন ইন্সটল করুন;

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

এবার SHOW PLUGINS; কমান্ড দিয়ে দেখুন প্লাগিনটি ইন্সটল হয়েছে কিনা (group_replication  নামে একটি লাইন দেখতে পাবেন)।

নিচের কমান্ড গুলো দিয়ে রেপ্লিকেশন চালু করুনঃ

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

এবার SELECT * FROM performance_schema.replication_group_members; কমান্ড দিয়ে দেখুন রেপ্লিকেশন চালু হয়েছে কিনা (MEMBER_STATE  ONLINE দেখাবে)।

এবার এই প্রাইমারি ডাটাবেস সার্ভারে একটি ডাটাবেস তৈরি করুন এবং তাতে কিছু ডাটা যুক্ত করুন (রেপ্লিকেশন টেস্টিং এর জন্য)। 

মনে রাখবেন আপনার ডাটাবেসের ইঞ্জিন টাইপ অবশ্যই InnoDB হতে হবে অন্যথায় রেপ্লিকেশন কাজ করবে না।

সেনেন্ডারী ডাটাবেস সার্ভার সেটআপঃ

আপএবার আসুন সেকেন্ডারী ডাটাবেস সার্ভার কনফিগার করি।

sudo nano /etc/mysql/my.cnf কমান্ড দিয়ে মাইএসকুয়েল কনফিগ ওপেন করুন। !includedir এর নিচে , নিচের কোড টুকু যুক্ত করুন (সামান্য এডিট করে)।

# সার্ভার এর নাম (এটা দরকারি না)
[mysqld]
# General replication settings
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = ON
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1

# Shared replication group configuration
loose-group_replication_group_name = "গ্রুপ UUID" #এটা জেনারেট করে সেভ করতে বলা হয়েছিলো
loose-group_replication_ip_whitelist = "প্রাইমারী সার্ভারের আইপি, সেকেন্ডারি সার্ভারের আইপি"
loose-group_replication_group_seeds = "প্রাইমারী সার্ভারের আইপি:33061, সেকেন্ডারি সার্ভারের আইপি:33061"

# Host specific replication configuration
server_id = 2 # সার্ভার নাম্বার (১২৩ এই স্টাইলে)
bind-address = "সেকেন্ডারি সার্ভারের আইপি"
report_host = "সেকেন্ডারি সার্ভারের আইপি"
loose-group_replication_local_address = "সেকেন্ডারি সার্ভারের আইপি:33061"

sudo systemctl restart mysql কমান্ড দিয়ে মাইএসকুয়েল সার্ভিস রিস্টার্ট করুন এবং sudo ufw allow 33061 && sudo ufw allow 3306 কমান্ড দিয়ে উবুন্টু ফায়ারওয়ালে 330613306 পোর্ট আলাউ করুন। mysql -u root -p কমান্ড দিয়ে মাইএসকুয়েল কমান্ডলাইন ইন্টারফেসে প্রবেস করুন। এবার রুট পাসোয়ার্ড দিয়ে অথেন্টিকেট করুন।

নিচের কমান্ডগুলো দিয়ে  SQL_LOG_BIN এর ভ্যালু 0 সেট করুন এরপর রেপ্লিকেশওন এর জন্য একটি ইউজার যুক্ত করুন এবং তাকে রেপ্লিকেশন এর জন্য পারমিশন দিন। এবং শেষে SQL_LOG_BIN এর ভ্যালু 1 সেট করে নিন।

SET SQL_LOG_BIN=0;
CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1; 

এবার group_replication_recovery চ্যানেলে রেপ্লিকেশন ইউজার এবং পাসোয়ার্ড সেট করতে হবে, এই ইউজার এবং পাসোয়ার্ড গ্রুপের সকল ডাটাবেস সার্ভার রেপ্লিকেশন এর জন্য ব্যবহার করবে।

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='এখানে পাসোয়ার্ড দিন' FOR CHANNEL 'group_replication_recovery';

নিচের কমান্ড দিয়ে রেপ্লিকেশন প্লাগিন ইন্সটল করুন;

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

এবার SHOW PLUGINS; কমান্ড দিয়ে দেখুন প্লাগিনটি ইন্সটল হয়েছে কিনা (group_replication  নামে একটি লাইন দেখতে পাবেন)।

START GROUP_REPLICATION; কমান্ড দিয়ে রেপ্লিকেশন শুরু করুন (যদিও আমাদের কনফিগারেশন এর কারনে এটা অটোমেটিক হয়ে যাওয়ার কথা)।

SELECT * FROM performance_schema.replication_group_members; কমান্ড দিয়ে দেখুন নতুন একটি ডাটাবেস সার্ভার রেপ্লিকেশন গ্রুপ মেম্বার হিসাবে যুক্ত হয়েছে। এখই পদ্ধতি অনুসারে আপনি আরো ডাটাবেস সার্ভার এই রেপ্লিকেশন গ্রুপে যুক্ত করতে পারবেন।

GTID ডুপ্লিকেট সমস্যার সমাধান

reset master; দিয়ে ডুপ্লিকেট GTID সমস্যার সমাধান করা যায়। reset master; কমান্ড দেওয়ার পর mysql_upgrade দিতে হয়। mysql_upgrade এ যদি রিড অনলি ইরর দেখায় তবে set global read_only = off; দিয়ে রিড অনলি অফ করে mysql_upgrade দিতে হবে, এরপর set global read_only = on; করে দিতে হবে।

TV Show Downloader

আমি বেশ কয়েক বছর ধরে নিয়মিত টিভি সিরিজ দেখে যাচ্ছি। বলতে পাররেন আমিই এডিক্টেড হয়ে গেছি টিভিসিরিজে। এখন আমি প্রায় ৫০+ টা সিরিজ নিয়মিত দেখি। এতগুলো সিরিজের ট্রাক রাখা সহজ কাজ না, এই ট্রাক রাখার জন্য আমি "টিভিশো টাইমস" নামের একটি সাইট ব্যবহার করে থাকি। এইতো গেল শো এর ট্রাক রাখার কথা।

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

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