Home Blog Page 76

Công Việc Của Business Analyst Và Tất Tần Tật Các Thông Tin Cần Biết Về Nghề BA

công việc của business analyst
Công Việc Của Business Analyst Và Tất Tần Tật Các Thông Tin Cần Biết Về Nghề BA

Trong thị trường việc làm công nghệ hiện nay, Business Analyst đã trở thành một ngành nghề khá phổ biến và được nhiều người quan tâm. Như mọi ngành nghề khác, sự chú ý đổ dồn vào việc nghề Business Analyst cụ thể là làm những gì, công việc có khó khăn hay không, nhu cầu nhân lực ra sao và mức lương có đủ hấp dẫn? Tiếp tục chuỗi bài viết về vị trí này, cùng TopDev tìm hiểu thêm về công việc của Business Analyst nhé!

công việc của business analyst
Công việc của các Business Analyst

Tổng quan ngành Business Analyst

Business Analyst – BA được biết đến là các Chuyên viên phân tích nghiệp vụ. Công việc này đang trở thành “hot job” ở thời điểm hiện tại nhờ sự săn đón nhiệt tình cùng chế độ lương thưởng cực hấp dẫn mà các công ty đề ra. Tuy nhiên, nói vậy cũng để thấy rằng, yêu cầu chuyên môn với một BA là rất cao và công việc mà họ đảm nhận có ảnh hưởng lớn đến sự phát triển và tồn vong của một công ty.

  Business Analyst (BA) là gì? Học gì để trở thành một BA
  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

Theo Viện quốc tế cung cấp chứng chỉ hành nghề BA chuyên nghiệp hiện nay đánh giá, các Business Analyst sẽ đóng vai trò trung gian kết nối giữa doanh nghiệp với khách hàng. Tùy theo mỗi vị trí làm việc cụ thể mà vai trò của các BA sẽ có sự khác biệt nhất định, nhưng về cơ bản họ sẽ là người tìm hiểu và nắm rõ các vấn đề mà khách hàng đang gặp phải, sau đó cùng với các phòng ban bàn bạc và đưa ra những giải pháp cụ thể hỗ trợ người dùng.

Công việc của Business Analyst

Nhìn chung, công việc hàng ngày mà các BA đảm nhận sẽ là một quy trình gồm:

  • BA sẽ làm việc trực tiếp với khách hàng và lắng nghe mọi chia sẻ của khách hàng với những trải nghiệm sử dụng cũng như khó khăn mà họ đang gặp phải. Thông qua các thông tin đó, chuyên viên phân tích nghiệp vụ sẽ lên phương án giải trình và tìm ra giải pháp phù hợp.
  • Sau khi triển khai kế hoạch, Business Analyst sẽ làm việc với từng phòng ban cụ thể trong công ty như team dev, QC, Product,… để phối hợp xử lý vấn đề đang xảy ra.
  • BA sẽ theo dõi toàn bộ quá trình thay đổi để đánh giá hiệu suất và sự cải thiện của hoạt động thay đổi này. Họ sẽ giám sát liên tục để đảm bảo kết quả được tối ưu nhất cũng như khắc phục kịp thời các lỗi khác nếu có.
business analyst làm gì
Công việc hàng ngày của Business Analyst

Đây là quy trình làm việc cơ bản của một Business Analyst, tuy nhiên theo mỗi vị trí cụ thể, công việc của các BA sẽ có sự khác biệt:

1. Data Analyst

Như tên gọi, vị trí Data Analyst sẽ làm việc chủ yếu và gần như gắn bó với dữ liệu. Họ sẽ phụ trách việc thu thập toàn bộ số liệu, thể hiện nó ở dạng biểu đồ hoặc đồ thị sao cho người xem có thể dễ dàng hiểu cũng như dự đoán được kết quả sẽ xảy ra với số liệu đó.

2. Systems Analyst

Các chuyên viên phân tích hệ thống là một nhánh khác trong công việc của Business Analyst. Công việc này đòi hỏi nhân viên phải hiểu rõ hệ thống dữ liệu của công ty, có khả năng phân tích, đánh giá và thiết kế hệ thống để giải quyết các vấn đề mà doanh nghiệp đang gặp phải. Bên cạnh đó, việc đề xuất các giải pháp phát triển và tối ưu hệ thống từ sớm cũng là yêu cầu với vị trí này.

systems analyst
Systems Analyst gắn bó với việc nghiên cứu hệ thống

3. Management Analyst

Management Analyst còn được gọi là Chuyên gia tư vấn quản lý, họ giữ vai trò rất quan trọng trong công việc phân tích nghiệp vụ nói chung với các đề xuất để cải thiện hiệu quả của hoạt động kinh doanh. Họ là những người hiểu rõ vấn đề của doanh nghiệp để đề xuất hướng giải quyết vừa giúp tiết kiệm chi phí vừa tối ưu kết quả sản xuất.

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

Với một công việc hấp dẫn như vậy, mức lương của các Business Analyst cũng luôn nằm trong top so với mặt bằng thị trường việc làm.

Ngoài ra, để có thể tập trung phát triển đúng hướng đi công việc của mình, việc tìm hiểu từ trước những ngành học phục vụ cho ngành phân tích nghiệp vụ là rất cần thiết. Xem thêm Business Analyst Cần Học Gì Để Trở Thành Chuyên Gia Trong Ngành? để tìm hiểu bạn nhé!

Hi vọng những thông tin được chia sẻ trên đây đã giúp bạn phần nào hoàn thiện hiểu biết của mình với công việc Business Analyst. Theo dõi Topdev.vn/blog và đón đọc thêm nhiều bài viết hấp dẫn khác cùng chủ đề nhé!

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

Xem thêm công việc CNTT hấp dẫn trên TopDev

TOPDEV MOBILE APP VERSION 2.0 – Nâng Cấp Trải Nghiệm Tìm Việc IT Dành Cho Developer

Với mục tiêu giúp Developer nâng cao cơ hội chinh phục các nhà tuyển dụng, TopDev Mobile App cho ra mắt phiên bản 2.0 với nhiều tính năng đặc sắc, được kỳ vọng trở thành “trợ thủ” đắc lực cho các lập trình viên tại Việt Nam.

TopDev – Tìm việc IT” – Ứng dụng di động chính thức của trang TopDev.vn, lần đầu ra mắt vào tháng 7 năm 2021 đã nhận được sự hưởng ứng từ các Developer và những người đam mê công nghệ tại Việt Nam. TopDev Mobile Application tiếp tục cải tiến với phiên bản 2.0 mang đến những trải nghiệm độc đáo, giúp Developer tạo “điểm sáng” trong mắt nhà tuyển dụng.

Khám phá những tính năng nổi bật tại Version 2.0 của TopDev Mobile App:

1. Tạo CV chuẩn Developer ngay trên ứng dụng TopDev

Công cụ CV Builder của TopDev chắc hẳn không còn xa lạ với các Developer đang tìm kiếm việc làm IT tại Việt Nam. Bổ sung tính năng hấp dẫn này, TopDev Mobile App mang đến cho bạn cơ hội sở hữu chiếc CV chuẩn Developer chỉ bằng vài thao tác đơn giản ngay trên thiết bị di động. Bạn hoàn toàn có thể tạo/chỉnh sửa CV trên cả PC và Mobile App với các thông tin được cập nhật đầy đủ, chính xác và đồng bộ hóa giúp thuận tiện trong việc quản lý CV và ứng tuyển các vị trí phù hợp tại bất cứ nơi đâu. 

Tại phiên bản 2.0, TopDev Mobile App cung cấp các mẫu CV với cấu trúc chuẩn, được lựa chọn kỹ càng giúp Developer “ghi điểm” và rút ngắn khoảng cách với các doanh nghiệp mơ ước.

2. Cập nhật thông báo nhanh chóng và tiện lợi

Giờ đây, bạn sẽ không còn bỏ lỡ bất kỳ cơ hội hấp dẫn nào từ các công ty công nghệ tại TopDev khi đã cập nhật version 2.0 của TopDev Mobile App với tính năng thông báo nhanh chóng, tiện lợi. Kể từ lúc này, bạn có thể dễ dàng nắm bắt thông tin việc làm mới nhất từ các công ty công nghệ yêu thích, đồng thời có những trải nghiệm tốt và toàn diện hơn khi sử dụng ứng dụng.

3. Chuyển đổi ngôn ngữ sử dụng từ Anh sang Việt và ngược lại

Ngôn ngữ sẽ không còn là rào cản đối các Developer trong hành trình trải nghiệm các tính năng nổi bật tại TopDev Mobile App bởi sự linh hoạt trong việc chuyển đổi ngôn ngữ Anh – Việt. Với sự nâng cấp tại phiên bản 2.0, bạn được phép thay đổi dễ dàng từ tiếng Anh sang tiếng Việt và ngược lại, từ đó làm tăng khả năng tiếp nhận thông tin và trải nghiệm toàn diện.

Các tính năng thú vị như trên và nổi bật là Công cụ CV Builder nay đã có mặt tại Version 2.0 của TopDev Mobile App vươn tới mục tiêu tạo sự chuyên nghiệp cho các Developer tại Việt Nam và nâng cao khả năng chạm tay công việc IT mơ ước. Đặc biệt phiên bản mới của ứng dụng sẽ mang đến cơ hội cho các IT Fresher sở hữu chiếc CV “đầu tay” đầy ấn tượng và thu hút nhà tuyển dụng, rộng mở con đường sự nghiệp trong tương lai.

Khám phá thêm những tính năng hấp dẫn khác tại TopDev – Tìm việc IT

Cài đặt ứng dụng TopDev – Tìm việc IT để khám phá thị trường việc làm IT tại Việt Nam và sẵn sàng khởi sắc sự nghiệp của bạn ngay hôm nay!

Tải ngay ứng dụng tại đây:

 

Hướng dẫn cách cài đặt JOOMLA thông qua server XAMPP

cài đặt joomla

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

Chào các bạn, bên cạnh WordPress thì có lẽ Joomla là một trong những nền tảng mã nguồn mở cũng rất quen thuộc với giới webmaster trong việc tạo ra một trang web đơn giản, nhanh chóng và chuyên nghiệp.

Cũng giống như WordPress, chúng ta hoàn có thể cài đặt Joomla trên Xampp để chạy thử một trang web trên Localhost.

Vâng, và bài viết này mình sẽ cùng các bạn đi vào chi tiết từng bước cài đặt nhé. Đảm bảo bạn sẽ tự làm được một cách dễ dàng sau khi đọc hết bài viết này. Okay bắt đầu thôi nào!

Cách cấu hình và cài đặt JOOMLA trên XAMPP

+ Bước 1: Cài đặt Server Xampp

Xampp là chương trình tạo máy chủ web được tích hợp sẵn các công cụ như Apache, PHP, MySQL, FTP Server, Mail Server, phpMyAdmin.

Xampp server có chương trình quản lý khá tiện lợi, cho phép chủ động bật/tắt hoặc khởi động lại các dịch vụ máy chủ bất kỳ lúc nào.

Về phần hướng dẫn cài đặt thì mình đã có một bài hướng dẫn riêng, các bạn có thể tham khảo bài viết đó tại đây: Hướng dẫn cách cài đặt phần mềm Xampp trên Windows 10

  Xampp là gì? Cách sử dụng và cài đặt XAMPP

+ Bước 2: Download file cài đặt Joomla

Để download file cài đặt Joomla thì các bạn có thể truy cập vào link bên dưới rồi bấm download như hình là được: https://downloads.joomla.org/

cach-cai-dat-joomla-tren-xampp (1)

+ Bước 3: Di chuyển các file cài đặt Joomla vào server Xampp.

Sau khi cài đặt thì thông thường, Xampp sẽ nằm ở thư mục C:\xampp như hình bên dưới. Các bạn tìm thư mục htdocs => rồi truy cập vào trong thư mục đó.

cach-cai-dat-joomla-tren-xampp (2)

Tại đây, các bạn kéo (copy) cho mình file cài đăt Joomla các bạn vừa download ở Bước 2. Bản chất thì đây chỉ là một file .zip nên các bạn chỉ cần giải nén ra như hình bên dưới là được.

Chọn Extract to… để đỡ bị lộn xộn các bạn

cach-cai-dat-joomla-tren-xampp (3)

Cũng bên trong thư mục htdocs các bạn tạo cho mình một thư mục mới (tên thư mục các bạn có thể đặt tùy ý. Nhưng mình khuyên các bạn nên đặt nó trùng với tên trang web các bạn muốn tạo).

  Biết chọn gì đây? Flutter, React Native hay Xamarin?

Ví dụ ở đây mình tạo một thư mục joomla-web có tên như sau.

cach-cai-dat-joomla-tren-xampp (4)

Tiếp theo, các bạn vào bên trong thư mục vừa giải nén => và copy toàn bộ file, thư mục bên trong đó như hình bên dưới.

cach-cai-dat-joomla-tren-xampp (5)

Quay lại thư mục joomla-web vừa tạo bên trên các bạn paste toàn bộ các file, thư mục vừa copy vào đó.

cach-cai-dat-joomla-tren-xampp (6)

Cuối cùng, bạn quay lại thư mục htdocs và xóa đi file *.zip cũng như thư mục được giải nén ra để cho đỡ nhầm lẫn cũng như nếu có đẩy code lên server thì cũng nhẹ server hơn.

cach-cai-dat-joomla-tren-xampp (7)

+ Bước 4: Tạo thông tin User truy cập và Database cho trang web.

Đầu tiên, các bạn hãy bật Xampp lên và start cho mình hai module đó là: Apache và MySQL như hình bên dưới.

cach-cai-dat-joomla-tren-xampp (8)

Sau khi bật thì các bạn truy cập vào địa chỉ: http://localhost/phpmyadmin

cach-cai-dat-joomla-tren-xampp (9)

Tại tab User accounts, các bạn bấm vào Add user account như hình bên dưới.

cach-cai-dat-joomla-tren-xampp (10)

Sau đó, điền đầy đủ các thông user như: User namehost namepasswordretype password như hình bên dưới.

Lưu ý là mật khẩu các bạn nên đặt đủ mạnh để có thể bảo vệ thông tin, cũng như không bị cảnh báo khi cài đặt.

cach-cai-dat-joomla-tren-xampp (11)

Tiếp theo các bạn tích chọn Create database with same name and grant all privileges như hình bên dưới.

Việc tích này sẽ tạo ra một database có tên trùng với tên User các bạn vừa tạo.

cach-cai-dat-joomla-tren-xampp (12)

Cuối cùng, các bạn kéo xuống cuối và bấm Go để hoàn thành việc thiết lập thông tin người dùng cũng như Database cho trang web.

cach-cai-dat-joomla-tren-xampp (13)

Okay, nếu có thông báo như hình bên dưới là thành công rồi đó các bạn.

cach-cai-dat-joomla-tren-xampp (14)

+ Bước 5: Kết nối trang web tới Database vừa tạo

Đầu tiên các bạn truy cập vào đường dẫn: http://localhost/joomla-web như hình bên dưới.

cach-cai-dat-joomla-tren-xampp (15)

Trang web sẽ tự động chuyển hướng tới địa chỉ: http://localhost/installation/index.php . Tại đây các bạn chọn cho mình ngôn ngữ và đặt cho trang web các bạn muốn tạo.

=> Sau đó thì bấm vào Setup Login Data để sang bước kết nối tới database.

cach-cai-dat-joomla-tren-xampp (16)

Tiếp theo, các bạn sẽ điền một số thông tin để sau này kết nối tới web quản trị. Các bạn lưu ý là nhớ phải lưu lại các thông tin này để sử dụng cho phần sau nhé.

cach-cai-dat-joomla-tren-xampp (17)

Đây chính là bước kết nối tới cơ sở dữ liệu các bạn vừa tạo ở bước trước. Các bạn chỉ cần điền đúng thông tin như đã cài đặt sau đó bấm Install Joomla.

cach-cai-dat-joomla-tren-xampp (18)

Chờ một lát cho quá trình cài đặt hoàn tất thì sẽ có một giao diện như bên dưới xuất hiện. Tại đây các bạn có thể truy cập vào trang web người dùng cũng như trang quản trị (Admin) như hình bên dưới mình có ghi chú.

cach-cai-dat-joomla-tren-xampp (19)

Để vào trang web người dùng các bạn vào địa chỉ: http://localhost/joomla-web

cach-cai-dat-joomla-tren-xampp (20)

Để vào trang quản trị các bạn vào địa chỉ: http://localhost/joomla-web/administrator . Trang web sẽ tự động chuyển hướng tới: http://localhost/joomla-web/administrator/index.php

Tại đây các bạn sử dụng Username và Password đã lưu ở bước trước để đăng nhập vào.

cach-cai-dat-joomla-tren-xampp (21)

Sau khi đăng nhập thành công thì đây chính là trang web quản trị của Joomla.

cach-cai-dat-joomla-tren-xampp (22)

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

Lời kết

Okay, vậy là mình đã cùng các bạn cài đặt thành công Joomla trên Xampp server (có liên kết đến database ) rồi ha.

Tuy nhiên, đây chỉ là cách cài đặt Joomla trên Locahost với XAMPP Server mà thôi (có nghĩa là chỉ chạy trên máy tính của bạn).

Còn nếu bạn muốn người khác có thể truy cập vào được trang web của bạn thì các bạn sẽ phải thuê hosting hoặc VPS và sử dụng tên miền riêng cho trang web đó.

Mình sẽ cùng các bạn tìm hiểu trong các bài viết tiếp theo nha. Hẹn gặp lại các bạn trong các bài viết tiếp theo.

CTV: Nguyễn Đức Cảnh – Bài viết gốc được đăng tải tại blogchiasekienthuc.com

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

Xem thêm việc làm công nghệ hấp dẫn trên TopDev

Định nghĩa JSON Web Key Set cho Authorization Server sử dụng Spring Authorization Server và tập tin PKCS12 key store

json web key set
Định nghĩa JSON Web Key Set cho Authorization Server sử dụng Spring Authorization Server và tập tin PKCS12 key store

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

JSON Web Key Set là một tập hợp các public key JSON Web Key được cung cấp bởi Authorization Server, để cho Resource Server có thể verify access token được gửi bởi Client Application. Trong bài viết về Hiện thực OAuth Authorization Server sử dụng Spring Authorization Server, mình đã hướng dẫn các bạn cách định nghĩa JSON Web Key này sử dụng code. Thế nhưng cho các ứng dụng chạy trên production, vì vấn đề bảo mật, thông tin JSON Web Key thường sẽ được một bên khác quản lý, có thể là IT team. Họ sẽ generate một tập tin keystore, nhiệm vụ của chúng ta là sử dụng tập tin keystore này để định nghĩa JSON Web Key Set. Trong bài viết này, mình sẽ hướng dẫn các bạn cách định nghĩa JSON Web Key Set cho Authorization Server sử dụng Spring Authorization Server và tập tin PKCS12 key store các bạn nhé!

  Cách tạo REST API với JSON Server
  Ghi chú file package.json của node module

Xem thêm các chương trình tuyển dụng Spring hấp dẫn trên TopDev

Đầu tiên, mình sẽ generate một tập tin keystore với định dạng PKCS12 để làm ví dụ.

Kết quả như sau:

Thông thường chúng ta sẽ expose biến môi trường trỏ đến đường dẫn của tập tin .pfx để cho IT team họ cấu hình. Nhưng để đơn giản trong bài viết này, mình sẽ để tập tin .pfx này vào thư mục src/main/resources của project ví dụ trong bài viết Hiện thực OAuth Authorization Server sử dụng Spring Authorization Server:

Chúng ta sẽ khởi tạo đối tượng KeyStore của Java Security để hold thông tin của tập tin .pfx như sau:

KeyStore keyStore = KeyStore.getInstance("pkcs12");

Có nhiều phương thức overload của phương thức getInstance() mà các bạn có thể sử dụng. Ở đây, mình đang sử dụng getInstance() với tham số là type của keystore file. Các bạn có thể xem tất cả các keystore type mà Java hỗ trợ ở đây.

Nếu các bạn sử dụng password để bảo vệ tập tin keystore thì có thể lấy nội dung của tập tin keystore như sau:

try (FileInputStream fis = new FileInputStream("src/main/resources/huongdanjava.pfx")) {
keyStore.load(fis, "123456".toCharArray());
}

123456 là password của tập tin keystore.

Sau khi đã load nội dung tập tin keystore thì các bạn có thể convert nội dung này qua đối tượng JWKSet của thư viện Nimbus, thư viện mà mà Spring Authorization Server đang sử dụng để làm việc với access token, như sau:

JWKSet jwkSet = JWKSet.load(keyStore, new PasswordLookup() {
@Override
public char[] lookupPassword(String name) {
return "123456".toCharArray();
}
});

Khi convert nội dung tập tin keystore qua đối tượng JWKSet, chúng ta cần truyền thông tin password của private key. Với keystore type PKCS12 thì password của private key giống với password của tập tin keystore các bạn nhé!

Toàn bộ nội dung thức build thông tin đối tượng JWKSet của mình như sau:

private JWKSet buildJWKSet() throws KeyStoreException, NoSuchAlgorithmException,
CertificateException, FileNotFoundException, IOException {
KeyStore keyStore = KeyStore.getInstance("pkcs12");
try (FileInputStream fis = new FileInputStream("src/main/resources/huongdanjava.pfx")) {
keyStore.load(fis, "123456".toCharArray());

return JWKSet.load(keyStore, new PasswordLookup() {

@Override
public char[] lookupPassword(String name) {
return "123456".toCharArray();
}
});
}
}

Các bạn có thể sử dụng phương thức này khi việc xây dựng Authorization Server sử dụng Spring Authorization Server như mình! Khai báo cho đối tượng JWKSource lúc này trong Spring container như sau:

@Bean
public JWKSource<SecurityContext> jwkSource() throws NoSuchAlgorithmException, KeyStoreException,
CertificateException, FileNotFoundException, IOException {
JWKSet jwkSet = buildJWKSet();

return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
}

Các bạn có thể sử dụng đoạn code build JWKSet cho bất cứ keystore nào các bạn 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 nhiều Việc làm CNTT hấp dẫn trên TopDev

Lương Thiết Kế Đồ Họa & Nhu Cầu Nhân Lực Của Ngành Hiện Nay

lương thiết kế đồ họa
Lương Thiết Kế Đồ Họa & Nhu Cầu Nhân Lực Của Ngành Hiện Nay

Thiết kế đồ họa đã và đang là một trong những ngành nghề hot trên thị trường hiện nay. Các Graphic Designers luôn nhận được sự săn đón của nhiều công ty do nhu cầu phát triển thương hiệu cũng như tăng trưởng về doanh thu. Vậy nhu cầu nhân lực của thị trường với nhân viên thiết kế đồ họa hiện đang ra sao và mức lương thiết kế đồ họa có thật sự ấn tượng như lời đồn? Bài viết này sẽ giúp bạn hiểu rõ hơn về những điều này.

lương thiết kế đồ họa
Lương và nhu cầu nhân lực ngành thiết kế đồ họa

Nhu cầu nhân lực Graphic Designers trên thị trường hiện tại

Song hành với sự phát triển mạnh mẽ của công nghệ thông tin trong thời đại 4.0, các nhân viên thiết kế đồ họa cũng được săn lùng nhiều hơn cả nhờ nhu cầu phát triển các sản phẩm đẹp mắt, thu hút và đánh đúng tâm lý người tiêu dùng. Từ giao diện website UX/UI đến hình ảnh quảng bá sản phẩm,… yếu tố thẩm mỹ luôn được đánh giá cao nếu muốn thu hút người đối diện từ những cái nhìn đầu tiên.

Xem thêm các chương trình tuyển dụng UI UX Designer lương cao trên TopDev

Theo kết quả thống kê sơ bộ của Trung tâm dự báo Nhân lực và thị trường lao động, từ khoảng năm 2017 đến nay, nhu cầu nhân sự làm việc trong ngành thiết kế đồ họa luôn ở mức cao, với ít nhất 1.500.000 lao động. Dù các trường học cũng ngày càng mở rộng chuyên ngành đào tạo liên quan đến thiết kế cũng như đầu tư hơn cho chương trình giảng dạy chất lượng, nhưng tỷ lệ đáp ứng của các graphic designers vẫn chưa tương xứng với thị trường.

Mức lương thiết kế đồ họa dựa vào kinh nghiệm làm việc

Nếu có sự đầu tư đúng đắn và hướng đi nghiêm túc với nghề thiết kế đồ họa, bạn sẽ được phát triển năng lực chuyên môn với mức lương cực hấp dẫn. Theo đó, hiện nay mức lương thiết kế đồ họa có thể chia theo cấp bậc và kinh nghiệm làm việc.

1. Mức lương của Junior Graphic Designers

Đây là vị trí dành cho các sinh viên mới ra trường, chưa có nhiều kinh nghiệm làm việc chuyên nghiệp. Mức lương khởi điểm của nhân viên thiết kế đồ họa ở vai trò này hiện đang dao động trong khoảng từ 10,000,000 – 14,000,000 VNĐ.

Công việc mà các Junior Graphic Designers thực hiện sẽ chịu sự giám sát và hướng dẫn trực tiếp từ cấp trên của mình. Ngoài ra, phụ thuộc vào nhiều yếu tố khách quan khác như giờ làm thêm, số lượng dự án cũng như khả năng làm việc tốt so với số năm kinh nghiệm, mức lương mà bạn nhận được thậm chí còn có thể cao hơn so với mức trung bình trên.

  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
graphic designer
Mức lương khởi điểm của Junior Graphic Designer khá ổn so với mặt bằng chung

2. Mức lương của Mid-Senior Graphic Designers

Với trình độ mid senior, các nhân viên thiết kế đồ họa thường đã có từ 3 – 5 năm kinh nghiệm làm việc trong ngành, do đó họ có thể tự chủ và độc lập hơn trong công việc. Cũng vì thế mà yêu cầu cũng như đòi hỏi dành cho sản phẩm của một Mid-Senior Graphic Designers sẽ cao hơn so với khi mới bắt đầu công việc của mình.

  Làm sao để chuyển đổi từ Graphic Design sang UX Design? (phần 1)

Theo một số tin đăng tuyển dụng hiện nay, mức lương thiết kế đồ họa với trình độ này hiện đang nằm trong khoảng từ 15,000,000 – 20,000,000 VNĐ. Đây có thể xem là một mức lương khá hấp dẫn so với mặt bằng chung ở cùng trình độ này.

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

3. Mức lương của Senior Graphic Designers

Đây là vị trí cao và nhân viên thiết kế đồ họa đã đạt được những thành tựu vững chắc trong công việc. Ở vai trò này, bạn chịu sự quản lý của trưởng phòng và làm tất cả mọi việc từ gặp gỡ khách hàng, trao đổi ý tưởng, lên phương án thiết kế và hoàn thiện dự án một cách hoàn toàn độc lập. Bên cạnh đó, các Senior Graphic Designers cũng quản lý và phân công nhiệm vụ cho các cấp dưới của mình.

senior graphic designer
Mức lương của Senior Graphic Designers rất hấp dẫn trên thị trường

Mức lương của các Senior Graphic Designers hiện đang không dưới 20.000.000 VNĐ. Với kinh nghiệm làm việc trên 5 năm và có nhiều sản phẩm chất lượng, một Senior Graphic Designers hoàn toàn có thể được săn lùng nhiệt tình với mức lương từ 800 – 2000 USD (20 ~ 40 triệu đồng/tháng).

Tính lương gross to net chuẩn xác ngay!

4. Mức lương của các Graphic Design Freelancers

Làm việc từ xa cũng là lựa chọn được khá nhiều các nhân viên thiết kế đồ họa ưa chuộng hiện nay. Với tính chất công việc khá linh hoạt và không hoàn toàn bắt buộc phải có mặt ở văn phòng, nhiều bạn trẻ lựa chọn cho mình việc làm freelance, tự do nhưng vẫn đảm bảo mức thu nhập ổn định.

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

Khi hoạt động tự do, các Graphic Designers sẽ chủ động trong việc tìm kiếm các dự án, các sản phẩm phù hợp với khả năng của mình để làm việc. Do đó, để hoạt động tốt, việc cần có mối quan hệ rộng cũng như một danh tiếng khá ổn trong ngành là điều cần thiết nếu bạn muốn duy trì lượng dự án ổn định và thu nhập không bị gián đoạn.

Tùy theo mỗi sản phẩm khác nhau cũng như khả năng làm việc của mỗi cá nhân mà mức lương thiết kế đồ họa hoạt động freelance sẽ không giống nhau. Có thể là tính theo sản phẩm hoặc tính theo thời gian làm việc. Có những sản phẩm bạn nhận mức lương khoảng vài trăm ngàn đến những dự án khoảng vài chục triệu đồng với thời gian kéo dài. Điều này hoàn toàn phụ thuộc vào khả năng làm việc của các Graphic Design Freelancers.

Thiết kế đồ họa thật sự là một ngành nghề hấp dẫn từ thu nhập đến cơ hội nghề nghiệp. Nếu có sự đầu tư kỹ lưỡng và nghiêm túc theo đuổi công việc, bạn hoàn toàn có thể tìm được chỗ đứng vững chắc trong nghề cho mình. Đón đọc thêm nhiều bài viết hấp dẫn với các chủ đề đa dạng tại Topdev.vn/blog nhé!

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

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

IoT là gì? Những ứng dụng tuyệt vời của IoT trong cuộc sống

iot là gì
IoT là gì? Những ứng dụng tuyệt vời của IoT trong cuộc sống

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

Đa số các doanh nghiệp hiện nay đều muốn tích hợp IoT vào các sản phẩm do chính họ sản xuất, để nâng cao chất lượng sản phẩm và trải nghiệm của người dùng.

Còn về phần khách hàng thì đương nhiên, họ cũng ưu tiên các sản phẩm có tích hợp IoT, vì nó rất đa năng và cung cấp được nhiều thông tin hữu ích hơn.

Vậy IoT là gì? và IoT làm được những gì? Nếu bạn là một người thích công nghệ thì hãy cùng mình tìm hiểu kỹ hơn về IoT trong bài viết này nhé.

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

IoT là gì?

IoT là viết tắt của cụm từ Internet of Things – dịch ra Tiếng Việt nghĩa là Internet vạn vật hoặc vạn vật kết nối. Mình vẫn thích cái tên Vạn vật kết nối hơn, vì cái tên của nó đã nói lên tất cả rồi!

IoT là gì?

Ý tưởng về IoT đã được xuất phát từ những năm 1982, khi mà nó được tích hợp vào một máy bán nước Coca-Cola tại Đại học Carnegie Mellon.

Qua quá trình xử lý, máy bán nước này đã trở thành thiết bị IoT đầu tiên được kết nối với Internet, các chức năng của nó gồm báo cáo kiểm kho và báo cáo độ lạnh của những chai nước khi mới được cho vào máy.

IoT là một trong 3 yêu tố cốt lõi của cuộc cách mạng công nghiệp 4.0. Và theo định nghĩa của Wikipedia về IoT thì:

“Internet of Things là một kịch bản của thế giới, khi mà mỗi đồ vật, mỗi con người được cung cấp một mã định danh của riêng mình.

Và tất cả đều có khả năng truyền tải, trao đổi thông tin, dữ liệu qua một mạng duy nhất mà không cần đến sự tương tác trực tiếp giữa người với người, hay người với máy tính.

IoT đã phát triển từ sự hội tụ của công nghệ không dây, công nghệ vi cơ điện tử và Internet.

Hay nói đơn giản là một tập hợp các thiết bị có khả năng kết nối với nhau, với Internet và với thế giới bên ngoài để thực hiện một công việc nào đó.”

>> Xem thêm: 5G & IoT hứa hẹn điều gì trong tương lai?

Cấu trúc của hệ thống IoT

Kiến trúc của một hệ thống IoT được chia thành bốn lớp khác nhau: Lớp Cảm Biến, Lớp Mạng, Lớp Xử Lý Dữ Liệu và Lớp Ứng Dụng.

Cấu trúc của hệ thống IoT

Lớp Cảm Biến (Sensor Layer)

Chức Năng

Lớp cảm biến là lớp đầu tiên trong kiến trúc IoT và chịu trách nhiệm thu thập dữ liệu từ nhiều nguồn khác nhau. Các cảm biến và thiết bị chấp hành được đặt trong môi trường để thu thập thông tin về nhiệt độ, độ ẩm, ánh sáng, âm thanh và các thông số vật lý khác.

Thành Phần

  • Cảm Biến: Các cảm biến đo lường các thông số vật lý và chuyển đổi chúng thành tín hiệu điện tử.
  • Thiết Bị Chấp Hành (Actuator): Các thiết bị này thực hiện các hành động dựa trên dữ liệu thu thập được, ví dụ như bật/tắt đèn, điều chỉnh nhiệt độ.
  • Giao Thức Truyền Thông: Các cảm biến và thiết bị chấp hành kết nối với nhau qua các giao thức truyền thông có dây hoặc không dây như Zigbee, Bluetooth, WiFi.

Lớp Mạng (Network Layer)

Chức Năng

Lớp mạng chịu trách nhiệm cung cấp khả năng kết nối và truyền thông giữa các thiết bị trong hệ thống IoT. Lớp này bao gồm các giao thức và công nghệ cho phép các thiết bị kết nối và trao đổi dữ liệu với nhau cũng như với internet.

Thành Phần

  • Công Nghệ Mạng: WiFi, Bluetooth, Zigbee, và các mạng di động như 4G, 5G.
  • Gateway và Router: Các thiết bị này hoạt động như trung gian giữa các thiết bị IoT và internet, đảm bảo dữ liệu được truyền tải một cách hiệu quả và bảo mật.
  • Tính Năng Bảo Mật: Mã hóa và xác thực để bảo vệ dữ liệu khỏi truy cập trái phép.

Lớp Xử Lý Dữ Liệu (Data Processing Layer)

Chức Năng

Lớp xử lý dữ liệu bao gồm các thành phần phần mềm và phần cứng chịu trách nhiệm thu thập, phân tích và diễn giải dữ liệu từ các thiết bị IoT. Lớp này nhận dữ liệu thô từ các thiết bị, xử lý và làm cho dữ liệu sẵn sàng cho các phân tích hoặc hành động tiếp theo.

Thành Phần

  • Hệ Thống Quản Lý Dữ Liệu: Các hệ thống lưu trữ và quản lý dữ liệu thu thập từ các thiết bị IoT.
  • Nền Tảng Phân Tích: Các công cụ và nền tảng để phân tích dữ liệu, chẳng hạn như các thuật toán học máy và các hệ thống phân tích dữ liệu.
  • Hồ Dữ Liệu (Data Lake): Kho lưu trữ tập trung để lưu trữ dữ liệu thô từ các thiết bị IoT, cho phép xử lý và phân tích sau này.

Lớp Ứng Dụng (Application Layer)

Chức Năng

Lớp ứng dụng là lớp trên cùng của kiến trúc IoT và tương tác trực tiếp với người dùng cuối. Lớp này chịu trách nhiệm cung cấp các giao diện và chức năng thân thiện với người dùng, cho phép người dùng truy cập và điều khiển các thiết bị IoT.

Thành Phần

  • Phần Mềm và Ứng Dụng: Các ứng dụng di động, cổng web và các giao diện người dùng khác được thiết kế để tương tác với hạ tầng IoT bên dưới.
  • Dịch Vụ Middleware: Cho phép các thiết bị và hệ thống IoT khác nhau giao tiếp và chia sẻ dữ liệu một cách liền mạch.
  • Khả Năng Phân Tích và Xử Lý: Bao gồm các công cụ phân tích dữ liệu, thuật toán học máy và công cụ trực quan hóa dữ liệu để chuyển đổi dữ liệu thành các thông tin hữu ích.

IoT hoạt động ra sao?

IoT hoạt động giống như một máy tính, nó có vi xử lý riêng, được trang bị các cảm biến để ghi lại các thay đổi của môi trường xung quanh, sau đó dữ liệu này sẽ được xử lý để đưa ra kết quả cho người dùng.

Hiện nay, các thiết bị IoT có thể giao tiếp được với nhau nhưng không nhiều, và quy mô chưa thực sự lớn.

Chỉ có những nhà sản xuất thiết bị IoT bắt tay, hợp tác với nhau thì chúng ta mới có các thiết bị giao tiếp được với nhau, còn không thì chỉ các sản phẩm cùng chung nhà sản xuất mới có thể giao tiếp được với nhau.

IoT hoạt động ra sao?

Các thiết bị IoT giao tiếp với nhau là sao?

Vâng, có nghĩa là thiết bị này có thể lấy được thông tin từ thiết bị khác và ngược lại để bổ sung cho nhau. Và điều đặc biệt là..

.. hoạt động này không cần đến sự can thiệp của con người. Điều này giúp giảm thiểu vấn đề về chi phí và tốc độ, từ đó tối ưu, cũng như tận dụng tốt hơn các data thu thập được để trả kết quả về cho người dùng.

Khám phá thêm việc làm intern hấp dẫn trên TopDev

Những tính chất và đặc điểm của IoT

Internet of Things (IoT) là một công nghệ tiên tiến đang thay đổi cách chúng ta tương tác với thế giới xung quanh. Dưới đây là những tính chất và đặc điểm chính của IoT giúp nó trở thành một trong những công nghệ phổ biến và có ảnh hưởng lớn hiện nay.

Những tính chất và đặc điểm của IoT

Kết Nối (Connectivity): Kết nối là tính chất cơ bản và quan trọng nhất của IoT. Các thiết bị IoT có khả năng kết nối với nhau và với Internet thông qua các giao thức mạng như WiFi, Bluetooth, Zigbee, và các mạng di động như 4G và 5G. Khả năng kết nối liên tục này cho phép các thiết bị giao tiếp, trao đổi dữ liệu và thực hiện các tác vụ phức tạp mà không cần sự can thiệp trực tiếp của con người, tạo nên một mạng lưới thông minh và linh hoạt.

Tính Tương Tác (Interactivity): IoT cho phép các thiết bị tương tác với nhau và với con người một cách dễ dàng và hiệu quả. Các thiết bị có thể thu thập dữ liệu, phân tích và thực hiện các hành động dựa trên các lệnh từ người dùng hoặc các thiết bị khác. Tính tương tác này mang lại sự linh hoạt và tiện ích, giúp cải thiện trải nghiệm người dùng và tối ưu hóa quy trình hoạt động trong nhiều lĩnh vực, từ gia đình thông minh đến sản xuất công nghiệp.

Thu Thập và Xử Lý Dữ Liệu (Data Collection and Processing): IoT có khả năng thu thập một lượng lớn dữ liệu từ môi trường thông qua các cảm biến và thiết bị khác. Sau đó, dữ liệu này được xử lý để tạo ra thông tin hữu ích. Các công cụ phân tích và học máy được sử dụng để trích xuất những hiểu biết có ý nghĩa từ dữ liệu thu thập được, giúp đưa ra các quyết định thông minh và kịp thời. Điều này đặc biệt quan trọng trong các ứng dụng như giám sát sức khỏe, quản lý năng lượng, và tự động hóa công nghiệp.

Tính Tự Động Hóa (Automation): IoT cho phép tự động hóa các quy trình và hoạt động, từ đó giúp cải thiện hiệu suất và giảm thiểu sự can thiệp của con người. Các thiết bị IoT có thể tự động thực hiện các hành động dựa trên dữ liệu thu thập được và các quy tắc đã được thiết lập trước. Điều này không chỉ giúp tiết kiệm thời gian và chi phí mà còn nâng cao độ chính xác và hiệu quả trong các hoạt động hàng ngày và các quy trình công nghiệp.

Tính Mở Rộng (Scalability): IoT có khả năng mở rộng dễ dàng, từ một vài thiết bị đơn lẻ đến hàng triệu thiết bị kết nối với nhau. Khả năng mở rộng linh hoạt này cho phép các hệ thống IoT thích ứng với nhu cầu thay đổi của môi trường kinh doanh và công nghệ. Việc quản lý tập trung và khả năng mở rộng không giới hạn giúp các doanh nghiệp và tổ chức dễ dàng triển khai và mở rộng các giải pháp IoT theo nhu cầu phát triển.

Tính Bảo Mật (Security): Bảo mật là một tính chất quan trọng của IoT, đảm bảo rằng dữ liệu và các thiết bị được bảo vệ khỏi các mối đe dọa và tấn công mạng. Các thiết bị IoT sử dụng các cơ chế mã hóa và xác thực để bảo vệ dữ liệu khỏi truy cập trái phép và đảm bảo tính toàn vẹn của thông tin. Việc đảm bảo an ninh dữ liệu là yếu tố then chốt giúp xây dựng lòng tin và bảo vệ quyền riêng tư của người dùng trong các ứng dụng IoT.

Tính Tương Thích (Interoperability): IoT yêu cầu tính tương thích cao giữa các thiết bị và hệ thống khác nhau để đảm bảo các thiết bị có thể giao tiếp và làm việc cùng nhau một cách hiệu quả. Hỗ trợ đa giao thức và tích hợp dễ dàng với các công nghệ và hệ thống hiện có giúp IoT trở thành một giải pháp linh hoạt và dễ triển khai trong nhiều lĩnh vực khác nhau, từ nhà thông minh đến thành phố thông minh và công nghiệp 4.0.

Tính Tiết Kiệm Năng Lượng (Energy Efficiency): Tiết kiệm năng lượng là một tính chất quan trọng của IoT, đặc biệt đối với các thiết bị di động và cảm biến hoạt động trong thời gian dài mà không cần thay pin thường xuyên. Các thiết bị IoT sử dụng các chiến lược quản lý năng lượng thông minh để giảm thiểu tiêu thụ năng lượng và kéo dài tuổi thọ pin, giúp giảm chi phí vận hành và bảo vệ môi trường.

Khám phá cơ hội việc làm Java hấp dẫn trên TopDev

Ưu điểm của IoT

IoT cho phép thực hiện nhiều nhiệm vụ cùng một lúc như một chiếc máy tính, giúp tối ưu hóa hiệu suất làm việc và tiết kiệm thời gian.

Việc kết nối Internet trở nên dễ dàng hơn, cho phép các thiết bị giao tiếp và trao đổi dữ liệu một cách hiệu quả. Nhờ vào cổng HDMI, các thiết bị IoT có thể hoạt động ở chế độ giao diện người dùng đồ họa (GUI), mang lại trải nghiệm sử dụng thân thiện hơn.

IoT rất phù hợp cho các ứng dụng dựa trên máy chủ, cho phép kết nối từ xa thông qua SSH (Secure Shell) để truy cập dòng lệnh của thiết bị và chia sẻ tệp tin qua FTP (File Transfer Protocol).

IoT cũng đáng tin cậy hơn cho các ứng dụng phần mềm, giúp đảm bảo tính ổn định và hiệu suất cao.

Nhược điểm của IoT

Một trong những mối quan ngại lớn nhất về IoT là vấn đề bảo mật và nguy cơ bị tấn công hoặc lộ dữ liệu. Vấn đề quyền riêng tư cũng là một yếu tố cần xem xét, liên quan đến việc thu thập và sử dụng dữ liệu cá nhân. Sự phụ thuộc vào công nghệ và khả năng gặp sự cố hệ thống cũng là một rủi ro. Việc thiếu tiêu chuẩn hóa và khả năng tương tác giữa các thiết bị có thể gây ra khó khăn trong việc tích hợp hệ thống.

IoT cũng đòi hỏi sự phức tạp và yêu cầu bảo trì cao hơn, cùng với chi phí đầu tư ban đầu cao. Thời lượng pin hạn chế trên một số thiết bị là một hạn chế khác cần lưu ý. Ngoài ra, còn có mối lo ngại về việc thay thế lao động do tự động hóa. Việc thiếu khung pháp lý và quy định rõ ràng về IoT cũng có thể dẫn đến sự mơ hồ và không chắc chắn.

>> Đọc thêm: Xu hướng phát triển của IoT hiện nay

Ứng dụng của IoT

IoT hiện đang được ứng dụng rộng rãi trong nhiều lĩnh vực khác nhau, mang lại những tiện ích và hiệu quả đáng kể.

  • Hỗ trợ con người trong việc quản lý chất thải, các cảm biến được sử dụng trong các nhà máy xử lý rác thải sẽ cung cấp một nguồn thông tin đáng giá về chất lượng nước thải, về các chỉ số môi trường,… Việc này đem lại kết quả chính xác và tránh được những ảnh hưởng tiêu cực lên sức khỏe của những người công nhân so với việc lấy mẫu trực tiếp từ khu xử lý rác.
  • Quản lý đô thị, tận dụng các cảm biến của tất cả các xe đang lưu thông trên đường phố, chúng ta có thể lọc ra những con đường đã, đang và chuẩn bị tắc nghẽn, từ đó đề xuất những giải pháp kịp thời để tránh hiện tượng kẹt xe.
  • Nhà thông minh, loa thông minh, thiết bị đeo thông minh, tủ lạnh thông minh, máy giặt thông minh, điều hòa thông minh, đèn thông minh, rèm cửa thông minh,…. Tất cả đều trở nên thông minh hơn nhờ vào IoT. Nếu bạn tận dụng tốt dữ liệu từ các thiết bị IoT này, các thiết bị IoT có thể hoạt động một cách tự động mà không cần đến sự điều khiển trực tiếp của con người.
  • Trong lĩnh vực y tế, IoT được sử dụng trong các bệnh viện và ứng dụng y tế từ xa, với các thiết bị như chip sinh học cho động vật nuôi, thiết bị theo dõi tim cấy ghép (ví dụ như máy tạo nhịp tim, theo dõi ECG theo thời gian thực).

Ví dụ như bạn đang trên đường chuẩn bị về nhà, cửa thông minh lúc này nhận biết được bạn là chủ nhà (nhờ vào thiết bị đeo thông minh trên tay bạn) thì nó sẽ tự mở cửa ra. Cùng lúc đó, điều hòa sẽ tự động được bật, rèm cửa tự mở ra để lấy ánh sáng,… Tất cả sẽ được tự động hóa hoàn toàn.

Trên đây chỉ là một chút ít thông tin về những thứ mà IoT có thể làm được, khả năng của IoT là rất lớn, trải dài trên nhiều lĩnh vực khác nhau. Nếu bạn tò mò thì có thể tìm hiểu thêm trên Google nhé.

Ứng dụng của IoT

IoT sẽ phát triển như thế nào trong tương lai?

Trong tương lai, để IoT có thể phát triển nhanh và mạnh thì mình nghĩ là các công ty sản xuất cần phải bắt tay, hợp tác với nhau, để cùng tạo ra những tiêu chuẩn chung, một tiêu chuẩn Quốc tế.

Để những thiết bị IoT từ bất cứ nhà sản xuất nào cũng đều có thể giao tiếp được với nhau, như vậy sẽ tận dụng được triệt để lượng data mà các thiết bị thu nhận được.

Hoặc do xảy ra một biến cố nào đó cũng sẽ giúp cho IoT phát triển nhanh hơn. Ví dụ như đại dịch Covid – 19 ở thời điểm hiện tại đã đẩy nhanh quá trình chuyển đổi số của rất nhiều cơ quan, tổ chức, công ty, trường học,…  vì vậy khả năng này cũng có thể xảy ra.

Và rõ ràng rồi, Tiền cũng là một trở ngại để IoT có thể phát triển, vì nhân công ở một vài quốc gia có giá rất rẻ. Vậy nên, việc sử dụng công nhân sẽ được ưu tiên hơn so với việc đầu tư vào các thiết bị IoT đắt tiền, hơn nữa, nhiều doanh nghiệp cũng không có một lượng tiền lớn ngay từ đầu để đầu tư được.

Nên theo mình thấy, cũng cần phải thêm một thời gian dài nữa để các nhà sản xuất thiết bị IoT có thể tối ưu hóa được quy trình sản xuất của họ, từ đó giảm được chi phí sản xuất thì may ra các thiết bị IoT mới dần dần trở nên phổ biến hơn.

Lời Kết

Vậy là mình đã giải thích cho bạn khá chi tiết về IoT rồi nhé. Qua bài viết này thì mình tin là bạn đã hiểu được IoT là gì rồi và những ứng dụng của IoT trong cuộc sống thường nhật chúng ta sau này.

Trong tương lai, chắc chắn IoT sẽ là một phần quan trọng bậc nhất trong cuộc sống hằng ngày, vì vậy hãy cùng chờ đợi những lợi ích mà IoT đem lại nhé các bạn

Được cập nhật và update bởi TopDev từ bài viết gốc blogchiasekienthuc.com

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

Xem thêm tuyển dụng CNTT hấp dẫn trên TopDev

Hướng dẫn cài đặt WORDPRESS trên SERVER XAMPP

cài đặt wordpress trên xampp
Hướng dẫn cài đặt WORDPRESS trên SERVER XAMPP

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

Chào các bạn, mã nguồn WordPress có lẽ đã không còn xa lạ gì với nhiều người nữa rồi, đặc biệt là với những anh em lập trình viên và giới Webmaster (quản trị web).

WordPress là một nền tảng mã nguồn mở cho phép người dùng có thể tạo ra các trang web một cách cực kỳ chuyên nghiệp và nhanh chóng. Có thể bạn chưa biết, bản thân Blog Chia Sẻ Kiến Thức mà các bạn đang truy cập đây cũng được xây dựng trên mã nguồn WordPress đó

Có rất nhiều cách để triển khai một trang web với nền tảng WordPress, nhưng trong bài viết này, mình sẽ hướng dẫn cho các bạn cách cài đặt trực tiếp WordPress thông qua server Xampp.

Xem thêm các chương trình tuyển dụng Xamarin hấp dẫn trên TopDev

Cách này rất phù hợp cho các bạn newber muốn làm quen với WordPress trước khi quyết định thuê Hosting hoặc VPS để xây dựng một trang web hoàn chỉnh. Okay, giờ thì bắt đầu thôi !

#1. Cách cấu hình và cài đặt WORDPRESS trên SERVER XAMPP

+ Bước 1: Cài đặt Server Xampp

Xampp là một chương trình tạo máy chủ web được tích hợp sẵn các công cụ như Apache, PHP, MySQL, FTP Server, Mail Server, phpMyAdmin.

Xampp Server có chương trình quản lý khá tiện lợi, giao diện thân thiện, cho phép người dùng chủ động bật/tắt hoặc khởi động lại các dịch vụ máy chủ bất kỳ lúc nào.

Về phần hướng dẫn cài đặt Xampp thì mình đã có một bài viết hướng dẫn rất chi tiết rồi, các bạn có thể tham khảo tại đây nha: Hướng dẫn cách cài đặt phần mềm Xampp trên Windows 10

  Xampp là gì? Cách sử dụng và cài đặt XAMPP

+ Bước 2: Tải File cài đặt WordPress

Để download file cài đặt WordPress về thì các bạn có thể truy cập vào link bên dưới => rồi bấm vào nút DOWNLOAD như hình là được:

https://wordpress.org/download/#download-install

cai-dat-wordpress-tren-server-xampp (1)

+ Bước 3: Di chuyển các File cài đặt WordPress vào Xampp Server.

Sau khi cài đặt xong, thông thường Xampp sẽ nằm ở thư mục: C:\xampp như hình bên dưới. Các bạn tìm cho mình thư mục htdocs => rồi mở thư mục đó ra.

cai-dat-wordpress-tren-server-xampp (2)

Hình bên dưới là các thư mục có trong thư mục htdocs, bây giờ bạn hãy tạo mới một thư mục để chứa mã nguồn của trang web mà các bạn muốn tạo (tên thư mục các bạn có thể đặt trùng với tên trang web luôn cho dễ quản lý).

Ví dụ mình sẽ tạo một thư mục có tên blogchiasekienthuc như hình bên dưới.

cai-dat-wordpress-tren-server-xampp (3)

Sau khi tạo xong thư mục trang web thì các bạn copy mã nguồn của WordPress vừa download về ở Bước 2 vào bên trong thư mục đó.

=> Tại đây các bạn giải nén file đó ra: Nhấn chuột phải vào file wordpress.zip => và chọn Extract Here..

cai-dat-wordpress-tren-server-xampp (4)

Sau khi giải nén file xong thì các bạn sẽ được một thư mục có tên là wordpress. Các bạn hãy copy toàn bộ các file và thư mục có trong thư mục wordpress này.

cai-dat-wordpress-tren-server-xampp (5)

Sau đó, quay trở lại thư mục mà các bạn vừa tạo ở bước trước => rồi paste toàn bộ vào thư mục đó.

Sau khi paste xong thì các bạn có thể xóa bỏ file mã nguồn và các thư mục sau khi giải nén như hình bên dưới (xóa bỏ để cho nhẹ trang web).

cai-dat-wordpress-tren-server-xampp (6)

+ Bước 4: Tạo thông tin User truy cập và Database cho trang web.

Đầu tiên, các bạn hãy bật Xampp lên và start cho mình 2 module đó là: Apache và MySQL như hình bên dưới. Hiện chữ Stop tức là chương trình đang chạy rồi nhé các bạn.

cai-dat-wordpress-tren-server-xampp (7)

Sau khi bật xong => các bạn hãy mở trình duyệt web ra => và truy cập vào địa chỉ: http://localhost/phpmyadmin

cai-dat-wordpress-tren-server-xampp (8)

Tại tab User accounts các bạn bấm vào Add user account như hình bên dưới.

cai-dat-wordpress-tren-server-xampp (9)

Sau đó, bạn hãy điền đầy đủ các thông user như: User namehost namepasswordretype password như hình bên dưới.

Lưu ý là mật khẩu các bạn nên đặt đủ mạnh để có thể bảo vệ thông tin, cũng như không bị cảnh báo khi cài đặt.

cai-dat-wordpress-tren-server-xampp (10)

Tiếp tục, các bạn tích chọn Create database with same name and grant all privileges như hình bên dưới.

Việc tích vào lựa chọn này sẽ tạo ra một Database có tên trùng với tên User mà các bạn vừa tạo.

cai-dat-wordpress-tren-server-xampp (11)

Cuối cùng, các bạn kéo xuống cuối và bấm Go để hoàn thành việc thiết lập thông tin người dùng cũng như Database cho trang web.

cai-dat-wordpress-tren-server-xampp (12)

Okay, nếu có thông báo như hình bên dưới là thành công rồi đó các bạn.

cai-dat-wordpress-tren-server-xampp (13)

+ Bước 5: Kết nối trang web tới Database vừa tạo.

Bây giờ, các bạn truy cập vào đường dẫn: http://localhost/blogchiasekienthuc

Tại đây các bạn chọn ngôn ngữ là tiếng Anh (English – United States) => rồi bấm Continue như hình bên dưới.

cai-dat-wordpress-tren-server-xampp (14)

Ở bước tiếp theo các bạn bấm Let’s go.

cai-dat-wordpress-tren-server-xampp (15)

Điền đầy đủ các thông tin mà các bạn vừa thiết lập ở Bước 4 bên trên => rồi sau đó bấm Submit

cai-dat-wordpress-tren-server-xampp (16)

Okay, ở bước này bấm Run the installation các bạn nhé.

cai-dat-wordpress-tren-server-xampp (17)

Sau đó sẽ đến bước các bạn thiết lập thông tin cho trang web. Các thông tin này bao gồm tên trang web (Site Title), tên người dùng (Username), mật khẩu (password) và email của các bạn.

=> Cuối cùng thì bấm Install WordPress để bắt đầu cài đặt trang web.

cai-dat-wordpress-tren-server-xampp (18)

Okay, như vậy là cài đặt thành công rồi đó các bạn. Tiếp theo các bạn bấm vào Log in để truy cập vào trang web.

cai-dat-wordpress-tren-server-xampp (19)

Điền thông tin đăng nhập là Email hoặc username và mật khẩu các bạn thiết lập bên trên để đăng nhập.

cai-dat-wordpress-tren-server-xampp (20)

Trang web sẽ gồm có hai phần, đó là phần web admin và web người dùng (hiển thị nội dung cho người dùng)

Dưới đây là địa chỉ truy cập vào trang admin: http://localhost/blogchiasekienthuc/wp-admin/

cai-dat-wordpress-tren-server-xampp (21)

Và đây sẽ là trang web hiển thị cho người dùng (phần này mọi người sẽ có thể truy cập được sau khi bạn gắn tên miền và public ra Internet)

Địa chỉ trang web (local) như sau: http://localhost/blogchiasekienthuc/

cai-dat-wordpress-tren-server-xampp (22)

Okay, giờ thì bạn có thể thỏa mái khám phá các tính năng có trong WordPress rồi, bạn có thể thỏa mái test tính năng, test plugin, tes theme… và làm những gì mà bạn muốn với một trang web WordPress.

  50 keywords mà mọi JAVA developer nên biết

#2. Lời kết

Okay, như vậy là mình đã hướng dẫn rất chi tiết cho các bạn cách cài đặt WordPress có liên kết đến database thông qua Xampp rồi nhé..

Tuy nhiên, đây chỉ là những bước cài đặt ở Local, nếu các bạn muốn người dùng có thể truy cập được trang web của bạn thì các bạn sẽ phải mua (thuê) Hosting hoặc VPS (máy chủ ảo) và sử dụng tên miền cho trang web đó.

Nhưng việc cài đặt WordPress trên SERVER XAMPP chưa bao giờ là thừa, vì ngay cả khi bạn đã biết cách đưa website của bạn lên Internet thì bạn vẫn cần dùng đến nó để test tính năng.

Okay, mình sẽ cùng các bạn tìm hiểu trong các bài viết tiếp theo nha. Hẹn gặp lại các bạn trong các bài viết tiếp theo.

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

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

Xem thêm tuyển dụng CNTT hấp dẫn trên TopDev

Selenium IDE – Record and Playback trên nhiều trình duyệt

selenium ide
Selenium IDE – Record and Playback trên nhiều trình duyệt

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

Hiện tại thì Selenium IDE hỗ trợ Playback trên IE, Chrome, Opera… Nhưng do các bước thiết lập để chạy trên các browser khác nhau là như nhau nên ở đây mình chỉ hướng dẫn các bạn làm với IE.

Điều kiện cần để Record và Playback

Để chạy được Selenium IDE Playback trên IE, chúng ta cần một số thứ như sau:

  • Selenium IDE – Cái này chắc chắn rồi hen.
  • Java – Cái này dùng để tạo môi trường cho hai cái sau.
  • Selenium Server – Cái này dùng để dịch các câu lệnh trên Selenium IDE ra mã Java để điều khiển IE. Đây cũng là một phần quan trọng của Selenium khi các bạn sử dụng Selenium RC (Selenium 1). Link để download phần này.
  • IEDriverServer – Cái này dùng để tạo ra một IE browser nhận lệnh từ Selenium Server và chạy. Đây là phần thiết yếu khi các bạn viết script để chạy trên Selenium WebDriver (Selenium 2) với IE browser. Khi các bạn muốn Playback trên các browser khác thì các bạn thay đổi loại DriverServer này là được. Link để download phần này.
  Download, Export file tự động với Selenium Webdriver
  Firefox profile preferences để download file với Selenium Webdriver

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

Các bước thiết lập hệ thống.

Bước 1: Kiểm tra Java

Chúng ta mở Command Line lên và chạy câu lệnh sau:

java –version

Nếu máy các bạn có Java thì version hiện tại của Java sẽ được trả về. Các bạn cố gắng lấy version mới nhất của Java nha.

check java

Bước 2: Kiểm tra Selenium Server

Sau khi download Selenium Server về một vị trí ở ổ cứng – giả sử là ổ E:, chúng ta di chuyển con trỏ của Command Line đến vị trí đó và thực thi câu lệnh:

java -jar selenium-server-standalone-2.33.0.jar

Nếu mọi chuyện OK, “INFO: Launching a standalone server” sẽ được trả về. Các bạn chú ý là “selenium-server-standalone-2.33.0.jar” chính là tên file của Selenium Server, nếu các bạn lưu file với một tên khác thì chỉ cần thay đổi phần này của câu lệnh.

check_sel_server

Bước 3: Kiểm tra IEDriverServer

Cơ bản là mình cũng nên để IEDriverServer cùng một vị trí với Selenium Server. Như vậy sẽ tiện hơn trong quá trình gọi lệnh. À quên, các bạn nhớ là phải unzip cái thằng này ra nha. Nó phải là file exe, chứ không phải file zip đâu . Trên Command Line, chúng ta sẽ kiểm tra IEDriverServer với câu lệnh:

java -jar selenium-server-standalone-2.33.0.jar -Dwebdriver.ie.driver=IEDriverServer.exe

Và nếu hệ thống trả về “Setting system property webdriver.ie.driver to .\IEDriverServer32.exe” là chúng ta đã có thể gọi Playback từ Selenium IDE được rồi. Nếu các bạn để IEDriverServer.exe file ở một vị trí khác thì phần sau của câu lệnh cần được chỉnh sửa lại -Dwebdriver.ie.driver=[pathfile]. Và phần [selenium-server-standalone-2.33.0.jar] cũng như trên hen.

check_ie_driver

Bước 4: Thiết lập Selenium IDE

Chúng ta mở Selenium IDE trên FireFox, chọn [Options/Options…] menu item. Trong Options dialog, chọn tab WebDriver.

Chúng ta chọn option Enable WebDriver Playback, chọn loại browser nào mình muốn Playback và restart lại Selenium IDE. Nếu hướng dẫn của mình có gì khó hiểu, các bạn có thể chọn “How to use WebDriver playback” để có hướng dẫn chi tiết hơn từ homepage của Selenium hen.

ide

Bước 5: Playback trên Browser không phải FireFox

Đâu tiên, chúng ta phải khởi động Selenium Server với IEDriverServer trên Command Line với câu lệnh mà chúng ta dùng để kiểm tra IEDriverServer ở bước 3.

Trên Selenium IDE, chúng ta có thể Record lại một test case hay mở một test case đã có sẳn. Cách làm mình đã hướng dẫn ở “Selenium IDE – Record and Playback”.

Sau đó, chúng ta chỉ việc nhấn nút Play trên Selenium IDE. Bên cạnh đó, chúng ta còn có thể đọc log của quá trình chạy trên Command Line thay vì chỉ đọc trên Selenium IDE. Mình có tạo một video clip với từng bước chi tiết ở đây, các bạn có thể xem để nắm bắt các bước nhanh chóng.

Note: Để thoát khỏi SeleniumServer, chúng ta dùng tổ hợp phím Ctrl+C

Cuối cùng, đây là các nhược điểm của Playback trên browser khác ngoài FireFox mà mình nhận thấy:

  • Mỗi lần chạy, Playback sẽ mở ra một cửa sổ mới và nó không được tự động tắt sau khi thực thi test case xong
  • Chúng ta không thể tạm ngưng hay chạy từng bước như trên FireFox được
  • Các chức năng debug dùng trên FireFox như nút Find không thể hoạt động bên ngoài FireFox

——————————————

Ba phần này là cơ bản của Selenium IDE. Bên cạnh đó, Selenium IDE hỗ trợ chúng ta một số phần thuộc về Advance như mình đã nói qua, bắt control theo người dùng hay gom nhóm nhiều action với nhau thông qua các extensions. Để thiết lập sử dụng extension, chúng ta vào phần Options (menu Options/Options), tab General. Ở đây, chúng ta sẽ có 2 phần Selenium Core Extensions và Selenium IDE Extensions. Các bạn chú ý là extensions phải được code bằng Java nha. Hoặc là chúng ta có thể sử dụng các extensions có sẵn trên cộng đồng Selenium như Selenium IDE Flow Control.

Về cá nhân thì mình cảm thấy phần Advance của Selenium IDE không quan trọng lắm. Bởi vì, nếu chúng ta muốn code và customize test case của chúng ta, chúng ta có thể sử dụng Selenium RC hoặc Selenium WebDriver. Các công cụ lập trình hỗ trợ cho Selenium RC/WebDriver như C#, Java hay Python phải nói là quá mạnh cho việc customize script của chúng ta. Chúng ta không nhất thiết phải thông qua Selenium IDE để làm những chuyện như vậy.

Cám ơn các bạn đã quan tâm và theo dõi. Hy vọng gặp lại các bạn ở loạt bài kế tiếp.

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

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

Xem thêm công việc CNTT hấp dẫn trên TopDev

Những lệnh GIT thường sử dụng từ cơ bản đến nâng cao

lệnh git
Những lệnh GIT thường sử dụng từ cơ bản đến nâng cao

Bài viết được sự cho phép của tác giả Lê Chí Dũng

I. Intro & Install

Git là 1 hệ thống Distributed revision control (Distributed version control or decentralized version control), tạm dịch là hệ thống quản lý source phân tán.

Chỉ mất 3s để đồng bộ metadata.

Cài  đặt 

https://git-scm.com/downloads

Documents

https://help.github.com/enterprise/2.9/

II. Config

1. Short commands

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.st 'status -s '

Linux:
Config file’s location: ~/.gitconfig

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

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

Windows:
Config file’s location: C:\Users\{your_name}\.gitconfig

[core]
    preloadindex = true
    fscache = true                   
    autocrlf = true
    quotepath = off
[gc]
    auto = 256
[user]
    email = lcdung@example.com
    name = lcdung
[color]
    ui = true
[alias]
    tree   = log --oneline --decorate --all --graph
    st     = status -s
    ig     = update-index --assume-unchanged
    no-ig  = update-index --no-assume-unchanged
    co     = checkout
    getlog = log --oneline -10
[credential]
    helper = cache
git config --global user.email "your_email@example.com"
git config --global user.username"lcdung"

2. Remember username and password when using [http]

git config --global credential.helper cache
git config credential.helper cache

3. Ignore files

Edit file .gitignore

git update-index --assume-unchanged
git update-index --no-assume-unchanged

III. Basic commands

Mô hình Git

1. Remote:

Mặc định (origin repository trên server và local repository trên local)

1. Add remote

git remote add <remote_name> <url>

2. Checking name of current remote

git remote -v
# View existing remotes
# origin  https://github.com/user/repo.git (fetch)
# origin  https://github.com/user/repo.git (push)

3. Rename remote

git remote rename <old_name> <new_name>

4. Set URL remote

git remote set-url origin https://github.com/user/repo2.git
# Change the 'origin' remote's URL

5. Delete

git remote rm <remote_name>

2. Add files

1. Add multi files

git add <file1> <file2> ....

2. Add all files

# Only adding modified files and new files
git add .

# Adding all (deleted, modified and new)
git add --all

3. Pull

git pull
git pull <remote_name> <branch_name>

4. Push

git push <remote_name> <branch_name>

# Force update
git push -f <remote_name> <branch_name>

5. Fetch

# Update remote without deleting branches
git fetch <remote_name>

# Update remote and deleting branch (if have)
git fetch <remote_name> --prune

IV. Main commands

1. Init

git init

2. Clone

# Clone repo:
git clone <url> {folder_name}

# Clone single branch of repo:
git clone -b <branch_name> <url> {folder_name}

3. Status

git status
git status -s

4. Branch

# List all branch of local:
git branch

# List all branch of local and remote:
git branch --all

# Create new branch and does not switch to new branch
git branch <new_branch>

# Create new branch and switch to new branch
git checkout -b <new_branch>

# Rename current branch to new_branch_name
git branch -m new_branch_name

# Delete branch on local
git branch -D <branch_name1> <branch_name2> ...

# Delete branch on remote
git push origin :<branch_name1> :<branch_name2> ...
git push origin --delete <branch_name1> <branch_name2>

5. Add files

# Add multi files
git add <file1> <file2> ....


# Add all files
## Only adding modified files and new files
git add .

## Adding all (deleted, modified and new)
git add --all

6. Commit

# Commit a message
git commit -m "Sample message"

# Edit commit message of last commit
git commit --amend -m "Edit sample message"

7. Logs

# View short logs:
git log --oneline -10

# View pretty logs:
git log --oneline --decorate --all --graph

8. Checkout

# Checkout to branch
git checkout <branch_name>

# Checkout to commit hash
git checkout <commit_hash>

# Checkout file with commit hash
git checkout <commit_hash> <file_path>

# Checkout file from another branch
git checkout <branch_name> <file_path>

9. Reset

# Reset HEAD
git reset --hard
git reset origin/master --hard

# Reset with commit hash
git reset <commit_hash>

10. Revert

# Revert with commit hash
git revert <commit_hash>

11. Merge

git merge <branch_name>

12. Rebase

Để tích hợp các thay đổi từ nhánh này vào nhánh khác và commit trong nhánh hiện tại. (https://git-scm.com/book/vi/v1/Ph%C3%A2n-Nh%C3%A1nh-Trong-Git-Rebasing)

Rebase on branch: When rebase other brach need checkout other branch.

# Rebase <branch_name> into current branch
git rebase <branch_name>

# Rebase <branch_name2> into <branch_name1>
git rebase <branch_name1> <branch_name2>

Rebase on commit: When rebase other brach need checkout other branch.

git rebase -i <commit_hash>
  
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

13. Cherry-pick

lấy commit từ branch khác về branch hiện tại.

git cherry-pick <commit_hash1> <commit_hash2> ..

14. Diff

So sánh code

# Diff two commit:
git diff <commit_hash1> <commit_hash2>

# Diff two branches:
git diff <branch_name1> <branch_name2>

# Diff file on two branches:
git diff <branch_name1> <branch_name2> -- <file_path>

15. Stash

Backup hiện trạng đang làm và nhảy code về bất kỳ version được backup trước đó.

# Stashed all changed
git stash

# List all stash
git stash list

# Show detail a stash
git stash show stash@{0}

# Apply latest stash to current branch
git stash pop

# Apply stash{0} into current branch
git stash pop stash@{0}

# Apply stash{0} into current branch
git stash apply stash@{0}

# Drop stash{0} into current branch
git stash drop stash@{0}

# Clear all stash
git stash clear

V. Tips & Notes

List all ignore files:

git ls-files -v | grep '^h'

Count modified files:

git status | grep 'modified:' | wc -l

Ignore chmod file:

git config core.fileMode false

Some commands need to push with option -f:

reset
rebase
commit --amend

VI. Q&A

  • Lúc commit rồi mà phát hiện ra commit đó sai quá sai thì phải undo hay xóa cái commit đó ra sao?
  • Muốn quay lại commit thứ N thì làm sao? 

Thông thường và dể dùng nhất là dùng git reset tuy nhiên còn vài cách khác dễ dùng hơn nửa đấy!

Bạn có thể tham khảo tại bài này -> Giới thiệu 3 cách undo commit hoặc loại bỏ commit cơ bản


  • Tôi đang chưa hiểu rõ sự khác biệt giữa git merge và git rebase là gì?
  • Tại sao tôi lại dùng git rebase mà không phải merge trong dự án này?
  • git rebase nó hay bị nhiều conflict hơn git merge?
  • git merge dễ tra log hơn git rebase đúng không vì rebase sửa log lại hết rồi  ?

Lý do áp dụng rebase trong dự án là cho mọi thứ đều dễ dàng xem, điều tra log khi xem qua transport plan trong git. Chính vì thế việc áp dụng rebase cho từng brach riêng biệt là cách để cac developer có tư duy logic tốt log một cách có hệ thống những commit thực sự quan trọng và cần thiết để tra cứu sau này hạn chế commit spam ngoài ý muốn.

Việc conflict trong git là điều không thể tránh khỏi khi merge hay rebase branch khác mà làm chung trên 1 file mình chưa thấy dẫn chứng nào là rebase conflict nhiều hơn merge.

Bạn muôn biết rõ sự khác biệt này thì vào xem bài viết này -> Sự khác biệt giữa git merge và git rebase


  • Trước khi commit mới thì mình phải pull code mới về, mà nếu gặp conflict thì phải xử lý, nếu xử lý ko khéo thì mất code của mình làm, vậy phải làm sao đây?
  • Nếu chỉ backup 1 lần cho 1 commit thì cực quá vì pull nhiều branch thì sao?
  • Mình đang làm branch hiện tại chưa muốn commit, mà phải qua branch khác fix bug dùm member vậy thì phải làm sao?

Nhìn chung mọi câu hỏi đều xoay quanh việc bạn muốn backup code mà chưa thể commit được! Có 1 câu thần chú mà mình hay dùng đó là git stash nó cho phép bạn backup mọi lúc, không giới hạn số lần backtup và bạn dễ dàng tra cứu lại những gì bạn backup nữa.

Bạn muôn biết rõ sự khác biệt này thì vào xem bài viết này -> Tổng hợp sử dụng git stash hiệu quả

VII. References

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

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

Xem thêm tuyển dụng IT hấp dẫn trên TopDev

#1 Lập trình Golang ăn xổi: Giới thiệu dự án

golang
#1 Lập trình Golang ăn xổi: Giới thiệu dự án

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Lời giới thiệu

Tôi gọi nó là ăn xổi vì thực tế tôi không có code backend bao giờ. Và đây là lần đầu tiên tôi nghĩ rằng mình cần học backend để hiểu hơn về công việc của các dev bên backend. Với 1 lập trình viên frontend – cụ thể là iOS, việc làm việc thường xuyên với các APIs dạng restful là thường xuyên. Bạn sẽ dùng Alamofire, Moya… để request lên server, lấy data dạng JSON trả về, convert chúng sang object và xử lý business cho nó. Do vậy tôi cũng nắm được đôi chút phần nào về dạng của API: chúng ta sẽ có 1 đường link để gọi, các tham số cho header như:

Content-Type: application/json
Authorization: token..

Các params gửi lên, token để authenticate, các thông báo lỗi, response trả về, method của API như GET, POST, PUT, DELETE…

  Chiến trường sinh tử phiên bản lập trình : Python vs Ruby vs Golang
  Golang là gì và tại sao bạn nên học Go?

Xem thêm các chương trình tuyển dụng Golang lương cao trên TopDev

Bản chất nó như thế nào thì chắc hẳn là 1 dev front end sẽ không bao giờ hiểu được cách làm nếu không tự nhảy vào code. Vì tính tò mò, tôi đã giành 1 chút thời gian cho việc tìm hiểu các ngôn ngữ lập trình backend. Bạn sẽ có Nodejs, php, java, Golang, ruby, python… rất rất nhiều ngôn ngữ để làm. Tôi cũng hoang mang không biết nên chọn cái nào cho hợp lý, nên tôi bắt đầu tìm các bài so sánh giữa chúng. Cuối cùng tôi chọn Golang vì lý do server của nhiều công ty nổi tiếng đang dùng, như Google, facebook, Netflix… Và thứ 2 nó có con trỏ, 1 dạng na ná C++. Có người đã nói là ngôn ngữ C++ cho thế kỷ 21, tận dụng điểm mạnh của C++ và thay thế sự phức tạp của nó. Tuy nhiên khi bắt đầu học, tôi cảm giác hơi khó khăn chút xíu vì cú pháp khá na ná C/C++, mà lại giống Swift, … Nó có 1 số quy tắc mà mãi sau tôi mới biết như cách đặt tên hàm, … Nếu bạn tin tôi thì hãy đọc tiếp nhé, bạn sẽ thấy Golang là 1 ngôn ngữ rất tốt về hiệu năng và chặt chẽ về cú pháp.

Đầu tiên dự án của tôi bạn có thể xem tại đây:

https://github.com/lexuanquynh/go_api

Đây là 1 dự án backend trả về các APIs dạng Restful. Bạn sẽ bắt gặp nhiều thứ quen thuộc như đăng nhập, đăng ký, cập nhật thông tin, authenticate với token… Vui lòng đọc kỹ README để hiểu cách cài đặt và các yêu cầu bắt buộc để chạy được dự án này.

Kiến trúc dự án

Với 1 người như “trang giấy trắng” – liệu bạn sẽ hỏi tôi là “tôi chưa code Golang bao giờ, vậy tôi có thể học được nó 1 cách dễ dàng không?” Câu trả lời này sẽ là “Bạn sẽ học được nó nếu như bạn nắm được luồng của dự án”. Vậy kiến trúc dự án của tôi tuân theo chuẩn nào? Rất thân thuộc với backend – tôi sử dụng Clean architecture để làm dự án này. Nếu bạn cũng code iOS như tôi, bạn hãy xem kiến trúc Clean architecture cho iOS ở đây nhé:

https://github.com/sergdort/CleanArchitectureRxSwift

Nếu bạn đã nắm chắc về kiến trúc này thì thật đơn giản để bắt đầu đọc hiểu project Golang của tôi.

Kiến trúc Clean architecture

Bạn có thể dịch nó là kiến trúc sạch – hay đơn giản là không cần dịch – chỉ cần hiểu nó hoạt động thế nào thôi.

Bạn nhìn thấy 3 vòng tròn màu khác nhau, phía trong cùng màu cam là lớp Domain – lớp này sẽ chứa các use case của ứng dụng, và các Entities sử dụng trong ứng dụng. Vậy use case là gì:

  • Use case: là các hành động trong ứng dụng. Ví dụ hành động đăng nhập, đăng ký.. trong 1 ứng dụng được gọi là use case – và use case sẽ sử dụng các hàm ảo(interface hay protocol) mà bạn đã từng viết để mô tả. Nó chỉ có tên hàm chứ ruột không có. Và lớp nào kế thừa lại các use case này đều phải implement toàn bộ use case.
  • Entities: cụ thể là các model. Thường bạn sẽ định nghĩa dưới dạng giá trị(struct) thay vì class. Nó lưu thông tin dữ liệu, nên mới được viết dưới dạng struct.

Vòng tròn thứ 2 là màu xanh lá cây – lớp Platform. Nó implementation các use case của lớp Domain ở trên, và nhằm che dấu cách triển khai như thế nào. Nó có thể là gọi service, lưu dữ liệu vào database(sql, realm..).

Vòng tròn ngoài cùng có màu xanh biển – lớp Application. Application có nhiệm vụ kết nối người dùng với các use case của ứng dụng. Nó có thể được triển khai bất cứ mô hình kiến trúc nào như MVC, MVVM, MVP.

Vì thế, application sẽ giao tiếp bằng interface, mà không trực tiếp để ẩn logic của các use case này. Ta thấy rằng việc này làm cho ứng dụng trở nên sạch sẽ, dễ dàng thay đổi các UseCaseProvider implementation mà không cần thiết phải thay thế các UseCase interface.

Vậy là bạn đã nắm qua về kiến trúc của dự án. Trong bài tiếp theo, tôi sẽ hướng dẫn bạn cách “ăn xổi” với Golang – làm thế nào để học Golang nhanh chóng và ứng dụng được vào dự án này.

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

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

Xem thêm tuyển dụng CNTT hấp dẫn trên TopDev

Generate keystore với PKCS12 format sử dụng công cụ keytool của Java

generate keystore
Generate keystore với PKCS12 format sử dụng công cụ keytool của Java

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

PKCS12 là một trong những định dạng chuẩn của chứng chỉ SSL với khả năng bảo mật cao. Công cụ keytool của Java ngoài việc giúp chúng ta có thể generate JKS keystore dành riêng cho Java thì nó còn hỗ trợ chúng generate chứng chỉ PKCS12 này.

  10 Java Web Framework tốt nhất
  10 tips để trở thành Java Developer xịn hơn

Xem thêm các chương trình tuyển dụng Java hấp dẫn trên TopDev

Cụ thể thì các bạn có thể command sau để generate chứng chỉ PKCS12 với keytool:

keytool -genkeypair -alias <alias> -keyalg <keyalg> -keystore <keystore> -storetype PKCS12

Ý nghĩa của từng tham số trên, các bạn có thể tham khảo thêm ở bài viết Sử dụng keytool để generate keystore trong Java. Chỉ có khác biệt ở đây là chúng ta phải khai báo thêm tham số -storetype với giá trị là PKCS12.

Extension của tập tin chứng chỉ PKCS12 có thể là .p12 hoặc .pfx các bạn nhé!

Ví dụ, mình có thể generate chứng chỉ PKCS12 với câu lệnh sau:

keytool -genkeypair -alias <alias> -keyalg <keyalg> -keystore <keystore> -storetype PKCS12

Kết quả:

Các bạn cần nhập password để đảm bảo tính toàn vẹn của tập tin keystore (xem thêm option -storepass trong bài viết Sử dụng keytool để generate keystore trong Java) rồi nhấn Enter:

Nhập lại password rồi nhấn Enter tiếp:

Trả lời một số câu hỏi rồi xác nhận. Nếu đúng hết thì nhập yes nhé các bạn!

Sau khi generate xong, các bạn có thể vào thư mục được truyền trong câu lệnh (của mình là /Users/Khanh/Documents), nhập câu lệnh sau:

keytool -list -keystore <keystore> -storepass <storepass>

Ví dụ của mình như sau:

ONLINE EVENT: Chuyển Đổi Số, Phân Tích Dữ Liệu Và Thách Thức “Nhân Tài Số” Trong Lĩnh Vực Fintech

Fintech & Innovation for Future

Tìm hiểu về xu thế Chuyển đổi số và những tác động đến lĩnh vực Tài chính – Ngân hàng

Chuyển đổi số đã trở thành một xu thế tất yếu trong lĩnh vực Tài chính – Ngân hàng. Đặc biệt trong bối cảnh dịch bệnh COVID-19, tiềm năng phát triển của các giao dịch không tiền mặt chính là động lực lớn thúc đẩy các ngân hàng liên tục cải tiến và phát triển sản phẩm – dịch vụ nền tảng số.

Số hóa trong lĩnh vực tài chính đã trở thành mệnh lệnh kinh doanh hàng đầu, là chiến lược “sống còn” đối với các ngân hàng và công ty tài chính. Không chỉ đơn giản là ứng dụng các công nghệ mới và tự động hoá trong quy trình ở cấp độ vi mô, chuyển đổi số trong ngành Tài chính – Ngân hàng là sự chuyển đổi toàn bộ mô hình, chiến lược và văn hoá kinh doanh trên nền tảng sự đổi mới công nghệ. Xu thế Chuyển đổi số cũng tác động mạnh mẽ đến nhu cầu nhân sự trong mảng Công nghệ thông tin và Khoa học máy tính lĩnh vực Tài chính – Ngân hàng.

Điều gì đang diễn ra đối với lĩnh vực này & đâu là thách thức đang chờ đợi các “nhân tài số” giải quyết? Hãy cùng lắng nghe phân tích của các vị diễn giả hàng đầu trong lĩnh vực về vấn đề này trong sự kiện Fintech & Innovation for Future do Ngân hàng TMCP Hàng Hải Việt Nam (MSB) x TopDev tổ chức.

Lắng nghe những quan điểm đa chiều về các chủ đề tại sự kiện

Fintech & Innovation for Future

Fintech & Innovation for Future là sự kiện công nghệ, hướng đến đối tượng khán giả hoạt động trong mảng Công nghệ thông tin và Khoa học máy tính, đặc biệt với các khán giả quan tâm và hứng thú với lĩnh vực Tài chính, Ngân hàng & Fintech.

Với sự kiện này, MSB & TopDev sẽ mang đến những câu chuyện và góc nhìn đặc thù về:

  1. Chủ đề: “Digital Transformation in Fintech: Key of Successful Launch”
  2. Chủ đề: “Data Analytics in Banking: Use cases from MSB”
  3. Chủ đề: “The Future of Banking Talent”

Sự kiện sẽ được diễn ra trực tuyến trên nền tảng Meetup/ EventX, tài khoản và hướng dẫn tham gia sẽ được BTC cập nhật qua email sau khi đăng ký thành công. Người tham dự có thể tương tác và đặt câu hỏi trực tiếp với các diễn giả tại sự kiện cũng như networking với nhau thông qua các công cụ hỗ trợ.

➤ Đăng ký tham gia ngay tại https://topdev.vn/s/FEUEFN5I
➤ Thời gian: 18:30 – 21:00, ngày 14/10/2021(thứ năm)

Gặp gỡ các lãnh đạo của MSB và diễn giả khách mời

SPEAKER: Nguyễn Quốc Khánh | Giám đốc Khối Công nghệ @ MSB

Học vị: Tiến sỹ, Đại học Western Sydney (Úc)

Có thể là hình ảnh về 1 người và văn bản cho biết 'MSB TOPDev MR. NGUYỄN QUỐC KHÁNH Chief Information Officer INTECH & INNOVATION FOR FUTURE ONLINE EVENT 2021 Đăng kí ngay.'

Anh Khánh đã có hơn 20 năm Công tác trong lĩnh vực Công nghệ thông tin ở trong và ngoài nước, với gần 15 năm đảm nhiệm các vị trí lãnh đạo cấp cao như: Phó Giám đốc Trung tâm Công nghệ Thông tin – Vietcombank, Phó Tổng Giám đốc – Giám đốc Khối Công nghệ thông tin – PVCombank, Phó Tổng Giám đốc phụ trách Công nghệ thông tin – Tổng Công ty Tài chính Cổ phần Dầu khí Việt Nam (PVFC), Phó Trưởng ban phụ trách Công nghệ thông tin – Ban Trù Bị PV Bank, Giám đốc Kỹ thuật – Công ty FPT Software… Đặc biệt, Anh Khánh đã từng đảm nhiệm vị trí Giám đốc Khối Công nghệ tại MSB từ tháng 05/2009 đến tháng 10/2013 với nhiều đóng góp quan trọng. Từ tháng 4/2020, Anh chính thức quay trở lại và đảm nhiệm chức vụ Giám đốc Khối Công nghệ tại MSB.
Trong sự kiện Fintech & Innovation for Future, anh Nguyễn Quốc Khánh sẽ chia sẻ các nội dung:
➤ Tổng quan chung về Digital Transformation nói chung ở Việt Nam và sự tác động đến Fintech. Tập trung vào đổi mới công nghệ.
➤ Góc nhìn của người làm công nghệ về Ứng dụng dữ liệu trong ngành tài chính & ngân hàng.
➤ Tham gia phiên thảo luận về chủ đề “The Future of Banking Talent” dưới góc nhìn trong vai Giám đốc Khối Công nghệ của MSB.
➤ Giải đáp thắc mắc và thảo luận cùng khán giả về các nội dung trong sự kiện.

SPEAKER: Trần Tiến Hiếu | Giám đốc Phân tích dữ liệu – Chuyên gia cao cấp Khoa học Phân tích dữ liệu @ MSB

Học vị: Thạc sĩ, Đại học Nam Florida (Mỹ)

Anh Hiếu từng là Management Trainee khóa đầu tiên của MSB (2012), sau đó anh chuyển tới công tác tại các tổ chức lớn và uy tín như WorldQuant, Techcombank với các chức danh Chuyên gia Cao cấp phát triển sản phẩm cấu trúc & các công cụ tài chính phái sinh, Chuyên gia Cao cấp phát triển chiến lược đầu tư định lượng, Chuyên gia cao cấp Khoa học dữ liệu. Tới nay, Anh Hiếu quay trở lại MSB với vai trò Giám đốc Phân tích dữ liệu kiêm Chuyên gia cao cấp Khoa học dữ liệu thuộc Digital Factory – Đây là đơn vị chiến lược của MSB thành lập với vốn đầu tư 2000 tỉ đồng, để tăng tốc số hóa các hành trình khách hàng; khai thác năng lực dữ liệu & phân tích nâng cao để đem lại giá trị đột phá cho MSB.
Trong sự kiện Fintech & Innovation for Future, anh Trần Tiến Hiếu sẽ chia sẻ các nội dung:
➤ Ứng dụng của dữ liệu trong ngành tài chính & ngân hàng.
➤ Tham gia thảo luận với Giám đốc Nhân sự để đưa ra góc nhìn về tiềm năng phát triển sự nghiệp trong mảng data.
➤ Giải đáp thắc mắc và thảo luận cùng khán giả về các nội dung trong sự kiện.

SPEAKER: Nguyễn Ngọc Cương | Giám đốc Nhân sự @ MSB

Học vị: Thạc sĩ Quản trị Kinh doanh, Đại học Kinh tế Quốc dân Hà Nội

Anh Nguyễn Ngọc Cương gia nhập MSB từ năm 2007 và từng đảm nhiệm các vị trí quản lý từ năm 2009 đến năm 2012 như: Giám đốc Quản lý Nghiệp vụ Nhân sự, Trưởng Phòng Chiến lược Phát triển Nhân tài, Phó Phòng Tiền lương và Phúc lợi. Từ năm 2012, Anh công tác tại Công ty Cổ phần Quản trị Nguồn Nhân lực M-Talent với vị trí như Giám đốc Trung tâm Chiến lược Nhân sự và được bổ nhiệm làm Phó Tổng Giám đốc Công ty M-Talent từ năm 2015. Từ tháng 01/2020, Anh được bổ nhiệm vị trí Giám đốc Nhân sự MSB.
Trong sự kiện Fintech & Innovation for Future, anh Nguyễn Ngọc Cương sẽ chia sẻ về chủ đề “The Future of Banking Talent” cùng tất cả các diễn giả của sự kiện để mang đến góc nhìn đa chiều về Cơ hội & thách thức đối với sự phát triển nghề nghiệp trong ngành nói chung và tại MSB nói riêng. Đồng thời anh Cương sẽ giới thiệu chi tiết về thông tin về Chương trình tuyển dụng & dự án D-Innovation.

SPEAKER: Nguyễn Hà Đức Minh | CEO @ Aka Digital & Chairman @ Lava Digital Group

Học vị: Cử nhân, Đại học Ngoại thương Hà Nội
Anh Nguyễn Hà Đức Minh hiện là CEO của Aka Digital, Managing Director của AKA Digital và đồng thời là Chairman của Lava Digital Group. Anh Nguyễn Hà Đức Minh có hơn 25 năm kinh nghiệm trong lĩnh vực tiếp thị, bán hàng quảng cáo, công nghệ và tài chính tại nhiều công ty đa quốc gia hàng đầu. Anh đã dẫn dắt sự phát triển đáng kể của Lava Digital Group từ một công ty khởi nghiệp trở thành một tập đoàn truyền thông kỹ thuật số tích hợp (văn phòng ở nước ngoài tại Singapore và Myanmar) với các đối tác quốc tế có uy tín: Spotify, Daily Motion, TikTok, Netcore và Salesforce.
➤ Trong sự kiện Fintech & Innovation for Future, anh Nguyễn Hà Đức Minh trong vai trò diễn giả khách mời đặc biệt sẽ cùng các diễn giả là các lãnh đạo cấp cao của MSB chia sẻ quan điểm và góc nhìn khách quan về ngành Ngân hàng nói riêng và lĩnh vực Tài chính – Ngân hàng & Fintech nói chung. Đặc biệt với trọng tâm về Digital Transformation, Data Analytics & Banking Talents.

Đăng ký tham gia ngay

Tại sự kiện, các diễn giả sẽ cùng nhau chia sẻ quan điểm, góc nhìn, kiến thức và kinh nghiệm về Fintech & ngành Tài chính – Ngân hàng, từ góc độ của lãnh đạo, ở các mảng khác nhau đối với 03 chủ đề:

  • Chủ đề: “Digital Transformation in Fintech: Key of Successful Launch”
  • Chủ đề: “Data Analytics in Banking: Use cases from MSB”
  • Chủ đề: “The Future of Banking Talent”

Sau 03 phần trình bày, người tham dự có thể tham gia đặt câu hỏi, tương tác cùng các diễn giả về các nội dung được chia sẻ trong phần Hỏi đáp & thảo luận cùng khán giả.

➤ Đăng ký tham gia ngay tại https://topdev.vn/s/FEUEFN5I
➤ Thời gian: 18:30 – 21:00, ngày 14/10/2021(thứ năm)

Sử dụng JDBC API thực thi câu lệnh truy vấn dữ liệu

jdbc api
Sử dụng JDBC API thực thi câu lệnh truy vấn dữ liệu

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

Trong bài này tôi sẽ hướng dẫn các bạn sử dụng các API của JDBC để thực thi các câu lệnh truy vấn dữ liệu.

1. Chuẩn bị

Trước khi đi vào chi tiết từng JDBC API, chúng ta cần chuẩn bị cơ sở dữ liệu để sử dụng làm demo.

Để đơn giản, tôi sẽ sử dụng cơ sở dữ liệu MySQL, các bạn có thể sử dụng bất kỳ cơ sở dữ liệu nào khác nếu thích.

  Hibernate là gì? Sao phải dùng nó thay JDBC?
  Giới thiệu JDBC Connection Pool

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

Sau khi cài đặt cơ sở dữ liệu, chúng ta tạo database và 1 bảng user với cấu trúc sau:

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`createdDate` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Tạo một lớp tiện ích hỗ trợ mở Connection đến Database (DB).

ConnectionUtils.java

package com.gpcoder;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionUtils {

private static final String hostName = "localhost";
private static final String dbName = "jdbcdemo";
private static final String userName = "root";
private static final String password = "";
// jdbc:mysql://hostname:port/dbname
private static final String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;

public static Connection openConnection() throws SQLException {
// 1. Load Driver
// Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

// 2. Open connection
return DriverManager.getConnection(connectionURL, userName, password);
}
}

2. Statement

Statement interface trong java cung cấp các phương thức để thực thi các câu lệnh truy vấn với cơ sở dữ liệu SQL. Statement cung cấp phương thức để tạo ra đối tượng ResultSet.

Theo mặc định, tại cùng một thời điểm chỉ có một đối tượng ResultSet có thể được mở cho mỗi đối tượng Statement. Vì thế, nếu hoạt động đọc một đối tượng ResultSet bị chen ngang bởi hoạt động đọc đối tượng khác, thì đối tượng khác này phải được tạo bởi đối tượng Statement khác.

Statement cung cấp một số phương thức để thực thi truy vấn SQL:

  • execQuery() : được sử dụng để thực hiện các truy vấn truy xuất giá trị từ cơ sở dữ liệu (select). Phương thức này trả về đối tượng ResultSet có thể được sử dụng để lấy tất cả các dữ liệu (record) của bảng.
  • execUpdate() : được sử dụng để thực hiện các truy vấn insert/ update/ delete.
  • execute() : có thể thực thi cả 2 trường hợp trên. Nếu phương thức statement.getUpdateCount() trả về số lượng record bị affect.
    • Nếu giá trị > 0, có nghĩa là thực thi các câu lệnh insert/ update/ delete.
    • Nếu giá trị = 0, có nghĩa là thực thi các câu lệnh insert/ update/ delete không có dòng nào bị ảnh hưởng hoặc thực thi câu lệnh cập nhật data structure.
    • Nếu giá trị = -1, có nghĩa là thực thi câu lệnh select. Khi đó, có thể gọi tiếp lệnh statement.getResultSet() để lấy ResultSet.

Ví dụ:

package com.gpcoder;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class executeUpdate {

public static void main(String[] args) throws SQLException {
try (
Connection con = ConnectionUtils.openConnection();
Statement st = con.createStatement();
) {

// Insert
String sqlInsert = "INSERT INTO user(username, password, createdDAte) "
+ " VALUE('user1', '123', now());";
int numberRowsAffected = st.executeUpdate(sqlInsert);
System.out.println("Affected rows after inserted: " + numberRowsAffected);

// Update
String sqlUpdate = "UPDATE user SET password='123456' WHERE id=1";
numberRowsAffected = st.executeUpdate(sqlUpdate);
System.out.println("Affected rows after updated: " + numberRowsAffected);

// Delete
String sqlDelte = "DELETE FROM user WHERE id=1";
numberRowsAffected = st.executeUpdate(sqlDelte);
System.out.println("Affected rows after deleted: " + numberRowsAffected);
}
}
}

Chạy chương trình, ta có kết quả sau:

Affected rows after inserted: 1
Affected rows after updated: 1
Affected rows after deleted: 1

3. ResultSet

ResultSet là một đối tượng Java, nó được trả về khi truy vấn (query) dữ liệu. Sử dụng resultSet.next() để di chuyển con trỏ tới các bản ghi (record/ row) tiếp theo. Tại một record nào đó, sử dụng các method resultSet.getXxx() để lấy ra các giá trị tại các cột. Các cột được đánh với thứ tự với bắt đầu là 1.

Mặc định các ResultSet khi duyệt dữ liệu chỉ có thể chạy từ trên xuống dưới, từ trái sang phải. chúng ta có thể làm cho đối tượng này di chuyển hướng chuyển tiếp và ngược lại bằng cách chỉ định loại ResultSet sử dụng.

Statement.createStatement(resultSetType, resultSetConcurrency)

Trong đó, ResultSetType là:

  • TYPE_FORWARD_ONLY : chỉ cho phép duyệt từ trên xuống dưới, từ trái sang phải. Đây là kiểu mặc định của các ResultSet.
  • TYPE_SCROLL_INSENSITIVE : cho phép duyệt lùi, sang trái, sang phải. Loại này không nhạy với các sự thay đổi dữ liệu dưới database. Nghĩa là trong quá trình duyệt qua một bản ghi và lúc nào đó duyệt lại bản ghi đó, nó không lấy các dữ liệu mới nhất của bản ghi mà có thể bị ai đó thay đổi.
  • TYPE_SCROLL_SENSITIVE : cho phép duyệt tiến lùi, sang trái, sang phải, và nhạy cảm với sự thay đổi dữ liệu.

ResultSetConcurrency là:

  • CONCUR_READ_ONLY : Khi duyệt dữ liệu với các ResultSet kiểu này bạn chỉ có thể đọc dữ liệu.
  • CONCUR_UPDATABLE : Khi duyệt dữ liệu với các ResultSet kiểu này bạn chỉ có thể thay đổi dữ liệu tại nơi con trỏ đứng, ví dụ update giá trị cột nào đó.

Một số phương thức được hỗ trợ bởi ResultSet :

  • next() : được sử dụng để di chuyển con trỏ đến một hàng tiếp theo từ vị trí hiện tại.
  • previous() : được sử dụng để di chuyển con trỏ đến một hàng trước đó từ vị trí hiện tại.
  • first() : được sử dụng để di chuyển con trỏ đến hàng đầu tiên trong đối tượng thiết lập kết quả.
  • last() : được sử dụng để di chuyển con trỏ đến hàng cuối cùng trong đối tượng thiết lập kết quả.
  • absolute(int row) : được sử dụng để di chuyển con trỏ đến số hàng được chỉ định trong đối tượng ResultSet.
  • relative(int row) : được sử dụng để di chuyển con trỏ đến số hàng tương đối trong đối tượng ResultSet, nó có thể là dương hoặc âm. Số âm nghĩa là di chuyển về hàng trước đó. Số dương nghĩa là di chuyển đến hàng tiếp theo.
  • getInt(int columnIndex) : được sử dụng để lấy kết quả tại dựa vào chỉ mục của một cột được chỉ định. Kết quả là một giá trị kiểu int.
  • getInt(String columnName) : được sử dụng để lấy kết quả dựa vào tên của một cột được chỉ định. Kết quả là một giá trị kiểu int.
  • Tương tự như getInt(), chúng ta có thể getString(), getDouble() ,..

Ví dụ:

package com.gpcoder;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class StatementExecuteQueryExample {

public static void main(String[] args) throws SQLException {
String sqlSelect = "SELECT * FROM user";
try (
Connection con = ConnectionUtils.openConnection();
Statement st = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.executeQuery(sqlSelect);
) {

while (rs.next()) {
showUserInfo(rs);
}

System.out.println("\n=== Move to previous row ===");
while (rs.previous()) {
showUserInfo(rs);
}

System.out.println("\n=== Move to last row ===");
rs.last();
showUserInfo(rs);

System.out.println("\n=== Move to first row ===");
rs.first();
showUserInfo(rs);
}
}

private static void showUserInfo(ResultSet rs) throws SQLException {
System.out.println("Id: " + rs.getInt(1));
System.out.println("UserName: " + rs.getString(2));
System.out.println("Password: " + rs.getString("password"));
System.out.println("CreatedDate: " + rs.getDate("createdDate"));
System.out.println("---");
}
}

Chạy chương trình trên, ta có kết quả sau:

Id: 1
UserName: gpcoder1
Password: 123
CreatedDate: 2019-09-15
---
Id: 2
UserName: gpcoder2
Password: 123
CreatedDate: 2019-09-15
---
Id: 3
UserName: gpcoder3
Password: 123
CreatedDate: 2019-09-15
---

=== Move to previous row ===
Id: 3
UserName: gpcoder3
Password: 123
CreatedDate: 2019-09-15
---
Id: 2
UserName: gpcoder2
Password: 123
CreatedDate: 2019-09-15
---
Id: 1
UserName: gpcoder1
Password: 123
CreatedDate: 2019-09-15
---

=== Move to last row ===
Id: 3
UserName: gpcoder3
Password: 123
CreatedDate: 2019-09-15
---

=== Move to first row ===
Id: 1
UserName: gpcoder1
Password: 123
CreatedDate: 2019-09-15
---

4. PreparedStatement

PreparedStatement là một sub-interface của Statement.

PreparedStatement sử dụng để chuẩn bị trước các câu lệnh SQL, và tái sử dụng nhiều lần, giúp cho chương trình thực hiện nhanh hơn.

Ví dụ:

String sql = "INSERT INTO user VALUES(?, ?, ?)";

Như bạn thấy, chúng ta truyền tham số (?) cho các giá trị. Giá trị của nó sẽ được cài đặt bằng cách gọi các phương thức setter của PreparedStatement.

Ví dụ:

package com.gpcoder;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class PreparedStatementExample {

public static void main(String[] args) throws SQLException {
String sqlInsert = "INSERT INTO user(username, password, createdDAte) "
+ " VALUE(?, ?, ?);";
try (
Connection con = ConnectionUtils.openConnection();
PreparedStatement pstm = con.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS);
) {
// Set parameter values
pstm.setString(1, "gpcoder-test-1");
pstm.setString(2, "pwd123");
pstm.setDate(3, new java.sql.Date(System.currentTimeMillis()));

// Executes the SQL statement
pstm.execute();

// Get generated key
try (ResultSet rs = pstm.getGeneratedKeys();) {
int idValue = 0;
if (rs.next()) {
idValue = rs.getInt(1);
}
System.out.println("Auto-generated id: " + idValue);
}
}
}
}

Output chương trình:

Auto-generated id: 4

Tùy thuộc vào giá trị tự tăng của table user có thể có kết quả là một id khác.

5. CallableStatement

CallableStatement được xây dựng để gọi một thủ tục (procedure) hoặc hàm (function) của SQL.

// Câu lệnh gọi thủ tục SQL trên Java
String sql = "{call procedure_name(?,?,?)}";

// Câu lệnh gọi một hàm SQL trên Java
String sql ="{? = call function_name(?,?,?)}";

Ví dụ:

Đầu tiên chúng ta cần một tạo hàm hoặc một thủ tục trong DB. Chẳng hạn, chúng ta có một procedure tìm kiếm user theo tên. Kết quả trả về của procedure này là danh sách user.

CREATE PROCEDURE find_user_by_name(name Varchar(50))
BEGIN
SELECT * FROM user WHERE username LIKE CONCAT('%', name, '%');
END

Chương trình java:

package com.gpcoder;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CallableStatementExample {

public static void main(String[] args) throws SQLException {
String sql = "{call find_user_by_name(?)}";
try (
Connection con = ConnectionUtils.openConnection();
CallableStatement cstm = con.prepareCall(sql);
) {
// Set parameter values
cstm.setString(1, "gpcoder1");

// Executes the Procedure statement
try (ResultSet rs = cstm.executeQuery();) {
while (rs.next()) {
showUserInfo(rs);
}
}
}
}

private static void showUserInfo(ResultSet rs) throws SQLException {
System.out.println("Id: " + rs.getInt(1));
System.out.println("UserName: " + rs.getString(2));
System.out.println("Password: " + rs.getString("password"));
System.out.println("CreatedDate: " + rs.getDate("createdDate"));
System.out.println("---");
}
}

Output chương trình:

Id: 1
UserName: gpcoder1
Password: 123
CreatedDate: 2019-09-15
---

6. Transaction Management

Giao dịch (Transaction) là một khái niệm quan trọng trong SQL. Transaction đảm bảo tính toàn vẹn dữ liệu. Các câu lệnh trong Transaction được gọi là thành công nếu cả câu lệnh thành công. Ngược lại chỉ cần 1 trong các câu lệnh lỗi thì coi như giao dịch không thành công, phải rollback lại trạng thái ban đầu.

Các thuộc tính ACID miêu tả rõ ràng nhất về Transaction. Trong đó:

  • Atomicity : nghĩa là tất cả thành công hoặc không.
  • Consistency : bảo đảm rằng tính đồng nhất của dữ liệu.
  • Isolation : bảo đảm rằng Transaction này là độc lập với Transaction khác.
  • Durability : nghĩa là khi một Transaction đã được commit thì nó sẽ vẫn tồn tại như thế cho dù xảy ra các lỗi, …

Ví dụ: Người A chuyển một khoản tiền 1000$ vào tài khoản người B như vậy trong Database diễn ra 2 quá trình:

  • Trừ số dư tài khoản của người A đi 1000$.
  • Thêm vào số dư tài khoản của người B 1000$.

Nếu không có transaction thì một trong 2 quá trình lỗi gây tổn thất cho phía ngân hàng hoặc cho người dùng.

Connection Interface cung cấp các phương thức sau để quản lý transaction:

  • setAutoCommit(boolean status) : theo mặc định là true. Để thao tác với Transaction, cần thiết lập về false.
  • commit() : gọi method commit dữ liệu xuống database.
  • rollback() : xóa tất cả các thay đổi đã được thực hiện trước đó và quay về trạng thái trước khi thực hiện thay đổi.

Ví dụ bên dưới thực hiện insert 2 user vào database. User 1 insert thành công, User không insert được do bị lỗi SQL. Nếu không có transaction thì User 1 được lưu vào database. Chúng ta không mong muốn điều này.

Hãy xem cách sử dụng Transaction:

package com.gpcoder;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class TransactionExample {

public static void main(String[] args) throws SQLException {
try (Connection con = ConnectionUtils.openConnection();
Statement st = con.createStatement();
) {
con.setAutoCommit(false); // 1. Disable individualtransaction
try {
// This user will be inserted
st.executeUpdate("INSERT INTO user(username, password, createdDAte) "
+ "VALUE('user-1', '123', now());");
System.out.println("Inserted user-1 successfully");

// This is an error sql. Cannot insert user
st.executeUpdate("INSERT INTO user2(username, password, createdDAte) "
+ "VALUE('user-2', '123', now());");
System.out.println("Inserted user-2 successfully");

con.commit(); // 2. commit data to database if all command are success
} catch (Exception e) {
e.printStackTrace();
con.rollback(); // 2. roll-back data if one of command are failed
System.out.println("Rollback data");
}
}

}
}

Chạy chương trình trên, chúng ta sẽ thấy log như sau:

Inserted user-1 successfully
java.sql.SQLSyntaxErrorException: Table 'jdbcdemo.user2' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1335)
at com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2108)
at com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1245)
at com.gpcoder.TransactionExample.main(TransactionExample.java:21)
Rollback data

Kiểm tra dữ liệu trong bảng user, bạn sẽ thấy user 1 không được lưu vào.

7. Batch Processing

Batch Processing là nhóm các lệnh có liên quan vào trong một batch và thực thi chúng. Trong đó, các thao tác lệnh của chương trình được thực thi liên tiếp nhau mà không cần sự can thiệp của người dùng.

Việc ứng dụng Batch Processing trong cơ sở dữ liệu là rất tiện lợi. Khi bạn gửi một số lệnh SQL cùng một lúc, bạn đã giảm được chi phí thời gian giao tiếp và vì thế nâng cao được hiệu suất.

Một số phương thức hỗ trợ Batch Processing:

  • addBatch(String sql) : thêm các lệnh đơn tới batch. Tham số sql ở đây là một lệnh insert, update hoặc delete. Phương thức này không được gọi trên một đối tượng PreparedStatement và CallableStatement.
  • int[] executeBatch() :bắt đầu sự thực thi của tất cả các lệnh đã được nhóm lại với nhau này. Các phần tử trong mảng được trả về bởi phương thức này có thể là:
    • Một giá trị lớn hơn hoặc bằng 0 chỉ rằng lệnh được thực thi thành công. Và giá trị đó (gọi là update count) là số hàng trong cơ sở dữ liệu bị tác động bởi sự thực thi của lệnh.
    • Một giá trị SUCCESS_NO_INFO chỉ rằng lệnh được thực thi thành công nhưng không biết số hàng bị tác động bởi lệnh.
    • Một giá trị EXECUTE_FAILED chỉ rằng lệnh đã thực thi thất bại.
  • clearBatch() : xóa lệnh đã thêm khỏi batch.

Ví dụ: Một trong những trường hợp thường sử dụng tính năng này là import dữ liệu.

Giả sử chúng ta có một file csv chứa danh sách user, sau khi đọc file chúng ta sẽ insert danh sách này vào database. Chúng ta có thể call executeUpdate() cho từng user. Tuy nhiên, nó sẽ gặp vấn đề về performance nếu danh sách user của chúng ta rất lớn. Một trong những cách rất hay và thường được sử dụng là Batch Processing.

package com.gpcoder;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
class User {
String username;
String password;
java.sql.Date createdDate;
}

public class BatchProcessingExample {

public static void main(String[] args) throws SQLException {
String sqlInsert = "INSERT INTO user(username, password, createdDAte) "
+ " VALUE(?, ?, ?);";
try (
Connection con = ConnectionUtils.openConnection();
PreparedStatement pstm = con.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS);
) {
try {
con.setAutoCommit(false);

List users = readUsersFromCsvFile();
for (User user : users) {
pstm.setString(1, user.getUsername());
pstm.setString(2, user.getPassword());
pstm.setDate(3, user.getCreatedDate());
pstm.addBatch(); // Add user to batch
}

// Executes the SQL statement
int[] counts = pstm.executeBatch();
System.out.println("Affected row [0] = " + counts[0]);
System.out.println("Affected row [1] = " + counts[1]);

con.commit();
} catch (Exception e) {
e.printStackTrace();
con.rollback();
}
}
}

private static List readUsersFromCsvFile () {
List users = new ArrayList<>();
for (int i=1; i<=2; i++) {
users.add(new User("user-" + 1, "pwd123", new java.sql.Date(System.currentTimeMillis())));
}
return users;
}
}

Thực thi chương trình trên, chúng ta có kết quả sau:

Affected row [0] = 1
Affected row [1] = 1

Kiểm tra trong bảng user, chúng ta thấy 2 user đã được lưu.

8. SQLException

Trong JDBC, lớp java.sql.SQLException cung cấp rất nhiều phương thức để xử lý các ngoại lệ xảy ra cho cả Driver và Database. Đây là một trong các lớp cơ bản của JDBC, và chịu trách nhiệm về xử lý các ngoại lệ.

Ví dụ:

package com.gpcoder;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLExceptionExample {

private static final String hostName = "localhost";
private static final String dbName = "jdbcdemo";
private static final String userName = "root";
private static final String password = "";
private static final String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;

public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection(connectionURL, userName, password);

Statement st = con.createStatement();

String sqlInsert = "INSERT INTO user(username, password, createdDate) "
+ " VALUE('gpcoder', '123', now());";
int numberRowsAffected = st.executeUpdate(sqlInsert);
if (numberRowsAffected == 0) {
System.out.println("insertion failed");
} else {
System.out.println("inserted successfully : " + numberRowsAffected);
}
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}

Thử đổi password không đúng, bạn sẽ nhận được log lỗi sau:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:827)
at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:447)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at com.gpcoder.SQLExceptionExample.main(SQLExceptionExample.java:20)

Nếu sai câu lệnh SQL bạn sẽ nhận được log lỗi tương tự sau:

java.sql.SQLSyntaxErrorException: Table 'jdbcdemo.user2' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1335)
at com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2108)
at com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1245)
at com.gpcoder.SQLExceptionExample.main(SQLExceptionExample.java:26)

Trường hợp Driver không tồn tại:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver2
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.gpcoder.SQLExceptionExample.main(SQLExceptionExample.java:18)

Bài viết đến đây là hết. Các bạn có thể tìm hiểu thêm về JDBC API ở các link tham khảo bên dưới.

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 CNTT hấp dẫn trên TopDev

Những điểm mới của Java 8 (phần 1: Lambda expression)

lambda expression
Những điểm mới của Java 8 (phần 1: Lambda expression)

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

Vào quý I năm 2014, Java 8 được phát hành với nhiều ưu điểm mới. Topdev xin giới thiệu những điểm mới mẻ này đến các bạn.

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  Những mã xấu mà Java 8 có thể khử

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

Khởi tạo thực thể Nhân viên (Employee) có 3 thuộc tính là tên, tuổi và mức lương:

Mục tiêu của chúng ta là sắp xếp nhân viên theo 1 trong 3 tiêu chí: tên, tuổi hay mức lương. Với Java 7, dùng 2 class là java.util.Collections và java.util.Comparator để so sánh và sắp xếp:

Với Java 8 lambda, cú pháp sẽ ngắn gọn hơn, gần với ngôn ngữ tự nhiên hơn

Như vậy, chúng ta đã thay thế cú pháp cũ

bằng cú pháp mới Lambda

SmartJob đã đóng gói project để bạn tải về chạy thử: Java8_sort . Clone/fork từ repository Github: https://github.com/SmartJobVN/java8

Đỗ Như Vý – developer tại SmartJob – Nguồn smartjob.vn

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

Xem thêm tuyển dụng CNTT hấp dẫn trên TopDev

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

lập trình python
Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Với những người lập trình viên Java thì Eclipse là 1 IDE quá quen thuộc, mặc dù nó hơi nặng một chút nhưng đầy đủ tính năng, nhiều plugin… Chính vì thế mà khi chuyển sang lập trình ngôn ngữ khác mình vẫn muốn sử dụng Eclipse.

Trong bài này mình sẽ thực hiện cài đặt plugin PyDev để thực hiện biến Eclipse thành Python IDE.

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

Cài đặt Plugin PyDev

Các bạn vào Help/Eclipse Marketplace

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

Trong ô tìm kiếm nhập pydev và click vào biểu tượng tìm kiếm.

Chọn install PyDev.

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev Hướng dẫn lập trình Python trên Eclipse với plugin PyDev Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

Sau khi cài đặt xong plugin bạn cần khởi động lại eclipse.

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

Sau khi cài đặt xong plugin PyDev chúng ta đã có thể tạo project python trên Eclipse.

Các bạn vào New/Other

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

Trong mục PyDev sẽ có lựa chọn tạo project, package python.

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

  Học Python: Từ Zero đến Hero (phần 1)

Cấu hình Python Interpreter trên Eclipse

Phần cấu hình python interpreter này tương tự với việc bạn cấu hình JDK trên Eclipse vậy. Nó sẽ cho phép bạn trỏ tới version Python mà bạn muốn dùng để chạy project.

Vào Windows/Preperences và chọn Python Interpreter -> click vào New

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

Trong phần Intepreter Executable trỏ tới file python.exe mà bạn đã cài đặt

Hướng dẫn lập trình Python trên Eclipse với plugin PyDev Hướng dẫn lập trình Python trên Eclipse với plugin PyDev Hướng dẫn lập trình Python trên Eclipse với plugin PyDev

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

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

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

[TÌM HIỂU] Open Source là gì? Mã nguồn mở là gì?

open source
[TÌM HIỂU] Open Source là gì? Mã nguồn mở là gì?

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

Khi mà máy tính và các thiết bị công nghệ dần trở nên phổ biến thì những cụm từ như Open Source hay mã nguồn mở… cũng được nhiều người biết tới hơn.

Đặc biệt là đối với những bạn thường xuyên sử dụng máy tính, chắc chắn là bạn sẽ từng nghe qua, thậm chí là nghe rất nhiều lần rồi, đúng không 🙂

Vậy Open Source là gì ? Ưu và nhược điểm của Open Source? Và tại sao mà các phần mềm Open Source lại có được sự phát triển mạnh mẽ như vậy? Bài viết dưới đây sẽ trả lời tất cả những câu hỏi này nhé các bạn !

  Fix lỗi "Fopen Failed To Open Stream: Permission Denied Windows Server"
  [TÌM HIỂU] Open Source là gì? Mã nguồn mở là gì?
”]

Xem thêm các chương trình tuyển dụng BrSE hấp dẫn trên TopDev

#1. Open Source là gì?

Open-source-la-gi (1)

Hiểu một cách đơn giản, ít phức tạp nhất thì Open Source (hay còn gọi là mã nguồn mở) là tất cả những dòng code của một phần mềm, hay của một ứng dụng, chương trình.. nào đó được chia sẻ công khai và miễn phí 100% cho cộng đồng cùng sử dụng.

Thông thường thì Open Source sẽ được phát hành miễn phí bởi các đơn vị cung cấp, hoặc là các công ty lớn về lĩnh vực công nghệ.

Nhưng tất nhiên, nếu bạn có khả năng thì bạn hoàn toàn có thể tải về mà nguồn gốc rồi tự phát triển, sửa đổi, cập nhật thêm tính năng theo nhu cầu của bạn.

Theo như những thông tin mà mình tìm hiểu được thì người sáng lập ra mã nguồn mở đầu tiên là Richard Stallman.

Người đã xây dựng ra dự án GNU và cho ra giấy phép Mã nguồn mở GPL. Đây là 2 nền tảng then chốt cho sự phát triển của Mã nguồn mở.

Nói tóm lại, Open Source (mã nguồn mở) là những phần mềm được tác giả chia sẻ công khai trên cộng đồng, đi kèm với đó là bộ code tạo nên phần mềm đó, để người khác có thể tái sự dụng và phát triển.

Nhưng phải lưu ý một điều là, những người sử dụng mã nguồn mở không được phép bán các sản phẩm dựa trên mã nguồn mở đó, vì nó là tài sản chung.

Như chúng ta đã biết, một phần mềm thương mại (mã nguồn đóng) được tạo ra đều sẽ được giữ bí mật về những dòng code, cấu trúc, cũng như là thuật toán …. thậm chí là họ còn mã hóa những dòng code này rất cẩn thận.

Ví dụ như hệ điều hành iOS của Apple, Windows và Office của Microsoft… Đây đều là những phần mềm và hệ điều hành thương mại nên người dùng không bao giờ nhìn thấy được dòng code nào từ họ cả.

Nhưng những phần mềm, ứng dụng được tạo ra từ mã nguồn mở thì khác, người dùng có thể thấy được tường tận, từ chân tơ kẽ tóc, từng dòng lệnh, từng cấu trúc và từng thuật toán… tất cả đều được hiển thị công khai, và mọi người đều có quyền sử dụng nó một các miễn phí.

#2. Ưu điểm của Open Source

Open-source-la-gi (2)

Vâng! Tính cộng đồng chính là ưu điểm mạnh nhất mà Open Source có được !

Vì được chia sẻ free nên cộng đồng của mã nguồn mở luôn vô cùng rộng lớn, chính nhờ vậy mà những nâng cấp, những cải tiến của những phần mềm mã nguồn mở này luôn rất nhiều, dồi dào và thay đổi mạnh mẽ qua từng năm.

Nhờ có lượng người dùng đông đảo nên những phần mềm Open Source luôn là điểm đến cho những ai thích tìm hiểu, vọc vạch mã nguồn, bởi có hàng nghìn, hàng vạn những bài hướng dẫn, những tips & tricks giúp bạn khắc phục những lỗi trong quá trình sử dụng.

Và cũng vì là mã nguồn mở, được chia sẻ miễn phí nên đây là nơi tụ họp của rất nhiều những coder (lập trình viên) trên thế giới. Vậy nên những lỗi, những lỗ hổng, hay là những phần mở rộng luôn được cập nhật thường xuyên và có các bản vá kịp thời.

Một số cái tên tiêu biểu và đình đám nhất hiện nay của Open Source đó là: Linux, WordPress, Chromium….

Một điều rất hay nữa của Open Source đó là tính công khai và minh bạch, tức là trong phần mềm đó có tính năng gì, có những thuật toán gì, cấu trúc ra sao, có cài cắm gì nguy hiểm bên trong không… đều được sáng tỏ như ban ngày..

Đây là điểm khác biệt lớn nhất giữa mã nguồn mở và mã nguồn đóng. Với mã nguồn đóng thì chỉ có công ty, người chủ quản mới nhìn thấy được các dòng code bên trong.

#3. Nhược điểm của Open Source là gì?

Open-source-la-gi (1)

Tuy có những ưu điểm rất tuyệt vời như vậy nhưng Open Source lại tiềm ẩn những rủi ro nhất định:

Như mình đã nói bên trên, với mã nguồn mở thì mọi thứ sẽ được công khai và phơi bày ra trước mắt. Đối với những hacker chân chính thì không sao, họ có thể thông báo hoặc tung ra các bản vá lỗi cho cộng đồng.

Nhưng ở chiều ngược lại, những hacker mũ đen, những kẻ ích kỉ muốn trục lợi cho bản thân sẽ lợi dụng những lỗ hổng đó để hack vào máy tính người dùng và tiến hành phá hoại sâu vào bên trong. Hoặc đánh cắp thông tin cá nhân của người khác..

Điều khó nhất đối với những phần mềm mã nguồn đóng (phần mềm thương mại) là những dòng code được bảo mật rất nghiêm ngặt, vậy nên hacker sẽ khó khai thác hơn.

Trong khi đó, với Open Source thì hacker có thể tìm ra các lỗ hổng thông qua thuật toán và câu lệnh của những phần mềm, ứng dụng đó một cách dễ dàng hơn.

Chính sự phát triển liên tục của cộng đồng đã đem tới những cải tiến, những tiện ích đi kèm, nhưng đôi khi nó lại là nguyên nhân khiến cho phần mềm dễ bị Crash.

Việc mỗi tiện ích, mỗi chức năng cải tiến đôi khi không cùng một nhóm người làm ra, nên chúng sẽ không được tối ưu một cách tốt nhất, thậm chí có thể bị xung đột trong quá trình sử dụng,

Đó cũng chính là lý do mà tại sao, các Open Source luôn cố gắng tìm một công ty chủ quản là như vậy.

Thiếu tính chuyên biệt là những gì mà những ứng dụng Open Source hay gặp phải, vì phát triển cho cộng đồng nên nó được phát triển là để phục vụ số đông, tức là phát triển nhiều nhóm người khác nhau, chứ đôi khi không cùng một mục đích sử dụng.

Nên đôi khi nó cũng thiếu đi những chức năng để làm những nhiệm vụ nhất định.

#4. Open Source trong tương lai

Với sự phát triển chóng mặt của công nghệ như hiện nay, giới trẻ ngày càng quan tâm đến CNTT nhiều hơn thì khái niệm Open Source sẽ ngày càng trở nên phổ biến và thông dụng hơn nữa.

Open-source-la-gi (2)

Không phải bỏ chi phí hằng năm cho tiền bản quyền, không phải theo những khóa học, gần như mọi thứ đều có sẵn trong cộng đồng và được chia sẻ hoàn toàn miễn phí.

Tất cả những gì bạn cần làm là TỰ HỌC, TỰ MÀY MÒ… Vậy thôi !

Những vấn đề về bảo mật, tính chuyên biệt là những điểm yếu cố hữu của những phần mềm mã nguồn mở.

Nhưng chúng cũng đang dần được khắc phục bằng cách, các công ty sẽ lập ra một nhóm riêng để tự tối ưu và phát triển phần mềm riêng biệt, dựa trên mã nguồn gốc của phần mềm đó.

Tức là những thứ mà họ phát triển sẽ dựa trên mã nguồn mở được chia sẻ ngoài cộng đồng, nhưng chúng sẽ không được chia sẻ rộng rãi ra cộng đồng, mà nó thuộc sở hữu riêng của nhóm người đã phát triển.

Điều này sẽ hạn chế tối đa những rắc rối về bảo mật, mã nguồn, cũng như tính ổn định và khả năng hoạt động chuyên cho một lĩnh vực nào đó.

Tương lai thì Open Source sẽ còn phát triển hơn nữa, điển hình như là Trí tuệ nhân tạo (AI), thứ được viết trên Python – một mã nguồn mở hoàn toàn.

Và rõ ràng rồi, bất cứ thứ gì mà do một cộng động lớn phát triển, dành thời gian cho nó thì bao giờ cũng mạnh hơn những thứ do một nhóm làm ra.

Hi vọng là trong tương lai, chúng ta sẽ sớm thấy được nhiều hơn những thành tựu mà Open Source đem lại. Xin cảm ơn các bạn đã đọc hết bài viết.

Lê Đinh Hoàng Vũ – 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

Tìm hiểu Conditional Border Radius trong CSS

conditional border radius
Tìm hiểu Conditional Border Radius trong CSS

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

Gần đây mình có F12 và kiểm tra code CSS của Facebook và thấy rằng họ sử dụng thuộc tính border-radius cực kỳ đỉnh cao cho giao diện main feed của họ. Lần đầu mình nhìn vào thì thấy sao họ lại viết rắc rối thế nhỉ, viết vậy để làm gì ? Sau khi tìm hiểu thì mình đã hiểu ra cách nó hoạt động và mình sẽ giải thích cho các bạn ngay sau đây

  5 điều phiền toái nhất của CSS
  9 CSS animation mới "mãn nhãn" cho các project

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

Vấn đề

Chúng ta có giao diện là card với border-radius là 8px. Khi cái card này không có margin hoặc là nó đang rộng bằng viewport(khi ở mobile) thì chúng ta muốn border-radius lúc này là 0.

Nhìn vào hình thì chắc các bạn cũng sẽ hiểu đúng không ? Chúng ta có thể dễ dàng xử lý nó bằng việc sử dụng Media Query như thế này

@media (min-width: 700px) {
.card {
border-radius: 8px; 
}
}

Tuy vậy thì trong một vài trường hợp nó sẽ có hạn chế như là chúng ta muốn có border-radius khi mà ở màn hình nhỏ hơn 450px chẳng hạn thì sao, chúng ta sẽ phải tạo ra một modifier để làm việc đó như này

@media (max-width: 450px) {
.card--rounded {
border-radius: 8px;
}
}

Giải pháp cực hay

Một giải pháp cực hay từ team của Facebook đó chính là sử dụng điều kiện và logic của họ kiểu như thế này:

if (cardWidth >= viewportWidth) {
 radius = 0;
} else {
 radius = 8px;
}

Để áp dụng được cái logic đó vào CSS thì chúng ta cần so sánh giữa 2 giá trị trong CSS bằng việc sử dụng các hàm so sánh như min() và max() như sau

.card {
border-radius: max(0px, min(8px, calc((100vw - 4px - 100%)
 * 9999)));
}

Nhìn vào thì chắc là không hiểu gì đâu. Các bạn đừng lo lắng, mình sẽ giải thích cho các bạn ngay sau đây

  1. Chúng ta có hàm max() sẽ so sánh giá trị giữa 0px và giá trị của việc tính toán bên trong hàm min(), hàm max() nó sẽ lấy giá trị lớn hơn ví dụ max(20px, 30px) thì nó sẽ lấy giá trị 30px
  2. Hàm min() thì nó sẽ so sánh giá trị giữa 8px và giá trị được tính toán ở hàm  calc((100vw - 4px - 100%) * 9999) kia. Hàm min() thì ngược lại, nó sẽ lấy giá trị nhỏ hơn giữa 2 phần tử. Ví dụ min(5px, 50px) thì giá trị sẽ là 5px
  3. 9999 là một con số lớn để giúp tính toán làm sao đó để giá trị luôn ra kết quả mà chúng ta muốn là 0px hoặc 8px mà thôi chứ không ra giá trị nào khác.

Cái trọng tâm chính ở đây đó chính là cách sử dụng hàm calc() của team Facebook viết. Kết quả chỉ có thể là 0px hoặc 8px dựa vào 2 ngữ cảnh như này:

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.

  • Nó(card) có độ rộng có thể bằng 100% của phần tử chứa nó(wrapper, container….)
  • Hoặc nó có thể là 100vw khi mà chúng ta đang ở giao diện điện thoại và cái card của chúng ta nó chiếm trọn 100vw luôn

Các bạn xem hình dưới đây sẽ rõ nhé

Tại sao phải là 9999

Nó không phải là một con số chính xác, chẳng qua chúng ta để nó lớn như vậy để tránh các lỗi có thể xảy ra khác vì thường border-radius mà để giá trị 9999px là quá lớn rồi. Cũng như ít ai để tới con số lớn như này, nếu các bạn lo lắng có người dùng lớn hơn 9999 thì các bạn có thể điền vào một con số cực lớn khác nhé.

Mình giả sử chúng ta có độ rộng của viewport là 375px đi và container của chúng ta là 365px. Lúc này công thức nó sẽ có như sau:

.card {
border-radius: max(0px, min(8px, calc(375px - 4px - 365px)));
/* Kết quả sẽ là */
border-radius: max(0px, min(8px, 6px));
}

Dựa vào kết quả ở trên, thì giá trị 6px sẽ được lấy từ hàm min() bởi vì 6px < 8px. Rồi lúc này hàm max() sẽ chạy với giá trị là 0px và 6px thì giá trị nó sẽ lấy là 6px. Vậy là sai rồi. Chúng ta không có muốn thế, chúng ta chỉ muốn border-radius chỉ là 0px hoặc là 8px mà thôi.

Để xử lý vấn đề này thì chúng ta sẽ lấy kết quả tính được trong chỗ hàm calc() nhân số một con số cực lớn mà chúng ta nghĩ là sẽ ít được sử dụng trong border-radius, ở đây mình dùng con số là 9999

.card {
border-radius: max(0px, min(8px, calc((375px - 4px - 365px)
 * 9999)));
/* Kết quả là */
border-radius: max(0px, min(8px, 59994px));
}

Dựa vào kết quả ở trên thì lúc này giá trị chúng ta lấy được ở hàm min() sẽ là 8px và hàm max() lúc này cũng sẽ là 8px. Cho nên giá trị của border-radius lúc này là 8px

Một ví dụ khác nữa nhé. Chúng ta có viewport là 1440px và cái card có độ rộng là 700px.

Giá trị mà chúng ta tính được ở hàm calc() sẽ là 7359264, một con số rất là lớn.

.card {
border-radius: max(0px, min(8px, 7359264px));
}

Hàm min() nó sẽ lấy giá trị 8px là chắc chắn rồi vì nó nhỏ hơn con số kia, và hàm max() sẽ lấy 8px vì 8px > 0px

.card {
border-radius: 8px;
}

Trường hợp tiếp theo sẽ là khi cái card có độ rộng bằng viewport luôn. Chúng ta sẽ thấy giao diện này khi mà ở thiết bị mobile. Lúc này chiều rộng của viewport và chiều rộng của container sẽ là như nhau.

Sau khi tính toán và nhân với con số 9999 thì chúng ta có kết quả là một con số âm -39996px

.card {
border-radius: max(0px, min(8px, -39996px));
}

Nhìn vào thì các bạn chắc cũng đoán được là nó sẽ lấy giá trị số âm vì nó nhỏ hơn 8px. Và lúc này hàm max(0px, -39996px) sẽ có kết quả là 0px

.card {
border-radius: 0px;
}

Các bạn đã thấy sự kì diệu chưa ? Mấy team khủng họ viết ảo diệu lắm, đôi khi chúng ta kiểm tra code của họ viết chúng ta đọc thì chúng ta sẽ học hỏi được nhiều cái mới lạ lắm đó. Hi vọng qua bài viết này sẽ giúp cho các bạn có thêm kiến thức mới và giúp các bạn nâng cao trình độ hơn nữa nhé.

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 CNTT hấp dẫn trên TopDev

IT Support Là Làm Gì? Phát Triển Sự Nghiệp Với Vị Trí IT Support

IT support là làm gì
IT Support Là Làm Gì? Phát Triển Sự Nghiệp Với Vị Trí IT Support

Theo chiều phát triển mạnh mẽ của ngành công nghệ thông tin, rất nhiều các vị trí mới ra đời để hỗ trợ và làm tốt công việc trong thời đại mới. Và IT Support là một trong những vị trí không thể thiếu với ngành công nghệ. Vậy IT Support là làm gì? Công việc hằng ngày của một IT Support gồm những gì và cần những kỹ năng gì để làm tốt vai trò này? Cùng TopDev tìm hiểu qua ngành nghề này với bài viết dưới đây nhé!

IT support là làm gì
Công việc của một IT Support

IT Support là gì?

IT Support là viết tắt của Information Technology Support. Tương tự như cách gọi của vị trí này, công việc chính của các IT Support là hỗ trợ các vấn đề liên quan đến kỹ thuật và công nghệ. Họ sẽ chịu trách nhiệm chính trong việc tiếp nhận thông tin, tư vấn và xử lý các vấn đề mà người dùng đang gặp phải có liên quan đến các yếu tố về công nghệ. Vai trò của một IT Support rất quan trọng trong suốt quá trình làm việc để đảm bảo không làm gián đoạn trải nghiệm sử dụng sản phẩm của người dùng.

Sự bùng nổ của thời đại IT mang đến rất nhiều lợi ích nhưng cũng kéo theo nhiều hệ lụy cho các đối tượng chưa có đủ thời gian để thích nghi với công nghệ mới. Do đó, việc còn khó khăn trong sử dụng các thiết bị công nghệ, máy tính, internet là rất phổ biến và dễ gặp, nhất là với người lớn tuổi và các đối tượng thiếu niên. Sự xuất hiện của IT Support được xem là “cứu cánh” cần thiết và kịp thời trong việc xử lý các vấn đề phức tạp của máy móc và công nghệ hiện đại.

Các công việc của IT Support là làm gì?

Vị trí mới lạ, công việc cụ thể ra sao, phải làm những gì là điều mọi người muốn tìm hiểu về vị trí này, vậy IT Support là làm gì chắc chắn là mối quan tâm với nhiều người. Một IT Support sẽ phải làm khá nhiều công việc khác nhau chủ yếu để hỗ trợ người dùng đang gặp phải các vấn đề liên quan đến sử dụng các thiết bị công nghệ:

  • Phối hợp với các bên liên quan để thu thập thông tin và hỗ trợ người dùng một cách nhanh chóng nhất, chính xác nhất.
  • Liên tục chăm sóc khách hàng cũng như giữ kết nối với họ để có thể theo dõi quá trình sử dụng sau này có vấn đề mới phát sinh không, để kịp thời hỗ trợ xử lý.

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

  • Kiểm tra hệ thống và các thiết bị của công ty một cách thường xuyên, theo thời gian định kỳ để phát hiện kịp thời các sự cố kỹ thuật có thể xảy ra.
  • Nghiên cứu, lên kế hoạch định hướng và phát triển nhiều hơn các công nghệ mới để cung cấp cho người dùng các sản phẩm công nghệ hiệu quả và đạt hiệu suất tối đa cao nhất.
kỹ năng của IT Support
Công việc của IT Support cần sự kết nối với nhiều bên liên quan

IT Support cần có những kỹ năng gì?

Để trở thành 1 IT Support chuyên nghiệp và có thể xử lý được các công việc một cách suôn sẻ nhất, bên cạnh kỹ năng tư vấn và sự kiên nhẫn, tập trung để xử lý vấn đề thì sự hiểu biết về IT là điều mà chắc các IT Support-er cần phải có.

Bạn cần tìm hiểu về các kiến thức liên quan đến khoa học máy tính, server, phần cứng, hệ thống mạng LAN/WAN,… để phục vụ tốt nhất cho công việc. Có kinh nghiệm làm việc trước đó trong ngành IT chắc chắn sẽ là một điểm cộng lớn cho vị trí IT Support này, chẳng hạn như kinh nghiệm trong việc quản trị server như Window, CentOS, Ubuntu,…

Xem thêm Mô Tả Công Việc IT HelpDesk & Những Điều Cần Biết Với Vị Trí Này

Ngoài ra, một điều không thể thiếu với một chuyên viên tư vấn và hỗ trợ chắc chắn là phải có kỹ năng giao tiếp tốt, thân thiện với người đối diện. Bạn cần luyện tập khả năng diễn đạt tốt, dễ hiểu, nắm bắt vấn đề nhanh chóng để vừa tiết kiệm thời gian vừa có thể giúp người dùng xử lý trục trặc một cách an toàn và hiệu quả nhất.

IT Support là một công việc hấp dẫn trong thời điểm hiện nay, cả về nhu cầu nhân lực lẫn mức thu nhập. Công nghệ thông tin sẽ còn tiếp tục phát triển trong tương lai do đó đừng lo sợ rằng đây là vị trí mới hay còn nhiều bấp bênh về cơ hội công việc. IT Support hiện nay có mức lương trung bình dao động trên 10 triệu đồng mỗi tháng với những tân cử nhân trong ngành. Mức thu nhập hấp dẫn này chắc chắn sẽ còn tăng cao trong thời gian tới nếu bạn đầu tư hợp lí cho kiến thức và kỹ năng của mình.

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

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

Là lập trình viên thì có nên chỉ viết code thôi không ?

lập trình viên làm gì
Là lập trình viên thì có nên chỉ viết code thôi không ?

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

Câu trả lời của mình là không. Mà các bạn nên tìm tòi học hỏi thêm nhiều thứ khác để có thể nâng cao kiến thức và cải thiện thêm nhiều kỹ năng khác nữa. Từ đó có thể tạo ra thêm thu nhập hoặc ít nhất là có kiến thức rộng hơn. Vậy đó là những cái gì thì mình sẽ giới thiệu cho các bạn ở dưới đây nha.

  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  "Code dễ đọc" là như thế nào?

Xem thêm nhiều việc làm IoT Development hấp dẫn trên TopDev

Viết blog

Khi chúng ta viết blog thì chúng ta sẽ phải tìm cách viết sao cho hay, tìm tòi nội dung, nghiên cứu từ khoá, làm sao để bài viết của mình lên TOP 10 của Google, và biết thêm nhiều về hosting, domain, để làm sao đưa website chúng ta lên trên mạng để nhiều người biết tới được.

Qua việc viết blog chúng ta sẽ có thêm những kỹ năng như là viết bài, SEO, lên nội dung, nghiên cứu từ khoá, chưa kể còn phải thiết kế ảnh bìa nữa, ngoài ra khi blog được nhiều người đọc, nhiều người biết tới thì cái thương hiệu cá nhân sẽ uy tín hơn, sau này dễ dàng kết nối tới nhiều người, làm được nhiều việc có lợi khác..

Làm freelance

Khi làm freelancer thì sẽ đúc kết được thêm kinh nghiệm làm việc online, tăng thu nhập rất là nhiều nếu làm giỏi, biết được nhiều trang tìm việc online hay, biết cách deal số tiền công tương xứng, có kinh nghiệm xử lý này kia, trình độ ngày một tăng lên đến khi giỏi, có lượng khách hàng tiềm năng rồi thì không lo không có việc nữa

Làm Youtuber

Làm Youtuber, cũng tương tự như blog nhưng mà là về videos thì chắc chắn chúng ta phải luyện thêm kỹ năng nói chuyện trước ống kính, hoặc đơn giản là vừa nói vừa ghi hình, học thêm các phần mềm chỉnh sửa video, quay phim, âm thanh các kiểu.

Khi làm Youtuber thì cũng sẽ học được thêm rất nhiều cho bản thân, kỹ năng hướng dẫn, chỉnh sửa videos, cách truyền đạt, dẫn chuyện, thiết kế ảnh bìa…

UI UX

Học UI UX để làm gì, để cải thiện thẫm mỹ để khi làm việc với Designer thì mình cũng có kiến thức để có thể làm ra sản phẩm giống thiết kế, hoặc khi không có Designer thì cũng có thể tự làm ra sản phẩm ít nhất cũng dễ nhìn còn hơn là xấu ko ai thèm dùng. Việc có thêm kiến thức UI UX là 1 lợi thế cho Lập trình viên mà bạn nên bổ sung vào nhé

Công cụ thiết kế

Học Photoshop, AI, Figma là những công cụ thiết kế, giúp chúng ta biết sử dụng để khi chúng ta được giao thiết kế từ những công cụ này thì sẽ dễ dàng lấy tài nguyên như hình ảnh, kiểu chữ, màu sắc, kích thước hoặc đơn giản hơn khi các bạn làm blog hoặc Youtube thì các bạn cũng có thể tự thiết kế ảnh bìa, ảnh cover, ảnh avatar cho riêng mình mà không cần phải đi thuê. Đôi khi có thời gian thì học thêm chỉnh sửa ảnh các kiểu, sau này bạn gái có nhờ thì trổ tài luôn.

Kỹ năng mềm

Học thêm kỹ năng mềm, như giao tiếp, rồi tìm tòi về cách gửi Mail lịch sự để khi chúng ta gửi CV xin việc gì đó thì cũng biết cách để nhà tuyển dụng họ đánh giá cao hơn những người chỉ biết gửi Email chứ ko biết đầu đuôi gì cả.

Một điểm hay nhất của viết blog, làm freelance, làm youtube là cho quen bị chửi đi 🙂 Dần dần biết cách bỏ ngoài tai những điều không tốt, từ đó hiểu bản thân mình hơn. Ngoài ra còn phải biết cách sắp xếp thời gian, bố trí phân chia công việc và viết lách.

Tạm kết

Học càng nhiều thì càng có lợi thế cho bản thân, có thêm nhiều kiến thức kỹ năng khác ngoài việc code, giống như những người ham đọc sách mình thấy họ có nhiều kiến thức sâu rộng, hỏi gì cũng nắm rõ và giải thích rất hay.

Mình thì ko ham đọc sách lắm, thay vào đó mình trau dồi những cái khác như mình đã trình bày ở trên. Hi vọng bài viết với tinh thần ham học này sẽ lan toả tới các bạn và giúp các bạn ngày một phát triển hơn nhé.

Có thể bạn quan tâm:
Xem thêm việc làm IT hấp dẫn trên TopDev

Chuyển đổi JSON qua CSV sử dụng thư viện Jackson

json qua csv
Chuyển đổi JSON qua CSV sử dụng thư viện Jackson

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

Thư viện Jackson giúp cho chúng ta có thể chuyển đổi data dưới dạng JSON sang các định dạng data khác nhau và ngược lại. Trong bài viết này, mình hướng dẫn các bạn cách chuyển đổi data từ JSON sang CSV như thế nào các bạn nhé!

  Cách tạo REST API với JSON Server
  Ghi chú file package.json của node module

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

Đầu tiên, mình sẽ tạo mới một Maven project:

với Jackson Dataformat CSV dependency như sau:

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>2.13.0</version>
</dependency>

Để làm ví dụ, mình sẽ chuyển đổi chuỗi JSON sau sang tập tin CSV:

{
"name" : "Khanh",
"code" : 99,
"date" : "04-07-2017",
"gotMarried": true
}

Để bắt đầu, mình sẽ tạo mới một Application class với main() method như sau:

package com.huongdanjava.jackson;

public class Application {

public static void main(String[] args) {

}
}

Đầu tiên, các bạn có thể sử dụng phương thức readTree() của đối tượng ObjectMapper của Jackson để đọc nội dung JSON mà các bạn cần chuyển đổi. 

Có nhiều phương thức overload readTree() hỗ trợ cho các bạn làm điều này:

Các bạn có thể đọc nội dung JSON từ file, từ chuỗi, từ byte,… Tuỳ theo bài toán mà các bạn hãy sử dụng các phương thức overload của readTree() cho hợp lý nhé. Ở đây, mình sẽ lưu nội dung JSON trên vào tập tin data.json ở thư mục src/main/resources để làm ví dụ:

JsonNode jsonNode = new ObjectMapper().readTree(new File("src/main/resources/data.json"));

Nội dung JSON này sẽ được lưu vào đối tượng JsonNode như các bạn thấy!

Tiếp theo, chúng ta sẽ sử dụng đối tượng CsvSchema Builder để định nghĩa các column của tập tin CSV.

Cho ví dụ của mình thì code sẽ như sau:

CsvSchema.Builder builder = CsvSchema.builder();
jsonNode.elements().next().fieldNames().forEachRemaining(f -> builder.addColumn(f));

Đoạn code trên là chúng ta đang lấy tất cả các key trong JSON data, bao gồm name, code, date, gotMarried trong ví dụ của mình, để định nghĩa là column trong tập tin CSV các bạn nhé!

Các bạn cũng có thể chỉ định những data nào, tương ứng với key nào trong JSON data được convert qua tập tin CSV bằng cách định nghĩa CsvSchema Builder như sau:

CsvSchema.Builder builder = CsvSchema.builder()
.addColumn("name")
.addColumn("code")
.addColumn("date");

Với đoạn code này thì ví dụ của mình chỉ có data của column name, code và date được convert mà thôi. Mình sẽ sử dụng code này trong bài viết này để làm ví dụ.

Sau khi đã có CsvSchema Builder xong thì các bạn có thể lấy đối tượng CsvSchema như sau:

CsvSchema csvSchema = builder.build().withHeader();

Bây giờ thì chúng ta có thể sử dụng CsvMapper để chuyển đổi JSON data sang CSV data rồi:

CsvMapper csvMapper = new CsvMapper();
csvMapper.configure(Feature.IGNORE_UNKNOWN, true);
csvMapper.writerFor(JsonNode.class)
.with(csvSchema)
.writeValue(new File("src/main/resources/data.cvs"), jsonNode);

Bởi vì mình đang định nghĩa các column manually, nên sẽ có những column mà CsvMapper không aware được khi làm việc chuyển đổi. Do đó, mình cần cấu hình để nó ignore những column đó đi.

Trong ví dụ này, mình lưu tập tin output data.csv ở thư mục src/main/resources.

Toàn bộ code của ví dụ như sau:

package com.huongdanjava.jackson;

import com.fasterxml.jackson.core.JsonGenerator.Feature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import java.io.File;
import java.io.IOException;

public class Application {

public static void main(String[] args) throws IOException {
JsonNode jsonNode = new ObjectMapper().readTree(new File("src/main/resources/data.json"));

CsvSchema.Builder builder = CsvSchema.builder()
.addColumn("name")
.addColumn("code")
.addColumn("date");

CsvSchema csvSchema = builder.build().withHeader();

CsvMapper csvMapper = new CsvMapper();
csvMapper.configure(Feature.IGNORE_UNKNOWN, true);
csvMapper.writerFor(JsonNode.class)
.with(csvSchema)
.writeValue(new File("src/main/resources/data.csv"), jsonNode);
}
}

Kết quả khi chạy chương trình như sau:

Jackson sẽ không làm việc được với những kiểu dữ liệu nested JSON các bạn nhé.

Ví dụ như nếu các bạn có chuỗi JSON sau:

{
"name" : "Khanh",
"code" : 99,
"date" : "04-07-2017",
"gotMarried": true,
"group" : [
"ABC", "XYZ"
],
"class" : {
"name" : "A",
"code" : 123
}
}

thì khi code, các bạn cần định nghĩa manually tên các column để loại bỏ những nested JSON này ra các bạn 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 CNTT hấp dẫn trên TopDev