Kỹ thuật khác trong Lập trình – Học lập trình, học sử dụng máy tính từ số 0 – ZeZo.dev https://zezo.dev Fri, 29 Nov 2024 17:53:53 +0000 vi hourly 1 https://wordpress.org/?v=6.7.1 https://zezo.dev/wp-content/uploads/2024/11/cropped-zzel-32x32.png Kỹ thuật khác trong Lập trình – Học lập trình, học sử dụng máy tính từ số 0 – ZeZo.dev https://zezo.dev 32 32 Cài đặt composer trên ubuntu 20 https://zezo.dev/view/cai-dat-composer-tren-ubuntu-20 Fri, 29 Nov 2024 17:53:53 +0000 https://zezo.dev/?p=315 Thực hiện theo các bước dưới đây

sudo apt update
sudo apt install php-cli unzip

 

cd ~
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php

 

HASH=`curl -sS https://composer.github.io/installer.sig`

 

php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

 

sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

Cuối cùng chạy lệnh để xem phiên bản

composer -v

 

]]>
HTTP status code https://zezo.dev/view/http-status-code Fri, 29 Nov 2024 17:25:35 +0000 https://zezo.dev/?p=269
Value Description Reference
100 Continue [RFC9110, Section 15.2.1]
101 Switching Protocols [RFC9110, Section 15.2.2]
102 Processing [RFC2518]
103 Early Hints [RFC8297]
104-199 Unassigned
200 OK [RFC9110, Section 15.3.1]
201 Created [RFC9110, Section 15.3.2]
202 Accepted [RFC9110, Section 15.3.3]
203 Non-Authoritative Information [RFC9110, Section 15.3.4]
204 No Content [RFC9110, Section 15.3.5]
205 Reset Content [RFC9110, Section 15.3.6]
206 Partial Content [RFC9110, Section 15.3.7]
207 Multi-Status [RFC4918]
208 Already Reported [RFC5842]
209-225 Unassigned
226 IM Used [RFC3229]
227-299 Unassigned
300 Multiple Choices [RFC9110, Section 15.4.1]
301 Moved Permanently [RFC9110, Section 15.4.2]
302 Found [RFC9110, Section 15.4.3]
303 See Other [RFC9110, Section 15.4.4]
304 Not Modified [RFC9110, Section 15.4.5]
305 Use Proxy [RFC9110, Section 15.4.6]
306 (Unused) [RFC9110, Section 15.4.7]
307 Temporary Redirect [RFC9110, Section 15.4.8]
308 Permanent Redirect [RFC9110, Section 15.4.9]
309-399 Unassigned
400 Bad Request [RFC9110, Section 15.5.1]
401 Unauthorized [RFC9110, Section 15.5.2]
402 Payment Required [RFC9110, Section 15.5.3]
403 Forbidden [RFC9110, Section 15.5.4]
404 Not Found [RFC9110, Section 15.5.5]
405 Method Not Allowed [RFC9110, Section 15.5.6]
406 Not Acceptable [RFC9110, Section 15.5.7]
407 Proxy Authentication Required [RFC9110, Section 15.5.8]
408 Request Timeout [RFC9110, Section 15.5.9]
409 Conflict [RFC9110, Section 15.5.10]
410 Gone [RFC9110, Section 15.5.11]
411 Length Required [RFC9110, Section 15.5.12]
412 Precondition Failed [RFC9110, Section 15.5.13]
413 Content Too Large [RFC9110, Section 15.5.14]
414 URI Too Long [RFC9110, Section 15.5.15]
415 Unsupported Media Type [RFC9110, Section 15.5.16]
416 Range Not Satisfiable [RFC9110, Section 15.5.17]
417 Expectation Failed [RFC9110, Section 15.5.18]
418 (Unused) [RFC9110, Section 15.5.19]
419-420 Unassigned
421 Misdirected Request [RFC9110, Section 15.5.20]
422 Unprocessable Content [RFC9110, Section 15.5.21]
423 Locked [RFC4918]
424 Failed Dependency [RFC4918]
425 Too Early [RFC8470]
426 Upgrade Required [RFC9110, Section 15.5.22]
427 Unassigned
428 Precondition Required [RFC6585]
429 Too Many Requests [RFC6585]
430 Unassigned
431 Request Header Fields Too Large [RFC6585]
432-450 Unassigned
451 Unavailable For Legal Reasons [RFC7725]
452-499 Unassigned
500 Internal Server Error [RFC9110, Section 15.6.1]
501 Not Implemented [RFC9110, Section 15.6.2]
502 Bad Gateway [RFC9110, Section 15.6.3]
503 Service Unavailable [RFC9110, Section 15.6.4]
504 Gateway Timeout [RFC9110, Section 15.6.5]
505 HTTP Version Not Supported [RFC9110, Section 15.6.6]
506 Variant Also Negotiates [RFC2295]
507 Insufficient Storage [RFC4918]
508 Loop Detected [RFC5842]
509 Unassigned
510 Not Extended (OBSOLETED) [RFC2774][status-change-http-experiments-to-historic]
511 Network Authentication Required [RFC6585]
512-599 Unassigned

 

https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

]]>
Mở máy ảo iPhone trên Macbook https://zezo.dev/view/mo-may-ao-iphone-tren-macbook Fri, 29 Nov 2024 08:20:51 +0000 https://zezo.dev/?p=156 Mở máy ảo iPhone trên Macbook có thể được thực hiện bằng lệnh trong Terminal sử dụng ứng dụng Simctl (Simulator Control). Dưới đây là một số lệnh mẫu:

  1. Liệt kê tất cả các máy ảo iPhone có sẵn:
    xcrun simctl list devices 
  2. Mở máy ảo iPhone cụ thể:
    xcrun simctl boot "tên_máy_ảo"

    Thay thế “tên_máy_ảo” bằng tên của máy ảo iPhone bạn muốn mở.

  3. Mở máy ảo iPhone và mở ứng dụng cụ thể (ví dụ: ứng dụng Camera):
    xcrun simctl openurl "tên_máy_ảo" "một_url_tới_ứng_dụng"

    Thay thế “tên_máy_ảo” và “một_url_tới_ứng_dụng” bằng thông tin tương ứng.

Lưu ý rằng, để sử dụng những lệnh này, bạn cần cài đặt và cấu hình Xcode đúng cách trên máy Macbook của mình. Đồng thời, tên máy ảo và thông tin khác sẽ phụ thuộc vào cài đặt của bạn.

Bạn cũng có thể thử thực hiện xcrun simctl help để xem danh sách đầy đủ các lệnh và tùy chọn mà Simctl hỗ trợ.

]]>
Biểu thức chính qui kiểm tra hợp lệ của password https://zezo.dev/view/bieu-thuc-chinh-qui-kiem-tra-hop-le-cua-password Fri, 29 Nov 2024 04:04:11 +0000 https://zezo.dev/?p=111

Mẫu biểu thức

Tạo biểu thức có giới hạn 6 – 30 ký tự, yêu cầu bắt buộc phải có chữ thường, số, ký tự đặc biệt(@#$ %, chữ hoa

 

((?=.* [a - z])(?=.* d)(?=.* [@#$ %])(?=.* [A - Z]).{ 6, 30})

Code trên được chia ra thành từng đoạn như sau:

 

( (?=.*[a-z]) (?=.*d) (?=.*[@#$%]) (?=.*[A-Z]) .{6,30} )

(?=.*[a-z]) : Bắt buộc phải có ít nhất 1 ký tự chữ cái viết thường.

(?=.*d) : Bắt buộc phải có ít nhất 1 chữ số trong chuỗi.

(?=.*[@#$%]) : Bắt buộc phải có ít nhất 1 ký tự đặc biệt trong các ký tự @#$%.

((?=.*[A-Z]) : Bắt buộc phải có ít nhất 1 ký tự chữ in hoa.

{6,30} : Giới hạn chiều dài cả chuỗi từ 6 đến 30 ký tự.

Bạn không muốn dùng điều kiện nào trong các điều kiện ở trên thì xóa khối đó đi khỏi biểu thức.

Demo trong java:

Giải sử chuỗi password người dùng nhập được lưu vào biến tên là password.

Cách thực hiện:

String bieu_thuc = "((?=.*[a-z])(?=.*d)(?=.*[@#$%])(?=.*[A-Z]).{6,30})";
if( password.matches( bieu_thuc ) ){
   System.out.println("Bạn đã nhập đúng định dạng");
}else{ System.out.println("Bạn nhập sai định dạng"); }

Chúc bạn thành công.

]]>
Biểu thức chính qui – Regex https://zezo.dev/view/bieu-thuc-chinh-qui-regex Fri, 29 Nov 2024 03:49:32 +0000 https://zezo.dev/?p=101 1) Tình huống thực tế

a. Bạn có 1 trang web cho phép người dùng đăng bài, viết bình luận… sẽ khó tránh trường hợp người dùng viết những câu từ tục tĩu… Bạn cần kiểm soát nội dung? Bạn không thể đọc hết được nhanh chóng nội dung người dùng viết khi mà web của bạn có đông người dùng.

==> Nhu cầu: Cần tự động kiểm tra khớp với các từ xấu trong nội dung để thay thế thành dấu ****

b. Bạn đăng ký tài khoản ở các trang web họ luôn yêu cầu bạn nhập giới hạn như: Tên đăng nhập chỉ bao gồm chữ cái và số, không chứa ký tự đặc biệt, không chứa khoảng trống (dấu cách). Hoặc password bắt buộc phải có giới hạn ít nhất 6 ký tự, ít nhất có 1 ký tự chữ cái in hoa, ít nhất có 1 ký tự số …

Làm sao mà biết người dùng nhập đúng yêu cầu như vậy?

Còn nhiều tình huống khác như kiểm tra định dạng email, url, ip, tên file, tên thư mục… hoặc tìm kiếm, thay thế, tách chuỗi….

2) Dùng biểu thức chính qui (regex) để giải quyết các vấn đề trên

Regex là gì?

Là một mẫu biểu thức gồm các ký tự được sắp xếp theo một quy luật nào đó để kiểm tra khớp với một chuỗi hoặc tìm trong một chuỗi nào đó….

Mỗi ngôn ngữ lập trình sẽ có một chút khác nhau về cách viết biểu thức, tuy nhiên quy luật thì giống nhau.

Ví dụ đơn giản kiểm tra trong chuỗi có chứa chữ h hay không (Dùng ngôn ngữ javascript)

/h/

 

3) Ý nghĩa các ký tự dùng xây dựng biểu thức

Ký tự đại diện dùng để thay thế cho ký tự khác

Dấu chấm . đại diện bất kỳ ký tự nào cũng được
\d đại diện cho một ký tự số từ 0-9, tương đương với cách viết [0-9]
\D đại diện cho một ký tự không phải là kiểu số từ 0-9, ngược lại với “\d”
\s đại diện cho một ký tự là khoảng trắng
\S đại diện cho một ký tự không phải là khoảng trắng, ngược lại với “\s”
\w đại diện cho một ký tự từ A-Z hoặc a-z hoặc 0-9, hoặc ký tự gạch dưới “_”  (không phải các chữ có dấu tiếng Việt)
\W đại diện cho một ký tự không phải là từ A-Z, a-z, 0-9, ký tự gạch dưới “_”  (không phải các chữ có dấu tiếng Việt)

Giới hạn số lần xuất hiện của một ký tự:

x? nghĩa là một ký tự “x” có thể xuất hiện 1 lần hoặc không xuất hiện lần nào
x* nghĩa là ký tự “x” có thể xuất hiện 1 lần hoặc nhiều lần hoặc không xuất hiện cũng được
x+ nghĩa là ký tự “x” bắt buộc phải xuất hiện ít nhất 1 lần, nhiều nhất thì không biết
x{n} nghĩa là ký tự “x” xuất hiện đúng giới hạn n lần
x{n,} nghĩa là ký tự “x” xuất hiện ít nhất n lần, nhiều nhất thì không biết
x{n,m} nghĩa là ký tự “x” xuất hiện ít nhất n lần và nhiều nhất m lần
Chú ý: Không nhất thiết là ký tự x, có thể là một nhóm ký tự nào đó…

Ghép nối danh sách ký tự:

[…] trong dấu ngoặc vuông liệt kê danh sách những ký tự hợp quy tắc, có thể dùng dấu gạch giữa “-“giữa 2 ký tự để thể hiện danh sách những ký tự trong khoảng 2 ký tự theo vị trí ASCII của ký tự. Ví dụ: [0-9] là giống như [0123456789]
[^…] chức năng thì ngược lại với “[…]” thay vì liệt kê những ký tự hợp quy tắc, nó cho biết bất kỳ ký tự nào ngoài danh sách các ký tự trong dấu ngoặc vuông

Xác định vị trí

Ký tự  ^  dùng để bắt đầu một chuỗi
Ký tự  $ dùng để kết thúc một chuỗi
Ký tự   \b  và \B bao gói từ (bạn có thể hiểu là bắt đầu tính từ vị trí dấu cách)

Vấn đề khác

Dấu ngoặc tròn ( …) dùng gom nhóm các ký tự hợp lệ.

Dấu xổ đứng | dùng làm toán tử hoặc. Ví dụ (a|b)  nghĩa là trong mẫu có thể xuất hiện ký tự a hoặc xuất hiện ký tự b

Nếu muốn giới hạn bắt buộc phải xuất hiện ký hiệu nào đó trong chuỗi thì dùng cấu trúc   (?=.*d)        nghĩa là bắt buộc phải có ít nhất 1 chữ số trong chuỗi.(Bạn tham khảo thêm Biểu thức chính qui kiểm tra hợp lệ của password  )

 

 

4) Cách xây dựng một biểu thức chính qui

Giả sử kiểm tra một chuỗi có hợp lệ theo chuẩn của một số điện thoại đầu 09 và là số 10 số. Ví dụ: 0912345678 và 0988888888 đều là số điện thoại hợp lệ.

Phân tích:

– Chuỗi phải bắt đầu bằng số 09.
– Chuỗi còn lại 8 chữ số thì có thể nhận bất kỳ số nào trong các chữ số từ 0->9

Cách viết:

– Dùng ký tự ^ và $ để đánh dấu bắt đầu và kết thúc chuỗi
– Dùng ký tự [   ] để liệt kê danh sách ký tự hợp lệ
– Dùng {  }  để viết giới hạn số lượng ký tự
– Ghép các ký tợ lại với nhau tạo thành chuỗi. Chú ý không viết dấu cách. Nếu trong chuỗi có xuất hiện dấu cách thì mới viết dấu cách.

^09[0-9]{8}$

hoặc dùng ký tự \d thay thế cho [0-9]

^09\d{8}$

Bạn hãy thử dùng công cụ javascript ở địa chỉ https://zezo.dev/tool/regex-cheatsheet.html để thử nghiệm nhé.

Đối với javascript, php thì viết biểu thức sẽ cần có thêm 2 ký tự gạch chéo bao gói ở đầu và cuối chuỗi biểu thức. VD:

/^09[0-9]{8}$/

Chúc bạn thành công và sáng tạo!

]]>