Home Blog Page 80

Hibernate Criteria Query Language (HCQL)

hcql
Hibernate Criteria Query Language (HCQL)

Bài viết được sự cho phép của tác giả Giang Phan

Trong bài trước, chúng ta đã cùng tìm hiểu về cách sử dụng Hibernate Query Language (HQL) để truy vấn cơ sở dữ liệu và nhận kết quả. Trong bài này, chúng ta sẽ cùng tìm hiểu về Hibernate Criteria Query Language – một cách khác để lấy dữ liệu dựa vào các tiêu chí (Criteria) cụ thể.

  Hibernate Interceptor & StatementInspector
  Hibernate Batch processing

Giới hiệu Hibernate Criteria Query Language (HCQL)

Hibernate Criteria API cung cấp cách tiếp cận hướng đối tượng để truy vấn cơ sở dữ liệu và nhận kết quả. Criteria cho phép chúng ta xây dựng câu lệnh một cách linh động (dynamic) và không bị hardcode trong một chuỗi truy vấn và có thể tái sử dụng.

Một số trường hợp sử dụng phổ biến của Hibernate Criteria Query:

  • Sử dụng các hàm tập hợp như sum(), min(), max(), …
  • Truy vấn một vài column cụ thể.
  • Sử dụng để join nhiều table với nhau.
  • Giới hạn dữ liệu được trả về.
  • Sắp xếp (Order) kết quả trả về.
  • Phân trang (Paging).

Tương tự như HQL, để tạo đối tượng Criteria chúng ta sẽ sử dụng phương thức getCriteriaBuilder() từ đối tượng Session và tạo đối tượng Criteria: CriteriaQuery, createCriteriaUpdate, createCriteriaDelete.

1
2
3
4
5
<T> javax.persistence.criteria.CriteriaQuery<T> createQuery(java.lang.Class<T> aClass);
<T> javax.persistence.criteria.CriteriaUpdate<T> createCriteriaUpdate(java.lang.Class<T> aClass);
<T> javax.persistence.criteria.CriteriaDelete<T> createCriteriaDelete(java.lang.Class<T> aClass);

Ví dụ sử dụng Hibernate Criteria Query Language (HCQL)

Chúng ta sẽ sử dụng lại cơ sở dữ liệu ở bài viết trước để thực hiện các truy vấn với Criteria.

Lấy 1 đối tượng

Ví dụ lấy user có id là 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try (Session session = HibernateUtils.getSessionFactory().openSession();) {
    // Begin a unit of work
    session.beginTransaction();
    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<User> query = builder.createQuery(User.class);
    Root<User> root = query.from(User.class); // FROM User u
    query.select(root); // SELECT
    query.where(builder.equal(root.get("id"), 1)); // WHERE u.id = 1
    User user = session.createQuery(query).uniqueResult();
    // Commit the current resource transaction, writing any unflushed changes to the database.
    session.getTransaction().commit();
}

Lấy danh sách với paging và ordering

Ví dụ lấy danh sách user có id >= 1 và id <= 1000. Sắp xếp danh sách này theo ngày tạo giảm dần, tên tăng dần. Lấy từ 5 user bắt đầu từ vị trí thứ 10.

1
2
3
4
5
6
7
8
9
10
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class); // FROM
query.select(root); // SELECT
query.where(builder.and(builder.ge(root.get("id"), 1), builder.le(root.get("id"), 1000))); // WHERE id >= 1 AND id <= 1000
query.orderBy(builder.desc(root.get("createdAt")), builder.desc(root.asc("fullname"))); // ORDER BY createdAt DESC, fullname ASC
List<User> users = session.createQuery(query)
        .setFirstResult(10)
        .setMaxResults(5)
        .getResultList();

Lấy một column (Selecting an expression)

Ví dụ lấy tất cả email của user.

1
2
3
4
5
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<String> query = builder.createQuery(String.class);
Root<User> root = query.from(User.class); // FROM
query.select(root.get("fullname")); // SELECT fullname
List<String> fullnames = session.createQuery(query).getResultList();

Lấy nhiều column (Selecting multiple values)

1
2
3
4
5
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
Root<User> root = query.from(User.class); // FROM
query.multiselect(root.get("fullname"), root.get("username")); // SELECT fullname, username
List<Object[]> users = session.createQuery(query).getResultList();

Lấy nhiều column sử dụng Wrapper (Selecting a wrapper)

Thay vì trả về list Object[], chúng ta có thể trả về List POJO class như sau:

  • Tạo class mới, chứa các cột trả về.
  • Sử dụng phương thức construct của CriteriaBuilder để gán giá trị tương ứng cho wrapper class.

Chẳng hạn, cần lấy 2 column là fullname và username

1
2
3
4
5
6
@Data
@AllArgsConstructor
class BaseUser {
    private String fullname;
    private String username;
}
1
2
3
4
5
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<BaseUser> query = builder.createQuery(BaseUser.class);
Root<User> root = query.from(User.class); // FROM
query.select( builder.construct( BaseUser.class, root.get("fullname"), root.get("username") ) ); // SELECT fullname, username
List<BaseUser> users = session.createQuery(query).getResultList();

Sử dụng hàm tập hợp (Aggregate Functions)

Ví dụ đếm số lượng user được tạo theo tháng.

1
2
3
4
5
6
7
8
9
10
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
Root<User> root = query.from(User.class);
Expression<Long> groupByExp = builder.function("month", Long.class, root.get("createdAt")).as(Long.class);
Expression<Long> countExp = builder.count(root.get("id"));
query.multiselect(groupByExp, countExp);
query.groupBy(groupByExp);
query.having(builder.gt(builder.count(root), 3));
//ordering by count in descending order
query.orderBy(builder.desc(countExp));

Truy vấn nhiều bảng (join)

Ví dụ: lấy thông tin user và user profile.

1
2
3
4
5
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class); // FROM
Join<User, UserProfile> userJoin = root.join("userProfile", JoinType.LEFT);
List<User> users = session.createQuery(query).getResultList();

Một số bất lợi khi sử dụng của Criteria

Như bạn thấy, Query với Criteria khá đơn giản. Tuy nhiên, nó có một số vấn đề sau chúng ta cần xem xét trước khi sử dụng:

  • Performance issue: Chúng ta không có cách nào để kiểm soát truy vấn SQL do Hibernate tạo ra, nếu truy vấn được tạo chậm, ta rất khó điều chỉnh truy vấn.
  • Maintenace issue: Tất cả các truy vấn SQL được phân tán thông qua mã code Java, khi một truy vấn bị lỗi, có thể dành thời gian để tìm truy vấn gây ra vấn đề trong ứng dụng của mình.

Không có gì là hoàn hảo, hãy xem xét nhu cầu dự án của mình và sử dụng nó một cách phù hợp. Đó cũng là một trong những lý dó mà Hibernate support nhiều loại truy vấn khác nhau.

Tài liệu tham khảo:

Bài viết gốc được đăng tải tại gpcoder.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Nên sử dụng Mobile first hay là Desktop first khi làm Responsive

responsive
Nên sử dụng Mobile first hay là Desktop first khi làm Responsive

Bài viết được sự cho phép của tác giả Trần Anh Tuấn

Chào các bạn, hôm nay chúng ta sẽ đến một chủ đề khá là hay đó là khi chúng ta code giao diện Responsive thì nên code theo hướng Mobile first hay là Desktop first ? Đây là 1 vấn đề mà có khá nhiều người thảo luận, có người bảo thì code Mobile first dễ hơn vì nó đang là xu hướng, có người thì bảo là Desktop first dễ hơn….

Ở bài viết này mình sẽ chia sẻ cho các bạn theo góc nhìn của mình để các bạn nắm rõ hơn về những cái này và biết áp dụng như thế nào cho hợp lý nhé. Chiến thôi

  SOLID – Nguyên tắc 1: Đơn nhiệm – Single Responsibility principle (SRP)
  Nên sử dụng Mobile first hay là Desktop first khi làm Responsive
”]

Mobile first

Nói theo nghĩa của nó thì chúng ta sẽ code một giao diện từ thiết bị nhỏ cho tới thiết bị to, từ mobile tới tablet rồi tới laptop và các màn hình lớn như Retina.

Tuy nhiên khi code Mobile first thì chúng ta nên có thiết kế mobile trước để chúng ta biết mà code như thế nào cho đúng, nếu không có giao diện mobile mà chỉ có desktop thôi mà chúng ta code mobile first thì sẽ khá là cực đó. Cho nên trường hợp mà chỉ có giao diện desktop thôi thì theo bản thân mình nghĩ lúc này code theo hướng Desktop first là 1 giải pháp tốt hơn.

Desktop first

Ngược lại với mobile first thì chúng ta sẽ code các giao diện từ lớn đến bé từ Retina cho tới laptop, rồi tới tablet và cuối cùng là các thiết bị mobile. Một điểm hay của Desktop first là nếu chỉ có giao diện desktop thì chúng ta vẫn code bình thường, và lúc này nếu các bạn tự hỏi vậy làm giao diện tablet mobile kiểu gì ?

Lúc này buộc các bạn phải có thêm kiến thức về UI UX, để làm cái gì ? Để tự có thể tuỳ biến sao đó cho những giao diện ở desktop xuống giao diện tablet, mobile cho phù hợp và đẹp là ổn(UI/UX). Vì đôi khi các bạn đi làm khách hàng chỉ cung cấp cho bạn 1 giao diện Desktop mà thôi và họ yêu cầu mobile các bạn phải tự căn chỉnh sao cho hợp lý. Vì thế tuỳ vào trường hợp ví dụ như trường hợp này thì lựa chọn Desktop first sẽ tốt hơn là Mobile first.

Nếu chỉ có 1 giao diện desktop mà yêu cầu code Mobile first thì khá là khó vì bạn phải tưởng tượng code giao diện điện thoại như nào cái đã để khi nó lên thiết bị lớn hơn thì giống với thiết kế hiện có là desktop. Theo quan điểm mình là thế, nếu bạn có ý tưởng nào hay hơn thì có thể bình luận nhé.

Như vậy là chúng ta đã đi qua khái niệm và vấn đề gặp phải, giờ mình sẽ nói đến best practice nhé, nghĩa là những ví dụ, trường hợp khi đi làm thực tế để áp dụng cho tốt nhen

Responsive menu

Đây là 1 ví dụ điển hình luôn, khi làm giao diện menu ở trên Desktop thì đơn giản là các bạn dàn hàng ngang thôi với cấu trúc ul li a nhỉ. Nhưng khi code xuống điện thoại thì thường chúng ta sẽ làm fixed menu rồi kết hợp với Javascript để nhấn vào nút toggle cho menu chạy ra chạy vào thì lúc này các bạn sẽ thấy 2 phong cách code của Mobile first và Desktop first sẽ như sau:

DÀNH CHO BẠN:

Mình có khoá học HTML CSS từ cơ bản tới nâng cao cho người mới, nếu bạn quan tâm thì bạn có thể học thử miễn phí bằng việc nhấn vào đây nha.

Mobile first

.nav {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow-y: auto;
padding-top: 2rem;
}

.nav__toggle {
position: absolute;
right: 1rem;
top: 1rem;
}

.nav__item {
padding: 1rem;
display: block;
}

.nav__item:not(:last-child) {
border-bottom: 1px solid #fff;
}

/* Desktop styles */
@media (min-width: 1024px) {
.nav {

position: initial;
width: initial;
height: initial;
overflow-y: initial;
display: flex;
align-items: center;
padding-top: 0;
background-color: blue;
}

.nav__toggle {
display: none;
}

.nav__item:hover {
color: blue;
background-color: initial;
}

.nav__item:not(:last-child) {
border-bottom: 0;
border-left: 1px solid #fff;
}

}

Lúc này các bạn sẽ thấy là khi code ở màn hình >= 1024 thì các bạn phải đè code rất là nhiều luôn. Chưa kể nhiều vấn đề khác như là ở màn hình 1024 mình muốn bỏ border-bottom của class nav__item thì code lại không chạy được là vì đoạn :not(:last-child) ban đầu nó có độ ưu tiên cao hơn

.nav__item:not(:last-child) {
border-bottom: 1px solid #fff;
}
@media (min-width: 1024px) {
.nav__item{
border-bottom: 0; // not working
}
}

Lúc này các bạn muốn nó hoạt động thì phải code làm sao để có độ ưu tiên cao hơn là được như dưới đây, mình đơn giản chỉ là copy đoạn code ban đầu và thiết lập CSS lại thôi là ổn.

.nav__item:not(:last-child) {
border-bottom: 0;
}

Đó chính là Mobile first, vậy còn Desktop first thì code trông như nào nhỉ ? Cùng xem dưới đây nha

Desktop first

.nav {

display: flex;
align-items: center;
background-color: blue;
}

.nav__toggle {
position: absolute;
right: 1rem;
top: 1rem;
}

.nav__item {
padding: 1rem;
display: block;
}

.nav__item:hover {
color: blue;
background-color: initial;
}

.nav__item:not(:last-child) {
border-bottom: 0;
border-left: 1px solid #fff;
}

@media (max-width: 1023px) {
.nav {
display: block;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow-y: auto;
padding-top: 2rem;
}

.nav__toggle {
display: block;
}

.nav__item:not(:last-child) {
border-bottom: 1px solid #fff;
}

}

Các bạn có thấy điều gì khác không ? Đó chính là các bạn đỡ hạn chế đè code hơn so với việc dùng Mobile first lúc nãy đó, và code trông nó có vẻ ngắn hơn và thoáng hơn. Tuy nhiên đây vẫn chưa là cách tốt nhất. Theo quan điểm của mình để hạn chế việc đè code lên nhau mình sẽ kết hợp cả 2 luôn. Khám phá tiếp theo dưới đây nha

Mix desktop first and mobile first

// base styles
.nav{}
.nav__toggle {
position: absolute;
right: 1rem;
top: 1rem;
}
.nav__item {
padding: 1rem;
display: block;
}
// desktop styles
@media screen and (min-width: 1024px){
.nav {
display: flex;
align-items: center;
background-color: blue;
}
.nav__item:hover {
color: blue;
background-color: initial;
}
.nav__toggle {
display: none;
}

.nav__item:not(:last-child) {
border-bottom: 0;
border-left: 1px solid #fff;
}
}
// mobile styles
@media screen and (max-width: 1023px){
.nav {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow-y: auto;
padding-top: 2rem;
}
.nav__item:not(:last-child) {
border-bottom: 1px solid #fff;
}

}

Khi mà mình kết hợp cả 2 luôn thì các bạn sẽ thấy không còn xung đột nữa và không cần phải lo vấn đề đè code nữa nhen. Và mình có chia ra làm 3 phần theo trường hợp mình đang nói đến là base styles là những styles chung áp dụng cho toàn bộ giao diện, min-width là áp dụng cho kiểu Mobile first và max-width là cho kiểu Desktop first nhen.

Một lưu ý nhỏ nữa là các bạn không được code trùng số khi dùng media query nhé ví dụ dưới đây tại break-point 1024 nó sẽ xung đột cả 2 đoạn code này cho nên sẽ dẫn đến trường hợp sai mà các bạn không mong muốn cho nên hãy cẩn thận.

@media screen and (max-width: 1024px) { // sai

 .nav{
display: none;
}
}
@media screen and (min-width: 1024px) {
.nav{
display: block;
}

}

Theo mình cứ nhớ công thức là max-width = min-width – 1 vậy đúng sẽ là max-width: 1023px nhé các bạn.

@media screen and (max-width: 1023px) { // đúng

 .nav{
display: none;
}
}
@media screen and (min-width: 1024px) {
.nav{
display: block;
}

}

Tạm kết

Trên đây là những chia sẻ mới của mình về việc sử dụng Media query sao cho hiệu quả, để các bạn nắm rõ khi nào nên dùng Mobile first, khi nào nên dùng Desktop first hay là dùng cả 2. Từ đó đúc kết được nhiều kinh nghiệm khi code hơn, tối ưu hơn, dễ dàng sửa hơn và tránh xung đột code nhất có thể nhen. Cám ơn bạn đã đọc và chúc các bạn 1 ngày tốt lành.

Bài viết có tham khảo các đoạn code từ blog Ishadeed

Bài viết gốc được đăng tải tại evondev.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

JDBC – người tiền sử trong kỷ Java

jdbc
JDBC – người tiền sử trong kỷ Java

Bài viết được sự cho phép của tác giả Kiên Nguyễn

1. JDBC – người nguyên thủy.

Trước tiên, nhắc tới JDBC (Java Database Connectivity), ai trong số các bạn cũng liên tưởng về một API xưa cổ dùng để connect tới database và query dữ liệu.

Nói nó xưa cổ là vì JDBC là công cụ thô sơ nhất, mộc mạc nhất dùng để kết nối tới cơ sở dữ liệu. Cái chân chất mộc mạc này tuy chán, nhưng lại là kiến thức nền tảng quan trọng cần phải nắm thật vững.

  Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC
  Hibernate là gì? Sao phải dùng nó thay JDBC?

Xem thêm các việc làm Java lương cao trên TopDev

Hiểu thật rõ về bản chất của JDBC có thể giúp ta vững vàng tìm hiểu thêm các frameworks mới và mạnh mẽ như Hibernate, JPA. Tất cả chúng, tựu chung đều sử dụng JDBC để thực hiện kết nối và lấy dữ liệu.

Java-JDBC-la-gi

Hình : Vị trí của JDBC trong application

Bài viết này mình sẽ chú trọng tới bản chất và mô hình của JDBC. Mong rằng bài viết này sẽ giúp đỡ các bạn nhiều!.


2. JDBC – cái nhìn tổng quan qua ví dụ hàng hóa.

Để hiểu JDBC, chúng ta cùng xem xét ví dụ thường gặp trong đời sống là lấy hàng từ kho. Một khách hàng muốn thực hiện lấy hàng từ một trong số các kho (Oracle, MySql, Sql Server, …), các bước tiến hành của anh ta như sau:

  1. Khởi tạo connection (liên lạc viên): trước tiên, khi muốn lấy hàng từ bất cứ kho hàng nào, điều đầu tiên luôn cần phải làm là thực hiện kết nối (getConnection) tới kho hàng. Việc làm này thường thông qua một người điều phối (DriverManager).
  2. Tạo đối tượng Statement (người liên lạc): sau khi đã có được kết nối tới kho hàng (database), kho hàng sẽ cần biết những thứ nào bạn cần lấy, lúc này người liên lạc sẽ làm nhiệm vụ, anh ta sẽ cầm một tờ giấy với tất cả những món hàng cần lấy, mang tới và giao cho kho hàng.
  3. Thực hiện lấy hàng (Pass a SQL statement): với danh sách món hàng lấy được từ người liên lạc (statement), kho hàng (database) sẽ thực hiện lấy hàng từ kho.
  4. Gửi hàng lên xe (Result Set): các món hàng được lấy từ kho sẽ được mang lên xe để trả về cho khác hàng yêu cầu.

Sau khi đã có cái nhìn khách quan về JDBC, phần 3 sẽ tìm hiểu sâu từng công đoạn mà JDBC thực hiện.

Java-JDBC-la-gi

Hình : Luồng thực hiện trong JDBC

3. JDBC – ruột gan có gì?.

1. JDBC Driver Manager (người điều phối).

Vì có rất nhiều kho hàng (database) tồn tồn tại độc lập khác nhau, nên DriverManager sẽ quản lý cách thức kết nối tới các kho hàng. Cụ thể, khi muốn sử dụng driver, ta cần đăng kí trước khi sử dụng.

Có 2 cách đăng kí driver thông qua DriverManager.

  • Thứ nhất: sử dụng class.forName() : phương thứ này chỉ đơn giản là load class với tên được đăng kí sẵn.
  • Thứ hai: sử dụng DriverManager.registerDriver() : phương thức này sẽ thực hiện đăng kí driver, nhưng có một bất cập nhỏ là driver có thể sẽ bị đăng kí tới 2 lần.

~~Hỏi vui: ~~

  1. Phương thức ExecuteUpdate nên là:
    • A. public int executeUpdate(String sql) throws SQLException;
    • B. public ResultSet executeUpdate(String sql) throws SQLException;
    • C. public boolean executeUpdate(String sql) throws SQLException;
2. Statement (người liên lạc).

Có 3 loại statement là statementpreparedStatement, và CallableStatement

  • Statement (liên lạc chỉ để lấy hàng, không có thêm điều kiện): sử dụng cho các câu SQL query không kèm tham số.
  • PreparedStatement (liên lạc lấy một mặt hàng nhất định): sử dụng tốt cho các câu SQL lặp lại nhiều lần, chấp nhận tham số truyền vào.
  • CallableStatement (liên lạc để thay đổi một số mặt hàng trong kho): thướng sử dụng với storeProcedure, chấp nhận tham số truyền vào.

~~Hỏi vui: ~~

  1. Có thể thực hiện SELECT banh,keo FROM ?, với ? truyền vào là tiemtaphoa được không?
    • A. Có
    • B. Không
  2. Có thể thực hiện statement.execute(“SELECT pornStarName FROM pornTable WHERE boobSize=1; SELECT pornStarCountry FROM user WHERE braSize=2”);
    • A. Có
    • B. Không
3. ExecuteStatement method (kẻ thực thi).

Có 3 loại execute là execute()executeQuery()executeUpdate()

  • Execute (làm việc đa năng): phương thức này sử dụng khi ta không rõ kiểu của statement.
  • ExecuteQuery (chỉ lấy hàng trong kho): sử dụng chủ yếu cho các câu query select.
  • ExecuteUpdate (chỉ thêm hàng, hủy hàng, cập nhật hàng): phương thức này sử dụng cho các câu insert, update, delete, chỉ trả về giá trị row count hoặc 0 cho các câu SQL không trả về kết quả gì.

Java-JDBC-la-gi

Hình : Mô tả phương thức query dữ liệu của 3 loại Execute Statement

~~Hỏi vui: ~~

  1. Phương thức ExecuteUpdate nên là:
    • A. public int executeUpdate(String sql) throws SQLException;
    • B. public ResultSet executeUpdate(String sql) throws SQLException;
    • C. public boolean executeUpdate(String sql) throws SQLException;

4. JDBC – bằng cách nào?.

1. ResultSet đã lấy dữ liệu từ SQL query bằng cách nào?.

Câu trả lời là ResultSet thực hiện lấy dữ liệu từ SQL Query bằng con trỏ, phương thức chính của ResultSet là next() Khi khởi tạo một đối tượng ResultSet, con trỏ sẽ trỏ tới record đầu tiên, sau khi đã xử lý dữ liệu (bao gồm columnName, objectValue) thì sẽ thực hiện di chuyển tới record tiếp theo.

Thật ra không quá khó hiểu rằng tại sao lại sử dụng con trỏ đối với ResultSet, câu trả lời là con trỏ cực kì linh động (giống như số record vậy), chúng ta không biết trước có bao nhiêu record được lấy ra). Việc xử lý dữ liệu đối với từng record mà con trỏ trỏ vào cũng tương đối đơn giản, vì vậy con trỏ được sử dụng cho ResultSet để đọc từng dòng dữ liệu từ SQL Query

Java-JDBC-la-gi

Hình : Mô phỏng cách thức di chuyển tới record tiếp theo bằng phương thức next()

~~Hỏi vui: ~~

  1. Cùng thực hiện method **record.getColumnName() **ở hai cơ sở dữ liệu Postgres và Oracle thì sự khác nhau sẽ là:
    • A. Postgres viết thường, Oracle viết hoa.
    • B. Postgres viết hoa, Oracle viết thường.
    • C. Không có gì khác biệt

2. Có thể vừa di chuyển con trỏ vừa thực hiện update dữ liệu không?. Nếu có thì bằng cách nào?.

Câu hỏi này đặt ra cho nhiều thanh niên làm biếng, và mình cũng thế!. Tại sao không vừa lấy dữ liệu vừa cần thì update tại chỗ luôn cho tiện, khỏi cần add vào Map hay List gì đó, rồi lại phải lấy ra mất thời gian, công sức lấy ra để update.

Vâng, tuyệt vời thay, JDBC có hỗ trợ cho ResultSet thực hiện update tại chỗ. Để thực hiện được, ngay từ lúc khởi tạo statement, ta set thêm thuộc tính ResultSet.CONCUR_UPDATEABLE, vậy là vừa có thể thực hiện di chuyển con trỏ, vừa thực hiện update, thật là tiện phải không nào?.

Java-JDBC-la-gi

Hình : Thực hiện update giá trị PRICE sau khi con trỏ đã di chuyển về record đầu tiên.

~~Hỏi vui: ~~

  1. Mặc định con trỏ sẽ di chuyển từ trên xuống dưới, để đảo ngược kết quả từ ResultSet thì kiểu di chuyển cho con trỏ nên là:
    • A. TYPE_SCROLL_INSENSITIVE.
    • B. TYPE_FORWARD_ONLY.

5. Kết Luận.

Bài viết này mình viết về JDBC, tuy rằng là công nghệ cũ, nhưng mình nghĩ nó là bản chất, rất nhiều framework cũng phát triển lên từ nó, nên hiểu thật rõ bản chất và cách thức hoạt động sẽ hữu ích về lâu về dài.

Nếu đã tự tin về kiến thức SQL của mình thì có thể thử sức với một số câu hỏi SQL Test Upwork.

6. Tham khảo thêm.

Again, thanks for reading, love u so much! 😍😍

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Hướng dẫn cách vô hiệu hóa Task Manager trên Windows

task manager
Hướng dẫn cách vô hiệu hóa Task Manager trên Windows

Bài viết được sự cho phép của blogchiasekienthuc.com

// Áp dụng cho Windows 7, 8, 10 ,11….

Vâng, đã là một người dùng hệ điều hành Windows thì chắc chắn bạn phải biết hoặc ít nhất cũng đã từng nghe qua về công cụ Task Manager rồi đúng không.

Đây là một công cụ vô cùng mạnh mẽ và hữu ích trong việc quản lý cũng như kiểm soát máy tính.

  10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows
  6 cách mở Services Management Console trên Windows 10

Nó cho phép bạn theo dõi mức hoạt động của các linh kiện phần cứng quan trọng, hay các tiến trình đang chạy trên Windows, hoặc các phần mềm gây ảnh hưởng xấu tới thời gian khởi động hệ điều hành, và rất nhiều thứ…

Hơn nữa, kể từ phiên bản Windows 10 20H1 build 18963 thì Task Manager còn có khả năng theo dõi nhiệt độ của card đồ họa rời, chức năng mà trước đây chúng ta phải sử dụng các phần mềm chuyên dụng như MSI Afterburner.

vo-hieu-hoa-task-manager-tren-windows-10 (1)

Chính vì nó mạnh mẽ như vậy nên đối với các máy tính công cộng, hay những máy tính ở ngoài quán NÉT bạn sẽ thấy họ thường phải tắt, hoặc ngăn không cho người dùng sử dụng Task Manager.

Và nếu bạn cũng đang tìm cách để vô hiệu hóa Task Manager trên Windows 10 thì bài viết này là dành cho bạn. Bởi trong bài viết dưới đây mình xin chia sẻ cho các bạn 2 cách để tắt hoàn toàn Task Manaager trên Windows 10 một cách đơn giản nhất !

I. Cách vô hiệu hóa Task Manager trên Windows

Bài hướng dẫn này mình thực hiện trên Windows 10 nha các bạn !

Microsoft đã cung cấp cho người dùng chúng ta 2 cách để có thể vô hiệu hóa hoàn toàn Task Manager trên Windows 10, đó là: Sử dụng Local Group Policy Editor hoặc Registry Editor.

Với những ai dùng Windows 10 bản Pro, Edu, Enter… thì cứ dùng Local Group Policy với giao diện đồ họa cho tiện và tiết kiệm thời gian.

Còn nếu máy tính của bạn chạy Windows 10 Home, bạn buộc phải sử dụng Registry Editor hoặc là phải kích hoạt Local Group Policy trên Windows 10 Home thôi.

Cách #1: Vô hiệu hóa Task Manager bằng Local Group Policy Editor

Local Group Policy là công cụ rất mạnh mẽ được sử dụng để thiết lập nhiều thành phần của hệ thống Windows. Hầu hết các thiết lập trong Local Group Policy đều yêu cầu phải có quyền Administrator thì mới thay đổi được.

Nếu bạn là quản trị viên của một hệ thống máy tính của công công ty hoặc có nhiều tài khoản trên máy tính của mình và đang sử dụng các phiên bản như Windows 10 Pro, Enterprise hoặc Edu thì bạn có thể tận dụng lợi thế của Local Group Policy để kiểm soát việc sử dụng máy tính của những người dùng khác.

+ Bước 1: Cách nhanh nhất để truy cập Local Group Policy Editor trên Windows 10 đó là mở hộp thoại Run (Windows + R) => nhập vào lệnh gpedit.msc => rồi bấm phím Enter.

vo-hieu-hoa-task-manager-tren-windows-10 (2)

+ Bước 2: Tiếp theo, bạn truy cập theo đường dẫn bên dưới:

User Configuration \ Administrative Templates \ System \ Ctrl + Alt + Del Options

=> Tìm ở danh sách kết quả Policy (ở cột bên phải) có tên Remove Task Manager, thật ra là chẳng phải tìm vì nhìn cái là thấy ngay nó rồi 🙂

Bây giờ bạn hãy click chuột phải vào nó => rồi chọn Edit để thiết lập lại.

vo-hieu-hoa-task-manager-tren-windows-10 (3)

+ Bước 3: Mặc định đang ở trạng thái Not Configured => giờ bạn chỉ việc chuyển sang trạng thái Enabled => rồi bấm OK là xong. Không cần phải khởi động lại máy, policy này sẽ có tác dụng ngay lập tức.

vo-hieu-hoa-task-manager-tren-windows-10 (4)

+ Bước 4: Kiểm tra kết quả !

Từ giờ trở đi, mọi cách để truy cập Task Manager trên Windows 10 mà mình biết đều vô dụng, bao gồm tất cả những cách đã từng được giới thiệu trên blog:

  • Tổ hợp phím Ctrl + Shift + ESC
  • Tổ hợp phím Ctrl + Alt + Del
  • Menu chuột phải của thanh Taskbar
  • Công cụ tìm kiếm của Windows
  • Lệnh taskmgr trong Windows Run, Command Prompt..

=> Mình đã thử hết các cách bên trên, đều vô dụng cả 😀

Khi truy cập bằng các cách trên, bạn sẽ đều nhận được thông báo đại loại như: Task Manager đã bị vô hiệu hóa bởi quản trị viên – Task Manager has been disabled by your Administrator và đều không thể mở được Task Manager dù bạn có là Administrator của hệ thống đi nữa.

vo-hieu-hoa-task-manager-tren-windows-10 (5)

Trường hợp bạn cần sử dụng lại Task Manager thì chỉ việc chuyển trạng thái của policy Remove Task Manager từ Enabled về Not configured hoặc Disabled rồi lưu lại là xong.

Cách #2: Vô hiệu hóa Task Manager bằng Registry Editor

Cách này dành cho bạn nào thích vọc vạch, hoặc những ai đang sử dụng Windows 10 Home. mà chưa thực hiện kích hoạt Local Group Policy.

Không những phức tạp hơn so với cách bên trên, mà việc chỉnh sửa Registry còn ẩn chứa rất nhiều rủi ro (nếu bạn làm sai), vậy nên trước khi thực hiện bạn hãy nhớ backup toàn bộ của Registry hệ thống trước nhé !

+ Bước 1: Bạn mở hộp thoại Run bằng tổ hợp phím Windows + R => nhập vào lệnh regedit => rồi bấm phím Enter để truy cập Registry Editor nhanh nhất trên Windows 10.

vo-hieu-hoa-task-manager-tren-windows-10 (6)

+ Bước 2: Bạn truy cập vào khóa System trong Registry bằng đường dẫn bên dưới:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

NOTE: Bạn có thể truy cập một cách nhanh chóng bằng cách dán trực tiếp đường dẫn trên vào thanh địa chỉ rồi bấm Enter là xong.

Đọc thêm: Thủ thuật mở nhanh một đường dẫn bất kỳ trong Registry – 1 Click

Nếu không có khóa System thì bạn cũng đừng lo, chúng ta chỉ cần tạo một khóa với tên tương tự trong khóa Policies là được (nhấn chuột phải vào Policies => chọn New => Key).

=> Sau đó, bạn click chuột phải vào vùng trống bất kỳ (cột bên phải) => và chọn New => chọn DWORD (32-bit) Value để tạo một giá trị mới và đặt tên cho nó là DisableTaskMgr.

Nếu không kịp đặt tên hoặc đặt sai thì bạn có thể click chuột phải lên giá trị vừa tạo => rồi chọn Rename để sửa lại. Lưu ý là cho dù bạn dùng Windows 10 phiên bản 64-bit hay 32-bit thì cũng đều phải tạo giá trị là DWORD (32-bit) Value nhé !

vo-hieu-hoa-task-manager-tren-windows-10 (7)

+ Bước 3: Bạn hãy chỉnh sửa thông số trong ô Value data từ 0 thành 1 để vô hiệu hóa Task Manager trên Windows 10 => rồi bấm OK là xong.

vo-hieu-hoa-task-manager-tren-windows-10 (8)

Giá trị DisableTaskMgr này sẽ có hiệu lực tương tự như policy Remove Task Manager trong Local Group Policy Editor.

Cuối cùng, bạn hãy khởi động lại máy tính để áp dụng thay đổi nhé !

Trong trường hợp muốn kích hoạt lại Task Manager thì bạn chỉ việc vào lại đây => rồi sửa từ giá trị 1 về 0 hoặc bạn cũng có thể xóa hẳn giá trị này đi.

//*đọc thêm*//

Và tất nhiên rồi, mình vẫn luôn chuẩn bị sẵn cho anh em một file *.reg để có thể kích hoạt tính năng vô hiệu hóa Task Manager trên Windows 10 mà không cần phải tự chỉnh sửa trong Registry như ở trên nữa.

Thực ra file REG này là quá trình tự động làm các việc thủ công bên trên, nếu bạn không muốn làm thủ công thì có thể dùng file mình tạo sẵn này. Bạn chọn một trong các đường dẫn bên dưới để tải những file *.reg này về nhé !

Link tải: Google Drive /  Link Box / Link Mega.nz / Link Mediafire

Và dù có chỉnh sửa thủ công hay sử dụng các file .reg tạo sẵn để chỉnh sửa Registry, bạn vẫn phải khởi động lại Windows 10 để các thay đổi này có tác dụng.

//*hết phần đọc thêm*//

II. Lời kết

Vâng, như vậy là mình đã vừa hướng dẫn xong cho các bạn cách để vô hiệu hóa Task Manager trên Windows 10 rồi nhé.

Bài hướng dẫn thì mình thực hiện trên Windows 10, tuy nhiên  bạn có thể áp dụng cho mọi phiên bản hệ điều hành Windows.

Hy vọng là thủ thuật mà mình giới thiệu trong bài viết này sẽ hữu ích với bạn. Chúc các bạn thành công !

CTV: Nguyễn Thanh Tùng – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Cách cài đặt .NET Framework 3.5 trên Windows thành công 100%

net framework
Cách cài đặt .NET Framework 3.5 trên Windows thành công 100%

Bài viết được sự cho phép của tác giả Nguyễn Viết Long

Trong bài viết này, mình sẽ hướng dẫn bạn cách cài đặt offline .NET Framework 3.5 thành công 100% trên tất cả các phiên bản windows.

.NET Framework của Microsoft là một nền tảng lập trình tập hợp các thư viện lập trình có thể được cài thêm hoặc đã có sẵn trong các hệ điều hành Windows. Tùy theo nhu cầu sử dụng mà máy tính của bạn buộc phải cài đặt chương trình .NET Framework. Tuy nhiên, với những máy từ Windows 8 trở lên, đặc biệt là Window 10 gặp vấn đề khi cài đặt bản .NET Framework 3.5.

Xem ngay việc làm .NET tại các doanh nghiệp hàng đầu trên TopDev

Tình hình hôm nay mình mới cài lại win 10, khi chạy một số ứng dụng nó yêu cầu .NET Framework 3.5 nhưng không thể cài đặt .NET Framework 3.5 trực tiếp bằng cách autoupdate được.

Kích hoạt .NET Framework 3.5 trong Windows Features

Bước 1: Đầu tiên, tại màn hình chính của Windows, A/C nhấn vào thanh Tìm kiếm và nhập từ khóa Control Panel.

Nhấn vào thanh Tìm kiếm bên dưới công cụ nhập từ khóa Control PanelNhấn vào thanh Tìm kiếm bên dưới công cụ nhập từ khóa Control Panel

Mở Control Panel lên.

Mở Control Panel lênBước 2: Tại giao diện tiếp theo, A/C nhấn chọn vào mục Programs.

Tại giao diện tiếp theo, bạn nhấn chọn vào mục ProgramsBước 3: Sau đó A/C nhấn chọn vào mục Programs and Features.

Sau đó bạn nhấn chọn vào mục Programs and FeaturesBước 4: Tại giao diện này, A/C nhấn chọn vào mục Turn Windows features on or off ở phía bên trái.

Nhấn chọn vào mục Turn Windows features on or off ở phía bên trái

Bước 5: Lúc này, bảng Windows Feature hiển thị ra, bạn nhấn chọn vào 2 mục .NET Framework 3.5 (includes .NET 2.0 and 3.0) và .NET Framework 4.8 Advanced Service.

nhấn tick vào 2 mục .NET Framework 3.5 (includes .NET 2.0 and 3.0 và .NET Framework 4.8 Advanced Service

Nhấn tick vào 2 mục .NET Framework 3.5 (includes .NET 2.0 and 3.0 và .NET Framework 4.8 Advanced Service

Sau đó bạn nhấn OK để lưu lại.

Nhấn OK để lưu lạiCài đặt .NET Framework 3.5 từ Microsoft

Bước 1: Truy cập vào .NET Framework 3.5 từ Microsoft, nhấn vào mục Download .NET Framework 3.5 SP1 Runtime.

Nhấn vào Download .NET Framework 3.5 SP1 RuntimeBước 2: Windows Features giờ đây sẽ tìm kiếm, tải xuống và cài đặt các file cần thiết cho .NET Framework 3.5 trực tuyến từ Windows Update. Sau đó file sẽ được lưu về máy

Sau đó file sẽ được chạy lưu về máy

  Dùng .NET Framework với IronPython

Cài đặt .NET Framework 3.5 trong Command Prompt

Bước 1: Mở Command Prompt với quyền Admin, sau đó nhấn chuột phải và chọn Run as administrator.

Mở quyềnBước 2: Sau đó cửa sổ Command Prompt hiển ra, A/C dán câu lệnh này Dism /online /Enable-Feature /FeatureName:”NetFx3″

Dán câu lệnh vào cửa sổ mới

Bài viết gốc được đăng tải tại forum.misa.vn

Xem thêm Việc làm IT hấp dẫn trên TopDev

Nom Parser và Parser Combinator

parser
Nom Parser và Parser Combinator

Bài viết được sự cho phép của tác giả Huy Trần

Parsing là kĩ thuật phân tích cú pháp để trích xuất thông tin và chuyển đổi một tập dữ liệu cho trước về một dạng dữ liệu có cấu trúc để dễ làm việc hơn.

Có rất nhiều kĩ thuật parsing khác nhau, trong bài này chúng ta nói về kĩ thuật Parser Combinator, chi tiết các bạn đọc trong Wikipedia.

  bodyParser() trong Express.js
  Clone một phần repo với sparse-checkout

Hiểu nôm na Parser Combinator là kĩ thuật kết hợp nhiều parser nhỏ lại với nhau theo một quy tắc nào đó để có thể parse một nội dung lớn hơn và phức tạp hơn. Quy tắc dùng để kết hợp các parser nhỏ được đưa ra dựa trên cú pháp của nội dung đầu vào. Việc chia thành nhiều parser nhỏ hơn như thế này cũng giúp chúng ta sử dụng lại code tốt hơn và dễ dàng thực hiện unit test hơn.

Nom là một thư viện cung cấp cho chúng ta rất nhiều công cụ để kết hợp và build parser sử dụng kĩ thuật Parser Combinator. Ưu điểm của Nom đó là nhanh và an toàn, nhờ vào khả năng hạn chế cấp phát bộ nhớ (từ thao tác copy string).

Khi sử dụng Nom, một parser sẽ là một hàm nhận vào một dữ liệu kiểu I, và trả về một dữ liệu kiểu nom::IResult<I, O, E> trong đó E là kiểu dữ liệu cho thông báo lỗi. Trong một số trường hợp, ta có thể bỏ qua kiểu E, và viết thành nom::IResult<I, O>. Nội dung trả về sẽ là một tuple có dạng (I, O), với I là nội dung còn thừa sau khi chạy parser, và O là kết quả sau khi trích xuất nội dung.

Ví dụ parser sau đây trích xuất các kí tự số trong một string slice, chuyển nó thành kiểu i32 rồi trả về phần còn thừa:

fn parse_number(input: &str) -> IResult<&str, i32> {
    map_res(digit1, |c: &str| c.parse::<i32>()).parse(input)
}

let (left_over, number) = parse_number("123abc")?;
// left_over = "abc"
// number = 123

Ở đây, hàm digit1 là một parser do Nom cung cấp, có chức năng match tất cả các kí tự số có trong chuỗi, hàm map_res(P, Fn) được dùng để truyền kết quả trả về từ parser P vào hàm Fn để lấy ra một giá trị mới. Ở đây ta truyền kết quả parse từ digit1 vào một closure để convert về kiểu i32.

Ta có thể sử dụng hàm parse_number để phát triển thành một parser mới phức tạp hơn, ví dụ viết một parser để phân tích một biểu thức dạng "A+B"”A-B””A*B” hoặc ”A/B”.

Trước khi viết code, chúng ta sẽ phân tích một tí, các biểu thức trên sẽ có dạng chung gồm 3 thành phần, như bảng sau:

Left Operator Right
10 + 3
9 5
2 * 3
6 / 2

Trong đó, left và right là các kí tự số, có thể parse bằng hàm parse_number đã viết ở trên. Còn operator sẽ là một trong 4 kí tự ”+””-””*” hoặc ”/”. Quy tắc kết hợp của biểu thức cần parse sẽ là:

left + (+ - * /) + right

Để cho đơn giản, ta có thể bỏ qua trường hợp có các khoảng trắng có trong biểu thức. Ta cần viết một hàm parse_expression trả về một tuple có dạng (i32, i32, &str) tương ứng với (left, right, operator).

fn parse_expression(input: &str) -> IResult<&str, (i32, &str, i32)> {
	tuple((
        parse_number,
        alt(( tag("+"), tag("-"), tag("*"), tag("/") )),
        parse_number
   )).parse(input)
}

Ở trong đoạn code trên, chúng ta sử dụng các parser mà Nom đã build sẵn, ví dụ:

  • tuple(): nhận vào một tuple gồm nhiều parser khác nhau, và trả về một tuple với các giá trị trả về theo thứ tự tương ứng.
  • alt(): nhận vào một tuple gồm nhiều parser khác nhau, và trả về một giá trị duy nhất ứng với một trong các parser đầu vào.
  • tag(): nhận vào một string slice và trả về giá trị ứng với nội dung input.

Chạy thử với biểu thức 10*6, việc parsing diễn ra theo thứ tự như sau:

  • Đầu tiên, parser tuple((...)) sẽ chạy, nhận vào input là "10*6", bắt đầu gọi từng parser bên trong nó.
  • Parser thứ nhất, là parse_number nhận vào input "10*6", và match được 2 ký tự "10", chuyển nó thành kiểu i32 là 10, trả về một tuple có dạng ("*6", 10), trong đó "*6" là phần input còn thừa, sẽ được truyền tiếp vào parser tiếp theo.
  • Tiếp theo, parser alt((...)) sẽ nhận vào input "*6" và chạy từng parser bên trong nó:
    • tag("+") sẽ fail, không match được gì cả
    • Tiếp theo, tag("-") cũng fail luôn
    • Đến tag("*") thì match được ký tự "*"
    • Thế là alt((...)) hoàn thành, trả về tuple có giá trị là ("6", "*") để chuẩn bị truyền vô parser tiếp theo.
  • Cuối cùng, parse_number thứ 2 sẽ nhận vào input "6" và match toàn bộ nó, chuyển thành kiểu i32 là 6, trả về tuple ("", 6).
  • Mọi parser bên trong đã hoàn thành, lúc này parser tuple((...))sẽ tổng hợp các kết quả đã match được và trả về một tuple có dạng ("", (10, "*", 6)). Trong đó, chuỗi rỗng "" là phần còn lại của input, còn tuple (10, "*", 6) chính là nội dung chúng ta đã match được.

Đến khúc này nhiều bạn sẽ hỏi là: làm sao để biết được có những parser nào mà xài, và lúc nào nên sử dụng parser có sẵn, lúc nào build mới? Câu trả lời là tham khảo trang List of parsers and combinators, cái nào có sẵn rồi thì mình xài thôi.

Phần lớn thời gian khi sử dụng Nom, chúng ta sẽ sử dụng các parser build sẵn này rất nhiều, có khi là dùng trực tiếp, nhưng thông thường là để kết hợp nhiều parser lại với nhau tạo thành parser mới.

Hôm nay viết đến đây thôi, ở bài sau chúng ta sẽ ứng dụng Nom để viết parser cho công cụ nhắc việc như Reminder.app của MacOS. Mong các bạn đón đọc.

Bài viết gốc được đăng tải tại thefullsnack.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Cấu hình IntelliJ cho lần đầu sử dụng

Cấu hình IntelliJ
Cấu hình IntelliJ cho lần đầu sử dụng

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Mình đã hướng dẫn các bạn cách cấu hình Eclipse cho lần đầu sử dụng, đối với các bạn muốn sử dụng IntelliJ làm IDE chính của mình thì cũng có thể tham khảo bài viết này để cấu hình những thứ cần thiết để có thể code Java tốt hơn các bạn nhé!

  Business Intelligence (BI) là gì? Trò chuyện cùng chuyên gia Trường Phan để hiểu hơn về vai trò của BI trong hệ thống
  Cách tạo sẵn mẫu comment trong INTELLIJ với Live Template

Cấu hình Formatter

Để cấu hình Formatter cho IntelliJ thì các bạn vào Preference, chọn Editor -> Code Style -> Java:

Mặc định thì IntelliJ cũng có formater của riêng nó dành cho Java. Nhưng best practice thì các bạn cũng có thể sử dụng formatter của Google dành cho IntelliJ.

Các bạn có thể download IntelliJ Java Google Style ở địa chỉ https://raw.githubusercontent.com/google/styleguide/gh-pages/intellij-java-google-style.xml về máy, sau đó thì trong cửa sổ trên, các bạn click vào nút cài đặt Schema, chọn Import Schema -> IntelliJ IDEA code style XML:

chọn đến tập tin mà các bạn vừa download để import IntelliJ Java Google Style vào.

Kết quả:

Nhấn OK rồi Appy nhé các bạn!

Eclipse thì mặc định enable hỗ trợ cặp // @formatter:off và // @formatter:on. IntelliJ thì các bạn cần enable nó bằng cách vào Preference, chọn Editor -> Code Style, chọn tab Formatter rồi click chọn Turn formatter on/off with marker in the code comments:

Cài đặt Save Action plugin

Save Action plugin của IntelliJ không có nhiều chức năng như chức năng Save Action của Eclipse nhưng nó cũng giúp chúng ta một số thao tác.

Các bạn hãy vào Preference chọn Plugin rồi search “save action”, sau đó thì install Save Action plugin này:

Sau khi restart IntelliJ IDE, thì các bạn có thể cấu hình Save Action như sau:

và:

Nhấn Apply để lưu cấu hình các bạn nhé!

Cài đặt SonarLint plugin

SonarLint plugin giúp chúng ta có thể thấy được các issue của code Java của mình ngay trong IntelliJ và có thể fix chúng ngay lập tức.

Các bạn cũng vào Preference chọn Plugin rồi search “sonar”, sau đó thì install SonarLint plugin này:

TOP 6 Công Ty Công Nghệ Với Các Giải Pháp Tăng Trưởng Doanh Thu Hàng Đầu Hiện Nay

tăng doanh thu
TOP 6 Công Ty Công Nghệ Với Các Giải Pháp Tăng Trưởng Doanh Thu Hàng Đầu Hiện Nay

Để cải thiện doanh thu, phát triển doanh nghiệp và tiếp cận được đúng đối tượng khách hàng tiềm năng, việc áp dụng công nghệ và trí tuệ nhân tạo trong điều hành công ty là điều tất yếu. Top 6 công ty dưới đây sẽ mang đến cho khách hàng nhiều lựa chọn ở nhiều lĩnh vực khác nhau để tìm ra giải pháp phù hợp nhất trong kinh doanh. Không chỉ tối ưu doanh thu mà còn tối ưu năng suất lao động cũng như giảm thiểu tối đa các quá trình dư thừa trong hoạt động.

1. Haravan     

Với mục tiêu lấy khách hàng làm trọng tâm, mang đến các giải pháp quản lý bán hàng đa kênh, Haravan Omnichannel được đánh giá là giải pháp công nghệ hiệu quả nhất cho các nhà bán lẻ tăng trưởng với mô hình kinh doanh bán hàng đa kênh online & offline. Khách hàng có thể đăng kí trải nghiệm dịch vụ trong 14 ngày hoàn toàn miễn phí trước khi quyết định sử dụng tại haravan.com

Các giải pháp do Haravan Omnichannel mang đến gồm việc xây dựng giải pháp truyền thông online cho thương hiệu thông qua nền tảng xây dựng website vượt trội, đến bán hàng trên Facebook, Instagram, Livestream và các sàn Thương mại điện tử phổ biến, đồng bộ với chuỗi cửa hàng offline. Tất cả chỉ trên cùng một hệ thống quản trị vượt trội từ Haravan.

2. TechX Corp

Với sự phát triển thần tốc của công nghệ, việc các doanh nghiệp ứng dụng và khai thác những lợi ích của công nghệ số, đặc biệt là công nghệ Cloud đã và đang trở thành xu hướng tất yếu của nền kinh tế Việt Nam. Tuy nhiên, đại dịch đã gây ra không ít khó khăn cho việc chuyển đổi số và phát triển của các doanh nghiệp. TechX Corp tự hào mang đến cho các doanh nghiệp gói hỗ trợ toàn diện Accel Migration – Cơ hội bứt phá chuyển đổi số cho doanh nghiệp

Nhiều ưu đãi hấp dẫn khi doanh nghiệp chuyển đổi hệ thống và ứng dụng lên nền tảng AWS Cloud cùng Accel Migration: 

  • 3 tháng sử dụng MIỄN PHÍ toàn bộ dịch vụ cloud trên nền tảng AWS
  • Ưu đãi giảm lên tới 80% chi phí tư vấn triển khai hệ thống
  • Miễn phí toàn bộ phí dịch vụ tư vấn xây dựng giải pháp Data Warehouse nếu doanh nghiệp có nhu cầu
  • Hỗ trợ tư vấn và Review Architecture theo chuẩn AWS Well-Architected Frameworks

3. Huawei Technologies Vietnam

Với hơn 23 năm hoạt động tại thị trường Việt Nam, Huawei tự hào được góp phần vào sự phát triển đầy bùng nổ của ngành viễn thông Việt Nam trong hai thập kỷ vừa qua. Huawei mang đến những sản phẩm tốt nhất, cam kết mang đến sự phục vụ và những giải pháp tối ưu nhất cho người Việt Nam nhờ vào đội ngũ nhân viên bản địa giàu năng lực. 

Bên cạnh hoạt động kinh doanh, Công ty Công nghệ Huawei còn tích cực tham gia vào các hoạt động xã hội thể hiện trách nhiệm công dân doanh nghiệp, tập trung hỗ trợ phát triển nguồn nhân lực, nhân tài ICT Việt Nam qua chương trình học bổng dành cho các học sinh, sinh viên ưu tú.

4. PMAX

PMAX là công ty tiên phong trong lĩnh vực Total Performance Marketing tại Việt Nam, được thành lập bởi những chuyên gia hàng đầu trong lĩnh vực Thương mại điện tử và Performance Marketing. Với định vị total performance marketing và giải pháp one-stop-shop, PMAX mong muốn mang lại sự tăng trưởng về doanh thu, gia tăng tiện lợi và tạo ra giá trị kinh tế bền vững cho doanh nghiệp.

Các mảng dịch vụ mà PMAX cung cấp bao gồm 6 mảng chính: Truyền thông (media), sáng tạo (creative), chiến lược (strategy), công nghệ (tech), dữ liệu (data), và nền tảng (landing page/website/app production). Và 3 mảng dành riêng cho ngành Thương mại điện tử: Thương mại (commercial), Quản lý chiến dịch bán hàng (ecommerce sale campaign management), và Tối ưu hoạt động trưng bày trên trang bán hàng (merchandising enhancement).

Các gói giải pháp điển hình của PMAX gồm:

  • Giải pháp tăng trưởng toàn diện cho thương mại điện tử (Ecommerce)
  • Giải pháp tối ưu nhận diện thương hiệu (Branding)
  • Giải pháp thu thập danh sách khách hàng tiềm năng (Lead generation)
  • Giải pháp thu thập và tối ưu vòng đời người dùng trên ứng dụng di động (App)

Sở hữu đội ngũ nhân sự chất lượng cao (trên 100 người) và hệ thống công nghệ/dữ liệu tiên tiến, PMAX đã và đang thành công mang tới tăng trưởng doanh thu cho các công ty và tập đoàn như: Vingroup, Tiki, Lazada, Shopee, Watsons, Uniqlo, FE Credit, Standard Chartered, Ngọc Dung, Estee Lauder, LG Vina,…

5. AppsFlyer

AppsFlyer là công ty hàng đầu toàn cầu về đo lường tiếp thị, phân tích và đánh giá tương tác khách hàng. Rất nhiều các thương hiệu lớn trên thế giới đã và đang sử dụng AppsFlyer Cloud để xây dựng các sản phẩm tốt nhất, tạo ra trải nghiệm đặc biệt và bảo vệ quyền riêng tư của khách hàng.

Với phương pháp làm việc lấy khách hàng làm trung tâm, đến nay AppsFlyer đã giúp hơn 12.000 thương hiệu và hơn 8.000 đối tác công nghệ đưa ra những giải pháp kinh doanh tốt hơn qua thời gian. Nền tảng do AppsFlyer xây dựng dựa trên 4 nguyên tắc chính: 

  • Lấy quyền riêng tư làm trọng tâm hàng đầu cho phát triển.
  • Cung cấp những thông tin đáng tin cậy.
  • Xây dựng phương pháp tiếp cận xoay quanh lợi ích của khách hàng. 
  • Sáng tạo những công nghệ phù hợp để đổi mới.

6. VNG Cloud

vCloudcam là một sản phẩm của VNG Cloud, cung cấp dịch vụ giám sát và lưu trữ trực tuyến dữ liệu từ camera trên nền tảng công nghệ điện toán đám mây, hỗ trợ sử dụng dịch vụ đa nền tảng (Web, Mobile App, Desktop).

vCloudcam cung cấp những dịch vụ phù hợp cho mọi đối tượng khách hàng như trường học, ngân hàng, nhà máy, chuỗi cửa hàng,… với những lợi ích như sau:

  • Kết nối, quản lý tập trung nhiều camera từ nhiều vị trí và truy cập mọi lúc, mọi nơi
  • Hệ thống thông báo đa kênh, đúng người, đúng thời điểm
  • An toàn và bảo mật dữ liệu
  • Các tính năng AI từ Cloud – Giúp camera của bạn trở nên thông minh hơn
  • Tiết kiệm chi phí thiết lập, lưu trữ và bảo trì hệ thống.
  • Tương thích với hầu hết thiết bị có sẵn trên thị trường
  • Linh hoạt, dễ dàng thiết lập và sử dụng dịch vụ

Các doanh nghiệp sử dụng vCloudcam sẽ giúp: 

  • Tiết kiệm chi phí quản lý
  • Tối ưu hóa nguồn vốn đầu tư các thiết bị giám sát, lưu trữ dữ liệu giám sát thời hạn trả lời kịp thời đáp ứng yêu cầu về nhà dữ liệu bảo mật  nước
  • Bảo đảm an toàn bằng an ninh chủ động, nâng cao chất lượng quản lý, chất lượng dịch vụ, nâng cao trải nghiệm hàng.

Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Đột Phá Với Các Giải Pháp Công Nghệ Tiên Tiến Cùng 4 Công Ty Hàng Đầu Thị Trường

công nghệ hàng đầu
Đột Phá Với Các Giải Pháp Công Nghệ Tiên Tiến Cùng 4 Công Ty Hàng Đầu Thị Trường

Cùng TopDev điểm qua một số công ty đang được đánh giá là đơn vị tiên phong trong việc ứng dụng và cung cấp các giải pháp công nghệ hiện đại nhất thời điểm hiện tại. Việc áp dụng chính xác và kịp thời các công nghệ phù hợp sẽ mang đến cơ hội rộng mở hơn trong việc gia tăng người dùng và cải thiện doanh thu cho công ty, tổ chức.

1. EY Vietnam      

EY Vietnam là đơn vị hàng đầu Việt Nam hiện nay trong việc mang đến các giải pháp về bảo mật và quản trị rủi ro, cũng như đánh giá tính hiệu quả của các chương trình an ninh mạng và khả năng phục hồi trong bối cảnh thúc đẩy tăng trưởng kinh doanh và các chiến lược hành động. 

Các dịch vụ của EY Vietnam được áp dụng một cách nhất quán bất kể ở đâu (Công nghệ thông tin, Internet of things, Công nghệ vận hành, Điện toán đám mây,…), với một thước đo rõ ràng về rủi ro, nắm bắt kịp thời các vấn đề mà công ty đang gặp phải và chứng minh các rủi ro về an ninh mạng sẽ được quản lý như thế nào trong tương lai. Cụ thể, EY Vietnam giúp:

  • Cung cấp bức tranh tổng thể về tình hình hiện trạng và khả năng xảy ra của những rủi ro an ninh mạng hiện tại mà tổ chức có thể đang gặp phải.
  • Hỗ trợ triển khai thực hiện chiến lược và chương trình an ninh mạng một cách tổng thể đồng nhất.
  • Hỗ trợ xây dựng văn hóa nhận thức rủi ro hơn thông qua các khóa học đào tạo, giáo dục và nâng cao nhận thức.

  • Hỗ trợ vận hành chương trình phục hồi nhanh chóng và hiệu quả khi đối mặt với các mối đe dọa không gian mạng ngày càng nhiều.
  • Bảo vệ dữ liệu và quyền riêng tư.
  • Dịch vụ bảo vệ dữ liệu và quyền riêng tư của EY giúp các Tổ chức luôn nhận được những cập nhật mới nhất về bảo mật dữ liệu và quyền riêng tư của dữ liệu, cũng như tuân thủ quy định trong môi trường mà các mối đe dọa không ngừng phát triển cũng và các yêu cầu trong bối cảnh pháp lý.
  • Nhận dạng định danh kỹ thuật số.
  • Các hoạt động thực tiễn trong Nhận dạng định danh kỹ thuật số của EY hướng dẫn các Tổ chức tạo ra danh tính thống nhất, người dùng được cá nhân hóa, mà vẫn đảm bảo được tính bảo mật thông minh và kiểm soát quyền riêng tư một cách an toàn hiệu quả và tối ưu.
  • Dịch vụ quản lý rủi ro của bên thứ ba.

2. KAT MEDIA

KAT MEDIA là công ty sản xuất nội dung đa phương tiện, cung cấp dịch vụ sản xuất truyền thông, video cho các doanh nghiệp, tổ chức và cá nhân. KAT MEDIA cũng là đơn vị sản xuất, quản lý và vận hành kênh YouTube The Quoc Khanh Show và tạp chí trực tuyến VietSuccess.vn, với các chủ đề về kinh tế, tài chính, đầu tư, khởi nghiệp, quản trị kinh doanh và phát triển bản thân.

Với mục tiêu trở thành công ty truyền thông, sản xuất nội dung hàng đầu tập trung vào chủ đề về thành công cho các tổ chức và cá nhân tại Việt Nam, KAT MEDIA đang từng bước nỗ lực và phát triển với nhiệm vụ tạo ra những nội dung nguyên bản, hữu ích và chất lượng, giúp người Việt Nam đạt được thành công bền vững trong sự nghiệp và hướng đến một cuộc sống cân bằng.

3. TOSS

TOSS – công ty được mệnh danh là Kỳ lân Fintech của Hàn Quốc. Năm 2020, Toss chính thức đặt chân đến Việt Nam với mục tiêu “đổi mới” thị trường tài chính và đem lại những giá trị cao, mang tính đột phá và toàn diện về giải pháp tài chính cá nhân cho khách hàng. Khởi đầu với dịch vụ ưu đãi đi bộ nhận thưởng, đến nay Toss đã và đang cung cấp thêm các dịch vụ đa dạng như đi xe máy nhận thưởng, mua hàng hoàn tiền, cũng như các dịch vụ tài chính liên quan đến vay, thanh toán và tín dụng,… 

Một số thành tựu đáng tự hào ban đầu của Toss Việt Nam có thể kể đến như:

  • Từng là Top 1 ứng dụng trên Playstore, hiện vẫn ổn định đứng đầu bảng xếp hạng ứng dụng Tài chính (Finance)
  • MAU vượt mức 3 triệu, khoảng 500.000 người dùng mới mỗi tháng
  • Sở hữu môi trường làm việc trẻ trung, năng động và nhiều cơ hội phát triển bản thân với chế độ lương thưởng đầy hấp dẫn.

4. Oraichain

Oraichain Data Hub là một nền tảng phi tập trung, chuyên cung cấp giải pháp cho tất cả các vấn đề về dữ liệu bao gồm thu thập, lưu trữ hoặc chia sẻ, khai thác và phân tích,  hoặc tạo yêu cầu về các bộ dữ liệu chất lượng cao. Data Hub phát huy tiềm năng của trí tuệ và nguồn dữ liệu thu thập của đám đông (crowdsourcing), trang bị cho họ những công cụ tài chính phi tập trung dựa vào công nghệ chuỗi khối để kiếm lợi nhuận và thậm chí những đặc quyền trọn đời gắn với những thông tin họ cung cấp.

Oraichain Data Hub cung cấp nhiều tính năng như: 

  • Chợ: Mua bán quyền truy cập vào các bộ dữ liệu.
  • Lưu trữ đám mây: cho phép chia sẻ dữ liệu trên toàn cầu, lưu trữ và truy cập dữ liệu trên nền tảng đám mây, hỗ trợ truy cập để huấn luyện các mô hình AI.
  • Phân tích dữ liệu: Một môi trường phi tập trung để khai thác, phân tích và đào tạo các thuật toán học máy và AI. 
  • Yêu cầu bộ dữ liệu: tạo các yêu cầu về dữ liệu như dữ liệu phản hồi của người dùng hoặc dữ liệu cần gán nhãn, nâng cao khả năng phân tích.
  • Gán nhãn: Gán nhãn cho các yêu cầu dữ liệu từ những dữ liệu đơn giản cho tới cần kiến thức chuyên gia. Đây là một dịch vụ dựa trên trí tuệ đám đông, 24/7 và có bảo vệ các đặc quyền gắn với dữ liệu được gán nhãn.

Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Java Enum là gì? Tại sao nên sử dụng enum?

java enum
Java Enum là gì?. Tại sao nên sử dụng enum?

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Trước khi bắt đầu, để hiểu rõ tại sao Senior Dev lại luôn sử dụng Java Enum, các bạn có thể tham khảo bài viết này.

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  Kiểu Enum trong C/C++ (Code ví dụ Enumeration trong C/C++)

Xem thêm các việc làm Java lương cao trên TopDev

1. Enum là gì?

1.1 Định nghĩa.

Định nghĩa thì nhàm chán, nhưng không đọc không được. =)))

Java Enum is a special Java type used to define collections of constants. More precisely, a Java enum type is a special kind of Java class. An enum can contain constants, methods etc. Java enums were added in Java 5.

Java Enum là một kiểu đặc biệt sử dụng để định nghĩa một collections of constants (tập các giá trị cố định). Chính xác hơn, kiểu enum là một lớp Java đặt biệt. Enums có thể chứa các giá trị constants, method, … Java enums được thêm vào từ Java 5.

1.2 Ví dụ.

Ví dụ kinh điển của Java, lụm từ W3Schools .

// Trình trong trình độ. Chứ đ*o phải trinh.
enum Trinh {
LOW,
MEDIUM,
HIGH
}

public class HocCuaGai { 
public static void main(String[] args) { 
// Trình còi, cưa gái không nổi.
Trinh cuagai = Trinh.LOW; 
// Chả muốn viết dòng này.
System.out.println(cuagai); 
} 
}

2. Đôi điều thú vị.

public class DoDen {
public final String nuocBai;

public static final DoDen CO = new DoDen("CƠ");
public static final DoDen RO = new DoDen("RÔ");
public static final DoDen CHUON = new DoDen("CHUỒN");
public static final DoDen BICH = new DoDen("BÍCH");

private DoDen(String nuocBai) {
this.nuocBai = nuocBai;
}

public String toString() {
return nuocBai;
}
}

You can’t instantiate an enum using the new operator.

Bạn không thể tạo ra một instance mới cho enum bằng từ khóa new.

2.1 Pass enum như parameter.

Các giá trị bên trong Enum có thể được truyền đi như tham số. Tuy nhiên, không thể pass parameter bằng cách new instance của enum.

public enum File {
READ,
WRITE
}

Có thể lấy được giá trị đầu tiên khai báo trong Enum bằng cách sau:

public class FileTest {
public static void main(String[] args) {
testEnumFile(File.values()[0]);
}
}

2.2 Không extends class nhưng implement interface.

Java enums implicitly extend the java.lang.Enum class. Therefore, Java enums can’t extend any class. But, enums can implement different interfaces.

Java enum đã extend lớp java.lang.Enum. Do đó, nó không thể extend thêm bất kì class nào khác. Tuy nhiên, enums có thể implement nhiều interfaces.

Cũng không quá khó hiểu. Trong Java, do không hỗ trợ đa kế thừa (multiple inheritance), nên chỉ có thể extends một class duy nhất.

Tuy nhiên, do enums entends class java.lang.Enum, nên có thể implement interface. Cùng xem xét ví dụ sau:

package com.kieblog.enums;
public interface Operator {
int calculate(int num1, int num2);
}

Khi khai báo EnumOperator, ta có thể implement được interface Operator.

public enum EnumOperator implements Operator {
// Nhân 2 số.
MUTIPLE {
@Override
public int calculate(int num1, int num2) {
return num1 * num2;
}
},
// Trừ 2 số.
SUBTRACT {
@Override
public int calculate(int num1, int num2) {
return num1 - num2;
}
};
}

Việc implement được interface giúp enums không chỉ đơn thuần là tập collections constants (màu sắc, ngày trong tuần, …). Khi đã có thể implement thêm, enums trở nên dạt dào sức mạnh (có thể là các object phức tạp với hàm tính toánxử lí dữ liệu hoặc là Printable, Reportable).

>>> Xem thêm: Stream trong Java 8 là gì?

3. Tại sao nên sử dụng Enum

Đang máu đỏ đen, nên ví dụ luôn các nước bài (Cơ, rô, chuồn, bích).

Provides compile time type safety.

Kiểu lúc compile time an toàn.

Can translate enums into printable strings.

Có thể chuyển đổi enums sang kiểu có thể in ra được (method toString()).

3.1 Dễ đọc.

Một đoạn code tốt là một đoạn code dễ đọc, điều đó sẽ đúng khi bạn sử dụng Enum. Thay vì sử dụng một mớ bùi nhùi dài dằng dặc static final constant, chỉ với một khai báo enum, mọi thứ trở nên rõ ràng, easy cho việc sửa chữa, đọc code.

Java Enum

Việc sử dụng quá nhiều constant có thể dẫn tới việc sửa chữa nhầm lẫn, không phân định rõ đoạn khai báo constant.
java enum
Sử dụng enum sẽ cho một đoạn code dễ đọc, dễ maintenance.

3.2 Sử dụng enum như là singleton.

Đầu tiên, bạn nào chưa biết khái niệm singleton có thể tham khảo bài viết này.

In object-oriented programming, a singleton class is a class that can have only one object (an instance of the class) at a time.

Trong lập trình hướng đối tượng, một class singleton là class chỉ có một đối tượng (một thể hiện của lớp) tại một thời điểm. Dịch khó vl.

public enum Ensure_Singleton {
INSTANCE;
}

Cực kì tiện dụng, chỉ với 3 dòng trên, một class Singleton hoàn hảo được tạo ra. Class enum cũng không có vấn đề về reflectionJava Enum cũng là phương pháp tốt nhất được khuyên dùng để tạo ra một class đảm bảo thực sự là Singleton (only one instance at time).

>>> Xem thêm: Các phần mềm giả lập Java dành cho máy tính tốt nhất

3.3 Type safe.

Enum has there own name-space – Enum có name-space riêng của nó. Như ví dụ dưới đây, khi đã gán enum Company, không thể reassign lại giá trị của Enum.

public enum Company {
EBAY, PAYPAL, GOOGLE, YAHOO, ATT
}

Company cName = Company.EBAY;
cName = 1; // Compilation Error

Rõ ràng mà nói, khi sử dụng enum, những giá trị constant sẽ tuyệt đối an toàn, không như String hay int, giá trị có thể thay đổi liên tục.

3.4 Thead safety.

Một số trường hợp, khi enum custom, thật khó lòng chắc chắn rằng không có một thread nào khác ngoài thread khởi tạo có thể can thiệp vào Enum đã khởi tạo. Tuy nhiên:

An enum value is guaranteed to only be initialized once, ever, by a single thread, before it is used. However, methods that you add to an enum class do not carry any thread safety guarantee. If you have an enum so that the methods don’t change its state, then they are by definition thread safe.

Giá trị enum sẽ đảm bảo rằng nó chỉ được khởi tọa một lần duy nhất, tất nhiên, bởi duy nhất một thread, trước khi được sử dụng. Tuy nhiên, nếu enum có thêm vào các methods, thì không chắc có thể đảm bảo được itnsh thread safety. Nếu các methods không thay đổi state của chúng, enum chắc chắn sẽ là thread safe.

Một khi đảm bảo được các method trong enum không thay đổi trạng thái, khi lập trình luồng, enum sẽ luôn là lựa chọn hàng đầu. Bởi khi đã sử dụng, các lập trình viên sẽ tương đối yên tâm, tránh khỏi deadlock hoặc collision.

4. Kết luận.

Với những vấn đề đã phân tích phía trên, hẳn các bạn cũng đã hiểu tại sao nên sử dụng Enum. Khi nào thì nên sử dụng?. Hãy luôn cố gắng sử dụng enum để tạo ra code sạch, dễ cho người đọc hoặc sửa chữa sau này.

Việc sử dụng enum, ngoài việc tạo thói quen tốt, còn chứng tỏ rằng bạn nghiêm túc và sẵn sàng chịu trách nhiệm cho những dòng code mình viết ra.

Nếu đã hiểu hết về Enum, tại sao lại không thử sức với bài Test Java của Upwork nhỉ?

5. Tài liệu tham khảo.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

ALT+ F4 là gì? Sửa lỗi không sử dụng được ALT F4 trên Windows

alt f4
Sửa lỗi tổ hợp phím ALT+ F4 không sử dụng được trên Windows

ALT + F4 đã giúp cho biết bao thế hệ học sinh, sinh viên thoát hỏi ánh mắt tử thần của giao viên trong giờ tin học Nếu anh em nào đã từng lén chơi game trong giờ Tin học thì sẽ hiểu được ngay, mà mình tin là có đến 99% anh em đều đã từng chơi game trong giờ học Tin rồi đúng chứ? Cùng tìm hiểu rõ hơn về tổ hợp phím tắt alt F4 và cách khắc phục lỗi không sử dụng được trên Windows trong bài viết dưới đây.

Alt + F4 là gì?

Alt + F4 là một tổ hợp phím tắt phổ biến trong hệ điều hành Windows, tắt nhanh cửa sổ đang mở (cửa sổ mà bạn đang thao tác) một cách cực kỳ nhanh chóng.

Lưu ý: Nếu bạn đang sử dụng trình duyệt hoặc phần mềm có nhiều tab, Alt+F4 sẽ đóng cửa sổ phần mềm lẫn tất cả tab đang mở. Vì vậy nếu bạn muốn tắt từng tab, hãy dùng phím tắt Ctrl + F4 hoặc Ctrl + W.

Cách sử dụng tổ hợp phím Alt + F4

Việc sử dụng tổ hợp phím đã cực kì quen thuộc với anh em lập trình viên, thậm chí là học sinh mới bắt đầu biết sử dụng máy tính. Tuy nhiên, vẫn còn nhiều bạn khá loay hoay khi lần đầu sử dụng tổ hợp phím. Sau đây TopDev sẽ hướng dẫn bạn sử dụng tổ hợp phím Alt + F4 cực kì đơn giản.

Đầu tiên nhấn và giữ phím Alt, đồng thời nhấn phím F4 ở hàng phím trên cùng. Lưu ý là nhấn giữ hai phím cùng lúc nhé!

Cách sử dụng tổ hợp phím Alt + F4

Vậy làm thế nào để khắc phục được lỗi không sử dụng được phím tắt ALT F4? Vâng, trong phần tiếp theo mình sẽ chia sẻ cho anh em những cách đơn giản nhất để khắc phục được tình trạng này.

Làm thế nào để sửa lỗi ALT + F4 không hoạt động?

Nhưng lưu ý là những cách làm dưới đây chỉ áp dụng cho những trường hợp bị lỗi do hệ điều hành thôi nhé, chứ lỗi vật lý như hỏng nút thì chịu nha các bạn.

#1. Kiểm tra phím Fn

loi-khong-su-dung-duoc-alt-f4 (1)

Nếu tổ hợp phím ALT + F4 không hoạt động được thì đầu tiên, bạn hãy kiểm tra xem nó có yêu cầu phím Fn để kích hoạt tổ hợp phím này hay không. Bởi rất nhiều bàn phím hiện nay có tích hợp thêm phím Fn này, kể cả là bàn phím rời.

Ví dụ: Thay vì chỉ nhấn tổ hợp phím Alt + F4 thì bây giờ bạn hãy nhấn tổ hợp 3 phím Fn + ALT + F4 (lưu ý là phím Fn bạn bấm giữ đầu tiên).

Đây là một giải pháp đơn giản nhưng có thể hữu ích nếu Alt + F4 không hoạt động trên máy tính của bạn. Hãy thử cách đơn giản này trước nhé !

#2. Thử tắt Sticky Keys trên Windows

Đầu tiên bạn bấm tổ hợp phím Windows + I để truy cập vào Windows Settings => Sau đó mở Ease of Access.

loi-khong-su-dung-duoc-alt-f4 (3)

Sau đó, bạn hãy truy cập vào tab Keyboard => và bạn hãy tắt Sticky Key ở phần Use Sticky Keys (gạt công tác sang OFF).

loi-khong-su-dung-duoc-alt-f4 (3)

Cuối cùng, bạn hãy kiểm tra lại xem tổ hợp phím ALT + F4 đã hoạt động được hay chưa.

#3. Sử dụng tính năng Troubleshooter để sửa lỗi ALT + F4

Vào lại Windows Settings bằng tổ hợp phím tắt Windows + I => sau đó bấm vào Update & Security.

loi-khong-su-dung-duoc-alt-f4 (5)

Bấm vào tab Troubleshoot => sau đó bấm Additional troubleshooters.

loi-khong-su-dung-duoc-alt-f4 (6)

Chọn Keyboard => và bấm Run the troubleshooter. Đây là bộ công cụ Fix lỗi được Microsoft tích hợp sẵn trên hệ điều hành Windows.

#4. Kiểm tra vấn đề về phần cứng

Cũng có thể là do bàn phím của bạn đã bị lỗi. Chính vì thế, bạn hãy thử kiểm tra xem các phím trên bàn phím của bạn có đang bị lỗi phím vật lý hay không.

Hoặc một cách đơn giản khác nữa là cắm bàn phím đó sang một máy tính khác, nếu nó vẫn không hoạt động thì 99% lỗi do bàn phím của bạn rồi. Tất nhiên là máy mà bạn đang test thử vẫn sử dụng được phím ALT + F4 nhé.

Và bạn biết phải làm gì rồi đấy. Vâng, thay mới đi còn lăn tăn gì nữa ^^

#5. Chỉnh sửa trong Registry Editer

NOTE: Bạn nên sao lưu lại toàn bộ Registry trước khi làm theo bài hướng dẫn này, để nếu có lỡ chỉnh sửa sai gây lỗi Windows 10 thì vẫn có thể khôi phục lại được.

+ Bước 1: Bấm Windows + R để mở hộp thoại Run => nhập lệnh regedit => nhấn Enter.

loi-khong-su-dung-duoc-alt-f4 (7)

+ Bước 2: Tiếp theo bạn truy cập theo đường dẫn sau:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

=> Sau đó bạn kiểm tra xem trong khung bên phải có khóa NoWinKeys chưa? Nếu có rồi thì bỏ qua bước này. Ngược lại, nếu chưa có thì…

Bấm chuột phải vào vùng trống bất kỳ trong khung bên phải => chọn New => chọn DWORD (32-bit) value và nhập tên key là NoWinKeys. Nếu đã có thì có thể bỏ qua bước này.

loi-khong-su-dung-duoc-alt-f4 (8)

+ Bước 3: Bạn nháy đúp chuột vào Key vừa tạo => và đổi giá trị thành 0 => nhấn OK để đồng ý.

loi-khong-su-dung-duoc-alt-f4 (9)

+ Bước 4: Cuối cùng, bạn hãy khởi động lại máy tính và thử lại xem phím ALT + F4 đã hoạt động trở lại chưa nhé !

#6. Kiểm tra Driver bàn phím

Driver bàn phím đã quá cũ hoặc bị lỗi có thể ảnh hưởng đến sự ổn định của tổ hợp phím Alt + F4. Để khắc phục sự cố này thì bạn hãy đảm bảo rằng Driver bàn phím đã là phiên bản mới nhất.

Đôi khi, Driver cho phần cứng và các thiết bị ngoại vi trên máy tính không được hệ thống cập nhật đúng cách.

Bởi có những điểm khác biệt giữa Driver chung chung và Driver do chính nhà sản xuất cung cấp. Cách tốt nhất là bạn hãy cài đặt Driver chính chủ của nhà sản xuất cho bàn phím để tránh bị các lỗi vặt như trên.

  40 phím tắt dành cho người dùng Windows

Lời kết

OK, trên đây là những cách hiệu quả nhất để sửa lỗi nhấn ALT + F4 không hoạt động được trên Windows. Bạn đã sửa lỗi ALT + F4 bằng cách nào trong những cách trên? đừng quên comment bên dưới để thông báo lại nhé!

Ngoài những cách bên trên ra, nếu bạn còn biết thêm cách làm nào hay khác thì đừng quên chia sẻ cho anh em nhé, để bài viết thêm phần hoàn thiện. Thank you!

Nguồn tham khảo: blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Clone một phần repo với sparse-checkout

clone repo
Clone một phần repo với sparse-checkout

Bài viết được sự cho phép của tác giả Huy Trần

Khi sử dụng Git để quản lý source code, sẽ có những lúc chúng ta cần checkout về một phần nhỏ của repo, thay vì toàn bộ repo đó. Ví dụ khi làm việc trên một monorepo rất to, nhưng bạn chỉ cần phụ trách một module rất nhỏ.

  10 Vấn đề về Git thường gặp và Giải pháp
  12 điều cực "cool" mà bạn có thể làm với Github

Lấy ví dụ một monorepo dùng chung cho cả backend, frontend và mobile team, mỗi team có 3 project là lemonorange và watermelon, cấu trúc như sau:

├── backend
│   ├── lemon
│   ├── orange
│   └── watermelon
├── frontend
│   ├── lemon-ui
│   ├── orange-ui
│   └── watermelon-ui
└── mobile
    ├── lemon-app
    ├── orange-app
    └── watermelon-app

Lưu ý khi mình nói monorepo, thì nó là monorepo, tất cả mọi project đều thuộc cùng 1 git repository chứ không có submodule gì hết nhé.

Bạn là một frontend developer thuộc team orange, để làm việc thì bạn chỉ cần 2 thư mục backend/orange và frontend/orange-ui. Không có lý do gì để bạn phải clone toàn bộ repository trên. Để rồi mỗi lần pull code là phải ngồi chờ git nó pull luôn cả những project mà mình không cần làm.

Đầu tiên, chúng ta clone repository này về, và thêm vào option --no-checkout để lấy về tracking info của repo chứ không lấy về bất cứ file/folder nào cả.

$ git clone --no-checkout git@github.com:thepokemoncompany/secret-project

Lúc này, nếu truy cập vào thư mục secret-project, bạn sẽ không thấy nội dung gì cả.

Tiếp theo, sử dụng lệnh git sparse-checkout set để chỉ định các thư mục muốn pull về:

$ git sparse-checkout set /backend/orange /frontend/orange-ui

Kiểm tra danh sách các sparse checkout bằng lệnh:

$ git sparse-checkout list

Bây giờ có thể checkout các file trong list này về bằng lệnh:

$ git checkout

Lúc này bạn sẽ thấy 2 folder backend và frontend , bên trong mỗi folder sẽ chỉ có project orange.

Khi gõ lệnh git status thì bạn sẽ thấy nội dung kiểu như này:

On branch master
Your branch is up to date with 'origin/master'.

**You are in a sparse checkout with 7% of tracked files present.**

nothing to commit, working tree clean

Chứng tỏ hiện tại chúng ta chỉ đang có khoảng 7% nội dung project trên working copy này.

Lưu ý là chức năng sparse-checkout chỉ có từ phiên bản git v2.26.0 trở lên.

Bài viết gốc được đăng tải tại thefullsnack.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Tạo ứng dụng Spring MVC sử dụng Maven

spring mvc
Tạo ứng dụng Spring MVC sử dụng Maven

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Mình đã hướng dẫn các bạn cách tạo mới một Spring MVC project sử dụng Spring Legacy Project trong Spring Tool Suite 3. Nhược điểm của cách này là các bạn phải sử dụng Spring Tool Suite 3 mặc dù hiện tại Spring Tool Suite 4 đã được release rất lâu rồi. Thêm nữa là sau khi tạo project, các bạn phải update chỉnh sửa các dependencies lại, rồi phải thêm Maven Jetty Plugin để chạy ứng dụng cho nhanh. Thấy được những bất cập đó, mình đã tạo mới một Maven Archetype project, publish lên Central Maven Repository để các bạn có thể dễ dàng tạo mới một ứng dụng Spring MVC và sử dụng mà không cần phải tốn công như vậy. Bây giờ thì nếu các bạn muốn tạo mới một Spring MVC project với Maven thì có thể sử dụng huongdanjava-springmvc-archetype của mình.

  Cài đặt Spring Boot CLI
  Hiện thực một Maven Archetype

Cụ thể, nếu các bạn đang sử dụng Eclipse để tạo mới một Spring MVC project sử dụng Maven thì trong cửa sổ “Select an Archetype” của Eclipse, các bạn có thể filter rồi chọn huongdanjava-springmvc-archetype project của mình như sau:

Nhấn Next để điền thông tin của project:

Kết quả sẽ như sau:

Maven Archetype project của mình đã khai báo sẵn Maven Jetty Plugin rồi nên các bạn chỉ cần chạy lên là được.

Kết quả như sau:

Checklist Những Câu Hỏi Phỏng Vấn Thường Gặp Mà Các Designer Không Nên Bỏ Qua

phỏng vấn designer
Checklist Những Câu Hỏi Phỏng Vấn Thường Gặp Mà Các Designer Không Nên Bỏ Qua

Phỏng vấn là một trong những thao tác quan trọng và luôn xuất hiện trong quy trình tuyển dụng nhân sự. Với các ứng viên cho vị trí thiết kế đồ họa, đâu là những câu hỏi thường xuyên xuất hiện trong buổi phỏng vấn? Ứng viên nên lưu ý gì để việc trả lời câu hỏi không chỉ suôn sẻ mà còn để lại ấn tượng trong mắt nhà tuyển dụng? Cùng TopDev tìm hiểu thêm các thông tin xoay quanh việc phỏng vấn designer để rõ hơn chi tiết.

1. Tại sao bạn lại quyết định trở thành designer?

Không chỉ riêng với các nhà thiết kế đồ họa mà đây là câu hỏi thường xuất hiện trong các buổi phỏng vấn ở mọi ngành nghề. Xuất phát từ đâu, nguyên nhân nào khiến bạn quyết định theo đuổi một nghề nghiệp nào đó có thể quyết định phần nhiều cách mà bạn đương đầu với khó khăn trong công việc. Bên cạnh đó, nó cũng cho thấy ý chí và sự quyết tâm gắn bó với công việc của bạn.

Khi nhận được câu hỏi này, các ứng viên cho vị trí thiết kế đồ họa hãy cố gắng trả lời một cách chân thật nhất về quyết định của mình. Đó có thể là do định hướng từ người thân, là do năng khiếu bản thân từ nhỏ, là do đam mê với việc vẽ vời và thiết kế,… Rất nhiều yếu tố khác nhau có thể khiến bạn trở thành một designer, câu chuyện của bạn chính là chìa khóa để người phỏng vấn nhận thấy được đam mê của bạn với công việc đấy.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer
  30 tiện ích Chrome cho designer và dev

2. Bạn nghĩ đâu là những kỹ năng mà một graphic designer không thể thiếu?

Đây là câu hỏi giúp nhà tuyển dụng nhìn thấy được suy nghĩ của bạn với vị trí mà mình đang ứng tuyển. Những kỹ năng mà bạn đưa ra cũng phần nào phản ánh được cách mà bạn đang xử lý với công việc của mình. Tùy theo kinh nghiệm làm việc, bạn có thể rút ra được đâu là yếu tố quan trọng với một graphic designer.

Về cơ bản, sự sáng tạo chắc chắn là yếu tố không thể thiếu với một nhà thiết kế đồ họa. Bên cạnh đó, có tính thẩm mỹ cũng là điều rất cần thiết để bạn cho ra một sản phẩm hài hòa không chỉ về nội dung mà cả hình thức. Hoặc cũng có thể, với nhiều người, một graphic designer giỏi cần có khả năng chịu áp lực tốt, không bị deadline làm cho bản thân trở nên rối rắm,…

Xem thêm Thiết Kế Đồ Họa Và Những Tư Chất Cần Thiết Của Một Nhà Thiết Kế Đồ Họa

3. Quy trình làm việc của bạn cho một thiết kế thường diễn ra như thế nào?

Mục đích của người phỏng vấn designer khi đặt câu hỏi này với bạn chủ yếu là để xem sự logic trong quá trình làm việc. Tùy theo mỗi công ty, khi làm việc chính thức, nhà thiết kế sẽ linh hoạt thay đổi để thích ứng với môi trường chung. Do đó, hãy chia sẻ chân thật về quy trình làm việc mà bạn cảm thấy hợp lí và thường áp dụng nhất. Nó sẽ cho thấy cách tiếp cận của bạn với công việc cũng như không để sót việc hay sót thông tin trong quá trình làm việc.

thiết kế đồ họa
Thiết kế đồ họa cần có những kỹ năng gì?

4. Bạn có xu hướng/mong muốn làm việc cá nhân hay theo nhóm?

Đây là câu hỏi nhằm mục đích đánh giá khả năng thích nghi và sự linh hoạt trong quá trình làm việc của bạn. Hầu hết các graphic designer trong một nhóm sẽ phải làm việc với nhiều bên liên quan để có được các thông tin quan trọng cho một sản phẩm mình làm ra. Không chỉ tiếp nhận thông tin, các nhân viên thiết kế đồ họa cũng có vai trò đóng góp ý tưởng để đưa ra sản phẩm phù hợp nhất cũng như các vấn đề liên quan đến đồ họa. Do đó, việc đòi hỏi khả năng làm việc nhóm là khá cần thiết với các nhân viên thiết kế.

Nói như thế không có nghĩa là nhân viên đồ họa có xu hướng làm việc cá nhân thì không tốt. Một người làm tốt công việc của mình một cách độc lập cũng hoàn toàn có thể cho ra những sản phẩm đồ họa hấp dẫn và thu hút người khác. Việc có xu hướng làm việc cá nhân hay theo nhóm hoàn toàn không ảnh hưởng đến thành quả làm việc của bạn. Do đó, hãy thành thật với các câu hỏi khi phỏng vấn để ghi điểm với nhà tuyển dụng.

Xem thêm các việc làm Designer lương cao trên TopDev

Một số lưu ý khi trả lời phỏng vấn

Điều quan trọng nhất trong buổi phỏng vấn đó là hãy chú ý đến tác phong và cách trả lời câu hỏi cũng như tránh các điều không nên trong quá trình này. Đây là một trong những yếu tố cực kỳ quan trọng để tạo thiện cảm với nhà tuyển dụng cũng như buổi phỏng vấn có thể diễn ra suôn sẻ hơn.

Hãy luôn chú ý trả lời câu hỏi một cách thành thật và cầu tiến. Bạn có thể chưa thật sự giỏi hay còn có một số khuyết điểm nhưng bạn luôn sẵn sàng học hỏi. Hãy cho nhà tuyển dụng thấy điều đó. Tác phong gọn gàng, cách nói chuyện rõ ràng và tôn trọng đối phương cùng việc sử dụng ngôn ngữ cơ thể đúng lúc sẽ giúp buổi phỏng vấn của bạn ấn tượng hơn trong mắt đối phương.

Trên đây là một số câu hỏi thường xuyên xuất hiện khi phỏng vấn designer. Hi vọng bạn có thể theo dõi và chuẩn bị trước để buổi phỏng vấn đạt kết quả tốt nhất. Đón đọc thêm nhiều bài viết hấp dẫn khác ở các lĩnh vực công nghệ và nhân sự cùng TopDev nhé!

Có thể bạn quan tâm:

Xem thêm các việc làm CNTT hấp dẫn trên TopDev

Chân Dung 4 Công Ty Tiên Phong Trong Ứng Dụng Công Nghệ Vào Giáo Dục Và Chăm Sóc Sức Khỏe

công nghệ vs giáo dục
Chân Dung 4 Công Ty Tiên Phong Trong Ứng Dụng Công Nghệ Vào Giáo Dục Và Chăm Sóc Sức Khỏe

Công nghệ ngày càng phát triển và mang lại nhiều tiện ích hấp dẫn cho người dùng. Bên cạnh các công ty, tổ chức, việc ứng dụng công nghệ và trí tuệ nhân tạo cũng đang dần “len lỏi” vào các lĩnh vực như giáo dục và chăm sóc sức khỏe gia đình. Cùng tìm hiểu thêm về một số công ty tiên phong trong lĩnh vực này cũng như những giải pháp mà họ đã cung cấp cho người dùng.

1. Phenikaa MaaS – Giải pháp toàn diện cho trường học thông minh

PHX Smart School là công ty start-up cung cấp cho các trường học một giải pháp toàn diện thông minh và an toàn từ đưa đón học sinh theo thời gian thực, quản lý nhà trường (quản lý nhân sự, thanh toán, thư viện, học liệu, sự kiện, suất ăn, quản lý thông tin…), hệ thống quản lý dạy và học tập trực tuyến (LMS) đến xây dựng website tiện ích cho nhà trường. 

Sau gần 1 năm hoạt động, đã có hơn 50.000 lượt tải ứng dụng trên App Store, gần 10 trường học đã và đang sử dụng giải pháp. 

  • Giải pháp này giúp nhà trường giảm đến 20% khối lượng công việc cho cán bộ công nhân viên nhà trường và hiệu quả hoạt động quản lý tăng hơn 30%. 
  • Thông tin được số hoá và cập nhật liên tục trên hệ thống theo thời gian thực, giúp phụ huynh và nhà trường có thể theo dõi lộ trình xe như xe đang ở đâu, cách nhà bao xa và nhận được thông báo khi xe gần đến.

2. Women Meet Tech – U.S Consulate HCMC

Women Meet Tech (WMT) là tổ chức giảng dạy và kết nối cộng đồng phi lợi nhuận STEM đầu tiên tại Việt Nam, được bảo trợ bởi Lãnh sự quán Mỹ tại TP. Hồ Chí Minh và Google Women Techmakers. Women Meet Tech chuyên giảng dạy và bồi dưỡng các kỹ năng STEM như lập trình web căn bản, xây dựng thương mại điện tử, startup pitching, định hướng nghề nghiệp,… với sự tham gia của hơn 2000 chuyên gia trẻ từ nhiều lĩnh vực khác nhau tại Việt Nam, Singapore, Úc và Mỹ. 

Women Meet Tech hoạt động với 3 sứ mệnh chính:

  • Thúc đẩy phát triển, đa dạng hóa nguồn nhân lực và tăng cường tính hòa nhập trong lĩnh vực công nghệ tại Việt Nam.
  • Giúp đề cao các chuyên gia trẻ trong ngành công nghệ thông tin tại Việt Nam, đặc biệt là phụ nữ trong ngành kỹ thuật.
  • Cung cấp các giải pháp giải pháp sinh thái – xã hội cho cộng đồng cũng như các doanh nghiệp địa phương.

3. 200Lab Education – Trung tâm huấn luyện kỹ sư phần mềm chuyên sâu

Software Engineer – Kỹ sư phần mềm là một ngành nghề mang lại nhiều giá trị cho cộng đồng và thay đổi cuộc sống tốt đẹp hơn. Tuy nhiên, rất nhiều bạn đang gặp vô vàn khó khăn và trắc trở để có thể gia nhập và tiến xa với ngành này. 200Lab Education ra đời với mong muốn góp phần nhỏ công sức của mình trong việc giải quyết bài toán nhân lực cho thị trường tuyển dụng sôi động hiện nay. 

200Lab Education thực hiện sứ mệnh này thông qua việc cung cấp các giải pháp và các khóa huấn luyện kỹ sư phần mềm chuyên sâu. Bên cạnh đó, 200Lab Education còn sản xuất các nội dung về kiến thức lập trình liên quan đến Software Engineer. Đồng hành cùng 200Lab Education sẽ giúp bạn có được nền tảng vững chắc hơn về các kỹ năng liên quan đến lập trình phần mềm.

4. Momby     

Với sứ mệnh mang đến cho các bà mẹ bầu trên khắp Việt Nam một thai kỳ an yên và khỏe mạnh, Momby cho ra đời Trợ lý thông minh Doti, được cá nhân hóa theo nhu cầu của từng bà mẹ với nhiều tiện ích và chức năng hỏi đáp trực tiếp cùng bác sĩ trên ứng dụng. Trong bối cảnh dịch bệnh phức tạp như hiện nay, đây được xem là giải pháp cực kỳ hữu ích để các mẹ bầu trong thai kỳ an tâm dưỡng thai và tránh hoang mang trước vô vàn thông tin mơ hồ, chưa có căn cứ trên Internet. 

Để chia sẻ với những khó khăn tài chính trong thời điểm dịch bệnh, Momby mang đến chương trình “Mang thai mùa Covy – An tâm cùng Momby” cho các phụ huynh. Momby kết hợp cùng Alive & Thrive và hội đồng các bác sĩ sản phụ khoa đồng HỖ TRỢ 100% chi phí cho toàn bộ các tính năng và hỏi đáp không giới hạn cùng các bác sĩ sản khoa trên ứng dụng Momby. 

Ba mẹ có thể tải ứng dụng Momby tại AppStore hoặc CH Play Google để tìm hiểu thêm các tính năng hữu ích cho nhu cầu của mình. 


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Những điểm mới của Java 8 (phần 3: Streams API – tiếp)

java 8
Những điểm mới của Java 8 (phần 3: Streams API – tiếp)

Bài viết được sự cho phép của smartjob.vn

Streams API trong Java 8 là một bước tiến lớn của ngôn ngữ lập trình Java và liên quan đến nhiều khía cạnh khác nhau, nên chúng tôi cần kéo dài thêm chủ đề này. Nếu bạn là lập trình viên C# trên nền .NET framework vào năm 2008, có thể bạn từng háo hức tìm hiểu LINQ. Từ năm 2014 trở về sau, lập trình viên Java cũng được tận hưởng cảm giác tương tự với Java Streams API.

Tôi đã từng rất say mê C#, trong ký ức xưa cũ, tôi tìm tên những nhân viên có chứa từ “Văn” sử dụng cú pháp LINQ:

string[] employeeList = {"Nguyễn Văn Còn", "Phạm Văn Đoan", "Nguyễn Văn Minh", "Đoàn Minh Huệ"};
List filteredNames = employeeList.Where(c =&gt; c.Contains("Văn")).ToList();

Giờ đây với Java 8 Streams API:

Sự linh hoạt, hữu dụng của Streams API thể hiện ở số lượng “pattern” rất đa dạng. “pattern” tạm hiểu là cách dùng, cách thức tổ hợp, phối hợp các phương thức để mang đến kết quả mong muốn. Phần nội dung này để trình bày thêm về các “pattern”.

Có nhiều cách để khởi tạo dòng nước (stream):

// Khởi tạo dòng (stream) từ mảng (array).
Arrays.stream(stringArray);

// Khởi tạo dòng số nguyên (stream of integer numbers) từ khoảng giá trị.
IntStream.range(9, 42);

// Khởi tạo dòng (stream) từ List&lt;T&gt;
employeeList.stream();

// Khởi tạo dòng nước (stream) từ tập hợp các file.
Files.walks();

// Khởi tạo dòng nước (stream) từ Spliterator&lt;T&gt; - Một interface mới trong bộ Collections.
java.util.Spliterator()

// Khởi tạo dòng (stream) từ tập hợp hữu hạn giá trị.
Streams.of("Nguyễn Văn Còn", "Đoàn Minh Huệ", "Nguyễn Văn Cảnh", "Nguyễn Văn Hải");

// Sử dụng chức năng của Supplier (đã kết hợp với Java 8 Lamba expression).
Supplier&lt;Stream&lt;String&gt;&gt; employeeList = () -&gt; Stream.of("Nguyễn Văn Còn", "Đoàn Minh Huệ", "Nguyễn Văn Cảnh", "Nguyễn Văn Hải");

(Supplier là interface class mới xuất hiện từ Java 8. Xem javadoc: https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html).

Xem thêm các việc làm Java lương cao trên TopDev

Tìm các nhân viên có tên bắt đầu bằng chữ “H”:

Ghi chú: Khi sử dụng cú pháp

chúng ta đã sử dụng đến kỹ thuật Method references (tham chiếu phương thức, mới có từ Java 8), thể hiện qua ký hiệu 2 dấu 2 chấm :: Xem thêm tài liệu từ Oracle: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html . Nếu không muốn dùng cú pháp “tham chiếu phương thức”, bạn có thể dùng cú pháp Lambda expression vẫn cho kết quả như cũ:

  Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Stream characteristics – Lọc dòng nước theo điều kiện

Trong phần trước, chúng ta đã sử dụng ví dụ đếm số lượng các ký tự phân biệt:

Chúng ta đã “lọc dòng nước” theo điều kiện distinct() (phân biệt/khác biệt). Danh sách dài hơn các điều kiện lọc mà bạn có thể sử dụng trong Streams API là:

DISTINCT
CONCURENT
IMMUTABLE
NONNULL
ORDERED
SIZED
SORTED
SUBSIZED

cũng chính là các field do class interface Spliterator cung cấp. Xem Javadocs: https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html Mục “Field Summary”.

Đỗ Như Vý – Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Don’t be that guys!. Viết functions sao cho tốt?

viết function
Don’t be that guys!. Viết functions sao cho tốt?

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Chuyện từ xửa xừa xưa, có anh chàng lập trình viên nọ rất thích viết FUNCTIONSbất cứ khi nào có thể viết ra function mới thì anh ta đều viết. Đối với cha này thì functions là BẤT TỬ, là TUYỆT VỜI NHẤT.

functions-functions

Hàm, hàm khắp mọi nơi.

Tuy nhiên, không như e ve ri bo đi nghĩ, gã ta viết functions cực kì tệ hại, tên không rõ ràng, comment không có, dài lê thê tới cả vài trăm dòng.

Bỗng một ngày đẹp trời, anh ta đọc được Clean Code của Uncle Bob. Bùm, “mặt trời chân lý chói qua chim“. Anh ta đã ngộ ra được tứ trụ chân lý về function. Rút đi rút lại, đúc kết ra 4 bí kíp tàng kinh để truyền lại cho hậu thế, tránh lãng phí thời gian đi vào vết xe đổ của anh ta.

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
  5 điểm khác nhau giữa function thường và arrow function
So scare. Anh ngửi thấy mùi trong code của chú rồi nhé.

Don’t be that guys!. Begin

1. Functions Should Be Small – Function nên viết nhỏ thôi.

Đã qua rồi thời những function viết lê thê tới cả vài trăm dòng, comment rối rít. Lúc bạn viết, có thể bạn hiểu luồng thực thi, logic thực thi trong hàm. Tuy nhiên, 2 tháng sau, quay về nhìn lại, functions của bạn không khác gì một đống rác (khó hiểu, dài, thứ tự thực hiện lộn xộn).

Mình có đọc một bài viết, anh chàng nọ được TechLead của mình chỉ dạy một điều khá hay.

“If it (the function) requires a lot of effort, you stop and rethink your solution”

Nếu nó (functions) mất nhiều công sức để hoàn thành, bạn nên dừng lại và nghĩ lại về giải pháp của mình.

Bugs ở đâu ra?. Bugs tới từ sự hiểu nhầmhiểu sai về một vấn đề nào đó. Nếu hàm viết quá dài, sẽ cực kì khó khăn để hiểu chính xác ý nghĩa của nó.

Functions viết nên nhỏ, nhưng tên mô tả thì nên lựa chọn cái dài. Người đọc sẽ dễ hiểu code của bạn. Source.

2. Function Should Be Clear – Function nên viết rõ ràng.

Đối với rule clear này, đơn giản ta có thể hiểu như là coding convention. Functions nên đáp ứng một số tiêu chí sau đây:

  • Không nên quá 100 dòng (functions should not be 100 lines long).
  • Không hầu như không bao giờ quá 20 dòng (functions hardly ever be 20 lines long).
  • Không nên có nhiều hơn 3 arguments. Việc có quá nhiều arguments sẽ làm funcitons trở nên khó hiểu, nếu arguments có cùng datatype thì còn có thể truyền nhầm giá trị nữa.
  • Tên gợi ý nghĩa. Việc đặt tên func1, func2 thật sự là một thảm họa với người đọc code. Một cái tên functions đầy đủ ý nghĩa sẽ chứng tỏ rằng bạn thực sự biết rõ method đang thực hiện việc gì. Ngoài ra, lúc maintanance, người reiview sẽ thầm cảm ơn bạn đấy.

3. Function Should Be Simple – Function nên viết đơn giản.

Nếu mày đọc bài và chưa có bạn gái, hãy cố kiếm lấy một cô. FACE TO FACE -> KISS -> XXX.

3 bước này đơn giản, lập trình còn đơn giản hơn, chỉ cần một trong ba bước. KISS.

KISS — Keep ISimple, Stupid

Giữ cho nó đơn giản. Thôi có văn hóa (không chửi bậy) =))

shorter method is easier to read, easier to understand, and easier to troubleshoot. Refactor long methods into smaller methods if you can.

Một method ngắn thì dễ đọcdễ hiểu và khắc phục sự cố. Hãy luôn có gắng refactor methods thành các methos nhỏ hơn nếu bạn có thể.

// Wtf, nhìn thôi là đã rối cả mắt.
// Function này đi handle lỗi.
// Cũng phải mất cả 20s mới nhìn ra.

function handleError(error) {
if not error A
if not error B
if not error C
// Làm cái m* gì đó.
else handle error C
else handle error B
else handle error A
}

Tại sao không viết.

// Nhìn cái hiểu luôn.
// Nó đi handle lỗi -> nhìn vào 3 cái return.
// Hiểu luôn.
function handleError(error) {
if error A
handle error A; return
if error B
handle error B; return
if error C
handle error C; return

// do something
}

Một ví dụ khác.

// Ơn chúa, function này cuối cùng thực hiện cái gì?
// Đọc code khó hiểu, khó sửa, dễ sửa sai.
public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
int nameCheck = SUCCESS;
if (someCondition) {
if (name != null && name != "") {
if (value != 0) {
if (perms.allow(name) {
// Do Something
} else {
nameCheck = PERM_DENY;
}
} else {
nameCheck = BAD_VALUE;
}
} else {
nameCheck = BAD_NAME;
}
} else {
nameCheck = BAD_COND;
}
return nameCheck;
}
public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
if (!someCondition)
return BAD_COND;

if (name == null || name == "")
return BAD_NAME;

if (value == 0)
return BAD_VALUE;

if (!perms.allow(name))
return PERM_DENY;

// Do something
return SUCCESS;
}

4. Function Should Have One Job – Function làm 1 việc thôi.

FUNCTIONS SHOULD DO ONE THINGTHEY SHOULD DO IT WELL. THEY SHOULD DO IT ONLY.
Uncle Bob –Clean Code

FUNCTION chỉ nên thực hiện một việc. Chúng thực hiện cho tốt mỗi việc đó mà thôi – chú Bob.

Thực tế, những good programer đều tuân thủ quy tắc này. Mới đầu có vẻ nhàm chán, bởi một function chỉ thực hiện một công việc duy nhất. Tệ hơn, một số bạn dev với ra trường có thể nhìn bạn với ánh mắt đầy nghi hoặc (do có nhiều funcitons nhỏ).

Hầu hết, khi mới code được chừng 1 năm, các bạn sẽ cố gắng viết những function lớn, thực hiện nhiều việc. Nhiều tác vụ khó nhằn như phân trang,(paging) quản lý transaction ở model chỉ thực hiện với 2 hay 3 function.

Mình cũng vậy, ban đầu cứ nghĩ như vậy là sẽ tối ưu code. Nhầm, việc chia nhỏ function (đảm bảo chúng chỉ thực hiện MỘT VIỆC) sẽ cực kì hữu ích cho người khác khi đọc codephát triển tính năng (feature) hoặc bảo trì (maintanance).

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Cách mạng 0.5 của Neovim: Lua và Built-in LSP Client

neovim
Cách mạng 0.5 của Neovim: Lua và Built-in LSP Client

Bài viết được sự cho phép của tác giả Huy Trần

Vãi thật, mình nhớ là mới viết một bài về Neovim 0.4 đây thôi, thế mà đã 2 năm rồi cơ à.

Phiên bản 0.5 của Neovim vừa release cách đây không lâu và chính thức trình làng rất nhiều thay đổi lớn, lớn nhất trong số đó là khả năng config bằng Lua và một loạt chức năng built-in liên quan đến LSP.

  Cách mạng 0.4 của Neovim: Floating Window
  5 nguồn học miễn phí giúp bạn "chinh phục" Vim

Lua Config

Với phiên bản 0.5, chúng ta đã có thể thay thế init.vim bằng init.lua, cơ chế load config của bản này cũng khá dễ hiểu:

  • Đầu tiên là check coi có file $HOME/.config/nvim/init.lua không
  • Nếu có thì load file này
  • Không có thì fallback về $HOME/.config/nvim/init.vim

Lưu ý là Neovim sẽ chỉ load một trong 2 file trên, chứ không load cả 2.

Và không chỉ có config file, Lua còn được tích hợp sâu rộng vào toàn bộ runtime của Vim, và bạn có thể dùng nó để thay thế cho Vimscript trong mọi tình huống, từ module/plugin cho đến execute command.

Ví dụ bạn có thể chạy Ex command sau để kiểm chứng:

:lua print("Hello, Lua!!!")

Cơ chế load module của Lua cũng không phức tạp lắm, mọi file *.lua nằm trong thư mục $HOME/.config/nvim/lua đều sẽ được load bằng lệnh require(), ví dụ với cấu trúc thư mục như sau:

~/.config/nvim
├── lua
│  ├── module_a.lua
│  └── big_ass_modules
│     ├── something.lua
│     └── init.lua

Ta có thể load module bằng nhiều cách khác nhau như sau:

require('module_a')
let mod_a = require('module_a')

require('big_ass_modules/something')
require('big_ass_modules.something')

-- load file big_ass_modules/init.lua
require('big_ass_modules')

Ngoài ra, chúng ta còn có thể chèn Lua script vào Vimscript thông qua khối lệnh:

lua << EOF

-- lua code here

EOF

Trong trường hợp bạn chưa có thời gian để migrate toàn bộ Vim config từ Vimscript sang Lua thì có thể dùng cách trên để vừa sử dụng Lua plugin vừa sử dụng Vimscript plugin.

Đọc thêm về Lua support trong Vim tại đây https://github.com/nanotee/nvim-lua-guide

Built-in LSP Client

Trước Neovim 0.5, có rất nhiều LSP Client plugin, mà phổ biến nhất có lẽ là coc.nvim.

Phiên bản 0.5 tích hợp sẵn LSP Client nên chúng ta không cần dùng các plugin như coc.nvim nữa, các bạn có thể xem qua hình bên dưới để thấy sự khác biệt giữa việc sử dụng built-in LSP Client trong Neovim 0.5 so với các plugin LSP Client khác.

Trong trường hợp của coc.nvim thì bá đạo hơn tí, vì nó sẽ run luôn cả extension host của VSCode ở bên dưới, nhưng nhờ thế mà cho trải nghiệm gần với VSCode hơn.

Còn Built-in LSP Client của Neovim thì khá đơn giản:

Chúng ta tiết kiệm được một layer khi giao tiếp với language server, nhanh hơn hay không thì chưa biết, mình đoán là nhanh hơn, cứ so sánh với mô hình của coc.nvim là sẽ thấy.

Ngoài ra, phiên bản 0.5 còn tích hợp Treesitter, đây là chức năng cho phép Neovim thực hiện syntax highlighting thông qua kết quả phân tích code của LSP, nên chất lượng nhận diện code để highlight sẽ tốt hơn thông thường.

Bản thân việc sử dụng built-in LSP Client cũng có rất nhiều cách cấu hình khác nhau, với các plugin hỗ trợ khác nhau. Hiện tại có các plugin hữu dụng như:

Ở bài sau mình sẽ hướng dẫn chi tiết hơn về cách cấu hình. Són dần ra mới câu được nhiều view.

Bài viết gốc được đăng tải tại thefullsnack.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Phân tích code với SonarQube Scanner cho Maven

SonarQube Scanner
Phân tích code với SonarQube Scanner cho Maven

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết trước, mình đã hướng dẫn các bạn cách sử dụng SonarQube Scanner để phân tích code. Nhược điểm của cách này là chúng ta phải download và cài đặt SonarQube Scanner. Các bạn có thể sử dụng SonarQube Scanner cho Maven để giảm bớt việc phải download và cài đặt SonarQube Scanner này. Đây cũng là cách mà SonarQube recommend chúng ta nếu chúng ta đang làm việc với Maven project. Cụ thể cách cấu hình và phân tích code với SonarQube Scanner cho Maven như thế nào? Chúng ta sẽ cùng nhau tìm hiểu trong bài viết này các bạn nhé!

  Build executable jar sử dụng Maven Shade Plugin
  Cài Plugin cho Jenkins, Cài Maven Plugin cho Jenkins

Tạo mới project trong SonarQube Server

Chúng ta không cần phải khai báo thông tin về project mà chúng ta cần phân tích trong tập tin sonar-project.properties nữa. Các bạn có thể login vào SonarQube server, sau đó thì nhấn vào Create Project, rồi chọn Manually:

Các bạn cũng có thể chọn More nếu muốn tạo mới project từ các VCS provider các bạn nhé!

Kết quả:

Các bạn hãy điền thông tin về Project display name và Project key theo nhu cầu của mình. Ở bài viết này, để làm ví dụ, mình sẽ sử dụng project ví dụ trong bài viết Binding biến trong request URI với tham số của phương thức sử dụng annotation @PathVariable trong Spring MVC. Mình sẽ khai báo Project display name là “Spring MVC PathVariable” và Project key là “spring_mvc_pathvariable”, thật ra thì Project key có thể tự động generate theo Project display name. Sau đó thì nhấn nút Set Up, các bạn sẽ thấy trang cấu hình cho project hiển thị như sau:

Có nhiều tuỳ chọn để SonarQube Server lấy source code để scan như trên. Trong ví dụ này thì mình sẽ chọn Locally để sử dụng source code trong máy mình các bạn nhé!

Tương tự như bài viết Phân tích code với SonarQube Scanner, chúng ta cần sử dụng thông tin user token để authenticate với SonarQube Server mỗi khi chạy scan code. Các bạn hãy nhập tên token mà mình muốn, sau đó thì nhấn nút Generate, các bạn sẽ thấy kết quả như sau:

Nhấn Continue để tiếp tục các bạn nhé!

Mình sẽ chọn Maven cho ví dụ của bài viết này, các bạn sẽ thấy kết quả như sau:

Copy command trong trang này để chuẩn bị scan code các bạn nhé!

Phân tích code

Để scan code, các bạn hãy mở Terminal trên Linux hoặc macOS hoặc Console trên Window, đi đến thư mục project, execute command mà chúng ta vừa copy ở trên, các bạn sẽ thấy kết quả như sau:

Mở lại SonarQube server, các bạn sẽ thấy kết quả như sau:

Vậy là chúng ta đã scan thành công rồi đó các bạn! Hãy click vào project để xem chi tiết nhé!

Bài viết gốc được đăng tải tại huongdanjava.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

3 Yếu Tố Kiến Tạo Nên Thành Công Của Fintech Hàng Đầu Việt Nam

vnpay
3 Yếu Tố Kiến Tạo Nên Thành Công Của Fintech Hàng Đầu Việt Nam

Là đơn vị hàng đầu trong lĩnh vực thanh toán điện tử tại Việt Nam, VNPAY không ngừng tạo ra những sản phẩm giá trị cho cuộc sống đơn giản hơn. Và trong hành trình phát triển đó, không thể thiếu những yếu tố làm nên thương hiệu VNPAY.

Sở hữu hệ sinh thái rộng lớn

Hiện tại VNPAY đang hợp tác với hơn 40 ngân hàng tại Việt Nam tiêu biểu như Agribank, Vietinbank, BIDV, Vietcombank… các tổ chức thanh toán tại Việt Nam và Quốc tế, 5 công ty viễn thông và hơn 120.000 nghìn doanh nghiệp. Với mục tiêu đơn giản hóa các nhu cầu giao dịch hàng ngày, VNPAY đưa người dùng trải nghiệm các dịch vụ tài chính một cách thân thiện, nhanh chóng, an toàn.

Hệ sinh thái dịch vụ phong phú của VNPAY giúp cho cuộc sống đơn giản, tiện lợi hơn

Cụ thể, VNPAY phối hợp cùng các Ngân hàng và các doanh nghiệp xây dựng hệ sinh thái Mobile Banking đa dạng về sản phẩm thanh toán (điện, nước, học phí, phí chung cư,…), đa dạng về tiện ích tài chính (thông tin tài khoản, tiết kiệm online, vay online, …), đa dạng về các dịch vụ tiện ích phi tài chính (thông tin tương tác, trợ lý ảo, tìm các địa điểm dịch vụ xung quanh, gọi taxi,…), đa dạng các hình thức thương mại (mua vé máy bay, mua vé xem phim, mua vé tàu, vé ô tô đường dài và các loại hàng hoá hữu hình phục vụ tiêu dùng hàng ngày từ bỉm sữa, đến tivi, máy giặt,…)

Đầu năm 2021, VNPAY ra mắt ví điện tử VNPAY phiên bản mới đầu tiên dành cho gia đình Việt, với tính năng nổi trội Ví gia đình. Người dùng có thể tạo các ví thành viên, cấp hạn mức và quản lý chi tiêu cho những người thân yêu như con cái, bố mẹ, ông bà…Ngoài ra ví VNPAY còn đáp ứng nhu cầu thanh toán các dịch vụ hàng ngày của bạn và gia đình một cách nhanh chóng, tiện lợi, an toàn.

Ví điện tử VNPAY – Ví điện tử đầu tiên dành cho gia đình Việt, đa dạng tiện ích, ưu đãi ngập tràn

VNPAY sở hữu giải pháp thanh toán đạt Thương hiệu quốc gia – VNPAY-QR đang được người dùng ưa chuộng bởi sự đơn giản, nhanh chóng, an toàn và được tích hợp trên hơn 30 ứng dụng ngân hàng (Vietcombank, BIDV, VietinBank, Agribank, NCB, SAIGONBANK, VietABank….) và 8 ví điện tử. VNPAY-QR chấp nhận thanh toán cả online và offline với hơn 150.000 điểm trên toàn quốc, phủ sóng rộng khắp các ngành nghề dịch vụ, giải trí, vận tải, y tế, giáo dục, dịch vụ công… giúp người dùng dễ dàng tiếp cận với hình thức thanh toán hiện đại này.

VNPAY là cánh tay nối dài của các ngân hàng, đối tác chiến lược của các doanh nghiệp cung cấp dịch vụ lớn như các hãng hàng không, các Telco, các tập đoàn về du lịch, vận tải, bán lẻ lớn, … mang tới cho người dân Việt Nam nhiều trải nghiệm tuyệt vời về sản phẩm dịch vụ số dựa trên công nghệ.

Ngoài việc hợp tác với ngân hàng, VNPAY đầu tư nguồn lực rất lớn cho việc hỗ trợ doanh nghiệp chuyển đổi số và đảm bảo hệ thống quản lý, bán hàng của doanh nghiệp tích hợp cùng các hình thức thanh toán hiện đại. Đặc biệt giúp doanh nghiệp quản lý hiệu quả, nâng cao hiệu suất bán hàng. VNPAY cũng sẽ là cầu nối giúp doanh nghiệp kết nối với nhau tạo nên một hệ sinh thái thương mại gắn kết trên môi trường điện tử. 

Cụ thể, VNPAY đưa ra nhiều giải pháp thanh toán và quản lý như VNPAY-POS cho nhiều loại hình doanh nghiệp khác nhau: loại hình bán hàng ăn uống, thương mại, vận chuyển hành khách đường dài, phần mềm quản lý taxi, … Cung cấp cả các dịch vụ kho thông minh cho các doanh nghiệp bán hàng online làm đơn giản hoá trong quá trình quản lý từ đó thúc đẩy phương thức bán hàng mới và đương nhiên kèm theo cả phương thức thanh toán mới không dùng tiền mặt.

Ngoài ra hệ sinh thái của VNPAY đang có hơn 30 công ty công nghệ, bán lẻ khác nhau cũng chính là một mạng lưới hỗ trợ giúp cho VNPAY có thể dễ dàng mang các công nghệ mới tới merchant và người dùng cuối hơn. Với tinh thần đổi mới sáng tạo trong việc phát triển sản phẩm, dịch vụ và chú trọng sự kết nối, chia sẻ , VNPAY kỳ vọng sẽ tạo nên đột phá trong cuộc cách mạng thanh toán không tiền mặt tại Việt Nam.

Lấy công nghệ là yếu tố “hạt nhân”

Được biết đến là đơn vị hàng đầu trong lĩnh vực tài chính, công nghệ tại Việt Nam, VNPAY định hướng xây dựng một hệ sinh thái thanh toán điện tử ưu tiên phát triển các công nghệ mới nhất theo xu hướng của thế giới. Lấy công nghệ là yếu tố “hạt nhân”, kiên trì đi theo triết lý kinh doanh là đầu tư rất nhiều nguồn lực cho việc nghiên cứu, xây dựng hạ tầng công nghệ về thanh toán, phát triển các dịch vụ công nghệ mới như: Big Data, AI, BlockChain… Đảm bảo mang đến cho người dùng các dịch vụ thanh toán đa dạng, tiện ích từ đó nâng cao các trải nghiệm người dùng. 

Ngoài ra VNPAY cũng tập trung vào các phát triển công nghệ lõi để tham gia cuộc cách mạng thanh toán không tiền mặt, đảm bảo khả năng phát triển nội địa mà không phải phụ thuộc vào việc nhập khẩu công nghệ từ nước ngoài. 

VNPAY luôn ứng dụng công nghệ tiên tiến nhất trong các sản phẩm, dịch vụ

VNPAY xây dựng và phát triển các sản phẩm, dịch vụ trên nền tảng công nghệ hiện đại blockchain cũng như áp dụng các công nghệ di động mới nhất đáp ứng nhu cầu và đảm bảo an toàn mọi giao dịch thanh toán online của người dùng. 

Đặc biệt mới đây, VNPAY đạt chứng chỉ PCI DSS 3.2.1 level 1 cho cổng thanh toán VNPAY-QR, đây là Chứng chỉ cấp độ cao nhất của Service Provider được hình thành bởi Hội đồng Tiêu chuẩn Bảo mật (PCI Security Standards Council). Cổng thanh toán VNPAY không chỉ đáp ứng những nhu cầu khắt khe về đảm bảo an ninh dữ liệu trong quá trình lưu trữ, xử lý và chuyển tiếp theo tiêu chuẩn quốc tế mà còn đảm bảo an toàn, bảo mật của hạ tầng thanh toán quốc gia. Đây chính là một trong những giải pháp thiết thực nhằm bảo vệ quyền lợi cho người tiêu dùng khi thanh toán online. 

Đầu tư vào “con người” tạo nên giá trị cốt lõi

VNPAY và các công ty thành viên hiện có trên 4.000 nhân sự, trong đó có trên 1.200 kỹ sư và có nhiều chuyên gia giỏi ở nhiều mảng công nghệ khác nhau. Trong đó, VNPAY hội tụ nhiều nhân sự nhiều giàu kinh nghiệm, chất lượng cao, nhiệt huyết và sáng tạo, tràn đầy sức trẻ… cùng triển khai vận hành các dự án về dịch vụ thanh toán điện tử.

VNPAY luôn có chế độ đãi ngộ nhân sự xứng đáng và lương thưởng hấp dẫn cho nhiều vị trí. Để không ngừng nâng cao chất lượng nhân sự, VNPAY thường xuyên tổ chức các chương trình đào tạo, nâng cao trình độ chuyên môn, kỹ năng cho nhân viên và tạo ra cơ hội thăng tiến rộng mở.

VNPAY luôn chú trọng vào nhân tố con người

Tại VNPAY, cá nhân có cơ hội trải nghiệm và phát huy tối đa năng lực, thỏa sức đam mê sáng tạo để tạo ra nhiều giá trị tốt đẹp. Mọi ý kiến luôn được tôn trọng, lắng nghe để nỗ lực tạo ra một môi trường làm việc hiện đại, chuyên nghiệp, kết nối giữa các thành viên trong công ty nhằm tạo nên một tập thể đoàn kết, vững mạnh. 

Không chỉ có văn phòng làm việc mơ ước, không gian sáng tạo cùng các thiết bị công nghệ hiện đại, cao cấp giúp tạo cảm hứng cho cá nhân phát huy tối đa hiệu quả làm việc, VNPAY còn đặc biệt quan tâm đến đời sống tinh thần của nhân viên. Ngoài các tiện ích đa dạng như phục vụ ăn sáng, café, hoa quả miễn phí giữa giờ… VNPAY còn chăm sóc sức khỏe cho nhân viên bằng chế độ bảo hiểm sức khỏe cao cấp (100% dành cho cán bộ nhân viên và gia đình) đảm bảo cho nhân viên yên tâm và cống hiến hết mình cho công việc. Ngoài ra, các chuyến du lịch trong và ngoài nước hay teambuilding cũng thường xuyên được tổ chức để tăng tinh thần đoàn kết, sáng tạo của nhân viên…

Văn phòng làm việc hiện đại, sáng tạo giúp cá nhân tạo cảm hứng, phát huy tối đa hiệu quả công việc

Ban lãnh đạo có tầm nhìn, thấu hiểu, gần gũi với đời sống nhân viên. Đồng nghiệp nhiều kinh nghiệm, chuyên môn giỏi cùng phong cách làm việc trẻ trung, linh hoạt, vui vẻ, thân thiện giúp đỡ nhau, tạo động lực để phát triển bản thân và hiệu quả công việc.

Với sự kết hợp hoàn hảo của 3 nhân tố trên, VNPAY đã và đang tạo ra các sản phẩm giá trị, các dịch vụ thanh toán hiện đại, thúc đẩy chuyển đổi số nền kinh tế và hướng đến xã hội không tiền mặt.