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à...

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)

29 tháng 12, 2015

Cài đặt và sử dụng cbpolicyd với Zimbra 8

Bài này tác giả đã có ý định viết từ rất lâu rồi nhưng chưa sắp xếp được thời gian. Hiện tại mới có thể bắt đầu. Xin lưu ý, cho tới thời điểm hiện tại, tác giả vẫn đang trong quá trình test tính năng và hiệu năng.
1. Cài đặt cbpolicyd trên Zimbra 8
Trước tiên bạn cần kích hoạt tiến trình cbpolicyd trên Zimbra bằng lệnh sau:
su - zimbra
zmprov ms `zmhostname` +zimbraServiceInstalled cbpolicyd +zimbraServiceEnabled cbpolicyd
zmlocalconfig -e postfix_enable_smtpd_policyd=yes
zmprov mcf +zimbraMtaRestriction "check_policy_service inet:127.0.0.1:10031"

zmlocalconfig -e cbpolicyd_log_level=4; zmlocalconfig -e cbpolicyd_log_detail=modules,tracking,policies; zmlocalconfig -e cbpolicyd_module_accesscontrol=1 cbpolicyd_module_checkhelo=1 cbpolicyd_module_checkspf=1 cbpolicyd_module_greylisting=1 cbpolicyd_module_quotas=1

zmcontrol restart
exit

Tiếp theo, từ quyền root, bạn kích hoạt webui của cbpolicyd bằng lệnh sau:
cd /opt/zimbra/httpd/htdocs/ && ln -s ../../cbpolicyd/share/webui

Sửa lại nội dung tập tin

opt/zimbra/cbpolicyd/share/webui/includes/config.phpComment dòng bắt đầu bằng $DB_DSN và thay bằng dòng:


$DB_DSN="sqlite:/opt/zimbra/data/cbpolicyd/db/cbpolicyd.sqlitedb";

Chuyển tới thư mục: /srv/
Tải về gói cài đặt sau (có thể chọn phiên bản nào phù hợp với nhu cầu):
http://download.policyd.org/v2.1.x-201310261831/
Sau đó chạy lệnh sau để cài đặt nó (lưu ý chỉ số phiên bản cho phù hợp):
tar -zxvf cluebringer-snapshot-2.1.x-201205100639.tar.gz
cd cluebringer-snapshot-2.1.x-201205100639/webui/
cp *.php *.css /opt/zimbra/cbpolicyd/share/webui/
su - zimbra -c "zmapachectl restart"

Sau khi cài đặt xong, bạn thử truy cập vào địa chỉ http(s)://domain.com:7780/webui/index.php để xem dịch vụ có chạy hay không?
Link tham khảo về cách cài đặt chi gốc các bạn có thể xem tại đây:
https://www.vavai.net/2014/02/zimbra-tips-policyd-rate-limit-sending-message-implementation-on-zimbra-8/

2. Bảo mật cho cbpolicyd web
Nếu để ý bạn sẽ thấy liên kết truy cập vào cbpolicyd web không được bảo mật, nó không yêu cầu mật khẩu để truy cập. Vì vậy bạn cần phải thiết lập mật khẩu truy cập cho nó.
Cách làm như sau:
Bạn tạo một tập tin .htaccess bằng lệnh sau:
cd /opt/zimbra/cbpolicyd/share/webui/
vi .htaccess

Sau đó thêm nội dung sau vào cho tập tin
AuthUserFile /opt/zimbra/cbpolicyd/share/webui/.htpasswd
AuthGroupFile /dev/null
AuthName "User and Password"
AuthType Basic


require valid-user

Và tạo một tập tin .htpasswd bằng cách sau:
touch .htpasswd
/opt/zimbra/httpd/bin/htpasswd -cb .htpasswd USERNAME PASSWORD

Lưu ý thay USERNAME và PASSWORD bằng giá trị bạn muốn.
Cuối cùng bạn sửa nội dung tập tin:
vi /opt/zimbra/conf/httpd.conf
Thêm vào cuối cùng dòng sau:
Alias /webui /opt/zimbra/cbpolicyd/share/webui/

# Comment out the following 3 lines to make web ui accessible from anywhere
AllowOverride AuthConfig
Order Deny,Allow
Allow from all
Bạn restart lại Zimbra Apache để các thay đổi có hiệu lực:
su - zimbra -c "zmapachectl restart"

Bạn có thể tham khảo link gốc tại đây:
https://imanudin.net/2014/09/12/zimbra-tips-how-to-protect-policyd-webui/

3.Cách sử dụng
Bạn tham khảo thêm tại link dưới đây:
http://uname.pingveno.net/blog/index.php/post/2015/03/11/Configure-sender-rate-limits-to-prevent-spam,-using-cluebringer-(policyd)-with-Postfix
http://wiki.policyd.org/accounting


17 tháng 12, 2015

Hướng dẫn sử dụng Fdisk trên Linux

Trong bài viết này tôi hướng dẫn các bạn sử dụng công cụ Fdisk để phân vùng ổ đĩa trên hệ thống Linux.
Nói về việc phân vùng ổ thì hầu như bất kì một quản trị hệ thống nào cũng phải biết đến, nhưng để biết rõ và sử dụng được nó thì không phải ai cũng có thể vỗ ngực tự xưng cả.
Nội dung bài viết sẽ đưa ra kinh nghiệm sử dụng công cụ này + một số tip nho nhỏ về khắc phục một số vấn đề khi sử dụng.
Mời mọi người tham khảo.
 1. Đầu tiên, là phần giới thiệu về công cụ Fdisk:
Fdisk là một ứng dụng chạy ở chế độ dòng lệnh cho phép xem và quản lý các phân vùng ổ cứng cho các dòng máy chạy hệ điều hành Linux.
Trên các hệ điều hành Ubuntu, Linux Mint hoặc một số biến thể Ubuntu khác, ứng dung fdisk khi chạy cần phải sử dụng ở chế độ root hoặc dưới đặc quyền sudo.

2. Đây là phần hướng dẫn sử dụng:
Liệt kê các phân vùng:
Để liệt kê các phân vùng, bạn chạy lệnh sudo fdisk -l. Lệnh này sẽ liệt kê tất cả các phân vùng của tất cả các ổ cứng có trong hệ thống.
Để liệt kê các phân vùng trong một ổ cứng chỉ định, bạn chạy lệnh sudo fdisk -l /dev/sda. Tức là bạn thêm đường dẫn tới ổ cứng muốn xem ở cuối dòng lệnh.
Lưu ý: Không nên tác động tới các phân vùng đang được sử dụng hoặc đã có dữ liệu. Việc này có thể làm hỏng hệ điều hành hoặc mất dữ liệu của bạn.

Truy cập công cụ Fdisk:
Để truy cập công cụ fdisk bạn gõ lệnh sudo fdisk /dev/sda
Lưu ý, bạn phải chỉ rõ cho fdisk biết mình muốn tác động vào ổ đĩa nào trước khi truy cập công cụ.

Xem giúp đỡ về các tùy chọn của công cụ:
Từ màn hình của công cụ Fdisk, bạn gõ m để xem trợ giúp.
Xem chi tiết thông tin các phân vùng trên ổ đĩa
 Để xem chi tiết thông tin các phân vùng trên ổ đĩa, bạn gõ p.

Xóa phân vùng trên ổ đĩa:
Để xóa phân vùng trên ổ đĩa, bạn gõ d.
Bạn sẽ được hỏi số thứ tự của phân vùng bạn muốn xóa (bạn có thể xem thông tin này thông qua lệnh p). Ví dụ, nếu muốn xóa phân vùng /dev/sda5, bạn gõ 5 (như trong hình).
Sau khi xóa, bạn có thể gõ p để xem các phân vùng hiện tại còn trên ổ đĩa. Như hiện tại, phân vùng đã bị xóa, tuy nhiên fdisk chưa ghi các thay đổi này lên địa cho tới khi bạn gõ lệnh w.


Tạo phân vùng mới:
Để tạo phân vùng mới, bạn gõ lệnh n.
Bạn có thể tạo một phân vùng logic hoặc primary (chọn l để tạo phân vùng logic và p để tạo phân vùng primary) Một ổ đĩa chỉ có thể có tối đa 4 phân vùng primary, số phân vùng logic thì không giới hạn.
Tiếp theo, bạn cần chỉ định sector bắt đầu cho phân vùng. Gõ Enter để chấp nhận sector mặc định, thông thường nó là sector rảnh đầu tiên của ổ đĩa.
Tùy chọn cuối cùng cần bạn chỉ ra sector cuối cùng cho phân vùng trên đĩa. Nếu muốn sử dụng toàn bộ không gian ổ đĩa, bạn chỉ cần chấp nhận giá trị mặc định của dòng lệnh bằng cách gõ Enter. Bạn cũng có thể chỉ ra kích thước ổ đĩa thay vì nhập số sector, ví dụ nhập +5G để tạo một phân vùng có dung lượng 5G (có thể chọn M,G tương ứng với MB và GB). Nếu khong chỉ ra một đơn vị tính sau dấu +, fdisk sẽ cói nó là số sector. Ví dụ, nếu nhập +10000 thì sector cuối cùng cho phân vùng sẽ là 10000.

System ID:
Lệnh t được sử dụng để xem các chỉ số tương ứng của phân vùng.
Lệnh L được dùng để xem danh sách các định dạng ổ đĩa mà công cụ hỗ trợ.
Nhập số tương ứng với phân vùng cần chọn, ví dụ gõ 82 để chọn phân vùng swap:


Ghi lại các thay đổi:
Sau khi thao tác với ổ đĩa, bạn cần ghi lại các thay đổi để có hiệu lực. Bạn chạy lệnh w để tiến hành ghi lại thay đổi lên ổ đĩa.
Nếu không chạy lệnh w mà sử dụng lệnh q, mọi thay đổi của bạn se bị hủy bỏ.
Định dạng phân vùng.
Lưu ý, sau khi chạy lệnh fdisk, bạn nên khởi động lại hệ thống đồng thời chạy lệnh partprobe. Bởi vì thường thì sau khi có một phân vùng được tạo ra, bạn sẽ thấy tên tập tin thiết bị tương ứng với phân vùng đó hiện ra trong thư mục /dev/mapper/. Tuy nhiên vì một số lý do nào đó bạn có thể không thấy tên tập tin thiết bị tương ứng được tạo ra sau khi sử dụng lệnh fdisk. Lệnh partprobe sẽ giải quyết vấn đề này.
Sau khi tạo phân vùng, bạn cần định dạng lại phân vùng trước khi sử dụng. Bạn có thể thực hiện bằng cách sử dụng lệnh mkfs tương ứng. Ví dụ, lệnh sau được sử dụng để định dạng lại phân vùng theo định dạng ext4:
sudo mkfs.ext4 /dev/sda5

Hoặc để tạo phân vùng swap thì chạy lệnh sau:
sudo mkswap /dev/sda4.
Ngoài ra còn một số lệnh khác trên Fdisk nhưng ít dùng nên tôi sẽ dành một bài viết khác để giới thiệu.
Link tham khảo:
http://www.howtogeek.com/106873/how-to-use-fdisk-to-manage-partitions-on-linux/
http://askubuntu.com/questions/174956/after-making-partition-i-couldnt-see-device-dev-sda3



14 tháng 12, 2015

Các fix lỗi VPN: ERROR: netsh command failed: returned error code 1

Cũng lâu không viết Tut. Tới hôm nay mới có thời gian viết lại.
Tut này ngắn thôi, chỉ là hướng dẫn cách fix lỗi với OpenVPN.
Tôi có một tài khoản VPN và hay sử dụng nó để làm một số việc. Tuy nhiên gần đây rất hay gặp lỗi  ERROR: netsh command failed: returned error code 1. Sau đó tôi không thể truy cập VPN được nữa.
Sau một hồi lục lọi tìm tòi thì tôi phát hiện ra card TunelTap (do OpenVPN sinh ra) bỗng tự đặt IP cho nó.
Vậy là đơn giản muốn sửa lỗi này thì bạn chỉ cần đặt lại cho nó ở chế độ Automatic IP là được.

26 tháng 4, 2015

Các thủ thuật trên Postgres (26/04/2015)

Bài viết này tôi nghiệm ra sau một số lần làm việc trên cơ sở dữ liệu Postgres.
Nó chỉ mang tính kinh nghiệm chứ không tập trung vào vấn đề kỹ thuật.
Tất cả các nội dung đều đã đảm bảo là hoạt động chính xác như tác giả mong muốn.
1. Làm thế nào để copy dữ liệu từ 1 bảng sang 1 bảng khác.
Trên công cụ pgAdmin đi kèm bộ cài postgress (Link download) bạn có thể dùng query tool để chạy lệnh sau:
INSERT INTO table_name
         [ ( column_name [, ...] ) ]
         query
Ví dụ:
INSERT INTO books (id, title, author_id, subject_id)
SELECT nextval('book_ids'), title, author_id, subject_id         
FROM book_queue WHERE approved;
Xem thêm tại: http://www.commandprompt.com/ppbook/x5504
Phần Insert from other tables
2. Cast kiểu giá trị trong postgres
Để cast từ string sang integer trong postgres ta dùng hàm cast theo cấu trúc sau:
cast( var1 as int)
Nếu muốn xử lý trong trường hợp xâu là rỗng (không phải null) thì dùng lệnh sau:
cast( nullif(var1, '') as int)
3. Sinh chuỗi UUID cho bảng trong Postgres
Để sinh chuỗi UUID cho bảng trong Postgres ta sử dụng extension đi kèm bộ cài.
Để kiểm tra xem extension này có đang chạy không ta thử bằng truy vấn sau:
Select uuid_in(md5(random()::text || now()::text)::cstring);
Nếu có kết quả đầu ra là một uuid thì ok, nếu không thì phải cài extension này bằng lênh:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Xem thêm