Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

01 tháng 12, 2016

Hướng dẫn cài đặt Maven trên Centos

Trong bài viết này, tôi sẽ giới thiệu về cách cài đặt Maven trên môi trường Centos.
Yêu cầu:

  • Bạn phải có quyền sudo trên hệ thống.
  • Bạn phải cài đặt JDK trên hệ thống.
  • Download bộ cài Maven từ địa chỉ http://maven.apache.org/download.cgi
Các bước thực hiện:

  • Giải nén bộ cài bằng lệnh (chú ý thay đổi thông tin phiên bản cho phù hợp):
    sudo tar xzf apache-maven-3.0.5-bin.tar.gz -C /usr/local
  • Chuyển tới thư mục /usr/local.
  • Tạo link với thư mục Maven bằng lệnh (chú ý thay đổi phiên bản cho phù hợp):
    sudo ln -s apache-maven-3.0.5 maven
  • Tạo biến môi trường cho hệ thống bằng cách tạo tập tin maven.sh như sau:
    sudo vi /etc/profile.d/maven.sh
    export M2_HOME=/usr/local/maven
    export PATH=${M2_HOME}/bin:${PATH}
  • Cuối cùng logout và login lại rồi kiểm tra bằng lệnh
    mvn -version
    Nếu thấy hiện ra phiên bản của maven là được.
Lưu ý nếu bạn cài maven trong môi trường proxy thì cần thêm nội dung sau để sử dụng:
  • Tạo tập tin settings.xml bằng lệnh:
    vi ~/.m2/settings.xml
  • Nội dung của tập tin sẽ như sau:
    
      
        
          true
          http
          proxy.host.com
          port_number
          proxy_user
          proxy_user_password
          www.google.com
        
      
    
  • Trong đó:
    •  proxy.host.com là địa chỉ máy chủ proxy.
    • port_number là cổng máy chủ proxy
    • proxy_user là user để đăng nhập proxy.
    • proxy_user_pasword là mật khẩu đăng nhập proxy
    • nonProxyHosts là các host không cần phải qua proxy
Tham khảo thêm tại địa chỉ:

12 tháng 11, 2016

Hướng dẫn cài đặt Hbase ở chế độ Distributed

Tiếp tục loạt bài hướng dẫn làm quen với BigData, hôm nay tôi sẽ hướng dẫn các bạn cách cài đặt Hbase.
Hbase là gì thì các bạn có thể tìm thông tin trên mạng.
Bài này được tóm tắt từ công việc thực tế của tác giả (mất 2 ngày ngồi ngẫm nghĩ và xử lý các vấn đề phát sinh) vì thế nên tỉ lệ cài thành công khá cao, nên nếu gặp lỗi thì chắc chắn bạn đã làm sai ở một bước nào đó.
Bài viết giả sử bạn đã cài đặt thành công Hadoop ở chế độ Distrubted từ trước.
1. Cài đặt HBase
Bạn có thể download bộ cài Hbase tại đây: http://www-us.apache.org/dist/hbase/
Tiến hành giải nén Hbase vào thư mục /opt/:
$ tar -xzf hbase-0.98.18-hadoop2-bin.tar.gz
Thêm biến môi trường vào tập tin ~/.bash_profile với nội dung sau:
export HBASE_HOME="/opt/hbase"
export PATH="$HBASE_HOME/bin:$PATH"
Kiểm tra xem đã cài đặt thành công chưa bằng lệnh:
hbase version
2. Cấu hình cho HBase
Sửa nội dung tập tin /opt/hbase/conf/hbase-env.sh với nội dung sau:
export JAVA_HOME=/usr/java/default
export HBASE_MANAGES_ZK=true
export HBASE_PID_DIR=/opt/hbase/var
Lưu ý:

  • Nếu HBASE_MANAGES_ZK = true tức là ta không phải cài thêm zookeeper nữa mà HBase sẽ tự quản lý bằng Zookeeper của mình (Cài đặt ZooKeeper riêng như nào sẽ được giới thiệu trong một bài viết khác)
  • HBASE_PID_DIR là thư mục đặt file pid của HBase, nếu chưa có thì phải tự tạo.
Tiếp tục sửa nội dung tập tin /opt/hbase/conf/hbase-site.xml và thêm vào nội dung sau;

        
                hbase.master
                sglamp.edumall.co.th:60000
        
        
                hbase.master.info.port
                60010
        
        
                hbase.rootdir
                hdfs://sglamp.edumall.co.th:9000/hbase
        
        
                hbase.cluster.distributed
                true
        
        
                
                        hbase.zookeeper.property.dataDir
                
                hdfs://sglamp.edumall.co.th:9000/zookeeper
        
        
                hbase.zookeeper.quorum
                sglamp2.edumall.co.th
        
        
                hbase.zookeeper.property.clientPort
                2181
        
        
                hbase.zookeeper.property.maxClientCnxns
                1000
        

Lưu ý:

  • Cần cấu hình thông tin  hbase.master.info.port thì mới có web ui để xem, nếu muốn disable thì bỏ dong này đi.
  • Số lượng Zookeeper quorum nên là số lẻ.
  • hbase.cluster.distributed phải là true.
  • hbase.master.info.port phải được để trên mọi file hbase-site.xml của các node.
Mở tập tin /opt/hbase/conf/regionservers trên tất cả các node của Hbase và thêm nội dung sau:
node1
node2
Trong đó nodex là hostname của tất cả các node trên Hbase.
3. Chạy Hbase
Để khởi động Hbase ta chạy lệnh sau:
/opt/hbase/bin/shServer.sh start 
Để tắt Hbase ta chạy lệnh sau:
/opt/hbase/bin/shServer.sh stop 

10 tháng 11, 2016

Cài đặt Hadoop trên môi trường multinode

Trong bài viết trước tôi đã hướng dẫn các bạn tiến hành cài Hadoop trong môi trường single node. Tuy nhiên đây chỉ là môi trường để test, thực tế không ai sử dụng Hadoop trên một máy chủ cả.
Vì vậy trong bài này tôi sẽ tiếp tục hướng dẫn các bạn cách cài Hadoop trong môi trường multi server.
Các bước chuẩn bị bạn làm y hệt như trong bài hướng dẫn này và dừng lại sau bước tạo ssh-key.
Ở đây, tôi giả định bạn đang để các máy có IP như sau (cấu hình file hosts):
192.168.1.109 master.hadoop.com
192.168.1.145 slave.hadoop.com

Cấu hình ssh-key cho các máy chủ
Bạn chạy lệnh sau để cấu hình:
# su hadoop
$ ssh -keygen -t rsa 
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@master.hadoop.com 
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave.hadoop.com 
$ chmod 0600 ~/.ssh/authorized_keys 
$ exit
Download và giải nén bộ cài hadoop vào thư mục /opt/hadoop như sau:
Quay về tài khoản root nếu đang ở tài khoản khác. 
Tải về Hadoop (lưu ý có thể chọn phiên bản khác tùy ý):
wget http://www-eu.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
Giải nén file vừa tải về:
tar xfz hadoop-2.7.2.tar.gz
Tạo thư mục lưu các tập tin của Hadoop:

mkdir /opt/hadoop
mv hadoop-2.7.2/* /opt/hadoop

 Đổi quyền cho thư mục:

chown -R hadoop:hadoop /opt/hadoop/

Kiểm tra lại các tập tin đã nằm ở thư mục chỉ định hay chưa:

ls /opt/hadoop

nếu thấy output như sau thì được:

LICENSE.txt  README.txt  etc      lib      sbin
NOTICE.txt   bin         include  libexec  share

 Chuyển sang tài khoản hadoop.
su - hadoop
Chèn nội dung sau vào tập tin ~/.bash_profile:
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/opt/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
Khởi tạo các biến bằng lệnh sau:
source .bash_profile
Kiểm tra lại các biến bằng các lệnh sau:
echo $JAVA_HOME echo $HADOOP_HOME
Nếu output tương tự như sau là được:
/usr/java/default/opt/hadoop
Cấu hình cho Hadoop:
Mở tập tin /opt/hadoop/etc/hadoop/core-size.xml và thêm vào nội dung sau:

    
      fs.default.name 
      hdfs://master.hadoop.com:9000/ 
    
    
      dfs.permissions 
      false 
    


Mở tiếp tập tin /opt/hadoop/etc/hadoop/hdfs-site.xml và thêm vào nội dung sau:

    
      dfs.data.dir 
      /opt/hadoop/hadoop/dfs/name/data 
      true 
    

    
      dfs.name.dir 
      /opt/hadoop/hadoop/dfs/name 
      true 
    

    
      dfs.replication 
      1 
    

Mở tiếp tập tin /opt/hadoop/etc/hadoop/mapred-size.xml và thêm vào nội dung sau:

    
      mapred.job.tracker 
      master.hadoop.com:9001 
    

Cài đặt Hadoop lên các máy chủ khác Copy bộ cài Hadoop lên các máy chủ khác bằng lệnh:
# su hadoop 
$ cd /opt/hadoop 
$ scp -r hadoop slave.hadoop.com:/opt/hadoop
Cấu hình trên máy chủ chính Trên máy chủ master.hadoop.com, thêm tập tin /opt/hadoop/etc/hadoop/masters với nội dung sau:
master.hadoop.com
Thêm tập tin /opt/hadoop/etc/hadoop/slaves với nội dung sau:
slave.hadoop.com
Chạy Hadoop: Từ máy chủ chính chạy lệnh sau để format: hdfs namenode -format. Chạy dịch vụ của Hadoop bằng các lệnh sau:
sbin/start-dfs.sh sbin/start-yarn.sh.
Thêm một DataNode vào Hadoop Cluster: Giả sử ta có thêm một DataNode có địa chỉ như sau: 192.168.1.103 slave2.hadoop.com Trên slave2 ta thêm tài khoản có tên là hadoop: useradd hadoop passwd hadoop Từ trên máy chủ master, ta chạy các lệnh sau:
mkdir -p $HOME/.ssh 
chmod 700 $HOME/.ssh 
ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa 
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys 
chmod 644 $HOME/.ssh/authorized_keys
Copy the public key to new slave node in hadoop user $HOME directory
scp $HOME/.ssh/id_rsa.pub hadoop@192.168.1.103:/home/hadoop/
Từ trên máy chủ slave2, ta copy public key vào tập tin $HOME/.ssh/authorized_keys:
cd $HOME
mkdi -p $HOME/.>ssh 
chmod 700 $HOME/.ssh
cat id_rsa.pub >> $HOME/.ssh/authorized_keys 
chmod 644 $HOME/.ssh>/authorized_keys
Các bước trên là để các máy chủ đăng nhập vào nhau mà không phải sử dụng mật khẩu. Cập nhật thông tin máy chủ slave2 trên mọi file hosts của các máy chủ khác. Khởi động DataNode trên máy chủ mới bằng lệnh sau: bin/hadoop-daemon.sh start datanode Loại bỏ máy chủ DataNode ra khỏi cụm máy chủ: Đăng nhập vào máy chủ master. Thêm trường sau vào tập tin hdfs-site.xml:
 
   dfs.hosts.exclude 
   /home/hadoop/hadoop-1.2.1/hdfs_exclude.txt 
   DFS exclude 

Thêm tập tin hdfs_exclude.txt với nội dung sau: slave2.hadoop.com Load lại thông tin cấu hình: bin/hadoop/hdfs dfsadmin -refreshNodes Tắt Node vừa loại bỏ. Tham khảo tại đây.

09 tháng 11, 2016

Cài đặt MySQL replication trên CentOS

Trong bài viết này tôi sẽ hướng dẫn các bạn cài đặt môi trường replica cho máy chủ MySQL.
Giả sử rằng:

  • Máy chủ chính có địa chỉ IP là: 123.456.789.1
  • Máy chủ thay thế có địa chỉ IP là: 123.456.789.2
1.Trên máy chủ chính
Cài đặt ứng dụng mysql:

yum install mysql-server mysql
 Khởi động dịch vụ của mysql:

systemctl start mysql
systemctl enable mysql
Sửa tập tin /etc/my.cnf, và thêm vào phần [mysqld] nội dung sau:
server-id = 1
binlog-do-db=database
relay-log = mysql-relay-bin
relay-log-index = mysql-relay-bin.index
log-bin = mysql-bin
Trong đó database là tên của database bạn muốn tạo replica.
Khởi động lại dịch vụ mysql bằng lệnh:
systemctl restart mysql
Đăng nhập vào mysql bằng lệnh:
mysql -u root -p
Chạy lần lượt các lệnh sau để tạo tài khoản cho máy chủ replica:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%' IDENTIFIED BY 'PASSWORD'
mysql> FLUSH PRIVILEGES;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      245 | database     |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> exit
Lưu ý nhớ thông tin trong cột File và Position để sử dụng trên máy chủ replica.
Sử dụng lệnh sau để xuất dữ liệu từ máy chủ chính và import vào máy chủ replica:
mysqldump -u root -p --master-data database > /root/database.sql
2.Trên máy chủ thay thế
Tiến hành cài đặt mysql và sử đổi tập tin cấu hình /etc/my.cnf để thêm nội dung sau vào phần [mysqld]:
server-id = 2
master-host=123.456.789.1
master-connect-retry=60
master-user=slaveuser
master-password=PASSWORD
replicate-do-db=database
relay-log = mysql-relay-bin
log-bin = mysql-bin
Khởi động lại dịch vụ của mysql:
systemctl restart mysql
Tiến hành import dữ liệu vào hệ thống:
mysql -u root -p < /root/database.sql
Đăng nhập vào dịch vụ:
mysql -u root -p
Cấu hình cho máy chủ slave:
mysql> slave stop;
mysql> CHANGE MASTER TO MASTER_HOST='123.456.789.1', MASTER_USER='slaveuser', MASTER_PASSWORD='PASSWORD', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245;
mysql> slave start;
Kiểm tra trạng thái của máy chủ slave bằng lệnh sau:
mysql> show slave status;
Nếu thấy output hiện ra có dòng sau là thành công:
Slave_IO_State: Waiting for master to send event
Tham khảo tại đây

15 tháng 10, 2016

Các giá trị mặc định của css

Dưới đây là danh sách các giá trị mặc định trong css, phòng khi bạn muốn reset lại giá trị của các css bị thay đổi không mong muốn mà không biết giá trị cũ của nó là gì. Danh sách các thuộc tính được sắp xếp theo thứ tự chữ cái như sau:
.reset-this {
    animation : none;
    animation-delay : 0;
    animation-direction : normal;
    animation-duration : 0;
    animation-fill-mode : none;
    animation-iteration-count : 1;
    animation-name : none;
    animation-play-state : running;
    animation-timing-function : ease;
    backface-visibility : visible;
    background : 0;
    background-attachment : scroll;
    background-clip : border-box;
    background-color : transparent;
    background-image : none;
    background-origin : padding-box;
    background-position : 0 0;
    background-position-x : 0;
    background-position-y : 0;
    background-repeat : repeat;
    background-size : auto auto;
    border : 0;
    border-style : none;
    border-width : medium;
    border-color : inherit;
    border-bottom : 0;
    border-bottom-color : inherit;
    border-bottom-left-radius : 0;
    border-bottom-right-radius : 0;
    border-bottom-style : none;
    border-bottom-width : medium;
    border-collapse : separate;
    border-image : none;
    border-left : 0;
    border-left-color : inherit;
    border-left-style : none;
    border-left-width : medium;
    border-radius : 0;
    border-right : 0;
    border-right-color : inherit;
    border-right-style : none;
    border-right-width : medium;
    border-spacing : 0;
    border-top : 0;
    border-top-color : inherit;
    border-top-left-radius : 0;
    border-top-right-radius : 0;
    border-top-style : none;
    border-top-width : medium;
    bottom : auto;
    box-shadow : none;
    box-sizing : content-box;
    caption-side : top;
    clear : none;
    clip : auto;
    color : inherit;
    columns : auto;
    column-count : auto;
    column-fill : balance;
    column-gap : normal;
    column-rule : medium none currentColor;
    column-rule-color : currentColor;
    column-rule-style : none;
    column-rule-width : none;
    column-span : 1;
    column-width : auto;
    content : normal;
    counter-increment : none;
    counter-reset : none;
    cursor : auto;
    direction : ltr;
    display : inline;
    empty-cells : show;
    float : none;
    font : normal;
    font-family : inherit;
    font-size : medium;
    font-style : normal;
    font-variant : normal;
    font-weight : normal;
    height : auto;
    hyphens : none;
    left : auto;
    letter-spacing : normal;
    line-height : normal;
    list-style : none;
    list-style-image : none;
    list-style-position : outside;
    list-style-type : disc;
    margin : 0;
    margin-bottom : 0;
    margin-left : 0;
    margin-right : 0;
    margin-top : 0;
    max-height : none;
    max-width : none;
    min-height : 0;
    min-width : 0;
    opacity : 1;
    orphans : 0;
    outline : 0;
    outline-color : invert;
    outline-style : none;
    outline-width : medium;
    overflow : visible;
    overflow-x : visible;
    overflow-y : visible;
    padding : 0;
    padding-bottom : 0;
    padding-left : 0;
    padding-right : 0;
    padding-top : 0;
    page-break-after : auto;
    page-break-before : auto;
    page-break-inside : auto;
    perspective : none;
    perspective-origin : 50% 50%;
    position : static;
    /* May need to alter quotes for different locales (e.g fr) */
    quotes : '\201C' '\201D' '\2018' '\2019';
    right : auto;
    tab-size : 8;
    table-layout : auto;
    text-align : inherit;
    text-align-last : auto;
    text-decoration : none;
    text-decoration-color : inherit;
    text-decoration-line : none;
    text-decoration-style : solid;
    text-indent : 0;
    text-shadow : none;
    text-transform : none;
    top : auto;
    transform : none;
    transform-style : flat;
    transition : none;
    transition-delay : 0s;
    transition-duration : 0s;
    transition-property : none;
    transition-timing-function : ease;
    unicode-bidi : normal;
    vertical-align : baseline;
    visibility : visible;
    white-space : normal;
    widows : 0;
    width : auto;
    word-spacing : normal;
    z-index : auto;
}
Bạn có thê tham khảo thêm tại địa chỉ này

28 tháng 5, 2016

Regular Expression trong lập trình

Bất cứ ai khi bước chân vào con đường lập trình chắc cũng đều đã từng làm việc với Regular Expression (hiểu nôm na nó là một chuỗi quy định một quy tắc nào đó). Nhưng chắc sẽ ít người hiểu thấu đáo được tác dụng và cách sử dụng nó như nào.
Trong bài viết này tôi xin phép giới thiệu sơ lược về Regular Expression, tất nhiên chỉ nằm trong vốn hiểu biết của tôi.

Dưới đây là bảng các kí tự, điều hướng trong Regular Expression.

Metacharacters

Ký tựÝ nghĩa
^Bắt đầu của chuỗi
$Kết thúc của chuỗi
.Bất kỳ kí tự gì, ngoại trừ kí tự xuống dòng
*Tồn tại 0 hoặc nhiều hơn 0 ký tự
+Tồn tại ít nhất 1 ký tự
?Tồn tại 0 hoặc 1 ký tự
|Hoặc
( )Nhóm
[ ]Một tập các ký tự
{ }Mức độ lạp lại
\Đánh dấu cho kí tự đặc biệt


Sử dụng ký tự đặc biệt với \

Single characters
\tký tự tab
\nđánh dấu dòng mới
\rký tự trả về đầu dòng (CR)
\xhhký tự có mã hex là hh


Matching
\wBất kì một ký tự thuộc nhóm chữ số, chữ cái và dấu "_"
\WCác ký tự không phải là từ (Không phải số, chữ cái và dấu "_")
\sBất kỳ ký tự trắng nào (bao gồm dấu cách, tab và đánh dấu đầu dòng)
\SKhông thuộc nhóm ký tự trắng
\dBất kỳ ký tự là chữ số [0-9]
\DBất kỳ ký tự nào không phải là chữ số

Ví dụ

a*Tồn tại 0 hoặc nhiều hơn các ký tự a
a+Tồn tại ít nhất một ký tự a
a?Tồn tại 0 hoặc 1 ký tự a
a{m}Có chính xác m ký tự a
a{m,}Có ít nhất 1 a
a{m,n}Có ít nhất m nhưng không có nhiều quá n ký tự a
repetition?(?)

Tập ký tự nằm trong [...]

Different meanings apply inside a character set (“character class”) denoted by [...] so that, instead of the normal rules given here, the following apply:
[characters]Bất kỳ kí tự nào nằm trong dấu ngoặc vuông
[x-y]Bất kỳ ký tự nào nằm ở giữa ký tự x và y ở trong bảng chữ cái
[\-]Ký tự “-
[\n]Tương ứng với ký tự bắt đầu dòng mới
[^something]Bất kỳ ký tự nào trừ những ký tự nằm trong ngoặc vuông



Ví dụ

expressionmatches...
abcabc (tìm chính xác cụm từ abc trong vị trí bất kì của xâu) 
^abcabc nằm ở đầu chuỗi
abc$abc nằm ở cuối chuỗi
a|bhoặc a hoặc b
^abc|abc$Bắt đầu hoặc kết thúc bằng chuỗi abc
ab{2,4}cchuỗi tìm kiếm bắt đầu bằng a, theo sau là 2 tới 4 ký tự b và kết thúc bằng c
ab{2,}cchuỗi tìm kiếm bắt đầu bằng a, theo sau là có ít nhất 2 ký tự b và kết thúc bằng c
ab*cchuỗi tìm kiếm bắt đầu bằng a, theo sau có thể có hoặc không có b và kết thúc bằng c
ab+cChuối tìm kiếm bắt đầu bằng a, theo sau có ít nhất 1 ký tự b và kết thúc bằng c
ab?cChuỗi tìm kiếm bắt đầu bằng a, theo sau là 0 hoặc 1 b và kết thúc bằng c
a.cChuỗi tìm kiếm bắt đầu bằng a, theo sau là bất kì ký tự nào ngoại trừ dấu đánh dấu bắt đầu dòng mới và kết thúc bằng c
a\.ctìm chuỗi a.c 
[abc]Bất kỳ ký tự nào trong a, b và c
[Aa]bchoặc là Abc hoặc abc
[abc]+chuỗi có chứa bất kỳ (không trống) các ký tự nào trong a, b và c
[^abc]+Bất kỳ chuỗi có chứa (không trống) các ký tự không phải là a, b và c
\d\dbất kỳ chuỗi số có 2 chữ số
\w+chuỗi có ít nhất một ký tự là chữ số, chữ cái và dấu "_"
100\s*mkLà sâu bắt đầu bằng chuỗi 100, theo sau là 0 hoặc nhiều ký tự trắng và kết thúc bằng chuỗi mk
abc\babc when followed by a word boundary (e.g. in abc! but not in abcd)
perl\Bperl when not followed by a word boundary (e.g. in perlert but not in perl stuff)

Bàn thêm về cụm ký tự nằm trong dấu ():

  • Nhóm ký tự nằm trong dấu () dùng để phân nhóm chuỗi, ví dụ như kiểu xâu chỉ định có khớp với nhóm (a) hay (b) hay không.
  • Xem thêm tại: http://stackoverflow.com/questions/3512471/what-is-a-non-capturing-group

Xem thêm tại: https://www.cs.tut.fi/~jkorpela/perl/regexp.html

23 tháng 4, 2016

[Kinh nghiệm] Lập trình với Swift

Như bài trước mình có đưa ra ý kiến riêng về kinh nghiệm học lập trình một ngôn ngữ mới, đó là làm thế nào để tiếp xúc với ngôn ngữ lập trình mới một cách nhanh nhất, hiệu quả nhất. Có một nguyên tắc mình đưa ra đó là:

  • Học cách quản lý biến, bao gồm thêm cả mảng
  • Học cách quản lý Class, bao gồm Function và Property.
  • Học cách quản lý vòng lặp và lệnh rẽ nhánh.
Vì vậy trong bài viết này mình cũng sẽ chỉ bám theo đúng nguyên tắc này.
1. Biến trong Swift.
  • Để khai báo biến trong Swift ta sử dụng cấu trúc sau: var varName: =
    • Ví dụ: var varTest:Int = 0
    • Dấu <> ám chỉ là tùy chọn, bạn có thể dùng hay không khi khai báo biến.
    • Data type là kiểu dữ liệu của biến, nếu thiếu thì ứng dụng biên dịch sẽ tự quản lý kiểu giá trị cho biến.
    • Init value: là giá trị mặc định được gán khi khởi tạo biến.
  • Mảng:
    • Mảng được khai báo như sau: var arrayName = [type]()
    • Ví dụ: var arrayTest = [Int](count:3, repeatedValue:0) - Nghĩa là khai báo 1 mảng kiểu Int, bao gồm 3 phần tử, trong đó giá trị khởi tạo cho mỗi phần tử là 0.
    • Truy cập phần tử của mảng bằng cách sau: var item = arrayTest[index] - trong đó index bắt đầu từ 0.
    • Khai báo mảng với giá trị khởi tạo khác nhau: var arrayName:[Int] = [10,20,30]
    • Khi gán mảng cho biến thì mảng là mảng động, gán mảng cho hằng thì mảng là mảng tĩnh.
    • Để thêm giá trị vào mảng ta dùng hàm append hoặc sử dụng toán tử +=.
    • Để duyệt mảng ta dùng vòng lặp for ... in ....
    • Để duyệt mảng lấy cả chỉ số ta dùng hàm enumerate
    • Có thể gộp 2 mảng bằng toán tử +
    • Có thể đếm số phần tử trong mảng bằng hàm count.
    • Có thể kiểm tra mảng có rỗng hay không bằng hàm empty.
2. Lệnh rẽ nhánh trong Swift:
Swift bao gồm các mẫu rẽ nhánh sau:
3. Vòng lặp trong Swift
Swift bao gồm các mẫu lặp sau:
  • for ... in ...: lặp lại trên từng phần tử của một tập. Xem thêm
  • for loop: lặp lại khi điều kiện còn đúng. Xem thêm
  • while loop: xem thêm
  • do statement while: xem thêm
Với các mẫu lặp, Swift sẽ có các lệnh điều khiển sau:
  • break: ngắt vòng lặp.
  • continue: bỏ qua các lệnh phía sau và quay trở lại với vòng lặp kế tiếp.
4. Class trong Swift
Với một class:
  • Để khai báo một class ta dùng cấu trúc sau: Class className{}
  • Để khởi tạo một class ta dùng cấu trúc sau: let varClass = className()
Với các thuộc tính trong class:
  • Để khai báo một biến ta dùng từ khóa var.
  • Để khai báo một hằng ta dùng từ khóa let.
  • Ngoài ra còn một kiểu khai báo biến là lazy. Kiểu này dùng để khởi tạo các thuộc tính mà giá trị của nó còn phụ thuộc vào một thuộc tính của một đối tượng khác, vì thế nên nó chưa cần được khởi tạo ngay khi khởi tạo object.
  • Để truy cập thuộc tính của class ta dùng cấu trúc sau varClass.property
  • getter và setter:
    • Trong Swift để tạo một biến getter setter ta dùng cấu trúc sau:
      var varName:[type]{
           get{
               return();
           }
           set(param){
           }
      }
    • Xem thêm
  • getter:
    • Trong Swift có một kiểu biến chỉ có getter. Kiểu này hơi đặc biệt tí, có thể hiểu nó hao hao giống cấu trúc JSON trong javascript.
    • Bạn có thể tìm hiểu thêm tại đây, phần Readonly properties
Với hàm trong class:
  • Cấu trúc khai báo sẽ là:
    func funcName(params) -> returnType{
        statement
        return something;
    }
  • params được khai báo như khai báo biến thông thường.

14 tháng 3, 2016

Tất tần tật về cài đặt và phát triển Prestashop trên MacOS

1. Cài đặt XAMPP trên MacOS
Link download tại đây: https://www.apachefriends.org/download.html <-- b="" ch="" cho="" macos.="" n="" ng="" nh="" p="" phi="">Cài đặt như bình thường.
Lưu ý, nên cài đặt thêm dịch vụ FTP để tiện cho việc sử dụng sau này.
Để cài đặt dịch vụ FTP trên XAMPP, bạn phải cấu hình Username và password. Thông tin cấu hình nằm ở tập tin:
/Applications/XAMPP/etc/proftpd.conf
tại dòng:

# Set the user and group under which the server will run.
User                nobody
...
# nobody gets the password "xampp"
UserPassword nobody 2TgxE8g184G9c
RequireValidShell off
Trong đó nobody là tên User còn xampp là mật khẩu. Bạn có thể đổi tùy ý thích.

2. Mở Prestashop bằng Netbean
Link download mã nguồn Prestashop thì download tại đây: https://www.prestashop.com/en/download
Giải nén mã nguồn ra một thư mục nào đó.
Mở Netbean lên--> Chọn New project --> PHP --> from exit source code --> Chỏ tới thư mục mã nguồn của prestashop.
Tiếp theo ta cấu hình cho project như sau:
Địa chỉ server thì ta chọn là localhost/prestashop (đây là đường dẫn ta sẽ đặt ứng dụng web trên máy chủ xampp)
Cấu hình máy chủ FTP như sau:
server: locahost.
port: 21
username: nobody (theo ví dụ trên)
password: xampp (theo ví dụ trên)