Package và Exception trong Java

  1. Package trong Java
  1. Định Nghĩa
  • Một Package (gói) trong Java là một nhóm các class, interface và các package con tương tự, liên quan đến nhau. Chúng ta có thể coi package giống như là một folder.
  • Các package trong Java được sử dụng để tránh việc xung đột trong khi đặt tên, để kiểm soát truy cập, giúp bạn tìm kiếm và sử dụng các class, interface… một các dễ dàng hơn.
irlr2uR493p oRCD 6d3UkhGz9Spnw7GqXq c1VOYu5hCjcZAieWIm0qIsFU7VDLqVibAJq5RXdyTP3 MAV22 - quochung.cyou PTIT
  1. Phân loại

a. Các package có sẵn trong Java API:

  • java.lang: Chứa các lớp hỗ trợ ngôn ngữ (ví dụ: lớp được định nghĩa các kiểu dữ liệu nguyên thủy, các phép toán). Package này được import tự động.
  • java.io: Chứa lớp để hỗ trợ input / output (I/O)
  • java.util: Chứa các lớp tiện ích thực hiện các cấu trúc dữ liệu như danh sách liên kết, dictionary và hỗ trợ cho các hoạt động date / time.
  • java.applet: Chứa các lớp để tạo Applet.
  • java.awt: Chứa các class để triển khai các thành phần cho giao diện người dùng đồ họa (ví dụ như button, menu,…).
  • java.net: Chứa các lớp để hỗ trợ các thao tác trong mạng (network).

b. Package do người dùng tự định nghĩa

  1. Lợi thế của việc sử dụng Package
  • Package được sử dụng để phân loại lớp và interface giúp dễ dàng bảo trì.
  • Package cung cấp bảo vể truy cập
  • Package khắc phục được việc đặt trùng tên.
  1. Triển khai Package
  • Nếu tên package là traidat.vietnam.hanoi, khi đó có 3 thư mục là: traidat, vietnam, hanoi. Package traidat chứa subpackage – package con vietnam, sau đó package vietnam lại chứa subpackage là hanoi
  • Tên package thường được viết thường hết các chữ cái, và ghi rõ nghĩa của các class nằm trong package. VD package “math” chứa các class toán học, …
- quochung.cyou PTIT
  • Để có thể sử dụng các phương thức, … của class TenClass này. Ta có thể gọi 
3 cmeFmK s1jNykYSFaox2P7S - quochung.cyou PTIT
  1. Exception trong Java
  1. Định Nghĩa
  • Exception (ngoại lệ) là một tình trạng bất thường. Trong java, ngoại lệ là một sự kiện làm gián đoạn luồng bình thường của chương trình. Nó là một đối tượng được ném ra tại runtime.
  • VD: Một chiếc ô tô đang chạy bình thường trên đường, thì bỗng nhiên dừng lại – chương trình dừng lại (RTE – Run Time Error), lúc này do ô tô hết xăng không chạy được nữa, vậy việc “hết xăng” là một ngoại lệ – sự bất thường bỗng xảy ra trong chương trình
mX1rXgYmcRtZrm57u22DkPoi28zX0gqRLNW9a6IZqq5QAR9EBL06tp0MR1bVE1N0pnlSDsNB1vxKotdJE3pfG1pH3Mg0 u6Vi7gw8tFq0C4BBooniVYJp4YftOsVs wrk8Akn2PF58SE - quochung.cyou PTIT
  1. Các loại Exception
  • Checked Exceptions: Các Exceptions là lớp extends từ lớp Throwable ngoại trừ RuntimeException và Error. Các Checked Exception được kiểm tra tại compile-time (Lúc chương trình được biên dịch)
  • Unchecked Exception: Các lớp extends từ RuntimeException được gọi là Unchecked Exception, ví dụ: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException,… Các Exception này thường xảy ra khi lỗi đó không lường trước được.
  • Error: Đây là các lỗi không thể cứu chữa được, không thể làm gì khi nó xảy ra được nữa (VD: Hết ram, …)

VD: Khi ta chuẩn bị đi ra ngoài, ta sợ trời có thể mưa nên đã phòng sẵn một cái ô.

Việc trời mưa ta đã lường trước được, nên gọi là Checked Exception, và ta đã khai báo “cái ô” để chuẩn bị trước.

Tuy nhiên có một số vấn đề khác ta không lường được, ví dụ có một vũng nước trên đường, có một cái ô tô chắn không ra khỏi nhà (Các vấn đề phải thực thi chương trình, đi ra ngoài mới có thể gặp)

  • Checked Exceptions
    • IOException: Ngoại lệ liên quan đến file input / output
    • SQLException: Ngoại lệ liên quan đến cú pháp SQL
    • DataAccessException: Ngoại lệ liên quan đến việc truy cập CSDL
    • ClassNotFoundException: Bị ném khi JVM không thể tìm thấy một lớp mà nó cần, do lỗi dòng lệnh, sự cố đường dẫn hoặc tệp, class bị thiếu…
    • InstantiationException: Ngoại lệ khi cố gắng tạo đối tượng của một abstract class hoặc interface
  • UnChecked Exceptions
    • NullPointerException: Ngoại lệ bị ném ra khi cố gắng truy cập một đối tượng có biến tham chiếu có giá trị hiện tại là null
    • ArrayIndexOutOfBound: Ngoại lệ khi cố gắng truy cập một phần tử vượt quá độ dài của mảng
    • IllegalArgumentException: Ngoại lệ bị ném ra khi một phương thức nhận được một đối số được định dạng khác với phương thức mong đợi.
    • IllegalStateException: Ngoại lệ bị ném ra khi trạng thái của môi trường không phù hợp với hoạt động cố gắng thực hiện, ví dụ: Sử dụng Scanner đã bị đóng.
    • NumberFormatException: Ngoại lệ bị ném khi một phương thức chuyển đổi một Chuỗi thành số nhưng không thể chuyển đổi.
    • ArithmeticException: Lỗi số học, chẳng hạn như chia cho 0.
  1. Xử lí Exception

Khối lệnh try-catch:

bZCO49o6XpA3LRRSjXycB2rrPgmItCcrV GJxgZgBlwqALoWqaHhpujkQwaSCA hIF5J6akks2GFZjumQ8GaVh9Zz nEfDnmK60q9OcuS3lkq6EjI 4TsHkkQhanspMRDLdSibXp v1t - quochung.cyou PTIT

Lưu ý: Bạn có thể sử dụng nhiều khối catch với một khối try duy nhất. (Xử lí nhiều lỗi khi thử làm gì đó)

fW5YcizqGIJL4U624ct2EOmk S1LFAOuq9pUExLLycf u WxnhCDfAWHRr66uJPmXG EERUK1lppMX6IKBSpHTu3EGVlUFUl6ylvs5ToI0LFVLZLXYhLVFU 49Nk5 CV9 zguRSaoKnr - quochung.cyou PTIT
Ảnh

Khối lệnh finally:

  • Khối lệnh finally trong java được sử dụng để thực thi các lệnh quan trọng như đóng kết nối, đóng cả stream,…
  • Khối lệnh finally trong java luôn được thực thi cho dù có ngoại lệ xảy ra hay không hoặc gặp lệnh return trong khối try.
  • Quy tắc:
  • Đối với mỗi khối try, có thể có không hoặc nhiều khối catch, nhưng chỉ có một khối finally.
  • Khối finally sẽ không được thực thi nếu chương trình bị thoát (bằng cách gọi System.exit() hoặc xảy ra một lỗi không thể tránh khiến chương trình bị chết).
  1. Custom Exception

Chúng ta có thể khai báo 1 class mới và extends Exception để trở thành 1 ngoại lệ checked

U ffy4g3NSN4W S6bA64JsgRkDn wCU sp E7rGC4IE3CN61jJSqNrd19zVhl9pL2QSsuM3VjSTehyj1dFMahKL68oC vWLwpMNnmiyIYIEvRbmoP5 Ayjiurl9UwnipTGlBMeJGWsu - quochung.cyou PTIT

Chúng ta có thể khai báo 1 class mới và extends RuntimeException để trở thành 1 ngoại lệ unchecked

EUZ4AZSIHP7tvEZ yf15ysT2LSD y18QIJ98He6BeIF1221MkXN6Fux8R29w4AhQGslU482o 8nYwaLr4EwWvbzxan2PUKCS0EFDDNkGAoC8IQIURXZ6onTbv rwayA9E4RiLYRSFLy - quochung.cyou PTIT

Cách up ảnh lên Facebook giữ được chất lượng tốt nhất

Facebook là một mạng xã hội phổ biến bậc nhất tại Việt Nam. Mọi người thường xuyên chia sẻ ảnh lên Facebook như một thói quen hàng ngày. Tuy nhiên có một vấn đề mà ai cũng thấy khó chịu là ảnh tải lên Facebook thường bị giảm chất lượng thấy rõ.

Bài viết này sẽ hướng dẫn cách tối ưu nhất có thể việc bị giảm chất lượng ảnh khi tải lên Facebook.

Tại sao Facebook lại giảm chất lượng ảnh tải lên?

Vì lượng ảnh tải lên Facebook từng phút từng giây có dung lượng rất lớn. Với ảnh có chất lượng giảm đi và dung lượng nhẹ hơn, Facebook sẽ cho người dùng tốc độ khi load các bài viết trên ứng dụng/web nhanh hơn, đồng thời giảm bớt chi phí lưu trữ lượng lớn ảnh như vậy. Việc nén ảnh này được thực hiện tự động khi bạn up ảnh lên.

Ảnh tải lên Facebook được hỗ trợ có chiều ngang cạnh phổ thông là 720px, 960px hoặc 2048px. Các ảnh có kích thước khác đều bị co lại theo kích thước tiêu chuẩn, điều này làm chất lượng ảnh giảm rõ rệt.

Giảm Facebook nén ảnh với file ảnh JPEG/JPG

Mỗi khi bạn tải ảnh lên, Facebook mặc định sẽ nén ảnh của bạn, nên không có cách nào chống được điều đó cả. Tuy nhiên có vài cách để giảm bớt việc nén ảnh đó

Đảm bảo ảnh bạn tải lên có cạnh dài lớn nhất là 720, 960 hoặc 2048px. Facebook sẽ không co kích thước ảnh với các kích cỡ ảnh này, việc này giúp ảnh của bạn sắc nét hơn nhiều khi tải lên.

Ví dụ sử dụng phần mềm Adobe Photoshop 2022

  1. Sử dụng chức năng File/ Export/ Save For Web (Legacy)
  2. Chỉnh các thông số như sau: (Cạnh nhiều nhất: 720/960/2048, PNG-24, Embed Color Profile, Convert to sRGB
  3. Ấn Save và kiểm tra thành quả!
image - quochung.cyou PTIT

So sánh kết quả

image 1 - quochung.cyou PTIT

Tham khảo: https://www.naturettl.com/upload-photos-facebook-best-quality-possible/

Tính đa hình – Polymorphism trong C++ OOP

Đa hình

C++ Polymorphism with Example

Tính đa hình (Polymorphism) là một trong bốn tính chất cơ bản của OOP. Trong lập trình, thuật ngữ này dùng để ám chỉ đến việc một biến, một hàm hoặc một phương thức có thể tồn tại ở nhiều dạng khác nhau. Đa hình là hiện tượng mà các đối tượng thuộc các class khác nhau có thể biểu diễn cùng một thông điệp theo các cách khác nhau.

Ví dụ:

Một người A có thể là một học sinh, đồng thời là thành viên câu lạc bộ, đồng thời là nhân viên bán thời gian quán café.

Một hành động “làm việc” nếu cho học sinh sẽ là học tập, cho kế toán sẽ là “tính toán”, …

Lập trình viên có thể tận dụng Tính đa hình trong OOP vào những trường hợp sau:

  • Khi các lớp con cần dùng phương thức của lớp cha để bổ sung cho một phương thức khác.
  • Khi một lớp cần có nhiều phương thức cùng tên nhưng khác tham số (parameter).

Tính đa hình trong OOP gồm có 2 loại: 

  • Runtime Polymorphism (Đa hình thời gian chạy) 
  • Compile Time Polymorphism (Đa hình thời gian biên dịch) 

Theo đó , tính đa hình cho phép một phương thức thực thi những hành vi khác nhau theo hai hướng: sử dụng phương thức ghi đè (method overriding) hoặc phương thức nạp chồng (method overloading).

  • Đa hình thời gian chạy là trường hợp một đối tượng bị ràng buộc với chức năng của chúng ngay tại thời gian chương trình đang chạy. Đa hình thời gian chạy sử dụng phương thức ghi đè.
  • Đa hình thời gian biên dịch là trường hợp một đối tượng bị ràng buộc với chức năng của chúng ngay tại thời gian chương trình đang biên dịch. Đa hình thời gian biên dịch sử dụng phương thức nạp chồng.

Phương thức ảo, từ khóa Virtual

Một số tài liệu có viết công dụng của Virtual Function như sau:

“Virtual Function là để khai báo một function ở class cha (base class) mà sau đó các class kế thừa (derived class) có thể override function đó”

Các hàm ảo sẽ cho phép chúng ta tạo một danh sách các con trỏ lớp cơ sở và các phương thức của bất kỳ lớp dẫn xuất nào mà không cần biết loại đối tượng của lớp dẫn xuất.

Khi khai báo hàm ảo với từ khóa virtual nghĩa là hàm này sẽ được gọi theo loại đối tượng được trỏ (hoặc tham chiếu), chứ không phải theo loại của con trỏ (hoặc tham chiếu). Và điều này dẫn đến kết quả khác nhau:

  • Nếu không khai báo hàm ảo virtual trình biên dịch sẽ gọi hàm tại lớp cở sở base (lớp cha)
  • Nếu dùng hàm ảo virtual trình biên dịch sẽ gọi hàm tại lớp dẫn xuất derived (lớp kế thừa)

Phương thức thuần ảo, lớp ảo

Hàm thuần ảo (pure virtual function) được sử dụng khi:

  • Không cần sử dụng hàm này trong lớp cơ sở, chỉ phục vụ cho lớp dẫn xuất
  • Lớp dẫn xuất bắt buộc phải định nghĩa lại hàm thuần ảo (Nạp chồng)

Ví dụ: Chúng ta có một lớp cơ sở là Shape. Các lớp dẫn xuất của lớp Shape là Triangle, Square và Circle. Chúng ta muốn tính diện tích của các hình này.

Chúng ta có thể tạo ra một hàm thuần ảo có tên là calculateArea() trong lớp Shape. Các lớp Triangle, Square và Circle phải định nghĩa lại hàm calculateArea() với công thức tính diện tích khác nhau cho mỗi hình.

5aqTqiCz9G4Xm6Uaz UnhFT3FFBkS90tg1hwvHqeYduCSDl5bOpxqiTLxwqxx4EbE2vveyk tfw2kZGOLfDwlJA8SUFw3a8rOZHJ6SbM7jUjoubXhah94az MJ4IizDzt4zAHqYB7VNstPKvRs 6pw - quochung.cyou PTIT

Lớp ảo

Có một vấn đề khi một lớp cơ sở được kế thừa bởi nhiều lớp dẫn xuất. Ví dụ, xét tình huống các lớp kế thừa theo sơ đồ như sau:

https://media.geeksforgeeks.org/wp-content/uploads/20190312133527/Need-of-Containership-in-C.jpg

Lớp B và Lớp C kế thừa từ lớp A. Chúng trở thành A (B) và A (C). Lúc này, nếu ta lại cho D kế thừa từ B và C, ta vô tình tạo ra tới 2 con đường kế thừa về 1 điểm đích.

  • D kế thừa thông qua B kế thừa A
  • D kế thừa thông qua C kế thừa A

Điều này sẽ khiến trình biên dịch mơ hồ và không biết nên đi theo con đường nào và tạo ra lỗi.

Thay vì kế thừa thông thường, ta sẽ định nghĩa B và C là các lớp ảo, việc sử dụng lớp ảo sẽ tiết kiệm không gian và tránh việc trùng lặp kế thừa.

  • Nếu kế thừa thông thường, khi tạo class D kế thừa đồng thời B và C, ta thực chất tạo ra 2 bản sao class A
  • Nếu cho class B và class C thành virtual, thì khi tạo class C chúng ta sẽ dùng chung 1 bản class A.
YilbwpP RhhZw3Zu6GAQyVLIUIhvGX 6KaIg13I2EQG8CpgaorXvQFB0eY GEOS7Bz W4hU1hwcttV1CufHhY8kzKzAMhEUsGUXD5YX8KoAYNEEcx1LaO - quochung.cyou PTIT

Diagram UML và C++ OOP

Diagram UML + Practicing

Hệ thống UML Class Diagram (Biểu đồ Class) là một cách dùng hình ảnh để khởi tạo và biểu diễn một hệ thống hướng đối tượng.

Tìm hiểu về Diagram UML: Access Modifier, Composition, Aggregation, Cardinality.

Access Modifier:

Trong C++ chúng ta có 3 nhãn phạm vi (access modifier) thì uml sẽ kí hiệu như sau

Dấu + : public

Dấu – : private

Dấu # : protected

Composition, Aggregation

Wevt9VIWixwXXqZChL595AM2tmBIItZfBe8pguSnvZep4R8d - quochung.cyou PTIT

Ví dụ:

  • Người đang tiếp xúc với pet, pet cũng tiếp xúc với người (Sự kết hợp – association)
  • Cái đuôi là một thành phần của con chó hoặc con mèo (aggregation composition – Thành phần)
  • Mèo là một kiểu con của pet (Kế thừa)

Aggregation là kiểu khi mà các lớp con được độc lập và không phụ thuộc vào lớp cha. Khi lớp cha bị xóa thì lớp con vẫn tồn tại.

Composition bị phụ thuộc vào lớp cha.

Ví dụ:

hkxJP7s9WMyUHH7feURQTXTOEhBlGB9rvilfx3i5 wM1V147HRCaA7KWv4L5k0TVCQ2u01P0ujuByHCj pWMoP L15HQiSNLrfshipIX2NvBU A74Hev1Tv 5cN8CaCJV3kpAUKIE7TjgHQG0Zdjqw - quochung.cyou PTIT

Class ô tô và Class bánh xe. Class bánh xe vẫn là một sự tồn tại “có ý nghĩa” kể cả không có Class  ô tô, class bánh xe vẫn có thể dùng cho class xe đạp, class xe máy, …

=> Aggregation là kiểu khi mà các lớp con được độc lập và không phụ thuộc vào lớp cha. Khi lớp cha bị xóa thì lớp con vẫn tồn tại.

OrRJ8oN57LWRsOqjwK6LO5K915Y6olyTiFXoOXz8XqHdxi L9m SoisWF0wcGm2vecjOcT9tEvBQIeRUvUbL6SERIdzO91Kf9A25Jmy5VIUUmNIa6b1qazQHTiYnSg7 6E EbgSIRUT2TNM3XYJTHA - quochung.cyou PTIT

Class người và class tay, chân, đầu. Nếu thiếu class người thì gần như những class còn lại đều tồn tại “không có ý nghĩa”, vì chúng không thể sử dụng vào đâu khác cả.

Cardinality

Sử dụng để thể hiện quan hệ về số lượng giữa các đối tượng được tạo từ các class trong class diagram

0…1: 0 hoặc 1

n : Bắt buộc có n

0…* : 0 hoặc nhiều

1…* : 1 hoặc nhiều

m…n: có tối thiểu là m và tối đa là n

B3hsekvGyamXUNgY 5v9biPnYAZKVqtKylsQQobRPQ7385gB SvuQp4u3qsdOppomEHptEBfQ2ykwt2Qfhxn0frNOsyQ U3rSS1WoEGKs8KX5yaGC9vsyCWjJ18srjYuF 11sWQ0qfB - quochung.cyou PTIT

-> VD ảnh: Công ty chỉ có một, còn nhân viên công ty thì là 1 hoặc * (nhiều – không giới hạn)

Tính kế thừa – Inheritance [C++ OOP]

Kế thừa là gì?

  • Tính kế thừa (Inheritance) là một trong bốn tính chất cơ bản của Lập trình hướng đối tượng (OOP).
  • Kế thừa có thể được định nghĩa là quá trình mà một lớp (class) có được các thuộc tính của một lớp khác. Các thuộc tính đó có thể là một phương thức (method) hoặc một trường (field) nào đó. Có nghĩa là nếu lớp A kế thừa lớp B thì lớp A sẽ có những thuộc tính và phương thức của lớp B.
  • Lớp được thừa hưởng những thuộc tính và phương thức từ lớp khác được gọi là dẫn xuất (Derived Class) hay lớp Con (Subclass) và các lớp bị lớp khác kế thừa được gọi là lớp cơ sở (Base Class) hoặc lớp cha (Parent Class).

Cú pháp kế thừa

6Em9crRKpncLAstWY2Z2bQZfwt ERW0Sck jghXSFbpcKJxvyDbN94we3Yf8c0kLHreuGstaVmMTX3cptUJnE1vGYRS3wA - quochung.cyou PTIT

Đơn kế thừa, đa kế thừa

Đơn kế thừa

  • Đơn kế thừa (single inheritance) là một class con kế thừa duy nhất từ một class cha. Ví dụ như class sinh viên chỉ kế thừa duy nhất từ class con người.

Khai báo:

w8VoTdRWgs3vjKMRb973p jC ZkXSiEhdOBSacDB8MS9VCMKTRoQgb 3w4ggLcaWfAiUFewo8I5kMtt3kAA DoUTHSqXjtDpWRgWTIBhLLew bVryXWGIh8iEhsiF0IDApB U WLVE - quochung.cyou PTIT

Tính chất dẫn xuất trong đơn kế thừa

Lớp dẫn xuấtLớp dẫn xuấtLớp dẫn xuất
Lớp cơ sởPublicPrivateProtected
PrivateKhông kế thừaKhông kế thừaKhông kế thừa
ProtectedProtectedPrivateProtected
PublicPublicPrivateProtected
  • public: Nếu kế thừa ở dạng này, sau khi kế thừa, tất cả các thành viên dạng public lớp cha sẽ public ở lớp con, dạng protected ở lớp cha vẫn sẽ là protected ở lớp con.
  • protected: Nếu dùng protected thì sau khi kế thừa, tất cả các thành viên dạng public lớp cha sẽ trở thành protected tại lớp con.
  • private: Trường hợp ta sử dụng private, thì sau khi kế thừa, tất cả các thành viên dạng public và protected ở lớp cha sẽ thành private tại lớp con.

Đa kế thừa

  • Đa kế thừa (multiple inheritance) nghĩa là thay vì một class dẫn xuất kế thừa từ một class cơ sở, class dẫn xuất này có thể có kế thừa từ nhiều class cơ sở khác nhau. Ví dụ như con cái thì sẽ kế thừa đặc điểm từ cả bố và mẹ của chúng.

Khai báo:

p7jnwzKx8OTXleC1sNzeAfsA41V19Q4Lo GOHqrzDGN9kbth2XZyeMQDyhWrSkaqO zTLzh0Wc NFEcKg HWhMqr9jsI r9geXyEOjP0FnYhHZ MDYPXaXGsST7UytG7oU1b8W5yNlXV - quochung.cyou PTIT
  • Khi thừa kế từ nhiều class cơ sở, bạn thấy sẽ có một vấn đề phát sinh chính là khi lớp cơ sở có phương thức trùng tên, khi gọi phương thức sẽ xảy ra sự mơ hồ. Sự mơ hồ nghĩa là trình biên dịch không biết bạn đang gọi phương thức từ class dẫn xuất nào. Để giải quyết vấn đề này, ta có thể sử dụng toán tử phạm vi :: để chỉ rõ phương thức ở class nào. Ví dụ:
6LY VpYtPOiVZa5X62k5a21IgZF0z RbLRqRYW nD4H7nHvSPDvVieoemMZtnmVkKhKqv7dNyMf5AZOXhysn - quochung.cyou PTIT

Function Overloading & Operator Overloading

  • Ngôn ngữ C++ cho phép xác định nhiều hơn một định nghĩa cho một tên hàm hoặc một toán tử trong cùng phạm vi, được gọi tương ứng là Nạp chồng hàm và Nạp chồng toán tử.
  • Một khai báo nạp chồng là một khai báo mà đã được khai báo cùng tên như một khai báo được khai báo trước đó trong cùng phạm vi, ngoại trừ rằng: cả hai khai báo có các tham số khác nhau và định nghĩa khác nhau

Nạp chồng hàm

  • Kỹ thuật này cho phép sử dụng cùng một tên gọi cho các hàm “giống nhau” (có cùng mục đích). Nhưng khác nhau về kiểu dữ liệu tham số hoặc số lượng tham số.
  • Ví dụ: Nạp chồng hàm cho phép ta khai báo và định nghĩa các hàm sau với cùng một tên gọi.
tYUerjOrMqnd4LwQawL7weM2TMV1 efVoirK6BCawbTGbNbrDFFX7u0WcxYT NcQCnn0G1VHHXn7CuZU4P8ykm3WL TBGd ESMMmlmN61dEKqbpE6GbmU2VNrl4ZJ kM7o3IlRn ToZ2 - quochung.cyou PTIT

Nạp chồng toán tử

  • .Nạp chồng toán tử (overload operator) là bạn định nghĩa lại toán tử đã có trên kiểu dữ liệu người dùng tự định nghĩa để dể dàng thể hiện các câu lệnh trong chương trình.
  • Ví dụ như bạn định nghĩa phép cộng cho kiểu dữ liệu phân số thì sẽ thực hiện cộng hai phân số rồi trả về một phân số mới. So với việc thực hiện gọi hàm, việc overload toán tử sẽ làm cho câu lệnh ngắn gọn, dễ hiểu hơn.
XjTsX IbJE9IzgP5NGytA763YIqjQffZljq53jqA znKHiJloMouE1UsO4nfhSHOnWc3q2MIyzYoWHBVkgZCavfVoSp Aofx6bbHdlzfSTA1VGuM0M8V2ig6X89ArKN zBd5My8BmKpw - quochung.cyou PTIT

Cú pháp:

=> Như đã giới thiệu, bản chất việc dùng toán tử là lời gọi hàm, do đó chúng ta overload toán tử cũng giống overload hàm, vậy chúng ta sẽ overload hàm nào? Chúng ta sẽ overload hàm có tên là operator @, với @ là toán tử cần overload (+, -, *, /…), kiểu trả về của hàm chính là lớp đó.

Nạp chồng toán tử 2 ngôi:

BQ1NHTILv 0aXq0Ha9tsVX88OBxh70XHLdYkO3sBFS8w7FRJ 0oD4jFagxDUI1336PbZF88rPajtgOGMYanSItSKRFtOz1ghoLz9mtCaB2YzwO1GROk7qh4D8 Nbj2SunNMe oQZDIDD - quochung.cyou PTIT

Function Overriding

  • Trong kế thừa, khi lớp con khai báo phương thức có tên trùng với phương thức ở lớp cha thì phương thức của lớp cha sẽ bị thay thế bởi phương thức ở lớp con.
- quochung.cyou PTIT

Hàm Friend

  • Hàm bạn của một lớp không phải là hàm thành viên nên nó không phụ thuộc vào lớp và có thể định nghĩa ở trong hoặc ngoài lớp. 
  • Hàm bạn có thể truy cập trực tiếp các thành viên private và một lớp có thể có nhiều hàm bạn.
  • Cú pháp khai báo hàm bạn đơn giản là thêm từ khóa friend trước hàm bình thường ta vẫn sử dụng.

Collection và Collections trong Java

COLLECTION & COLLECTIONS

Collection

Collection trong java là một root interface trong hệ thống cấp bậc Collection. Java Collection cung cấp nhiều interface (Set, List, Queue, Deque,…) và các lớp (ArrayList, Vector, LinkedList, PriorityQueue, HashSet, LinkedHashSet, TreeSet,…)

- quochung.cyou PTIT

Collections

Collections trong java là một khuôn khổ cung cấp một kiến trúc để lưu trữ và thao tác tới nhóm các đối tượng. Tất cả các hoạt động mà bạn thực hiện trên một dữ liệu như tìm kiếm, phân loại, chèn, xóa,… có thể được thực hiện bởi Java Collections.

Hệ thống cấp bậc Collection

Gói java.util chứa tất cả các lớp và interface của Collection

NxEiS NhpDt2aCqAp qDQG0p29nHkoqtQieaej5V4WwooYzSmeDjJzkgHwTXDzYqt52o6bvg3rZo0KL4pUT9Dt4kULTdN4X - quochung.cyou PTIT

Các phương thức

Iterable interface chứa dữ liệu thành viên Iterator interface.

Giao tiếp Iterator cung cấp phương tiện để lặp đi lặp lại các thành phần từ đầu đến cuối của một collection.

  • Ngoài ra, ta còn có thể làm việc với Collection thông qua Iterator Interface.
Phương thứcMô tả
public boolean hasNext()Nó trả về true nếu iterator còn phần tử kế tiếp phần tử đang duyệt.
public object next()Nó trả về phần tử hiện tại và di chuyển con trỏ trỏ tới phần tử tiếp theo.
public void remove()Nó loại bỏ phần tử cuối được trả về bởi Iterator. Nó hiếm khi được sử dụng.
  • Một số method của Interface Collection. Các method này sẽ được các Interface con kế thừa lại:
Phương thứcMô tả
boolean add(Object element)Được sử dụng để chèn một phần tử vào collection.
boolean addAll(Collection c)Được sử dụng để chèn các phần tử collection được chỉ định vào collection gọi phương thức này.
boolean remove(Object element)Được sử dụng để xóa phần tử từ collection.
boolean removeAll(Collection c)Được sử dụng để xóa tất cả các phần tử của collection được chỉ định từ collection gọi phương thức này.
boolean retainAll(Collection c)Được sử dụng để xóa tất cả các thành phần từ collection gọi phương thức này ngoại trừ collection được chỉ định.
int size()Trả lại tổng số các phần tử trong collection.
void clear()Loại bỏ tổng số của phần tử khỏi collection.
boolean contains(Object element)Được sử dụng để tìm kiếm phần tử.
boolean containsAll(Collection c)Được sử dụng để tìm kiếm collection được chỉ định trong collection.
Iterator iterator()Trả về một iterator.
Object[] toArray()Chuyển đổi collection thành mảng (array).
boolean isEmpty()Kiểm tra nếu collection trống.
boolean equals(Object element)So sanh 2 collection.
int hashCode()Trả về số hashcode của collection.
  • Collections chỉ chứa static method. Một số method của collections:
Phương thứcMô tả
void sort()sắp xếp collections
min(), max()trả về phần tử nhỏ nhất /lớn nhất trong Collection
int binarySearch()tìm kiếm nhị phân một giá trị
void reverse()đảo ngược collections
void copy()Sao chép tất cả các phần tử từ một danh sách này sang một danh sách khác.
int frequency()Trả về số lượng các phần tử có trong bộ sưu tập được chỉ định bằng đối tượng được chỉ định.
int indexOfSubList()Trả về vị trí bắt đầu của lần xuất hiện đầu tiên của danh sách mục tiêu được chỉ định trong danh sách nguồn quy định, hoặc -1 nếu không tìm thấy đối tượng chỉ định.

CÁC COLLECTION THƯỜNG GẶP

List

List là một interface trong java. Nó chứa các phương thức để chèn và xóa các phần tử dựa trên chỉ số index.

Khai báo của interface List trong Java:

5neMDTW8gs2P6eXH6p091esF7GsoSWfQ2nGklyLNTQa L3zMRzi57gksf3ZP4ZVupWuENZzXYPr8iefiiKvQMO0rtd4fm JwWvNuuIhL4ejupOD20JRZFnWcuP7nfCSwRQO DLMBj7p5 - quochung.cyou PTIT
  • Các method của List thường dùng:
Phương thứcMô tả
void add(int index, Object element)Nó được sử dụng để chèn các phần tử vào list tại chỉ số index.
boolean addAll(int index, Collection c)Nó được sử dụng để chèn tất cả các yếu tố của c vào danh sách tại chỉ số index.
object get(int index)Nó được sử dụng để trả về đối tượng được lưu trữ tại chỉ số index trong list.
object set(int index, Object element)Nó được sử dụng để gán phần tử cho vị trí được chỉ định index trong list.
object remove(int index)Nó được sử dụng để xóa các phần tử tại vị trí có chỉ số index và trả về phần tử đã xóa.
ListIterator listIterator()Nó được sử dụng để trả về một Iterator mà bắt đầu từ phần tử đầu tiên của list.
ListIterator listIterator(int index)Nó được sử dụng để trả về một Iterator mà phần tử bắt đầu từ chỉ số index chỉ định.

ArrayList

Lớp ArrayList trong java là một lớp kế thừa lớp AbstractList và triển khai của List Interface nên nó sẽ có một vài đặc điểm và phương thức tương đồng với List.

ArrayList được sử dụng như một mảng động để lưu trữ các phần tử.

Những đặc điểm của ArrayList:

  • Lớp ArrayList trong java có thể chứa các phần tử trùng lặp.
  • Lớp ArrayList duy trì thứ tự của phần tử được thêm vào.
  • Lớp ArrayList là không đồng bộ (non-synchronized).
  • Lớp ArrayList cho phép truy cập ngẫu nhiên vì nó lưu dữ liệu theo chỉ mục.
  • Lớp ArrayList trong java, thao tác chậm vì cần nhiều sự dịch chuyển nếu bất kỳ phần tử nào bị xoá khỏi danh sách.

Khởi tạo ArrayList:

- quochung.cyou PTIT
  • Các method của ArrayList thường dùng:
Phương thứcMô tả
boolean add(Object o)Nó được sử dụng để nối thêm phần tử được chỉ định vào cuối một danh sách.
void add(int index, Object element)Nó được sử dụng để chèn phần tử element tại vị trí index vào danh sách.
boolean addAll(Collection c)Nó được sử dụng để nối tất cả các phần tử trong collection c vào cuối của danh sách, theo thứ tự chúng được trả về bởi bộ lặp iterator.
boolean addAll(int index, Collection c)Nó được sử dụng để chèn tất cả các phần tử trong collection c vào danh sách, bắt đầu từ vị trí index.
void retainAll(Collection c)Nó được sử dụng để xóa những phần tử không thuộc collection c ra khỏi danh sách.
void removeAll(Collection c)Nó được sử dụng để xóa những phần tử thuộc collection c ra khỏi danh sách.
int indexOf(Object o)Nó được sử dụng để trả về chỉ mục trong danh sách với sự xuất hiện đầu tiên của phần tử được chỉ định, hoặc -1 nếu danh sách không chứa phần tử này.
int lastIndexOf(Object o)Nó được sử dụng để trả về chỉ mục trong danh sách với sự xuất hiện cuối cùng của phần tử được chỉ định, hoặc -1 nếu danh sách không chứa phần tử này.
Object[] toArray()Nó được sử dụng để trả về một mảng chứa tất cả các phần tử trong danh sách này theo đúng thứ tự.
Object[] toArray(Object[] a)Nó được sử dụng để trả về một mảng chứa tất cả các phần tử trong danh sách này theo đúng thứ tự.
Object clone()Nó được sử dụng để trả về một bản sao của ArrayList.
void clear()Nó được sử dụng để xóa tất cả các phần tử từ danh sách này.
void trimToSize()Nó được sử dụng để cắt dung lượng của thể hiện ArrayList này là kích thước danh sách hiện tại.
boolean contains(element)Kết quả trả về là true nếu tìm thấy element trong danh sách, ngược lại trả về false.
  • Như tìm hiểu bên trên, ta thấy ArrayList và Vector gần giống nhau. Tuy nhiên, ta có thể so sánh một vài sự khác biệt như sau:
ArrayListVector
ArrayList là non-synchronized.Vector là synchronized.
ArrayList là nhanh hơn vì nó là non-synchronized.Vector là chậm hơn vì nó là synchronized. Tức là, trong môi trường đa luồng, các thread giữ nó ở trong trạng thái runnable hoặc non-runnable cho đến khi thread hiện tại giải phóng đối tượng đó.
ArrayList được duyệt bởi Iterator.Vector được duyệt bởi Enumeration và Iterator.

Map

Trong java, map được sử dụng để lưu trữ và truy xuất dữ liệu theo cặp key và value. Mỗi cặp key và value được gọi là mục nhập (entry). Map trong java chỉ chứa các giá trị key duy nhất. Map rất hữu ích nếu bạn phải tìm kiếm, cập nhật hoặc xóa các phần tử trên dựa vào các key.

Các phương thức hữu ích của Map interface

Phương thứcMô tả
Object put(Object key, Object value)Nó được sử dụng để chèn một mục nhập trong map hiện tại.
void putAll(Map map)Nó được sử dụng để chèn map chỉ định vào map hiện tại.
Object remove(Object key)Nó được sử dụng để xóa một mục nhập của key được chỉ định.
Object get(Object key)Nó được sử dụng để trả lại giá trị cho khoá được chỉ định.
boolean containsKey(Object key)Nó được sử dụng để tìm kiếm key được chỉ định từ map hiện tại.
Set keySet()Nó được sử dụng để trả đối tượng Set có chứa tất cả các keys.
Set entrySet()Nó được sử dụng để trả lại đối tượng Set có chứa tất cả các keys và values.

Map.Entry Interface

Entry là một interface con của Map. Vì vậy, chúng ta được truy cập nó bằng tên Map.Entry. Nó cung cấp các phương pháp để truy xuất các key và value.

Các phương thức của Map.Entry interface

Phương thứcMô tả
Object getKey()Nó được dùng để lấy key.
Object getValue()Nó được sử dụng để lấy value.

Phân biệt List và ArrayList

l3YItbjXQXR8GyrhYUZxXwrnTHVTIsgLFaOXblTC0rMSBNS ZDBrEcOro1kCT0uB8Q o 6ksM3OguGn1g8L7RlROphHGpAFwi7Ud5sUIWS3zK odQh konRWvb JBKEKJVRZv2QqLs9m - quochung.cyou PTIT
  • List là một interface –  ArrayList là một class thuộc framework Collection
  • List kế thừa từ Collection – ArrayList kế thừa AbstractArrayList và implement List
  • List lưu các phần tử theo thứ tự vị trí, ArrayList như một mảng động có thể thêm xoá phần tử

Sắp xếp trong Java

Sắp xếp bằng cách tạo hàm compare.to sử dụng giao diện Comparable để sắp xếp

XpxUcDwgV3pbMLRG4GxdnGT0YTZLY 7JDFAhyafARqXcz EWyrVgZsqugh 3yZG IrgLtCzVv6RI4pGVxX jmf7x - quochung.cyou PTIT

Sắp xếp bằng cách sử dụng Comparator để sắp xếp tiện dụng hơn

R61xA9a2WnpDW53cJ3RltUzPcccRmmqUEiREl5ixNBz5V0SRZ1kj e9DC FIur0x 8WH8sc0GFT MA DdRJKRIAiswoNQbO3QLVjUjX - quochung.cyou PTIT

[site_reviews_form]

Review về ngành Công nghệ thông tin CLC của PTIT

  • Chương trình học, thông tin: https://daotao.aisenote.com/nganhhoc/7480201(CLC)
  • Chào các bạn, mình là Nguyễn Quốc Hưng. Tại thời điểm cuối cập nhật bài viết này (9/2023), mình là sinh viên năm 3 ngành CNTT CLC của PTIT. Sau một năm học trong ngành này, mình hi vọng những chia sẻ của mình có thể phần nào giúp các bạn hiểu rõ hơn về ngành Công nghệ thông tin (CLC) của trường.

KÌ THI XÉT TUYỂN

Những ngành có thể tham gia kì thi lên CLC:

  • Điện tử viễn thông
  • An toàn thông tin
  • Điện tử
  • Công nghệ thông tin
  • Khoa học máy tính
  • … Có thể sẽ có các ngành mới mỗi năm trường thêm

Để chuyển lên ngành CLC, đầu tiên bạn sẽ cần thi một kì thi tiếng anh vì ngành CNTT CLC để liên quan khá nhiều đến tiếng anh. Bài thi dùng để xét tuyển sẽ là TOEFL ITP do IIG hợp tác với trường tổ chức.

https://iigvietnam.com/bai-thi-toefl-itp/

image - quochung.cyou PTIT

Theo như thời điểm mình thi, thì khoảng 360-400 điểm (Bạn có thể tham khảo quy đổi bên dưới) đã đủ để đỗ, và tổng sinh viên một khóa sẽ khoảng 200 sinh viên (5 lớp). Nếu bạn có chứng chỉ tiếng anh đổi điểm sẵn, bạn sẽ được phân vào lớp E1,E2 với chương trình học khá nhàn ở năm 1 và năm 2. (Do năm 1 năm 2 ngành CLC có khoảng 4 kíp tiếng anh một tuần – 8 tiếng) và nếu bạn đã có chứng chỉ thì sẽ được nghỉ hết các môn đó.

image 1 - quochung.cyou PTIT

CHƯƠNG TRÌNH HỌC

image 7 - quochung.cyou PTIT

Nếu bạn ở các khoa điện tử viễn thông, điện tử có chương trình học ban đầu thường hướng nhiều về phần cứng hơn, nhưng sau khi thi lên ngành CNTT CLC, bạn sẽ chuyển hoàn toàn chương trình sang Công nghệ thông tin CLC khá giống với ngành Công nghệ thông tin bình thường.

Đầu tiên, các môn chuyên ngành (lập trình) và toán sẽ được dạy bằng tiếng anh. Bài giảng tiếng anh, thi bằng tiếng anh, thầy cô một số cũng dạy bằng tiếng anh nhưng đa số vẫn là tiếng việt. Tuy nhiên tiếng anh khá là nhẹ, nên bạn không cần quá lo lắng về vấn đề này. Dù các bài tập, kì thi đều là tiếng anh, nhưng bạn hoàn toàn vẫn có thể học từ các tài liệu tiếng việt và thi bình thường.

Các môn chuyên ngành hệ thường tại năm 1, năm 2

  • Kì 1: Tin học cơ sở 1 : Word, Excel, Powerpoint, máy tính, …
  • Kì 2: Tin học cơ sở 2: Lập trình C
  • Kì 3: Ngôn ngữ lập trình C++, Toán rời rạc 1
  • Kì 4: Cấu trúc dữ liệu và giải thuật

Các môn chuyên ngành hệ CLC tại năm 1, năm 2

  • Kì 1: Introduction to Programming: Lập trình C + Word Excel PowerPoint
  • Kì 2: Programming with C++: Lập trình C++
  • Kì 3: Toán rời rạc 1, Data Structure and Algorithm (Cấu trúc dữ liệu và giải thuật)
  • Như chương trình trên, bạn sẽ được tiếp cận với code sớm hơn hệ thường 1 kì. Điều này mang lại lợi thế khá lớn cho các bạn tham gia vào các câu lạc bộ học thuật, các kì thi trong trường

Ý kiến cá nhân: Việc được tiếp cận các môn code sớm cho mình lợi thế khá lớn khi tham gia các câu lạc bộ trong trường và các kì thi.

  • Các đề thi thường được dễ hơn hệ thường nên bạn sẽ nhẹ nhàng hơn để tập trung vào môn chuyên ngành.
  • Điểm của CLC cũng thường nhỉnh hơn khá rõ. (Môn giải tích của CLC còn cho phép mang tài liệu tham khảo vào phòng thi do thi tiếng anh)
  • Làm đồ án của ngành CLC chỉ cần 2.6 GPA, trong khi hệ thường là 2.9.
  • Môn tiếng anh tại ngành cũng được học khá nhiều (8 tín), nên nếu bạn đổi điểm tiếng anh sau này thì toàn bộ môn này là 10, buff khá nhiều điểm gpa so với hệ thường.

CƠ SỞ VẬT CHẤT – GIẢNG DẠY

Cho đến thời điểm hiện tại của bài viết (9/2023):

  • Hệ CLC sẽ học ở tòa A1, và hệ thường học ở tòa A2
  • Điều hòa của CLC sẽ nhiều hơn và có trong cả sảnh.
  • Các bạn dự định học cao, thạc sĩ, … thì khá dễ vào lab riêng của CLC, chỉ cần thể hiện tốt và liên hệ trực tiếp với thầy cô giảng dạy để xin vào đội làm lab.
  • Bạn phải đóng x1.25-2 tiền học phí của mọi môn. Kể cả những thứ bạn không nhận được hơn gì cả (VD: Tiền học phí quốc phòng)
  • Wifi Free mạnh hơn tòa A2 của hệ thường
  • Nhà vệ sinh đẹp hơn A2
  • Ghế công thái học, trong lớp nhiều ổ điện hơn A2.
  • Thầy cô dạy đa số là trưởng khoa, top trong trường, ở hệ thường sẽ cần tranh đấu để có slot học, tại CLC bạn sẽ được phân bổ tự động
  • Có nhiều hội thảo tiếng anh
  • CIE PTIT – Đào tạo quốc tế có vẻ được trường khá quan tâm, nên trong tương lai mình nghĩ cơ sở vật chất, chất lượng sẽ được ưu tiên cải thiện nhiều hơn

Sửa lỗi âm thanh chất lượng cao (High Fidelity A2DP) loa Bluetooth trên Ubuntu, Debian, …

TH1: Có thể chuyển sang chế độ HiFi A2DP, nhưng không nghe thấy nhạc

  • Bạn mở file manager bằng quyền root, (chuột phải open as root)
  • Tìm đến /home/tên người dùng/.config/pulse (Nếu không có .config thì tìm bật “Show Hidden File” lên)
  • Xóa folder trên, sau đó ra ngoài gõ pulseaudio -k để khởi động lại daemon

TH2: Khi chuyển sang chế độ HiFi A2DP thì bị lỗi (Failed to change profile to a2dp_sink)

TH3: Khi chuyển sang chế độ HiFi A2DP thì bị lỗi khác

  • Cài đặt blueman sudo apt-get install blueman
  • Mở file ở /etc/bluetooth/main.conf và thêm Disable=headset
  • Khởi động lại daemon bluetooth sudo service bluetooth restart

Cài đặt WordPress với Docker, Nginx, MariaDB trên Ubuntu 22

Giới thiệu

Ở bài viết này chúng ta sẽ tiến hành tạo một website WordPress thông qua Docker Compose, Nginx, MariaDB trên Ubuntu 22.04. Về phần Docker mình sẽ sử dụng Portainer để quản lý container.

Cài đặt Docker và Portainer

Cài đặt Docker trên Ubuntu

sudo apt update
sudo apt upgrade
sudo apt install docker.io -y

Tự động bật Docker khi máy chủ khởi động

sudo -i
systemctl start docker
systemctl enable docker

Cài đặt Portainer

docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
docker ps

Truy cập Portainer

Sau khi cài đặt xong, bạn hãy lên web và truy cập vào http://localhost:9000 để vào giao diện của Portainer

image - quochung.cyou PTIT

Vào lần truy cập đầu tiên, bạn sẽ được hỏi để tạo mật khẩu truy cập Portainer.

Vì mình quản lý từ local nên mình sẽ chọn Local ở bước tiếp theo

02 connect local - quochung.cyou PTIT

Cài đặt WordPress

Cài đặt Nginx

Bạn vào mục Container và tạo một container cho nginx như sau

image 1 - quochung.cyou PTIT
+ Name: nginx (Tùy ý bạn chọn để đặt tên cho container)
+ Image: nginx
+ Manual network port publishing:
Chọn port truy cập cho nginx, mặc định ở phần container phải là 80, và host là port bạn truy cập đến nginx
Hoặc bật Publish all exposed network ports to random host ports để tự động chọn port ngẫu nhiên 

Ở đây mình chọn 80:80

Chọn Deploy Container để tiếp tục

Tiếp theo thử truy cập localhost:(cổng bạn chọn) để kiểm tra xem nginx đã hoạt động chưa?

welcome to nginx window 5x3 2 - quochung.cyou PTIT

Cài đặt MariaDB

Tiếp tục tạo Container cho MariaDB như sau

image 2 - quochung.cyou PTIT
+ Name: mariadb (Tùy ý bạn chọn để đặt tên cho container)
+ Image: mariadb 
+ Manual network port publishing:
Chọn port truy cập cho mariadb , mặc định ở phần mariadb phải là 3306, và host là port bạn truy cập đến nginx
Hoặc bật Publish all exposed network ports to random host ports để tự động chọn port ngẫu nhiên 

Ở đây mình chọn 4166:3306

Chọn Deploy Container để tiếp tục

Sau đó truy cập vào Console và tạo database cho wordpress

mysql -u root -p
create database wordpress;

Cài đặt WordPress

Tạo container wordpress như sau

image 3 - quochung.cyou PTIT
+ Name: wordpress (Tùy ý bạn chọn để đặt tên cho container)
+ Image: wordpress 
+ Manual network port publishing:
Chọn port truy cập cho wordpress, mặc định ở phần container phải là 80, và host là port bạn truy cập đến wordpress
Hoặc bật Publish all exposed network ports to random host ports để tự động chọn port ngẫu nhiên 

Ở đây mình chọn 4167:80

Chọn Deploy Container để tiếp tục

Cấu hình Nginx

Truy cập vào Console nginx và gõ lệnh sau

apt -y update
apt -y install nano
nano /etc/nginx/conf.d/wordpress.conf

Bạn tạo config file theo mẫu sau với ip, port theo bạn tạo

server {
    listen       80;
    server_name  wordpress.quochung.cyou; 

location / {
    proxy_pass       http://ip:4167;
    proxy_redirect             off;
    proxy_set_header Upgrade   $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Như vậy mình đã trỏ subdomain wordpress.quochung.cyou về IP của nginx trên cổng http 80. Sau đó nginx sẽ chuyển đến http://ip:4167 (Trang của wordpress)

Bạn save file và gõ

nginx -t

Để kiểm tra xem config đã đúng chưa

Sau khi xong khởi động lại container nginx, truy cập tên miền đã tạo để kiểm tra kết quả

WordPress setup wizard - quochung.cyou PTIT

Cách cài đặt C++, MingW cho Visual Studio Code (C++ 20)

Video hướng dẫn

Video hướng dẫn

Hướng dẫn

Các bước thực hiện

  1. Cài Visual Studio Code.
  2. Tải extension C/C++ extension for VS Code. hỗ trợ C/C++. Hoặc bạn có thể tự vào mục Extension bằng Ctrl+Shift+X rồi tìm C++ C/C++ extension
  3. Tải Mingw để có thể compile code https://github.com/brechtsanders/winlibs_mingw/releases/, thông thường các máy sẽ dùng file có dạng “winlibs-x86_64-posix-seh-gcc-12.1.0-mingw-w64msvcrt-10.0.0-r3.zip” (winlibsx86_64…… ) (đuôi .zip)
  4. Bạn giải nén thư mục được 1 folder mingw, để folder này vào đâu đó trong ổ C. Trong folder mingw sẽ có một thư mục con tên “bin” , hãy nhớ thư mục này
  5. Dùng thanh tìm kiếm của Window, tìm chữ “path”, chọn lựa chọn Edit environment variables for your account.
    1. Chọn Path trong User variables và click Edit.
    2. Chọn New, bây giờ hãy paste đường dẫn vào folder mingw/bin bên trên (dẫn đến thư mục con bin) VD: C:\msys64\mingw64\bin
    3. Chọn OK và tắt tất cả cửa sổ cài đặt

Kiểm tra cài đặt thành công chưa

Mở CMD/Powershell của Window lên, gõ lệnh

g++ --version

Nếu trả về là phiên bản của GCC có dạng GCC 4.7.2 …. thì bạn đã cài thành công