বিগ ইন্টিজার ১

জাভার একটি চমৎকার জিনিস হচ্ছে বিগ ইন্টিজার (BigInteger)। সেটি নিয়ে আমার ব্লগের পাঠকদের জন্য একাধিক পর্বের সিরিজ লিখেছে তুষার রায় (বাংলাদেশ ইউনিভার্সিটি অব বিজনেস এন্ড টেকনোলোজি (বি ইউ বি টি)-তে কম্পিউটার বিজ্ঞান বিভাগে অধ্যয়নরত)।

প্রথম পর্ব

আমরা বিভিন্ন প্রোগ্রামিং ভাষায় হিসাব-নিকাশ করার জন্য সাধারণত int (32-bit) বা long (64-bit) টাইপের ডাটা ব্যবহার করে থাকি। এদের মধ্যে int ডাটা দিয়ে খুব বড় সংখ্যাগুলোর হিসাব-নিকাশ করা না গেলেও long ডাটা দিয়ে মোটামুটি 10^18 এর কাছাকাছি সংখ্যাগুলো এক্সেস করা যায়। সমস্যা হয় তখন যখন আমাদেরকে এর চেয়েও অনেক অনেক বড় সংখ্যা নিয়ে কাজ করার দরকার হয়। তখন আমরা কোনো সাধারণ ডাটা টাইপ দিয়ে সরাসরি এদের হিসাব-নিকাশ করতে পারি না, কারণ এতে করে আমাদের ভেরিয়েবলগুলোতে ডাটার ওভারফ্লো হয়।

এ ধরণের সমস্যা দূর করবার জন্য Java-তে BigInteger নামের একটি বিল্ট-ইন ক্লাস তৈরি করা আছে। যা দিয়ে খুব সহজেই অনেক বড় বড় সংখ্যার হিসাব-নিকাশ করে ফেলা যায়। BigInteger-এর সাইজ JVM-এর পর্যাপ্ত মেমোরির উপর নির্ভর করে। তবে প্রয়োজন ছাড়া এটি ব্যবহার করা উচিত নয়, কারণ BigInteger সাধারন ডাটা-টাইপ এর তুলনায় অনেক ধীরে কাজ করে। এখন তাহলে দেখা যাক, বিগ ইন্টিজার ব্যবহার করে আমরা কী কী কাজ করতে পারি এবং কীভাবে।

প্যাকেজ ইম্পোর্ট করাঃ
BigInteger ক্লাসটি জাভার math প্যাকেজের অন্তর্ভুক্ত। তাই BigInteger ব্যবহার করার জন্য আমাদেরকে প্রথমেই math প্যাকেজটি ইম্পোর্ট করে নিতে হবে।
import java.math.BigInteger;

ভেরিয়েবল ডিক্লেয়ার করাঃ
বিগ ইন্টিজার ভেরিয়েবল ডিক্লেয়ার করা অন্য সব ডাটা টাইপের মতোই। এখানে মূলত BigInteger ক্লাসের অবজেক্ট তৈরি করা হয়। যেমন, আমরা যদি a, b এবং c নামের তিনটি ভেরিয়েবল ডিক্লেয়ার করতে চাই তাহলে আমাদের এভাবে লিখতে হবে –
BigInteger a, b, c;

ইনপুট ও আউটপুটঃ
BigInteger এর ইনপুট ও আউটপুটও অন্য সব ডাটা টাইপের মতো। যেমন, আমরা যদি একটি ভেরিয়েবলের মান ইনপুট নিয়ে তা আউটপুটে দেখাতে চাই তাহলে আমাদের প্রোগ্রাম টি এভাবে লিখতে হবে –

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);
        BigInteger n;
        n = sc.nextBigInteger();
        System.out.println(n);
    }
}

ভ্যালু অ্যাসাইন করাঃ
আমাদেরকে অনেক সময় এক ভেরিয়েবলের মান অন্য ভেরিয়েবলে অথবা সরাসরি কোন মান একটি ভেরিয়েবলে অ্যাসাইন করার প্রয়োজন হতে পারে। এক ভেরিয়েবল থেকে অন্য ভেরিয়েবলে ভ্যালু অ্যাসাইন করতে আমরা সরাসরি ‘=’ ব্যবহার করতে পারি। যেমন, একটি ভেরিয়েবল b-এর মান অপর একটি ভেরিয়েবল a-তে অ্যাসাইন করতে চাইলে হলে লিখতে হবে –
BigInteger a = b;

কিন্তু সরাসরি যদি কোনো মান একটি ভেরিয়েবলে অ্যাসাইন করতে চাই, তাহলে BigInteger এর কন্সট্রাক্টর ব্যবহার করে ভেরিয়েবলে (যেটি আসলে একটি BigInteger অবজেক্ট) তার মান অ্যাসাইন করতে হবে। BigInteger-এর কন্সট্রাক্টরটি প্যারামিটার হিসেবে একটি নাম্বারের স্ট্রিং নিয়ে থাকে। যেমন –
BigInteger n = new BigInteger(“1234567890123456789”);

আবার আমরা BigInteger.valueOf(int_value) ব্যবহার করে যেকোনো ইন্টিজারকে সরাসরি BigInteger হিসেবে ব্যবহার করতে পারি।

BigInteger অ্যারেঃ
BigInteger এর আবার অ্যারে! অবাক হবার কিছু নেই। বিগ-ইন্টিজারের অ্যারেও আমরা ব্যবহার করতে পারি। এটিও অন্য সব ডাটা টাইপের অ্যারের মতোই।
BigInteger[] array_name = new BigInteger[array_size];

এখন আমরা চাইলে এই অ্যারেটি সর্টও করে ফেলতে পারি। সম্পুর্ন অ্যারে সর্ট করতে চাইলে লিখতে হবে Arrays.sort(array_name);, আর কোনো একটা নির্দিষ্ট রেঞ্জের ভ্যালু গুলো সর্ট করতে চাইলে লিখতে হবে Arrays.sort(array_name, fromIndex, toIndex+1);। সর্ট করার ক্ষেত্রে খেয়াল রাখতে হবে যাতে অ্যারেটির কোনো ইন্ডেক্সে নাল ভ্যালু না থাকে, নইলে আমাদের প্রোগ্রামটি এক্সেপশন থ্রো করবে।

দ্বিতীয় পর্ব

তৃতীয় পর্ব

চতুর্থ পর্ব

কোড শেয়ার করার ওয়েবসাইট

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

১) paste.ubuntu.com

Screenshot from 2015-01-21 02:16:49এখানে নাম লিখতে হবে, প্রোগ্রামিং ল্যাঙ্গুয়েজ সিলেক্ট করতে হবে, কোড পেস্ট করতে হবে, তারপরে Paste! বাটনে ক্লিক করলে যেই নতুন লিঙ্কটি তৈরি হবে, সেটি দিয়েই কোড শেয়ার করা যাবে।

২) pastebin.com

Screenshot from 2015-01-21 02:18:22

এটিও আগেরটির মতোই। তবে পেস্ট এক্সপায়ার করার একটা সময় নির্ধারণ করে দেওয়া যায়। আর বেশি বেশি ব্যবহার করতে হলে একাউন্ট তৈরি করে নিতে হয়।

৩) pastie.org
এটির ব্যবহারও খুব সহজ। এখানে একাউন্ট তৈরি করা লাগে না।

আশা করছি সবাই এখন থেকে আরো সুন্দরভাবে কোড শেয়ার করবে।

প্রোগ্রামিং সংক্রান্ত বাংলায় প্রশ্নোত্তর করার ভালো ওয়েবসাইট হচ্ছে  http://ask.dimikcomputing.com, আর ফেসবুকে আছে প্রোগ্রামিং স্কুল নামে একটি গ্রুপ।

দ্রুপাল কোর আপডেট

drupal_branding_2012আমার মূল ওয়েবসাইট (subeen.com) দ্রুপাল দিয়ে তৈরি। কেন দ্রুপাল বেছে নিয়েছিলাম, তার কারণ হচ্ছে ওইসময় একটা প্রজেক্টে কাজ করতাম যেখানে দ্রুপাল ব্যবহার করতে হয়েছিল, সম্ভবত সেখান থেকে দ্রুপাল ব্যবহার করার উৎসাহ পেয়েছিলাম। ওয়েবসাইটটা মাঝে মাঝে আপডেট করার প্রয়োজন হয়। এর মধ্যে দ্রুপাল কোর যখন আপডেট করতে হয়, সেটা ম্যানুয়ালি করতে হয় এবং আমার গুগল সার্চ করে বের করতে হয়ে কীভাবে আপডেট করে। তাই নিজের ব্লগে বাংলা ভাষায় লিখে রাখলাম, যেন পরবর্তী সময়ে গুগল না করে আমার ব্লগেই আমি সার্চ করতে পারি।

কীভাবে দ্রুপাল (ভার্শন ৭) কোর আপডেট করতে হয়?

দ্রুপাল কোর ম্যানুয়ালি আপডেট করতে হলে নিচের স্টেপগুলো অনুসরণ করতে হবে :

) ডাটাবেজেের ব্যাকআপ নিতে হবে।

) দ্রুপালের বর্তমান ভার্শনের সর্বশেষ রিলিজ ডাউনলোড করে সাইটে আপলোড করতে হবে।

) সাইটে আপলোড করার পরে দ্রুপাল প্যাকেজ আনজিপ করতে হবে।

) ওয়েবসাইটের [yourdrupalsitename]/admin/config/development/maintenance এ গিয়ে সাইটে মেইনটেনেন্স মোডে নিয়ে যেতে হবে।

) দ্রুপালের বর্তমান ব্যবহৃত ইনস্ট্যান্সের /sites ডিরেক্টরি ছাড়া বাকী সব ফাইল ও ডিরেক্টরি মুছে ফেলে নতুন ভার্শনের ফাইল ও ডিরেক্টরিগুলো পেস্ট করে দিতে হবে (sites ডিরেক্টরি ব্যাতীত)

) এরপর সাইটে এডমিন হিসেবে লগিন করে আপডেট স্ক্রিপ্ট চালাতে হবে। ব্রাউজারের এড্রেসবারে সরাসরি এই লিঙ্ক পেস্ট করলে আপডেট স্ক্রিপ্ট চলবে : http://[yourdrupalsitename]/update.php

) আপডেট করা শেষ হলে ওয়েবসাইটকে মেইনটেনেন্স মোড থেকে ফিরিয়ে স্বাভাবিক অবস্থায় আনতে হবে।

বি.দ্র. [yourdrupalsitename] এর জায়গায় নিজের ওয়েবসাইটের নাম দিতে হবে। যেমন আমার ওয়েবসাইটের ক্ষেত্রে subeen.com

লিনাক্স সার্ভারে পাসওয়ার্ড ছাড়া লগইন

আমরা অনেকেই ssh টুল ব্যবহার করে রিমোট লিনাক্স সার্ভারে লগইন করি এবং প্রতিবারই পাসওয়ার্ড দেওয়া লাগে। এই পাসওয়ার্ড দেওয়ার ঝামেলাটা সহজেই এড়ানো যায়। এতে যেই কম্পিউটার থেকে লগিন করা হয়, সেখানে কি (key) তৈরি করে সার্ভারে সেটা দিয়ে দিতে হয়।

Monitor_padlock

এর জন্য নিচের ধাপগুলো অনুসরন করতে হবে :

১) প্রথম কাজ হচ্ছে একজোড়া পাবলিক-প্রাইভেট কি জোড়া (key pair) তৈরি করা। তার জন্য নিচের কমান্ড দিতে হবে :

ssh-keygen -t rsa

এর আউটপুট হবে এমন :
Generating public/private rsa key pair.
Enter file in which to save the key (/home/name/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/name/.ssh/id_rsa.
Your public key has been saved in /home/name/.ssh/id_rsa.pub.
The key fingerprint is:
08:3c:1a:b5:f1:e0:19:13:c5:f4:38:45:ea:e0:1d:91 name@name
The key’s randomart image is:
+–[ RSA 2048]—-+
|    B=+oo        |
|   + OE*         |
|  . O * .        |
|   + * +         |
|  . . + S        |
|                 |
|                 |
|                 |
|                 |
+—————–+

এখানে দুটি কি তৈরি হল। একটি হচ্ছে id_rsa – এটি প্রাইভেট কি (private key), আরেকটি হচ্ছে id_rsa.pub এটি পাবলিক কি (public key)।

২) এখন id_rsa.pub ফাইলটি সার্ভারে কপি করতে হবে (এর জন্য scp কমান্ড ব্যবহার করা যেতে পারে, বা অন্য উপায়েও করা যেতে পারে)।

৩) এবারে ফাইলটি সার্ভারের ~/.ssh/authorized_keys ফাইলে যুক্ত করে দিতে হবে, এই কমান্ড দিয়ে :
cat id_rsa.pub >> /home/name/.ssh/authorized_keys

৪) তারপরে এই কমান্ড দিতে হবে : chmod 600 /home/name/.ssh/authorized_keys (অপশনাল, মানে এই স্টেপ ফলো না করলেও চলে)।

এখন ssh কমান্ড দিয়ে পাসওয়ার্ড ছাড়াই সার্ভারে ঢোকা যাবে! তবে যেই কম্পিউটার থেকে কাজটি করা হয়েছে, মানে যেই কম্পিউটারের পাবলিক কি সার্ভারে কপি করা হয়েছে, সেই কম্পিউটার থেকেই পাসওয়ার্ড ছাড়া সার্ভারে লগিন করা যাবে। অন্য কম্পিউটার থেকে পাসওয়ার্ড লাগবে। আবার চাইলে সার্ভারের নিরাপত্তা বাড়ানোর জন্য পাসওয়ার্ড বেজড লগিন (password based authentication) বন্ধ করে দেওয়া যায়, তাতে যেসব কম্পিউটারের কি সার্ভারের কাছে আছে, কেবল সেসব কম্পিউটার থেকেই সার্ভারে লগিন করা যাবে।

ইঞ্জিনএক্স ইনস্টল করা : উবুন্টু সার্ভার সেটাপ – ২

আগের পর্ব পড়তে এখানে ক্লিক করতে হবে।

ইঞ্জিনএক্স (nginx) হচ্ছে একটি জনপ্রিয় ওয়েব সার্ভার। আগে আমি বেশিরভাগ ক্ষেত্রেই এপাচি (apache) ব্যবহার করতাম, এখন ইঞ্জিনএক্স ব্যবহার করি। তাই এখন ইঞ্জিনএক্স ইনস্টল করে ফেলবো।

প্রথমে সার্ভারে লগিন করতে হবে : ssh -p 1234 user@ip-address

তারপরে নিচের কমান্ড :
sudo apt-get install nginx

ইঞ্জিনএক্স সার্ভারে একটি সার্ভিস হিসেবে চলবে, সেটি চলছে কী না পরীক্ষা করি :
dimik@dimikcomputing:~$ service nginx status
* nginx is running

তার মানে ঠিকঠাক চলছে। তবে আরো চারটি কমান্ড জেনে রাখি :
service nginx start
service nginx stop
service nginx restart
service nginx reload

এখন ব্রাউজারে আইপি-এড্রেস লিখে এন্টার চাপলেই আমরা নিচের ছবিটি দেখবো :

nginx

উবুন্টু সার্ভার সেটাপ – ১

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

ubuntu-server-1

আমি ধরে নিচ্ছি যে সার্ভারের অপারেটিং সিস্টেম হচ্ছে উবুন্টু।

প্রথমে সার্ভারে লগিন করতে হবে : ssh root@ip-address

তারপরে প্যাকেজ আপডেট করতে হবে :  apt-get update

অত:পর আপগ্রেডের কাজ : apt-get upgrade

এখন পাইথন ও প্রয়োজনীয় কিছু জিনিস ইনস্টল করে ফেলি। (কী কী প্যাকেজ ইনস্টল হচ্ছে সেটা লেখা আসবে The following NEW packages will be installed: এবং The following extra packages will be installed: এর নিচে।)
root@dimikcomputing:~# apt-get install curl python-software-properties software-properties-common

এখন sudo ইনস্টল করা না থাকে সেটি করে নিতে হবে : apt-get install sudo

সার্ভারের নিরাপত্তার জন্য আমরা নতুন একটি ইউজার তৈরি করবো যার এডমিন প্রিভিলেজ থাকবে। এর জন্য নিচের কমান্ডগুলো একে একে টার্মিনালে দিতে হবে। <USERNAME> এর জায়গায় ইউজারনেম দিতে হবে, মানে যে নামে ইউজার আমরা চাই।

groupadd admin
adduser <USERNAME>
usermod -a -G admin <USERNAME>
dpkg-statoverride –update –add root admin 4750 /bin/su

এখন রুট থেকে আমরা নতুন তৈরি করা ইউজারে চলে যাব :

su <USERNAME>

এখন সার্ভারের SSH পোর্ট পরিবর্তন করে দিব। SSH-এর ডিফল্ট পোর্ট হচ্ছে 22। আমরা 1025 থেকে 65536 এর মধ্যে যেকোনো একটি পোর্ট নির্বাচন করতে পারি। আর রুট থেকে যেন আর লগিন করা না যায়, সেই ব্যবস্থাও করে দিব। এর জন্য একটি ফাইল ওপেন করতে হবে :

sudo vim /etc/ssh/sshd_config

(vim ইনস্টল করা না থাকলে এই কমান্ড দিতে হবে : sudo apt-get install vim)

এখন নিচের দুটি লাইনে পরিবর্তন করতে হবে :

Port 2423
PermitRootLogin no

আমরা পোর্ট নাম্বার পরিবর্তন করে 2423 দিলাম (ডিফল্ট 22 ছিল) এবং PermitRootLogin কে no করে দিলাম (ডিফল্ট yes ছিল)।

তারপরে ফাইলের একেবারে শেষে নিচের লাইন দুটি যোগ করতে হবে  (<USERNAME> এর জায়গায় যেই ইউজারটি একটু আগে তৈরি করা হলো, সেটি লিখতে হবে, এঙ্গেল ব্র্যাকেট ছাড়া):

UseDNS no
AllowUsers <USERNAME>
এবারে ssh রিস্টার্ট করতে হবে :

sudo /etc/init.d/ssh restart

এখন যদি আমাদের ইউজার নেম হয় dimik এবং পোর্ট নাম্বার হয় 2423, তাহলে আমরা এভাবে লগিন করতে পারব :

ssh -p 2423 dimik@ip-address

পরের পর্বগুলোতে আমরা দেখবো কীভাবে বিভিন্ন প্রোগ্রামিং ল্যাঙ্গুয়েজ, ডাটাবেজ, ওয়েবসার্ভার ইত্যাদি ইনস্টল করতে হয়।

নিচের দুটি টিউটোরিয়ালের সাহায্য নিয়েছি :
১) https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-12-04

২) http://learnaholic.me/2014/01/09/ubuntu-vps-step-by-step-config-notes/