PPTP VPN Installation

Automatic: 

  1. Copy script using wget https://raw.githubusercontent.com/saaiful/PPTP-VPN/master/install.sh
  2. Run using sudo bash install.sh
  3. Script will ask for username and password for VPN, set them correctly
  4. Connect the VPN and Enjoy 🙂

https://github.com/saaiful/PPTP-VPN

Manual:

Install PPTP using the following command:

sudo apt-get install pptpd

Edit PPTP Configuration Using the following command:

sudo nano /etc/pptpd.conf

add the following lines

localip 10.0.0.1
remoteip 10.0.0.100-200

Edit PPTP Option to add DNS Server using the following command:

sudo nano /etc/ppp/pptpd-options

Add the following lines to add google public DNS

ms-dns 8.8.8.8
ms-dns 8.8.4.4

Add VPN User by Editing ‘chap-secrets’ using the following command:

sudo nano/etc/ppp/chap-secrets

Formate: username * password *

[username] [service] [password] [ip]

Example:

saiful * 12345678 *

Restart PPTP Service using the following command:

service pptpd restart

You need to enable IP forwarding on your PPTP server in order to make you VPN work (This will allow you to forward packets between public IP and private IPs that you setup with PPTP).Enable IP forwarding by using the following command

sudo nano /etc/sysctl.conf

Set`net.ipv4.ip_forward = 1` in the config file. Run the following command to make changes active

sudo sysctl -p

Apply NAT rule for “iptables” using the following commands:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE && iptables-save
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
iptables -I INPUT -s 10.0.0.0/8 -i ppp0 -j ACCEPT
iptables --append FORWARD --in-interface eth0 -j ACCEPT

Now all you need is testing your VPN using any PPTP VPN Client.

সফটওয়্যার ডিজাইন প্যাটার্ন-১

সফটওয়্যার ডিজাইন প্যাটার্ন হচ্ছে এক ধরনের সমাধান যা বারবার বিভিন্ন সফটওয়্যার ডিজাইনের ক্ষেত্রে ব্যবহার করা যায়। যদিও এটা কোন সোর্সকোড/কম্পাইল্ড বাইনারি না। এটা মূলত কিভাবে কোন সমস্যার সমাধান কিভাবে করা যায় তার একটা বর্ননা , যা অনেক যায়গায় ব্যবহার করা যায়। ডিজাইন প্যাটার্নগুলো মূলত সফটওয়্যার/সিস্টেম ডিজাইনে প্রচলিত সমস্যাগুলো সমাধানের এক ধরনের স্বীকৃতি পদ্ধতি এবং এদেরকে ‘বেস্ট প্যাকটিস‘ বলা হয়।

এই পোস্টে মূলত পিএইচপি তে বহুল ব্যবহৃত ডিজাইন প্যাটার্ন গুলো নিয়ে আলোচনা করা হয়েচে।

ফ্যাক্টরি প্যাটার্ন

ফ্যাক্টরি প্যাটার্ন একটি বহুল ব্যবহৃত ডিজাইন প্যাটার্ন। এই প্যাটার্নে মূলত একটি ক্লাস ব্যবহারকারীর প্রয়োজনীয় অবজেক্ট তৈরি করে দেয়। নিচের ফ্যাক্টরি প্যাটার্নের একটি উদাহরণ দেওয়া হলঃ

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

factory_method_uml_class_diagram

ফ্যাক্টরি প্যাটার্ন এর আরেকটি পরিমার্জিত রুপ হচ্ছে ফাস্যাড প্যাটার্ন।

সিঙ্গেলটোন প্যাটার্ন

সফটওয়্যার ইঞ্জিনিয়ারিং এ সিঙ্গেলটোন প্যাটার্ন হচ্ছে এমন এক ডিজাইন প্যাটার্ন যা কোন ক্লাস থেকে একাধিক ইন্সট্যান্স তৈরি করতে বাধা দেয়, অর্থাৎ একটি ক্লাসের কেবলমাত্র একটি ইন্সট্যান্স-ই থাকবে।

Singleton Pattern
Fig: Singleton Pattern

সাধারণত ওয়েব অপ্লিকেশন ডিজাইন করার সময় এই ডিজাইন প্যাটার্ন ব্যবহার যুকিযুক্ত মনে হয়। নিচের সিঙ্গেলটোন প্যাটার্নের একটি উদাহরণ দেওয়া হলঃ

উপরের কোডে সিঙ্গেলটোন প্যাটার্ন ইমপ্লিমেন্ট করে দেখানো হয়েছে। স্টাটিক getInstance() মেথড দিয়ে Singleton ক্লাসের ইন্সট্যান্স তৈরি করা হয়েছে। Singleton ক্লাসে setName(), showName() নামের দুইটি মেথড আছে। উপরের কোডের শেষের অংশে SingletonChild নামে একটি ক্লাস লেখা হয়েছে যা Singleton ক্লাসকে এক্সটেন্ড করে। উদাহরণের কোডে দেখতে পাবেন $singleton এ Singleton এর ইন্সট্যান্স রাখা হয়েছে। এরপর setName() মেথড দিয়ে name অবজেক্টে 'Saiful' সেট করা হয়েছে এবং showName() মেথড দিয়ে name অবজেক্টের ভ্যালু দেখানো হয়েছে। এরপর $child এ SingletonChild  ইন্সট্যান্স কল করা হয়েছে, যা মূলত পূর্বে তৈরিকৃত Singleton ক্লাসের ইন্সট্যান্স রিটার্ন করেছে, যে কারনে ( $child->showName();setName() মেথড কল করায় পুর্বে সংরক্ষিত name অবজেক্টের ভ্যালু দেখিয়েছে, অর্থাৎ নতুন ইন্সট্যান্স তৈরি হয়ন

…চলবে

 

 

MySQL JOIN

MySQL এ দুই বা ততোধিক টেবিলের রো একসাথে যুক্ত করতে JOIN ব্যবহার করা হয়। MySQL এ JOIN মোট ৪ প্রকারের।

INNER JOIN

INNER JOIN কীওয়ার্ড দিয়ে দুই বা ততোধিক টেবিলের রো একসাথে যুক্ত করতে হলে বাম ও ডান কলামের মান সমান হতে হয়।

SQL INNER JOIN সিনট্যাক্স

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

অথবা,

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

উদাহরনঃ

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

LEFT JOIN

LEFT JOIN কীওয়ার্ড দিয়ে দুই বা ততোধিক টেবিলের রো একসাথে যুক্ত করতে হলে বাম কলামের রো এর ডাটার সাথে ডান কলামের রো এর ডাটা তুলনা করা হয় । যেসব স্থানে উভয় কলামের রো এর ডাটা সমান নয় সেসকল ক্ষেত্রে শুধুমাত্র বাম কলামের ডাটা সিলেক্ট করা হয় , আর যেসব স্থানে উভয় কলামের রো এর ডাটা সমান সে ক্ষেত্রে উভয় কলামের রো এর ডাটা সিলেক্ট করা হয়।

SQL LEFT JOIN সিনট্যাক্স


SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

অথবা,

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

উদাহরনঃ

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

RIGHT JOIN

RIGHT JOIN কীওয়ার্ড দিয়ে দুই বা ততোধিক টেবিলের রো একসাথে যুক্ত করতে হলে বাম কলামের রো এর ডাটার সাথে ডান কলামের রো এর ডাটা তুলনা করা হয় । যেসব স্থানে উভয় কলামের রো এর ডাটা সমান নয় সেসকল ক্ষেত্রে শুধুমাত্র ডান কলামের ডাটা সিলেক্ট করা হয় , আর যেসব স্থানে উভয় কলামের রো এর ডাটা সমান সে ক্ষেত্রে উভয় কলামের রো এর ডাটা সিলেক্ট করা হয়। এটিLEFT JOIN এর বিপরীত।

SQL RIGHT JOIN সিনট্যাক্স

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;

অথবা,

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

উদাহরনঃ

SELECT Orders.OrderID, Employees.FirstName
FROM Orders
RIGHT JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID
ORDER BY Orders.OrderID;

FULL JOIN

FULL JOIN মুলত LEFT JOIN এবং RIGHT JOIN এর ফলাফল একসাথে যুক্ত করে প্রকাশ করে।

SQL FULL OUTER JOIN সিনট্যাক্স

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

উদাহরনঃ

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

LAMP সার্ভার যেভাবে সেটাপ করবেন

এ্যপাচি ওয়েব সার্ভার ইন্সটলেশনঃ

sudo apt-get update কমান্ড দিয়ে অপারেটিং সিস্টেমের প্যাকেজ রিপোজিটরি আপডেট / হালনাগাদ করে নিন। নিচের কমান্ড দিয়ে এ্যপাচি ওয়েব সার্ভার ইন্সটল করুন।

sudo apt-get install apache2

MySQL ইন্সটলেশনঃ

MySQL সার্ভার ইন্সটল করার জন্য নিচের কমান্ড দিন। নিচের কমান্ডে MySQL সার্ভার এর সাথে পিএইচপি এর MySQL এক্সটেনশন এবং এ্যপাচির auth-mysql মড ইন্সটল করা হয়েছে।

sudo apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql

PHP ইন্সটলেশনঃ

PHP , PHP এর Mcrypt, PHP এর Curl এক্সটেনশন এবং এ্যপাচির php মড ইন্সটল করতে নিচের কমান্ড দিন।

sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt php5-curl

ইন্সটলেশন শেষে সার্ভারের রুট ডিরেক্টরিতে (/var/www) একটি পিএইচপি ফাইল তৈরি করুন এবং এর ভেতরে নিচের কোড লিখুন এবং ব্রাউজার থেকে ফাইলটি এক্সেস করুন।

<?php
phpinfo();
?>

 

LEMP সার্ভার যেভাবে সেটাপ করবেন

এঞ্জিনেক্স ওয়েব সার্ভার ইন্সটলেশনঃ

sudo apt-get update কমান্ড দিয়ে অপারেটিং সিস্টেমের প্যাকেজ রিপোজিটরি আপডেট / হালনাগাদ করে নিন। নিচের কমান্ড দিয়ে এঞ্জিনেক্স ওয়েব সার্ভার ইন্সটল করুন।

sudo apt-get install nginx

সার্ভার ফায়ারওয়ালে এঞ্জিনেক্স যাতে পোর্ট ৮০ ব্যবহার করতে পারে সে জন্য পরবর্তী কমান্ড নিচের কমান্ড দিন।

sudo ufw allow 'Nginx HTTP'

ফায়ারওয়াল ‘Nginx HTTP’ কে এলাউ করেছে কিনা জানতে নিচের কমান্ড দিন।

sudo ufw status

সার্ভারের IP এড্রেস ওয়েব ব্রাউজার থেকে এক্সেস করুন, এঞ্জিনেক্স এর ডিফল্ট পেজ দেখতে পাবেন।

MySQL ইন্সটলেশনঃ

MySQL সার্ভার ইন্সটল করার জন্য নিচের কমান্ড দিন।

sudo apt-get install mysql-server

MySQL ইন্সটলেশনের সময় MySQL সার্ভারের রুট এক্সেসের জন্য পাসওয়ার্ড সেট করুন।

PHP ইন্সটলেশনঃ

PHP এবং PHP এর MySQL এক্সটেনশন ইন্সটল করতে নিচের কমান্ড দিন।

sudo apt-get install php-fpm php-mysql

নিচের কমান্ড দিয়ে php-fpm এর কনফিগারেশন ফাইল ওপেন করুন এবং cgi.fix_pathinfo=0 সেট করুন।

sudo nano /etc/php/7.0/fpm/php.ini

নিচের কমান্ড দিয়ে php-fpm রিস্টার্ট করুন।

sudo service restart php7.0-fpm

এই এপ দিয়ে এঞ্জিনেক্স কনফিগারেশন জেনারেট করুন এবং /etc/nginx/sites-available ফোল্ডারে কনফিগারেশন সেভ করুন। এরপর নিচের কমান্ড দিয়ে /etc/nginx/sites-enabled ফোল্ডারে সিমলিংক তৈরি করুন। your.conf আপনার কনফিগারেশন ফাইলের নাম দিয়ে রিপ্লেস করুন।

sudo ln -s /etc/nginx/sites-available/your.conf /etc/nginx/sites-enabled/your.conf

sudo nginx -t কমান্ড দিয়ে কনফিগারেশন চেক করুন, যদি কোন এরর না থাকে তাহলে sudo service nginx restart কমান্ড দিয়ে এঞ্জিনেক্স সার্ভার রিস্টার্ট করুন।