วันอาทิตย์ที่ 21 กันยายน พ.ศ. 2557

Resize Partition LVM

เพิ่งได้เจอมาคือว่า..ลง CentOS 6.5 มี HDD 1 TB ใช้ default แบ่งได้คือ lv_root = 50GB ,  lv_home = ที่เหลือ ประเด็นคือส่วนมากผมลงโปรแกรมไว้ /opt/ ปรากฏว่า lv_root เต็ม ทีนี้ต้องขยาย

Step 1

# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/vg_repo-lv_root 148G  113G   29G  80% /
tmpfs                       499M     0  499M   0% /dev/shm
/dev/sda1                   485M  156M  304M  34% /boot
/dev/mapper/vg_repo-lv_home 47G  181M   45G   1%  /home

Step 2

#cd /
#cp -Ra /home /home.bak  # Make a backup of home
#umount /home
#lvm lvremove /dev/vg_<hostname>/lv_home   (Remove the logical volume for home)
#lvm lvresize -l+100%FREE /dev/vg_<hostname>/lv_root  (Resize the root logical volume so it uses 100% of the now free space)
#resize2fs /dev/vg_<hostname>/lv_root  (Resize the filesystem to use the whole logical volume)

#mv /home.bak /home  (Restore the backup)

Step 3

#lvdisplay
#lvcreate -n lv_home -l 100%FREE VolGroup
#mke2fs -j /dev/VolGroup/lv_home
#mount /dev/VolGroup/lv_home /home

เสร็จ......


*******เพิ่มเติม*******

# comment out /home
แก้ไข /etc/fstab โดย คอมเม้น /home

* ถ้า boot ไม่ขึ้น
1. mount -o remount,rw / (เพื่อให้แก้ไขได้ ไม่งั้นจะ readonly)
2. แก้ไข /etc/fstab โดย คอมเม้น /home


วันพฤหัสบดีที่ 4 กันยายน พ.ศ. 2557

ติดต่อ Big Data (Hadoop) ผ่าน Jdbc ด้วย Hive และ Impala

บ้านเรายังไม่ค่อยตื่นตัวเรื่อง Big Data กันสักเท่าไหร่ แต่พอดีผมได้มีโอกาสทำงานกับข้อมูลเดือนละหลักพันล้าน record / ใช้พวก relation database เอาไม่อยู่ครับ query ง่าย ๆ ใช้เวลากันครึ่งค่อนวันเลยทีเดียว เจ้า Big Data เลยเป็นอีกทางเลือก มาลองดูกันว่าจะเข้าไปคุยกับมันยังไงดี  ในที่นี้เป็น Cloudera Pack (Hadoop,hive,impala...)

- library ที่ต้องใช้


























1. Jdbc Hive ตัวอย่างการเขียน ดึงข้อมูลมาแสดง

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HiveConnection {

    private static final String driver = "org.apache.hive.jdbc.HiveDriver";
    private static final int hive_port = 10000;
    private static final String host = "127.0.0.1";
    private static final String db = "hadoopdb";

    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        return DriverManager.getConnection("jdbc:hive2://" + host + ":" + hive_port + "/" + db);
    }

    public static void main(String[] args) {

        System.out.println("\n=============================================");

        System.out.println("start....");
        Connection con = null;

        try {
            con = getConnection();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select * from table_name");
            while (rs.next()) {
                System.out.println("-" + rs.getString(1));
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
}

2. Jdbc Impala ตัวอย่างการเขียน ดึงข้อมูลมาแสดง

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ImpalaConnection {

    private static final String driver = "org.apache.hive.jdbc.HiveDriver";
    private static final int impala_port = 21050;
    private static final String host = "127.0.0.1";
    private static final String db = "hadoopdb";

    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        return DriverManager.getConnection("jdbc:hive2://" + host + ":" + impala_port + "/" + db + ";auth=noSasl");
    }

    public static void main(String[] args) {

        System.out.println("\n=============================================");

        System.out.println("start....");
        Connection con = null;

        try {
            con = getConnection();

            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery("select * from table_name");
            
            while (rs.next()) {
                System.out.println("-" + rs.getString(1));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
}

วันอาทิตย์ที่ 13 กรกฎาคม พ.ศ. 2557

เขียน shell script อย่างง่ายๆ ไว้ใช้งาน

- อธิบาย คำสั่งที่สร้างขึ้น

Step1 Set Java Home
Step2 เข้าไปที่ Path /home/test และ ลบ ไฟล์ที่นามสกุล .class ทั้งหมด
Step3 Compile ClassMyClassA.java
Step4 Clear หน้าจอ
Step5 สั่งรัน Class MyClassA และส่ง Param เข้าไปใน Class ด้วย
Step6 พิมพ์คำว่า Good bye....

- บันทึกไฟล์นี้ด้วยชื่ออะไรก็ได้ นามสกุลเป็น .sh แล้วอย่าลืมเปลี่ยน chmod เป็น +x ด้วยนะครับ

*** สั่งรัน shell script ดังนี้    ./xxxx.sh
*** อาจจะตั้งเวลาใน crontab สั่งใช้เรียกงาน sh นี้ก็ได้ครับ อย่างการทำ script สำหรับการ backup ข้อมูลใน Database


#!/bin/sh

JAVA_HOME=/opt/่java/jdk1.6.0_51
PATH=/opt/java/jdk1.6.0_51/bin:$PATH

cd /home/test/
rm *.class

javac MyClassA.java

clear

java MyClassA Param1 Param2 Param3

echo "Good bye..."

การเขียนโปรแกรม..เรียกใช้งาน command linux (ตัวอย่าง การ grep log)

- ถ้าเราเข้า ssh จะค้าหาข้อความที่อยู่ใน log เราก็ต้องใช้ command  ---> grep  'xxxxx' /logfile_path
- แล้วถ้าต้องการเขียนโปรแกรมไปหาเองล่ะ... ตัวอย่างข้างล่างเลย ไม่เน้นอธิบาย เน้นให้อ่านโค๊ด

public static String grep(String keyword) {

        try {

            String logpath = "/home/test/server.log";
            List<String> commands = new ArrayList<String>();
            commands.add("/bin/sh");
            commands.add("-c");
            commands.add("grep '" + keyword + "' " + logpath);
            ProcessBuilder pb = new ProcessBuilder(commands);
            pb.redirectErrorStream(true);
            Process process = pb.start();
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            StringBuilder sb = new StringBuilder();

            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }

            return sb.toString();
            
        } catch (IOException ex) {
            Logger.getLogger(GrepLogLinux.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

เข้ารหัสแบบใช้ Private Key

ชุดข้อวความ "y781iGR57Q8CuuTbjEtSzg==" นี้ถือว่าเป็นกุญแจในการเข้าและถอดรหัส

เข้ารหัส

package test;

import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class Encrypt {

    private Cipher ecipher;
    private final String secret = "y781iGR57Q8CuuTbjEtSzg==";

    public Encrypt() {
        try {
            byte[] salt = {
                (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32,
                (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03
            };

            int iterationCount = 19;
            KeySpec keySpec = new PBEKeySpec(secret.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());
            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        } catch (Exception ex) {
            Logger.getLogger(Encrypt.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String testEncrypt() {
        try {
            String str = "Hello World";
            byte[] utf8 = str.getBytes("UTF8");
            byte[] enc = ecipher.doFinal(utf8);
            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (Exception ex) {
            Logger.getLogger(Encrypt.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public static void main(String[] args) {
        Encrypt encrypt = new Encrypt();
        System.out.println(encrypt.testEncrypt());
    }

}

ถอดรหัส

package test;


import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class Decrypt {

    private Cipher dcipher;

    private final String secret = "y781iGR57Q8CuuTbjEtSzg==";

    public Decrypt() {
        try {
            byte[] salt = {
                (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32,
                (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03
            };

            int iterationCount = 19;

            KeySpec keySpec = new PBEKeySpec(secret.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
            dcipher = Cipher.getInstance(key.getAlgorithm());
            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (Exception ex) {
            Logger.getLogger(Decrypt.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String testDecrypt() {
        try {
            String str = "GdMOJDcTyBXFTK7yXmqIGw==";
            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
            byte[] utf8 = dcipher.doFinal(dec);
            return new String(utf8, "UTF8");
        } catch (Exception ex) {
            Logger.getLogger(Decrypt.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public static void main(String[] args) {
        Decrypt decrypt = new Decrypt();
        System.out.println(decrypt.testDecrypt());
    }
}

วันจันทร์ที่ 16 มิถุนายน พ.ศ. 2557

การเข้ารหัส รหัสผ่านก่อนลงใน LDAP และการถอดรหัส รหัสผ่านก่อนนำไปใช้

Authen ผ่าน LDAP แล้ว ทำการ synchronize ข้อมูลล่าสุดไปลง Database ซึ่งใน Field ของ Password ไม่สามารถนำไปใช้ได้ทันที หากต้องแปลงให้อยู่ในรูปของ MD5 (Hex Code) ก่อน

ตัวอย่าง Method แปลง รหัสของเราก่อนเก็บลง LDAP

public static String digestMd5(final String password) {
        String base64;
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(password.getBytes());
            base64 = new BASE64Encoder().encode(digest.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        return "{MD5}" + base64;
    }

อินพุท

1234

ผลลัพธ์

{MD5}gdyb21LQTcIANtvYMT7QVQ==

ผลลัพธืนี้จะถูกเก็บลง LDAP โดยไม่สามารถแปลงกลับมาเป็น 1234 ได้



ตัวอย่าง Method ถอดรหัสที่นำมาจาก LDAP แล้วแปลงเป็น Hex

 public static String base64ToHex(String base64) {
        try {
            base64 = base64.substring(5, base64.length());
            byte[] bytes = new BASE64Decoder().decodeBuffer(base64);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bytes.length; i++) {
                sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
            }
            return sb.toString();
        } catch (IOException ex) {
            Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

อินพุท

{MD5}gdyb21LQTcIANtvYMT7QVQ==

ผลลัพธ์

81dc9bdb52d04dc20036dbd8313ed055

วันพุธที่ 9 เมษายน พ.ศ. 2557

ชนิดของข้อมูล ในภาษาจาวา

ชนิดของข้อมูล (Data Type) ในภาษาจาวาแบ่งเป็นสองประเภทใหญ่ๆ คือ

1. ชนิดข้อมูลแบบพื้นฐาน (Primitive data type) หมายถึงชนิดข้อมูลที่สามารถเก็บข้อมูลที่เป็นข้อมูลทั่วไปหรือข้อมูลพื้นฐาน มีทั้งหมด 8 ตัว ได้แก่ boolean, char, byte, short, int, long, float,double

ชนิดข้อมูลพื้นฐาน (Primitive Data Type) ชนิดข้อมูลพื้นฐานในภาษาจาวาแบ่งออกเป็น 4 กลุ่ม ดังนี้

Logical ได้แก่ boolean
Textual ได้แก่ char
Integral ได้แก่ byte,short,int และ long
Floating-point ได้แก่ float และ double

ชนิดข้อมูล สำหรับ ค่าที่เป็นไปได้

byte ตัวเลขจำนวนเต็มเล็กๆ ใช้พื้นที่เก็บเพียงแค่ 1 ไบต์ -128 ถึง 127
short ตัวเลขจำนวนเต็ม (ใช้พื้นที่เก็บ 16 บิต หรือ 2 ไบต์) -32,768 ถึง 32,767
int ตัวเลขจำนวนเต็มทั่วไป (ใช้พื้นที่เก็บ 32 บิต หรือ 4 ไบต์) -2,147,483 ถึง 2,147,483,647
long ตัวเลขจำนวนเต็มขนาดใหญ่ (ใช้พื้นที่เก็บ 64 บิต หรือ 8 ไบต์) -9,223,372,036,845,775,808 ถึง 9,223,372,036,845,775,807

float ตัวเลขทศนิยมทั่วไป (ใช้พื้นที่เก็บ 32 บิต หรือ 4 ไบต์) 1.4e-45 ถึง 3.4028235e+38
double ตัวเลขทศนิยมขนาดใหญ่ (ใช้พื้นที่เก็บ 64 บิต หรือ 8 ไบต์) 4.9e-324 ถึง1.7976931348623157e+308

char ตัวอักษรทุกชนิด ตามมาตรฐาน 16-bit Unicode ตัวอักษรต่างๆ
boolean ค่าความเป็นจริงทางตรรกะ (ใช้พื้นที่เก็บ 1 บิต) มี 2 ค่าเท่านั้นคือ true กับ false

2. ชนิดข้อมูลแบบอ้างอิง (Reference data type) มีความแตกต่างกับชนิดข้อมูลพื้นฐาน ที่ว่าชนิดข้อมูลชนิดนี้อยู่ในรูปแบบหนึ่ง ซึ่งการเข้าถึง(ใช้งาน)ข้อมูลเป็นการอ้างถึง มากกว่าการเข้าถึงข้อมูลโดยตรง เก็บข้อมูลไว้ 2 ส่วน คือ

  2.1 Execution Stack เก็บค่าอ้างอิงที่ชี้ไปยัง Heap memory
  2.2 Heap Memory เก็บข้อมูลที่เรียกว่าออปเจ็ค ที่สร้างขึ้นมาจากคลาส

วันพฤหัสบดีที่ 27 มีนาคม พ.ศ. 2557

SVN บน CentOS และ Authen ผ่าน LDAP

รัน command linux จะใช้สิทธิ์ root หรือ sudo เอาก็ได้ ตามสะดวก แล้ว ถ้าใช้ yum อย่าลืมต่อเน็ตนะครับ

# yum install mod_dav_svn subversion

แก้ไข 3 ไฟล์ดังนี้

1. /etc/httpd/conf/httpd.conf

(เพิ่มลงล่างสุดของไฟล์)

<VirtualHost *:80>
    ServerAdmin root@localhost
    DocumentRoot /var/www/svn
    ServerName dev-server
    ErrorLog logs/dev-server-error_log
    CustomLog logs/dev-server-access_log common
</VirtualHost>


2. /etc/httpd/conf.d/subversion.conf

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn
   SVNListParentPath on
   SVNAutoversioning on

   AuthType Basic
   AuthName "Subversion repositories"   
   AuthzLDAPAuthoritative off
   AuthBasicProvider ldap
   AuthLDAPURL "ldap://xxx.xxx.xxx.xxx:389/dc=pumbaa,dc=co,dc=th?uid?sub?(objectClass=*)"
   AuthLDAPBindDN "cn=root-dn,dc=pumbaa,dc=co,dc=th"
   AuthLDAPBindPassword "password"

   Require ldap-group cn=SM,ou=Groups,dc=pumbaa,dc=co,dc=th
   Require ldap-group cn=PG,ou=Groups,dc=pumbaa,dc=co,dc=th
   Require ldap-group cn=SA,ou=Groups,dc=pumbaa,dc=co,dc=th

   Require valid-user
   AuthzSVNAccessFile /etc/svn-access-control
</Location>


3. /etc/svn-access-control

[groups]

PM = pm1, pm2pm3
SA = user1, user2, user3, user4
DEV = dev1,dev2,dev3

[/]
* =

[repos:/]
@DEV = rw
@PM = r
@SA = r

[test:/]
pm1 = r
@DEV = rw

สร้าง Repository

# mkdir /var/www/svn

# cd /var/www/svn

# svnadmin create repos
# chown -R apache.apache repos
# chcon -R -t httpd_sys_content_t /var/www/svn/repos
# chcon -R -t httpd_sys_rw_content_t /var/www/svn/repos

สร้างโครง SVN (template)

# mkdir -p /tmp/svn-structure-template/{trunk,branches,releases}

# svn import -m 'Initial import' /tmp/svn-structure-template/ http://localhost/svn/repos/

ตัวอย่าง

repos ---> trunk
repos ---> branches
repos ---> releases

รีสตาทร์ Service กันเลย

# service httpd restart

เปิด browse IE , Firfox , Chrom

Address --- >  http://localhost/svn/repos

username = ใน ldap
password = ใน ldap

อาจจะใช้ client พวก TortoiseSVN หรือ ลง plugin ใน IDE ไปเลยครับ

ตัวอย่าง command

import project
svn import -m 'Initial import' project1 http://localhost/svn/eai/trunk/project1

check out
svn co http://localhost/svn/eai/trunk/project1 project1

export
svn export http://localhost/svn/eai/trunk/project1 project1

วันอังคารที่ 18 มีนาคม พ.ศ. 2557

รู้จักกับ Cron Expression และการใช้งาน

โครงสร้างของมันปกติจะอยู่ลักษณะนี้

[min] [hour] [day of month] [month] [day of week] [program to be run]

คำอธิบาย

[min]  คือนาที ค่าที่ใส่ได้ คือ 0-59  และ * ที่หมายถึงทุกๆ นาที ซึ่งห้ามใส่ * ในช่องนี้เป็นอันขาด ไม่งั้นมันรันทุกๆ นาที (แดร็กระบบ)

[hour]   คือชั่วโมง  ค่าที่ใส่ได้คือ 0-23  และ * ที่หมายถึงทุกๆ ชั่วโมง ทั้งชั่วโมงและนาที แนะนำให้ใส่ 0 ในกรณีไม่อยากใส่อะไร เช่นอยากตั้งเป็นรันทุกๆ วัน จะได้เป็นการรันตอนเที่ยงคืน (คนน้อย) หรืออาจปรับเป็นตี 1 ตี 2 ตามสมควร

[day of month]  คือวันที่  ค่าที่ใส่ได้คือ 1-31  และ * ที่หมายถึงทุกๆ วันของเดือน (ยังกะประจำเดือน)

[month]  คือเดือน  ค่าที่ใส่ได้คือ 1-12  และ * ที่หมายถึงทุกๆ เดือน

[day of week]  คือวันของสัปดาห์  ค่าที่ใส่ได้คือ 0-6 วันอาทิตย์คือ 0 วันจันทร์คือ 1 ไล่ไปถึงวันเสาร์คือ 6 และ * ที่หมายถึงทุกๆ วันของสัปดาห์

[program to be run]  คือพาทหรือคำสั่งที่เราต้องการรัน


วิธีการใส่ก็จะมีใส่ตามวิธีเหล่านี้

1. ระบุเวลาที่ต้องการตายตัวเลย เช่น อยากรันทุกๆ 6:00 ของทุกวัน ก็จะเป็น
0   6   *   *   *   your command

2. ระบุช่วงเวลาที่ต้องการเป็นช่วงๆ เช่น อยากรันตั้งแต่วันจันทร์ถึงวันพุธ  ก็จะเป็น
0   0   *   *   1-3   your command

3. ระบุช่วงเวลาที่ต้องการเป็นหน่วยย่อยๆ เช่น อยากรันทุกๆ วันที่ 1  5  7  9  และ 11  ก็จะเป็น
0   0   1,5,7,9,11   *   *   your command

4. ระบุช่วงเวลาเป็น ทุกๆ กี่ x เช่น อยากรันทุกๆ 4 ชั่วโมง ก็จะเป็น
0   */4   *   *   *   your command

เพิ่มเติม

@yearly (or @annually) รันทุกวันที่ 1 ของเดือน มกราคม
รูปแบบ 0 0 1 1 *
@monthly รันวันแรกของเดือนทุกๆ เดือน
รูปแบบ 0 0 1 * *
@weekly รันทุกๆ วันอาทิตย์
รูปแบบ 0 0 * * 0
@daily รันทุกๆ วัน
รูปแบบ 0 0 * * *
@hourly รันทุกๆ ชั่วโมง
รูปแบบ 0 * * * *
@reboot รันตอน Start up
รูปแบบ @reboot

ตัวอย่างการตั้งเวลาในระบบ linux

คำสั่ง crontab

parameter
-l  ดูรายการที่มีการตั้งเวลาไว้
-e เพิ่มหรือแก้ไขรายการที่ตั้งเวลาไว้ แบบ vi editor

เช่น

# crontab -e

ข้างในก็ใส่ cron expression และตามด้วยโปรแกรมที่ต้องการรันได้เลย

คำสั่งยูนิกส์ Command Line

ls
เป็นคำสั่งที่ใช้สำหรับแสดงแฟ้มข้อมูล (เช่นเดียวกับ dirของDOS) มากจากคำว่า list
รูปแบบคำสั่ง ls [option] [file]
option ที่มักใช้กันใน ls คือ
-l จะแสดงผลลัพธ์แบบ Long Format ซึ่งจะแสดง Permission ของแฟ้มด้วย
-a จะแสดงแฟ้มข้อมูลทั้งหมด
-F จะแสดง / หลัง Directory และ * หลังแฟ้มข้อมูลที่ execute ได้
ตัวอย่างการใช้งาน  ls –l     ls -al     ls -F

adduser 
คำสั่งเพิ่ม User ให้กับระบบ Unix,Linux
รูบแบบการใช้งาน adduser -g (group) -d (Directory) (User)
ตัวอย่าง adduser -g root -d /home/user1 user สร้าง User ชื่อ Login คือ user1 เป็นสมาชิกในกลุ่ม root

useradd
คำสั่งเพิ่ม User ให้กับระบบ Unix,Linux (ใช้เหมือนกับคำสั่ง adduser)
รูบแบบการใช้งาน useradd -g (group) -d (Directory) (User)
ตัวอย่าง useradd -g root -d /home/user1 user สร้าง User ชื่อ Login คือ user1 เป็นสมาชิกในกลุ่ม root

userdel 
คำสั่งลบ User ออกจากระบบ Unix,Linux
รูบแบบการใช้งาน userdel [option] (Username)
ตัวอย่าง userdel -r root user1 ลบ User ชื่อ Login คือ User1 และ -r คือให้ลบ Home Directoryของ User1 ด้วย

passwd 
คำสั่งกำหนดและแก้ไขรหัสผ่านของ User ของระบบ Unix,Linux
รูบแบบการใช้งาน passwd [Username]
ตัวอย่าง passwd user1 (กำหนดรหัสผ่านให้ User1 ถ้าไม่พิมพ์ ชื่อ User ระบบUnixจะหมายความว่าแก้ไขรหัสผ่าน
ของคนที่Loginเข้ามา)

alias
คำสั่งกำหนดคำสั่งย่อของระบบ Unix,Linux (คล้ายกับคำสั่ง SETในDOSแต่สามารถใช้เปฝ้นคำสั่ง RUNได้)
รูบแบบการใช้งาน alias [ชื่อใหม่=ข้อความ]
ตัวอย่าง alias copy=cp กำหนดให้พิมพ์ copy แทนคำสั่ง cpได้

bash
คำสั่งเรียกใช้ Bourne again shellของระบบ Unix,Linux
รูบแบบการใช้งาน bash
ตัวอย่าง bash [Enter] ( เรียกใช้ Bourne again shell)

bc 
คำสั่งเรียกใช้โปรแกรมคำนวณเลขของระบบ Unix,Linux
รูบแบบการใช้งาน bc [-lwsqv] [option] [file]
ตัวอย่าง bc [Enter] 1+2 [Enter] 1^2 [Enter] a=3 [Enter] b=4 [Enter] a*b [Enter] x=2;y=5;x+y[Enter] [Ctrl-d] เพื่อออก
หมายเหตุ:คำสั่งนี้จะใช้ได้ต้องInstall Packet ลงไปก่อน

cp
เป็นคำสั่งที่ใช้สำหรับสำเนาแฟ้มข้อมูล (เช่นเดียวกับcopyของDOS) มาจากคำว่า copy
รูปแบบคำสั่ง cp source target
ตัวอย่างการใช้งาน #cp test.txt /home/user1

cal
คำสั่งแสดงปฏิทินของระบบ Unix,Linux
รูบแบบการใช้งาน cal
ตัวอย่าง cal [Enter](สั่งให้ระบบแสดง ปฏิทินเดือน ปัจจุบัน)
cal -y [Enter](สั่งให้ระบบแสดง ปฏิทินปี ปัจจุบัน)

cat
คำสั่งแสดงข้อความในFileของระบบ Unix,Linux (คล้ายกับคำสั่งTypeของDOS)
รูบแบบการใช้งาน cat
ตัวอย่าง cat /home/user1 | more อ่านข้อมูลจากไฟล์/home/user1ถ้ายาวเกินหน้าให้หยุดทีละหน้าจอ

C Compiler 
คำสั่งCompile ภาษาCของระบบ Unix,Linux (คล้ายกับคำสั่งTypeของDOS)
รูบแบบการใช้งาน cc [filename]
ตัวอย่าง cc /home/user1/industry.c จะสั่งให้ระบบCompile ภาษาC ไฟล์ชื่อ industry.c ที่ Directory /home/user1

cd 
คำสั่งChange Directoryของระบบ Unix,Linux (คล้ายกับคำสั่งCDของDOS)
รูบแบบการใช้งาน cd [directory]
ตัวอย่าง cd /etc [Enter]ไปDirectory etc
cd ..[Enter] ย้ายไปDirectoryอีก1ชั้น

chfin
คำสั่งChange your finger informationของระบบ Unix,Linux (เป็นการกำหนดข้อมูลของUser
เช่น ชื่อเต็ม ที่อยู่ เบอร์โทรศัพท์)
รูบแบบการใช้งาน chfn [username]
ตัวอย่าง chfn User1 กำหนดรายละเอียดUser1

chgrp 
คำสั่งChange Groupของระบบ Unix,Linux (เป็นการเปลี่ยนกลุ่มเจ้าของไฟล์)
รูบแบบการใช้งาน chgrp [-chfRv] (Group) (File)
ตัวอย่าง chgrp root /root/* เปลี่ยนGroupให้กับไฟล์ทุกไฟล์ในไดเรคทอรี่ /root ให้เป็น Group root

chmod
คำสั่งChange Modeของระบบ Unix,Linux (เป็นการเปลี่ยนสิทธิการเข้าถึงไฟล์)
รูบแบบการใช้งาน chmod [สิทธิ] (File)
ตัวอย่าง กำหนดสิทธิให้กับไฟล์ชื่อtest คือ chmod 754 test หรือ chmod go +r-w testให้กับไฟล์ทุกไฟล์ chmod o-r *
ตัวเลขMode rwx = 7 ; rw - =6 ; r-x =5 ; r- - = 4 ; - wx = 3 ; - w - = 2 ; - - x = 1 ; - - = 0

การกำหนดสิทธิกำหนดได้2ลักษณะคือ
1.กำหนดโดยใช้อักษรย่อกลุ่ม
2.ใช้รหัสเลขฐาน2แทนสิทธิ (1 คืออนุญาต)
กลุ่มผู้ใช้ User Group Other = ugo เช่น go-r-w+x คือกลุ่ม และคนอื่นไม่มีสิทธิอ่านเขียนแต่Runได้
สิทธิ์การใช้ -rwx rwx rwx = Read Write Execute
รหัสเลขฐาน 111 101 100 = 754 คือเจ้าของไฟล์ใช้ได้ครบ คน Group เดียวกันอ่านExecuteได้นอกนั้นอ่านได้อย่างเดียว

chown 
คำสั่งChange Ownerของระบบ Unix,Linux (เป็นการเปลี่ยนเจ้าของไฟล์)
รูบแบบการใช้งาน chown [ซื่อเจ้าของไฟล์] (ชื่อFile)
ตัวอย่าง chown user1 filename คือเปลี่ยนเจ้าของไฟล์ชื่อ filename เป็นUser1
chown -R user1.root dirname คือเปลี่ยนทั้งเจ้าของไฟล์และกลุ่มไปพร้อมกันทุกไฟล์ใน Sub dirname.

chsh 
คำสั่งchshของระบบ Unix,Linux (เป็นการเปลี่ยนShell ให้ User)
รูบแบบการใช้งาน chsh [Username]
ตัวอย่าง chsh user1 [Enter] /bin/bash [Enter]

clear
คำสั่งclearของระบบ Unix,Linux (เป็นการลบข้อความบนจอภาพ คล้ายกับคำสั่ง clsใน dos)
รูบแบบการใช้งาน clear
ตัวอย่าง clear [Enter]

cal
คำสั่งแสดงปฏิทินของระบบ Unix,Linux
รูบแบบการใช้งาน cal
ตัวอย่าง cal [Enter](สั่งให้ระบบแสดง ปฏิทินเดือน ปัจจุบัน)
cal -y [Enter](สั่งให้ระบบแสดง ปฏิทินปี ปัจจุบัน)

mesg
mesg ดู status การรับการติดต่อของ terminal
mesg y เปิดให้ terminal สามารถรับการติดต่อได้
mesg n ปิดไม่ให้ terminal สามารถรับการติดต่อได้

date
ใช้แสดง วันที่ และ เวลา
ตัวอย่าง date 17 May 2004

df
คำสั่งdf ของระบบ Unix,Linux (เป็นการตรวจสอบการใช้พื่นที่บนฮาร์ดดิสก์)
รูบแบบการใช้งานdf [option] [file]
ตัวอย่าง df [Enter]

dmesg
คำสั่งdmesgของระบบ Unix,Linux (เป็นการให้แสดงผลเหมือนตอน Boot)
รูบแบบการใช้งาน dmesg
ตัวอย่าง dmesg | more [Enter]
หมายเหตุ คำสั่งนี้ ใช้ตรวจสอบ เมื่อเกิดปัญหา เช่น Linux ไม่รู้จัก Driver CD-Rom หรือปัญหาอื่นๆ

echo
คำสั่งechoของระบบ Unix,Linux (เป็นการให้แสดงข้อความ เหมือนกับ ECHOของDOS)
รูบแบบการใช้งาน echo (ข้อความที่ต้องการให้แสดงผล)
ตัวอย่าง echo my name is user1
echo Hello > /dev/tty2 ส่งข้อความ Hello ไปออกจอเทอร์มินอลที่2

ed
คำสั่ง ed ของระบบ Unix,Linux (โปรแกรมแก้ไขข้อความใน Text file เหมือนกับคำสั่ง edlinของDOS)
รูบแบบการใช้งาน ed (fileName)
ตัวอย่าง ed /home/user/test (ออกกดq)
สำหรับคนที่ไม่ถนัดคำสั่งนี้แนะนำให้ใช้คำสั่ง picoหรือvi หรือemacsแทนได้เช่นกัน

emacs
คำสั่ง emacs ของระบบ Unix,Linux (โปรแกรมแก้ไขข้อความใน Text file )
รูบแบบการใช้งาน emacs (fileName)
ตัวอย่าง emacs /home/user/test (help กด Ctrl - h ; ออกกด Ctrl - x Ctrl - c)

exit
คำสั่ง exit ของระบบ Unix,Linux (ออกจากระบบยูนิกส์ )
รูบแบบการใช้งาน exit
ตัวอย่าง exit

finger
คำสั่ง finger ของระบบ Unix,Linux (แสดงชื่อUserที่กำลังLoginเข้ามาแต่คำสั่ง Whoจะให้รายละเอียดดีกว่า)
รูบแบบการใช้งาน finger [username]
ตัวอย่าง finger user1 แสดงชื่อและรายละเอียด user1

fsck
คำสั่ง fsck ของระบบ Unix,Linux (เป็นคำสั่ง ตรวจสอบและซ่อมแซม Linux file system เหมือนกับ
คำสั่งScandisk ของDos)
รูบแบบการใช้งาน fsck [option]
ตัวอย่าง /sbin/fsck -a /dev/hd1

ftp
คำสั่ง ftp ของระบบ Unix,Linux (เป็นโปรแกรมรับ-ส่งไฟล์ )
รูบแบบการใช้งาน ftp (IP or Name of FTP Server )
ตัวอย่าง ftp 132.209.1.2 [Enter]

Login:anonymous , Password: Username@YourDomain.com
คำสั่งที่เกี่ยวข้อง ls - ดูไฟล์ ; pwd -ดูdir. ที่อยู่ ;cd - เปลี่ยน dir ;lcd - เปลี่ยน local dir ;mput* -ส่งไฟล์ ;mget – รับ
ไฟล์ ;bye - ออก

grep
คำสั่ง grep ของระบบ Unix,Linux (เป็นการสั่งให้ค้นหาตามเงื่อนไข )
รูบแบบการใช้งาน grep (option)
ตัวอย่าง grep -i ftp /etc/test ค้นหาบรรทัดที่มีคำว่า "ftp"ไม่สนใจพิมพ์เล็ก-ใหญ่ จาดไฟล์ /etc/test

groupadd 
คำสั่ง groupadd ของระบบ Unix,Linux (เป็นการเพิ่มรายชื่อกลุ่มของ User)
รูบแบบการใช้งาน groupadd (GroupName )
ตัวอย่าง #groupadd staff สร้างกลุ่มของ User ชื่อ Staff เพิ่มให้ระบบ

groupdel
คำสั่ง groupdel ของระบบ Unix,Linux (เป็นการลบรายชื่อกลุ่มของ User)
รูบแบบการใช้งาน groupadd (GroupName )
ตัวอย่าง #groupdel staff ลบกลุ่มของ User ชื่อ Staffออกจากระบบ

gzip/gunzip
คำสั่งgzip/gunzipของระบบ Unix,Linux (เป็นการบีบอัดไฟล์หรือขยายบีบอัดไฟล์)
รูบแบบการใช้งาน gzipหรือgunzip (-cdfhlLnNrtv19 ) [file]
ตัวอย่าง #gzip -9vr /home/samba/* บีบอัดไฟล์ข้อมูลทุกไฟล์ ในSub /home/samba จะเปลี่ยนเป็นนามสุกล .gz
#gunzip -dvr /home/samba/* คลายการบีบอัดไฟล์ข้อมูลทุกไฟล์ที่สกุล .gz ในSub /home/samba

halt 
คำสั่ง halt ของระบบ Unix,Linux (เป็นการสั่งให้เครื่องหยุดทำงาน)
รูบแบบการใช้งาน halt [-n] [-w] [-d] [-f] [-I] [-p]
ตัวอย่าง #halt
คำสั่งที่เกี่ยวข้อง คือ Shutdown ; init0 , reboot

history
คำสั่ง history ของระบบ Unix,Linux (เป็นการดูประวัติการใช้คำสั่งในCommand line คล้ายกับ
การกดF7ในDOSคือเรียกใช้คำสั่งDos key)
รูบแบบการใช้งานhistory [n] [-r wan [filename] ]
ตัวอย่าง #history 20 ดูคำสั่งที่เพิ่งใช้ไป20คำสั่งที่แล้ว

ifconfig 
คำสั่ง history ของระบบ Unix,Linux (เป็นการตรวจสอบกำหนดค่าNetworkของLan Card)
รูบแบบการใช้งาน ifconfig [option]
ตัวอย่าง #ifconfig

ipchains
คำสั่ง ipchains ของระบบ Unix,Linux (เป็นคำสั่งสำหรับกำหนดควบคุม การรับส่งผ่านข้อมูลของ Firewall)
รูบแบบการใช้งาน ipchains [parameter] command [option]
ตัวอย่าง #ipchains -L ดูสถานะการ Set IPchainsในปัจจุบัน

jobs
คำสั่ง jobs ของระบบ Unix,Linux (เป็นคำสั่งสำหรับกำหนดควบคุม การรับส่งผ่านข้อมูลของ Firewall)
รูบแบบการใช้งาน jobs
ตัวอย่าง #sleep 20 & jobs

kill
คำสั่ง kill ของระบบ Unix,Linux (เป็นคำสั่งสำหรับยกเลิก Process)
รูบแบบการใช้งาน kill [option] (process ID)
ตัวอย่าง ps -A ดูหมายเลขที่ช่อง PIDของProcess ที่ต้องการลบ
Kill -9

login 
คำสั่ง login ของระบบ nnn แทนnnnด้วยหมายเลขPID -9 คือบังคับฆ่าให้ตาย
Unix,Linux (เป็นคำสั่งการเข้าระบบหรือเปลี่ยน User Login) รูบแบบการใช้งาน login [fp] (UserName)
ตัวอย่าง #login:root

mkdir 
เป็นคำสั่งที่ใช้สำหรับการสร้าง directory (ในทำนองเดียวกับ dos) มาจากคำว่า make directory
รูปแบบของคำสั่งmkdir mkdir [option] [file]
โดย option ที่มักใช้กันใน mkdir คือ
-m จะทำการกำหนด Permissioin (ให้ดูคำสั่ง chmod เพิ่มเติม)
-p จะทำการสร้าง Parent Directory ให้ด้วยกรณีที่ยังไม่มีการระบุ directory ในที่นี้อาจเป็น relative
หรือ absolute path ก็ได้
ตัวอย่าง
mkdir /home
mkdir -p -m755 ~/้home/user1

mv 
เป็นคำสั่งที่ใช้สำหรับการย้ายแฟ้มข้อมูลและ Directory รวมถึงการเปลี่ยนชื่อด้วย (ในทำนองเดียวกับ dos)
มาจากคำว่า move
รูปแบบคำสั่ง mv source target
ตัวอย่าง mv *.tar /backup
mv test.txt old.txt
mv bin oldbin

more
คล้ายกับคำสั่ง cat ไม่เหมาะกับการดูข้อมูลที่มีความยาวมากๆ ดังนั้น จึงได้มีการพัฒนา more ขึ้น
เพื่อช่วยให้สามารถดูข้อมูลที่มีขนาดยาวได้เป็นช่วงๆ
รูปแบบคำสั่ง more file
ภายในโปรแกรม more จะมีคำสั่งเพื่อใช้งานคราวๆ ดังนี้
= แสดงเลขบรรทัด
q ออกจากโปรแกรม
เลื่อนไปยังหน้าถัดไป เลื่อนไปยังบรรทัดถัดไป
h แสดง help
ตัวอย่าง more test.txt

man 
คำสั่ง man ของระบบ Unix,Linux (เป็นคำสั่งแสดงข้อความ อธิบายการใช้คำสั่ง)
รูบแบบการใช้งานman (Command)
ตัวอย่าง #man ls
หมายเหตุ เมื่อต้องการออก กด q ;ใช้[Spacebar] เลื่อนหน้าถัดไป ; ใช้ลูกศรขึ้นดูหน้าผ่านมา

mount
คำสั่ง mount ของระบบ Unix,Linux (เป็นคำสั่งเชื่อมต่ออุปกรณ์เข้ากับระบบ)
รูบแบบการใช้งาน mount (-t type) DeviceDriver MountPoint
ตัวอย่าง # การ Mountแบบที่1 CdRom mount -t iso9660 /dev/cdrom /mnt/cdrom
#การ Mount CdRom แบบที่2 mount /dev/cdrom (เมื่อmountแล้วCDจะอยู่ที่ /mnt/CdRom ยกเลิกดูคำสั่ง Unmount)

rmdir
เป็นคำสั่งที่ใช้สำหรับการลบ directory (ในทำนองเดียวกับ dos) มาจากคำว่า remove directory
โครงสร้างคำสั่ง
rmdir [option] [file]
โดย option ที่มักใช้กันใน mkdir คือ -p จะทำการลบ Child และ Parent Directory ตามลำดับ
directory ในที่นี้อาจเป็น relative หรือ absolute path ก็ได้ ตัวอย่าง rmdir /home

tar
เป็นคำสั่งเพื่อการ backup และ restore file ทั้งนี้การ tar จะเก็บทั้งโครง สร้าง directory และ file permission ด้วย
(เหมาะสำหรับการเคลื่อนย้าย หรือแจกจ่ายโปรแกรมบนระบบ UNIX) มาจากคำว่า tape archive
รูปแบบคำสั่ง tar [option]... [file]...
โดย option ที่มักใช้กันใน echo คือ
-c ทำการสร้างใหม่ (backup)
-t แสดงรายชื่อแฟ้มข้อมูลในแฟ้มที่ backup ไว้
-v ตรวจสอบความถูกต้องของการประมวลผล
-f ผลลัพธ์ของมาที่ file
-x ทำการ restore
ตัวอย่าง tar -xvf data.tar

talk 
คำสั่งที่ใช้สำหรับการพูดคุยระหว่างผู้ใช้ด้วยกันบนระบบ ซึ่งผู้ใช้ทั้งทั้ง 2 ฝ่ายจะต้องพิมพ์คำสั่ง Talk ถึงกันก่อน จึงจะเริ่มการสนทนาได้
รูปแบบคำสั่ง talk user[@host] [tty]
กรณีไม่ระบุ host โปรแกรมจะถือว่าหมายถึงเครื่องปัจจุบัน (นอกจากนี้ยังมีคำสั่ง ytalk ซึ่งสามารถพูดคุยได้พร้อม
กันมากกว่า 2 คน) ซึงบางกรณีเราอาจจะต้องระบุ tty ด้วยหากมีผู้ใช้ Log in เข้าสู่ระบบด้วยชื่อเดียวกันมากกว่า 1 หน้าจอ
ตัวอย่าง talk m2k@nanastreet.com

write
คำสั่งใช้เพื่อการส่งข้อมูลทางเดียวจากผู้เขียนไปถึงผู้รับบนเครื่องเดียวกันเท่านั้น
รูปแบบคำสั่ง write user [tty]
เมื่อมีการพิมพ์คำสั่ง write ผู้ใช้จะเห็นข้อความซึ่งจะแสดงว่าข้อความดังกล่าวถูกส่งมาโดยใคร ซึ่งหากผู้รับต้องการ
ตอบกลับ ก็จะต้องใช้คำสั่ง write เช่นกัน เมื่อพิมพ์เสร็จแล้วให้พิมพ์ตัวอักษร EOF หรือ กด CTRL+C เพื่อเป็น
การ interrupt ทั้งนี้ข้อความที่พิมพ์หลังจาก write จะถูกส่งหลังจากการกด Enter เท่านั้น
ตัวอย่าง write m2k

who am i
คำสั่งใช้เพื่อแสดงว่าผู้ใช้ซึ่ง login เข้าสู่ระบบนั้น (ตัวเราเอง) login ด้วยชื่ออะไร
รูปแบบคำสั่ง/ตัวอย่าง whoami หรือ who am i (บน SUN OS หรือ UNIX บางตัวเท่านั้น)

file 
คำสั่งfileบนระบบ DOS/Windows นั้น ประเภทของแฟ้มข้อมูลจะถูกระบุด้วยนามสกุล แต่ใน UNIX จะไม่มี
นามสกุลเพื่อใช้ระบุประเภทของแฟ้มข้อมูล ดังนั้นการหาประเภทของแฟ้มข้อมูลจะดูจาก Context ภายใน
ของแฟ้ม ซึ่งคำสั่ง file จะทำการอ่าน Content และบอกประเภทของแฟ้มข้อมูลนั้นๆ
รูปแบบคำสั่ง file [option]... file
ตัวอย่าง file /bin/sh file report1.doc

free
แสดงหน่วยความจำที่เหลืออยู่บนระบบ
โครงสร้างคำสั่ง free [-b|-k|-m]
โดย option ที่มักใช้กันใน free คือ
-b แสดงผลลัพธ์เป็นหน่วย byte
-k แสดงผลลัพธ์เป็นหน่วย kilobyte
-m แสดงผลลัพธ์เป็นหน่วย megabyte
ตัวอย่าง free     free –b  free -k

pwd
เป็นคำสั่งที่ใช้สำหรับแสดง Directory ปัจจุบัน (ในทำนองเดียวกับการพิมพ์ cd บน DOS) มาจากคำว่า print work directory
รูปแบบคำสั่ง / ตัวอย่าง pwd

uname
คำสั่งแสดง ชื่อและรุ่นของ OS ชื่อและรุ่นของ cpu ชื่อเครื่อง
ตัวอย่าง uname -a

hostname
คำสั่งแสดงชื่อเครื่องที่ใช้อยู่
ตัวอย่าง hostname

tty
แสดงหมายเลข terminal ที่ใช้งานอยู่
ตัวอย่าง tty

id 
ใช้แสดงชื่อและกลุ่มมของผู้ใช้งาน
ต้วอย่าง id

วันอาทิตย์ที่ 9 มีนาคม พ.ศ. 2557

การใช้งาน vi editor

VI editor เรียกได้ว่าเป็น editor คู่บุญของระบบ Linux และ Unix ผู้ใช้งานจำเป็นอย่างที่สุดที่จะต้องสามารถใช้งาน vi editor ได้อย่างคล่องแคล่ว ดังนั้นเรามาทำความเข้าใจเกี่ยวกับเจ้า vi editor กันดีกว่า

เรียกใช้ vi editor
การเรียกใช้ vi editor ก็ง่ายๆให้พิมพ์ว่า vi ตามด้วยชื่อไฟล์ เช่น #vi filename.txt
จะเป็นการ edit ไฟล์ filename.txt (ถ้าไม่มีจะสร้างขึ้นใหม่เลย)

โหมดการทำงาน มี 2 โหมดคือ

1. command mode ใช้สำาหรับรับคำาสั่ง ของผู้ใช้ เช่น จะเข้าสู่ insert mode บันทึกไฟล์ ออกจากโปรแกรม  ฯลฯ
2. insert mode ใช้สำาหรับแก้ไขไฟล์ เช่น พิมพ์ข้อมูลเพิ่ม ลบคำเมื่อเราเปิดโปรแกรม vi ขึ้นมาโปรแกรมจะเข้าสู่ command mode เราจะพิมพ์ข้อความลงไปไม่ได้จนกว่าเราจะเข้าสู่ 
insert mode โดยการกดปุ่ม i (หรืออื่นๆ) เมื่อเราทำางานใน insert modeเราสามารถแก้ไขข้อมูลในไฟล์ได้ ถ้าเราต้องการบันทึกไฟล์ หรือออกจากการใช้งาน vi ก็ต้องกลับเข้าสู่ command mode โดยการกดปุ่ม Esc เข้าสู่ insert mode เพื่อแก้ไขข้อความ
a เพิ่มข้อความที่อยู่ข้างหลัง
A เพิ่มข้อความต่อท้ายบรรทัดปัจจุบัน
i แทรกข้อความที่อยู่หน้าเคอร์เซอร์
I แทรกข้อความที่ต้นบรรทัดปัจจุบัน
o เพิ่มบรรทัดว่างๆใหม่อีกหนึ่งบรรทัด ถัดจากบรรทัดที่เคอร์เซอร์อยู่
O เพิ่มบรรทัดว่างๆใหม่อีกหนึ่งบรรทัด เหนือจากบรรทัดที่เคอร์เซอร์อยู่

การบันทึกไฟล์และออกจากโปรแกรม (command mode)
ถ้าทำางานอยู่ใน insert mode เข้าสู่ command mode โดยการกด Esc แล้วค่อยพิมพ์คำาสั่ง
ZZ ออกจากโปรแกรมบันทึกไฟล์
:q! ออกจากโปรแกรมไม่บันทึกไฟล์
:wq ออกจากโปรแกรมบันทึกไฟล์

การเลื่อนเคอร์เซอร์ไปยังตำาแหน่งต่างๆ ใน 1 จอภาพ
h เลื่อนเคอร์เซอร์ไปทางซ้าย 1 ตัวอักษร
j เลื่อนเคอร์เซอร์ไปยังบรรทัดล่าง 1 บรรทัด
k เลื่อนเคอร์เซอร์ไปยังบรรทัดบน 1 บรรทัด
l เลื่อนเคอร์เซอร์ไปทางขวา 1 ตัวอักษร
เลื่อนเคอร์เซอร์ทีละคำ ประโยค ย่อหน้า
w เลื่อนเคอร์เซอร์ไปยังตัวอักษรแรกของคำาที่อยู่ถัดไป
e เลื่อนเคอร์เซอร์ไปยังตัวอักษรสุดท้ายของคำาที่อยู่ถัดไป
b เลื่อนเคอร์เซอร์ไปยังตำแหน่งแรกของคำาที่อยู่ก่อนหน้า

การเลื่อนจอภาพ
^F เลื่อนจอภาพเพื่อดูข้อมูลที่อยู่ในหน้าถัดไป
^B เลื่อนจอภาพเพื่อดูข้อมูลที่อยู่ก่อน 1 หน้า
^D เลื่อนจอภาพไปอีกครึ่งจอภาพ
^U เลื่อนจอภาพย้อนกลับไปอีกครึ่งจอภาพ
^R หรือ ^L ให้แสดงจอภาพปัจจุบันอีกครั้งหนึ่ง

การลบ
dd ลบเฉพาะบรรทัดที่เคอร์เซอร์อยู่
dw ลบคำตั้งแต่ตัวอักษรที่เคอร์เซอร์อยู่ไปจนถึงตัวอักษรแรกของคำาต่อไป
de ลบคำตั้งแต่ตัวอักษรที่เคอร์เซอร์อยู่ไปจนถึงตัวอักษรสุดท้ายของคำาปัจจุบัน
db ลบคำตั้งแต่ตัวอักษรที่อยู่หน้าเคอร์เซอร์ไปถึงอักษรแรกของคำาปัจจุบัน
d^ ลบคำตั้งแต่ตัวอักษรที่อยู่หน้าเคอร์เซอร์ไปจนถึงตัวอักษรแรกของบรรทัดที่ไม่ใช่ space
d$ ลบคำตั้งแต่ตัวอักษรที่เคอร์เซอร์อยู่ไปจนถึงตัวสุดท้ายของบรรทัด

การโยกย้ายและการทำสำเนา
ym นำาข้อความที่ต้องการเก็บลงใน buffer (m=จำานวนบรรทัด)
yy นำาข้อความทั้งบรรทัด ที่เคอร์เซอร์อยู่ไปเก็บใน buffer
p นำาข้อความใน buffer มาวางหลังเคอร์เซอร์

การยกเลิกคำาสั่ง
u undo
. redo

การค้นหาคำ
/Test หาคำว่า Test
/This is test หาวลี This is test
/^Test หาคำว่า Test หาคำว่า Test ที่ปรากฏที่ต้นบรรทัด
/Test$ หาคำว่า Test หาคำว่า Test ที่ปรากฏที่ท้ายบรรทัด
/^$ หาบรรทัดที่เป็นบรรทัดว่างๆ

โครงสร้าง Subversion

                 ส่วนที่สำคัญของ Subversion เรียกย่อๆ ว่า svn คือ trunk , branches และ tags (ในที่นี้ใช้ releases) ที่จริงแล้วชื่อพวกนี้ไม่ได้เป็นข้อบังคับหรือว่าอะไรเลย ไม่ได้มีความหมายพิเศษต่อการทำงานของ svn ด้วย แต่ว่าเป็นอะไรที่คนส่วนใหญ่เค้าตกให้ไปในทางเดียวกัน แต่ใน svn ก็จะมองเป็นโฟลเดอร์ธรรมดาๆ ดังนั้นเราจึงควรทำอะไรตามคนส่วนใหญ่ จะได้สื่อสารกันได้ง่ายๆ

ส่วนประกอบหลัก
  1. trunk ก็จะหมายถึงสายการพัฒนากลางหรือสายพัฒนาหลัก และเวอร์ชันล่าสุดของโปรเจกก็มักจะอยู่ที่นี่ ถ้าอยากได้ซอร์สโค้ดของโปรเจคก็ควรจะ check out จากที่นี่ครับ และ trunk ก็จะถูกคาดหวังว่าจะสามารถนำไป build และ compile เพื่อใช้งานได้
  2.  branch เป็นกิ่งก้านสาขาที่แตกออกมา (ในกรณีปกติก็คงแตกออกมาจาก trunk นั่นแหละ) อาจจะแตกออกมาเพื่อให้คนๆหนึ่งไปรับผิดชอบ feature หนึ่งๆ เพราะเกรงว่าการแก้ไขโดยคนนั้นๆทำไปทำมาจะทำให้ trunk เจ๊ง (คอมไพล์ไม่ผ่าน) ก็เลยให้ไปทำใน branch ซะ แน่ใจว่าเสร็จแล้วค่อยเอามารวม (merge) ที่ผ่านมาผมใช้สำหรับ Maintenance/Bug fix เป็นต้น ในที่นี้ใช้แยกออกเป็นวิว
  3.  tag หรือ release อันนี้แปลง่ายๆ คือมันเป็น snapshot  คือเหมือนเป็นการบันทึก state ณ เวลาหนึ่งๆไว้นั่นเอง มักถูกใช้ในการเก็บเวอร์ชันต่างๆไว้ เป็นต้นว่า 1.0.0 ตอน release เวอร์ชัน 1.0.0 เป็นต้น ถ้าทำไปเรื่อยๆจนถึงเวอร์ชัน 2.1 แล้ว อยากดูโค้ดตอนที่ release 1.0.0 ว่าเป็นยังไงก็เปิด tags/1.0.0 ได้





ทั้งการทำ branch และ tag นั้น เป็นเพียงการ copy trunk ไปใส่ไว้ใน branches และ tags เท่านั้น ซึ่งการ copy ผ่าน svn มันก็จะเป็นแค่การคัดลอก reference มา ดังนั้นจึงทำได้เร็วมาก และหายห่วงเรื่องไฟล์ซ้ำซ้อนได้เลย

ข้อมูลเพิ่มเติม
http://blog.manishchhabra.com/2010/08/version-control-system-repository-branching-scenarios/

Public-key Cryptography: RSA

Public-key Cryptography: RSA

RSA ได้รับการพัฒนาขึ้นที่มหาวิทยาลัย MIT ในปี 1977 โดยศาสตราจารย์ 3 คน ซึ่งประกอบด้วย Ronald Rivest, Adi Shamir และ Leonard Adleman ชื่อของอัลกอริทึมได้รับการตั้งชื่อตามตัวอักษรตัวแรกของนามสกุลของ ศาสตราจารย์ทั้งสามคน
RSA คืออะไร??? RSA เป็นอัลกอริทึม อย่างหนึ่งที่มีการเข้ารหัสแบบ Asymmetric-key cryptography หรือ อีกชื่อนึงคือ Public-key cryptography ซึ่งการเข้ารหัสแบบนี้จะมีเรื่องของ Public key และ Private key เข้ามาเกี่ยวข้องด้วย RSA ใช้กันมากใน Electronic Commerce protocols

เรื่องของ RSA นี้เกี่ยวกับการ Moduloและ  Public key กับ Private key ที่เป็นจํานวนเฉพาะ โดยสมมุติว่า public key  = p และ private key = q แล้วแทนค่าลงไปว่า
p = 9 , q = 7 แล้วลองคูณกันดู จะเห็นว่าได้ 63 … ค่าของจํานวนเฉพาะคูณกัน จะได้จํานวนเฉพาะ แล้วตัวที่หารลงตัวก็มีเฉพาะ แค่ 9 กับ 7 ไม่นับ 1กับ63นะครับ  แล้วทีนี้ลองสมมุติค่าว่าเป็นจํานวนตัวเลขที่สูงมากๆๆๆอย่างเช่น 12345 คูณกับ 6789 จะได้ 83810205 จะเห็นได้ว่าค่าของมันมีจํานวนเยอะมากๆๆเลย แล้วทําให้การหาตัวเลขที่หารมันลงตัวนะ ทําได้ยากขึ้นซึ่งคุณสมบัตินี้ของเลขจํานวนเฉพาะเลยถูกนําไปใช้ในสูตรของ RSA
ส่วนนี้คือสูตรของ RSA ซึ่งในการทํางานจริงๆๆ แล้ว เราจะค่าเพียงบางส่วนที่เป็นเฉพาะ public key ทําให้สามารถหาค่าของมันได้ยากมาก ต้องใช้ Discrete Logarithm ในการแก้ซึ่งในบางกรณีก็แก้ไม่ได้ทําให้ RSA ก็มีความปลอดภัยสูงทีเดียวเลย
Private Key: d = e-1(mod(p-1)(q-1))
Encrypting: c = me(mod n)
Decrypting: m = cd(mod n)

วันพุธที่ 5 กุมภาพันธ์ พ.ศ. 2557

ส่งเมล์กับ Apache Commons Mail แบบง่ายๅ

แบบที่ 1

public static void send(String to, String subject, String message, String from) throws EmailException {
        HtmlEmail email = new HtmlEmail();
        email.setHostName("smtp.gmail.com");
        email.setSmtpPort(465);
        email.setAuthenticator(new DefaultAuthenticator("user@gmail.com", "password"));
        email.setSSLOnConnect(true);

        email.setFrom(from);
        email.setSubject(subject);
        email.setHtmlMsg(message);
        email.setCharset("utf-8");

        email.addTo(to);
        email.send();
}

ตรวจสอบว่า Client ที่เรียกเว็ปเราใช้ Browser อะไร Device อะไร

1. ตรวจสอบ Browser

public static String isBrowser(HttpServletRequest request) {
        String deviceType = request.getHeader("User-Agent");

        if (deviceType.indexOf("MSIE") != -1) {
            return "Internet Explorer";
        } else if (deviceType.indexOf("Firefox") != -1) {
            return "Firefox";
        } else if (deviceType.indexOf("Chrome") != -1) {
            return "Chrome";
        } else if (deviceType.indexOf("Safari") != -1) {
            return "Safari";
        } else if (deviceType.indexOf("Presto") != -1) {
            return "Opera";
        } else {
            return null;
        }
}

2. ตรวจสอบ Device

public static String isDevice(HttpServletRequest request) {
        String deviceType = request.getHeader("User-Agent");

        if (deviceType.indexOf("Mobile") != -1 || deviceType.indexOf("Android") != -1) {
            return "Mobile";
        } else {
            return "Desktop";
        }

}

Java Reflect

ปกติแล้วเราจะเรียกใช้งาน method ใน class โดยการ สร้าง object class นั้น ๆ แล้วเรียกใช้งาน method ใน class

เช่น 

A obj = new A();
obj.method();

แต่ยังมีอีกวิธีนึง คือการเรียกใช้งาน แบบ reflect ตัวอย่างเช่น

แบบที่ 1 (ธรรมดา)

1. Class Service มี method hello() ไว้ให้เรียกใช้งาน

package demo.reflect;

public class Services {

    public String hello() throws InterruptedException {
        return "Hi method hello()";

    }
}


2. Class Test เป็น class ที่เรียกใช้งาน method hello ของ class Service โดยวิธีการ reflect

package demo.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

    public static void main(String[] args) {
        try {
            Services clazz = new Services();
            Method method = clazz.getClass().getMethod("hello", new Class[]{});
            Object ret = method.invoke(clazz, new Object[]{});
            System.out.println("result : " + ret);
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

แบบที่ 2 (ส่ง Parameter ไปด้วย)


1. Class Service มี method hello() ไว้ให้เรียกใช้งาน

package demo.reflect;

public class Services {

    public String hello(String name) throws InterruptedException {
       return "Hi " + name;
    }
}


2. Class Test เป็น class ที่เรียกใช้งาน method hello ของ class Service โดยวิธีการ reflect

package demo.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

    public static void main(String[] args) {
        try {
            Services clazz = new Services();
            Method method = clazz.getClass().getMethod("hello", new Class[]{String.class});
            Object ret = method.invoke(clazz, new Object[]{"aekasit"});
            System.out.println("result : " + ret);
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

วันเสาร์ที่ 1 กุมภาพันธ์ พ.ศ. 2557

LDAP บน Redhat 5.4

1. Install (RPM)

 - compat-openldap-2.3.43_2.2.29-3.el5.i386.rpm
 - libtool-ltdl-1.5.26-4.fc10.i386.rpm
 - openldap-servers-2.3.43-3.el5.i386.rpm
 - openldap-clients-2.3.43-3.el5.i386.rpm

2. Config
/etc/Openldap/slapd.conf

3. Start Server


4. Create Structure (Apache Directory Studio)


5. Create Group and User    ou = Users, ou = Pumbaa