SDKMAN là gì? Tại sao lập trình viên Java nên cài đặt SDKMAN?

Một công cụ cực hay trên Linux mình đọc được trên Viblo nên xin phép được repost lại chia sẻ cùng mọi người.

1. SDKMan là gì?

SDKMan (Software Development Kit Manager) là một công cụ dùng để quản lý song song các phiên bản của các bộ phát triển phần.

Ví dụ bạn có thể cài nhiều phiên bản Java trên máy. Khi muốn dùng version nào thì bạn chuyển sang version đó. Hay muốn cài Java thì chỉ cần chạy lệnh của SDKMan là nó tự động cài phiên bản Java stable mới nhất hoặc theo phiên bản bạn chỉ định.

SKDMan cung cấp chuẩn giao tiếp dòng lệnh (Command Line Interface – CLI) và các api để cài đặt, xóa, chuyển đổi hiển thị danh sách SDK.

2. Những tính năng và ưu điểm của SDKMan

  • Giúp cho việc cài đặt dễ hơn: bạn không cần phải download, giải nén tạo các biến môi trường
  • Hỗ trợ đầy đủ các gói phát triển Java: SDKMan có thể cài được các SDK cho JVM như Java, Groovy, Scala, Kotlin … Các trình quản lý thư viện Java như Ant, Gradle, Maven… (Xem các SDK mà SDKMan hỗ trợ quản lý tại đây)
  • SKDMan rất nhẹ: SDK được viết cho giao diện dòng lệnh (bash), chỉ yêu cầu chạy được lệnh curl, zip/unzip
  • SDKMan có thể chạy trên tất cả platforms UNIX: Mac OSX, Linux, Cygwin, Solaris and FreeBSD

3. Một số lệnh cơ bản của SDKMan

3.1 Liệt kê các sdk mà SDKMan hỗ trợ

sdk list 

3.2 Cài đặt bộ phát triển phần mềm (sdk)

Cài đặt bản stable nhất sdk install sdk_name:

Ví dụ mình muốn cài bản Java stable mới nhất thì sẽ dùng lệnh:

sdk install java Hoặc muốn chỉ rõ một version nào đó thì bạn sử dụng sdk install sdk_name sdk_version

Ví dụ

sdk install scala 2.12.1

3.3 Hiển thị danh sách các version của sdk

Hiển thị danh sách các version của một bản sdk: sdk list sdk_name

Ví dụ mình muốn xem các version của gradle đang hỗ trợ:

sdk list gradle 

3.4 Xóa SDK

sdk uninstall sdk_name sdk_version Ví dụ mình muốn xóa bản scala version 2.11.6

sdk uninstall scala 2.11.6

3.5 chuyển đổi giữa các version SDK

sdk default sdk_name sdk_version Ví dụ trên máy mình có nhiều bản scala, mình muốn chuyển sang bản scala 2.11.6 làm bản mặc định

sdk default scala 2.11.6

References: https://stackjava.com/sdkman/sdkman-la-gi-gioi-thieu-sdkman-trong-lap-trinh-java.html

(Xem thêm: Cài đặt Java bằng SDKMan )

(Xem thêm: Cài đặt Gradle bằng SDKMan)

(Xem thêm: Cài đặt Maven bằng SDKMan)

Nguồn: https://viblo.asia/p/sdkman-la-gi-tai-sao-lap-trinh-vien-java-nen-cai-dat-sdkman-4P856dWOZY3

Tác giả: stackjava ( https://viblo.asia/u/cuongth )

Advertisements

Gợi ý một workspace cho dân IT đặc biệt cho Web Developer

Hi mọi người, nay giới thiệu cho mọi người một workspace (không gian làm việc) của mình như một gợi ý cho mọi người có thể tham khảo. Chủ yếu mình sẽ giới thiệu về các công cụ và chức năng sử dụng trong công việc hàng ngày là chính chứ không đi sâu vào hướng dẫn sử dụng phần mềm đâu nhé. Khi học tập hay làm việc mọi người nên tối ưu cho mình một không gian làm việc sao cho đạt hiệu quả nhất, tối ưu thời gian cho bản thân mình và đồng nghiệp xung quanh. Đối với dân IT thì không gian làm việc là ngay trên chính chiếc laptop hay những bộ Desktop vì vậy mình sẽ gợi ý cho mọi người một Workspace mà mình đang dùng.

  1. Công cụ quản lý tập tin, quản lý thư mục Q-Dir

Phần mềm này hay và tiện ích ở chỗ mình có thể quản lý nhiều cửa sổ trong một màn hình ứng dụng Q-Dir khi muốn thao tác copy, chỉnh sửa hay mở các project thì sẽ tiện lợi, tiết kiệm thời gian hơn rất nhiều. Mọi thao tác trong mỗi cửa sổ con đều giống như chúng ta thao tác với Windows Explorer bình thường nên chúng ta không mất quá nhiều thời gian vào tìm tòi cách sử dụng. Công cụ này hoàn toàn miễn phí nhé mọi người.

2. Công cụ quản lý mail, đa tài khoản: Mailbird

Một phần mềm mà mình rất thích bởi vì mình có thể quản lý nhiều tài khoản email, gmail cùng một lúc rất tiện như trong hình mình có 4 email là mail cá nhân, công việc, trường học với công ty nên cứ mỗi lần thao tác trên trình duyệt “khắc nhập, khắc xuất” nhiều làm mình hơi mệt. Ở đây mình có thể xem danh sách mail, chi tiết mail, xóa mail rác, soạn mail mới tất cả trong cùng một cửa sổ cực nhanh và cực tiện. Nếu mọi người sợ bị làm phiền khi đang làm việc mà sợ mail tới thì có thể cài đặt thời gian nhận thông báo mail ví dụ thời gian làm từ 8h sáng đến 5 giờ chiều thì có thể cài đặt các khoảng thời gian để kiểm tra mail và các thời gian còn lại sẽ không bị làm phiền. Phần mềm này cũng miễn phí, nâng cấp lên để xài các chức năng nâng cao nhé.

Continue reading

Trường học vs Công sở – đôi bạn thân ít ai ngờ tới

Khi còn đi học ở trường đại học chúng ta chỉ muốn nhanh chóng ra trường để đi làm mà mấy ai biết khi đi làm thì chỉ muốn quay về trường học lại.

Đùa với các bạn thế thôi, mình còn một cái khóa luận tốt nghiệp to đùng với 1 môn học thiết kế phần mềm giáo dục nữa còn ở công ty thì tính tới bây giờ mình đã làm được 8 tháng rồi đấy. Nhân hôm nay vừa làm xong cái yêu cầu của khóa luận tốt nghiệp lên tâm sự với mọi người dù biết rằng chắc chẳng có ai vào cái blog mà mình không quảng cáo cũng không cho ai biết này đâu.

Trường học và công ty tuy hai mà một, một bên cung cấp kiến thức mang nặng tính lý thuyết, học thuật, một bên lại yêu cầu luyện tập thực hành hàng ngày, đánh giá dự án thực tế để nâng cao bản thân. Mình thấy nhiều bạn ái ngại việc đi thực tập hoặc đi làm part-time tại một công ty trong thời gian còn học ở trường vì một số lý do sau:
+ Sợ bỏ bê việc học không đạt được điểm số như mong muốn
+ Không cân bằng được việc quản lý thời gian vì ở công ty khi đã làm chính thức đòi hỏi việc estimate thời gian theo task, theo dự án chính xác từ giờ phút đấy nhé
+ Sợ kiến thức học được ở trường không áp dụng vào vì suy nghĩ kiểu gì vào người ta cũng train lại từ đầu thì thôi học cho xong rồi đi làm luôn.

Vân vân và vân vân ý kiến nhằm phủ định mong muốn đi thực tập hoặc đi làm của bản thân. Điều này làm mất khá nhiều thời gian của các bạn đấy vì như mình dân kỹ thuật đã phần nếu không ở trường thì ở nhà cũng phải tìm hiểu công nghệ, làm dự án cá nhân thì mới lên trình được vậy tại sao thời gian ở nhà đó chúng ta lại không thử sức trong một môi trường mới năng động hơn là ở nhà đó là công ty. Mình có thể đưa ra một số lý do bên dưới:
+ Đi làm công ty được train, học những kiến thức rất rất thực tế
+ Giao tiếp được với mọi người các anh chị được mọi người truyền lại kinh nghiệm
+ Làm dự án thực tế cũng như một dự án cá nhân nhưng sẽ có team và có support thay vì ở nhà cặm cụi tự tìm kiếm, fix bug thì môi trường công ty sẽ giúp ta hướng giải quyết vấn đề và teamwork chuyên nghiệp trong một dự án
+ Học được quy trình làm việc mà từ đó có thể áp dụng vào trường học ngược lại

Nhưng các bạn đừng lo kiến thức ở trường không phải là vô dụng đâu

Chúng ta học được các kiến thức căn bản lập trình nè, hướng đối tượng, hướng hàm từ đó có cái nhìn tổng quan và dễ nắm bắt một ngôn ngữ lập trình. Tiếp theo đó mình sẽ liệt kê một số điều tuyệt vời mà trường học trang bị giúp chúng ta tham gia vào các công ty:
+ Kỹ năng trang bị đối phó trong các đợt đăng ký môn học giúp ta phản ứng nhanh với các tình huống bất ngờ như khách hàng thay đổi requirement chẳng hạn :v
+ Kỹ năng làm việc nhóm ở trường đại học cũng là một bước tiến cho bạn làm việc nhóm tại các công ty nơi các bạn đóng góp ý kiến và chia sẻ kiến thức của mình với mọi người
+ Kỹ năng tìm kiếm ở trường như phải tìm kiếm tài liệu, nguồn tiếng Anh giúp chúng ta có kinh nghiệm hơn trong việc giải quyết vấn đề “first” bởi vì chúng ta phải tự tìm hiểu trước mới hỏi đến mentor hoặc giáo viên điều đó giúp cho làm việc ở công ty cũng theo tuần tự như vậy. Phải tự research trên medium, stackoverflow, viblo,… nếu bí quá thì mới hỏi anh leader, anh senior giúp mình 😀

Áp dụng kiến thức từ công ty vào ngược lại trường học, tại sao không?

Hiện tại mình đang áp dụng quy trình làm việc mà mình học tập ở công ty vào khóa luận tốt nghiệp của mình:
+ Phân tích yêu cầu của ứng dụng, đánh giá thực trạng của chủ đề nhóm đang làm
+ Ước lượng thời gian cho các yêu cầu, cần phải high level cho các module của ứng dụng
+ Sau khi đã có bản ướ lượng ta áp dụng ngay vào cho Đề cương chi tiết khóa luận một cái nhà trường yêu cầu phải có nhưng bây giờ ta có bản estimate thời gian rồi thì chỉ cần việc áp vào rất nhanh
+ Tiếp theo phân tích cơ sở dữ liệu theo mô hình SQL hoặc NoSQL cho việc hỗ trợ tốt đa các chức năng ví dụ là Full-text search chẳng hạn
+ Khi mọi thứ đã ổn định như vậy thì ta tiến hành code theo các module khi đó thời gian ta làm việc sẽ nhanh chóng và chuyên nghiệp đảm bảo đúng theo lộ trình giao viên hướng dẫn đề ra
+ Áp dụng các công nghệ quản lý như Trello, Skype, TortoiseGit để quản lý task, mã nguồn và liên lạc giữa các thành viên nhóm
+ Cuối cùng là các kỹ năng test và viết document được học hỏi từ các anh chị bên team Test giúp cho chúng ta hoàn thành báo cáo và kiểm thử lại dự án chuyên nghiệp nhất có thể.

Trên đây là một số chia sẻ của mình giữa trường học và công ty, giữa việc học và việc đi làm. Nó bổ sung kinh nghiệm, kiến thức cho nhau chứ không loại trừ lân nhau nên nếu có thể hãy đắm mình trong sự hối hả của cả 2 để thấy được chúng ta mạnh mẽ đến thế nào như mình chẳng hạn Ahihi

Khai code đầu xuân, tìm hiểu về Progressive Web Apps (PWA)

Image result for 2019

Xin chào các bạn, các bạn ăn Tết có vui không nè, hôm nay hết Tết rồi mọi người lại quay trở lại với cuộc sống thường nhật thôi. Chắc hẳn mọi người đã từng nghe đến Single Page Application (SPA) rồi phải không? Hôm nay mình sẽ chia sẻ về một khái niệm mới mà các nhà dự đoán công nghệ sẽ bùng nổ trong năm 2019 đó là Progressive Web Apps (PWA).

Vậy PWA là gì? PWA là trải nghiệm người dùng có hướng tiếp cận mới theo các tiêu chí sau:

  • Đáng tin cậy – Tải trang ngay lập tức và không bao giờ hiển thị downasaur, (chú khủng long đáng ghét) ngay cả trong điều kiện mạng không ổn định.
  • Nhanh – Đáp ứng nhanh chóng với các tương tác của người dùng với hình ảnh động mượt mà.
  • Hấp dẫn – Cảm thấy giống như một ứng dụng tự nhiên trên thiết bị, với trải nghiệm người dùng tuyệt vời.

Mức chất lượng mới này cho phép PWA chiếm được một vị trí trên màn hình chính của người dùng. Bây giờ sẽ đi chi tiết vào các tiêu chí bên trên nhé.

1. Đáng tin cậy
Khi khởi động ứng dụng từ màn hình người dùng, Service Workers cho phép PWA tải một cách nhanh chóng bất chấp trạng thái kết nối mạng.
Một Service Worker được viết bằng Javascript giống như một người ủy quyền phía client và để cho người dùng truy cập cache và cách phản hồi lại yêu cầu request. Bằng việc pre-caching (tải lại bộ nhớ đệm đã lưu các nguồn tài nguyên khi người dùng truy cập trang trước đó), bạn có thể loại bỏ việc phụ thuộc vào internet, đảm bảo trải nghiệm người dùng một cách nhanh chóng và đáng tin cậy.

2. Nhanh chóng
53% lượng người dùng sẽ rời bỏ một trang web nếu nó chiếm quá nhiều thời gian tải trang thông thường là 3 giây (không tối ưu trang web như ảnh động, ảnh dung lượng lớn, thư viện nhiều mà không sử dụng hoặc không minified). Và một khi đẫ tải, người dùng mong chờ tải trang nhanh nhất có thể không cần phải cuốn tới đâu tải tới đó hoặc phản hồi chậm. Một trong những ví dụ điển hình trong việc tối ưu trang và tải trang là Thegioididong. Tải cực nhanh và hình ảnh load toàn bộ không cần cuộn để “Load More“.

3. Hấp dẫn
PWA có thể cài đặt và trực tuyến trên màn hình người dùng mà không cần bất kỳ ứng dụng nào khác hỗ trợ. PWA cung cấp trải nghiệm toàn màn hình với sự trợ giúp từ một tập tin manifest (khai báo quyền và cài đặt ứng dung) và thậm chí có thể thu hút người dùng bằng  push notifications.
Một tập tin Manifest cho phép bạn điều khiển cách ứng dụng xuất hiện và cách nó khởi chạy. Bạn có thể chỉ rõ icon, cách tải trang, điều hướng màn hình và thậm chí có hiển thị trong trình duyệt hay không.

Continue reading

Comeback…. Welcome to my blog!

Chào mọi người rất xin lỗi vì quãng thời gian qua mình phải làm tiểu luận chuyên ngành nên không có nhiều thời gian chăm chút cho blog để như nhà hoang ý rất có lỗi luôn.

Giờ mình bắt đầu kì 2 năm cuối rồi chuẩn bị cho khóa luận tốt nghiệp nhưng trong khoảng thời gian này mình khá rảnh nên tiếp tục viết các bài chia sẻ với blog. Dự định sắp tới của mình là tập trung khá nhiều vào Front-end vì ở công ty mình cũng đang làm Front-end nhiều. Tiểu luận chuyên ngành mình tập trung học Angular 6 và set-up một project Angular 6 nên cũng khá thú vị. Bây giờ ở công ty mình làm về Vue.JS một bé nhưng có võ trong thời gian gần đây. Nếu có thời gian mình sẽ chia sẻ nhiều về nó. Bên cạnh đó mình muốn học tiếng Nhật và tiếng Hàn (sở thích coi show của mình 😀 ) sau đó là học guitar cua gái ahihi

Rất mong mọi người tiếp tục quan tâm tới blog và dành nhiều sự quan tâm về các bài viết mình chia sẻ cảm ơn mọi người nhiều nha thả tim ❤ ❤ ❤

Hệ thống nhúng – Giao tiếp chuột và bàn phím sử dụng Kit STM32F429-DISCOVERY

Mình đang làm báo cáo đè tài này nên tiện đây chia sẻ cho mọi người báo cáo kết thúc môn học của mình luôn. Đề tài giao tiếp chuột và bán phím với Kit. Ở đây mình sử dụng Kit STM32F429-DISCOVERY. Vì đây mình chỉ upload thôi nếu mọi người có thắc mắc gì có thể comment hoặc nhắn tin cho mình nha, blog mình không đi sâu vào nhúng nên bài này mình sẽ không đi quá sâu.


Sơ lược về vi xử lý: 

  • STM32F429ZIT6 có bộ nhớ Flash 2MB được tổ chức 2 banks cho phép đọc ghi song song, 256 KB RAM(LQFP144)
  • Bộ nhớ ngoài linh động với 32 bit bus dữ liệu: hỗ trợ bộ nhớ SRAM, PSRAM, SDRAM, Compact Flash/NOR/NAND
  • On-board ST-LINK/V2 với lựa chọn chế độ chuyển đổi giữa debug và chạy mạch.
  • ST-LINK/V2 ( có kết nối SWD để lập trình và gỡ lỗi) giúp cho việc nạp code vào mạch diễnra nhanh chóng hơn từ việc code từ Keil uVision và đưa qua ST-Link Utility và nạpcode vào mạch.
  • Nguồn cấp cho Board kit là qua USB hoặc từ nguồn điện bên ngoài 3V or 5V tiện lợi vìcó thể chuyển đổi từ cổng USB trên máy tính để cấp nguồn cho mạch.
  • Màn hình TFT LCD QVGA 2.4”: Bộ điều khiển LCD-TFT có độ phân giải lên tới VGA với Bộtăng tốc Chrom-ART chuyên dụng để tạo nội dung đồ họa nâng cao (DMA2D)
  • Bộ cảm biến chuyển động thích hợp trong mạch L3GD20
  • DMA đa năng: Bộ điều khiển DMA 16 luồng với hỗ trợ FIFO và hỗ trợ cụm
  • RTC: đo độ chính xác của giây, lịch trong phần cứng
  • Kết nối nâng cao
    • Thiết bị / máy chủ / bộ điều khiển OTGtốc độ cao USB 2.0 với PHY
    • Bộ điều khiển / máy chủ / OTG tốc độcao / tốc độ cao USB 2.0 với DMA chuyên dụng, PHY và ULPI tốc độ cao
    • 10/100 Ethernet MAC với DMA chuyên dụng:hỗ trợ phần cứng IEEE 1588v2, MII / RMII

Sơ lược về Kit:

  • Kit đã bao gồm mạch nạp nên khi nạp không cần sử dụng đến các thiết bị như ST-Linker mà có thể nạp code qua ứng dụng ST-Link Utility
  • Kit có tích hợp Micro Vi điều khiển (Micro Controller Unit – MCU) là đơn vị xử lý nhỏ, nó được tích hợp toàn bộ các bộ nhớ như ROM, RAM, các Port truy xuất, giaotiếp ngoại vi trực tiếp trên một con chip hết sức nhỏ gọn.
  • Màn hình QVGA TFT LCD 2.4” hiển thị màu
  • 6Led bao gồm:
    • LD1 (đỏ/xanh) cho giao tiếp USB
    • LD2 (đỏ) dành cho cấp nguồn 3.3V
    • 2 Led người dùng: LD3 (xanh) và LD4 (đỏ)
    • 2 Led USB OTG: LD5 (xanh) VBUS và LD6(đỏ) OC
  • 2 nút bấm: User và Reset
  • Cổng kết nối USB OTG với chuẩn micro-AB
  • Cảm biến con quay hồi quy xoay 3 trục xyz
  • Cổng USB cấp nguồn 3V hoặc 5V
  • Tính năng đầu tiên là tích hợp SD-Link/V2 hỗ trợ 2 chế độ nạp code chạy và debug
  • Tính năng mbed-enabled : nhằm đảm bảo các nhà phát triển có thể sử dụng các công nghệ Mbed (Mbed OS, Mbed Linux và các công cụ khác) trên một loạt các phần cứng đủ điều kiện.
  • Tính năng cảm biến con quay hồi quy xoay Kit theo 3 trục xyz
  • Tích hợp màn hình Led có hỗ trợ cảm ứng
  • Kết nối USB có các chức năng chính:
    • Cổng debug
    • Cổng COM ảo
    • Lưu trữ Mass
    • Nạp nguồn cho Kit
    • Giao tiếp USB OTG chuẩn micro-AB

Sơ đồ Kit các cổng nguồn và cổng USB giao tiếp như hình:

Code demo (tác giả có comment trong code nhé):

/**
 *	Keil project for USB HID Host
 *
 *
 *	Before you start, select your target, on the right of the "Load" button
 *
 *
 *	@author		Tilen Majerle
 *
 *
 *	@email		tilen@majerle.eu
 *
 *
 *	@website	http://stm32f4-discovery.com
 *
 *
 *	@ide		Keil uVision 5
 *
 *
 *	@packs		STM32F4xx Keil packs version 2.2.0 or greater required
 *
 *
 *	@stdperiph	STM32F4xx Standard peripheral drivers version 1.4.0 or greater required
 *
 *
 */

/* Include core modules */

#include "stm32f4xx.h"

/* Include my libraries here */

#include "defines.h"

#include "tm_stm32f4_disco.h"

#include "tm_stm32f4_delay.h"

#include "tm_stm32f4_usb_hid_host.h"

#include <stdio.h>

int main(void) {

	TM_USB_HIDHOST_Result_t USB_HID_Status;		/* USB HID Host status */

	TM_USB_HIDHOST_Keyboard_t Keyboard_Data;	/* Keyboard handler */

	TM_USB_HIDHOST_Mouse_t Mouse_Data;			/* Mouse handler */

	
	/* Initialize system */

	SystemInit();

	
	/* Leds init */

	TM_DISCO_LedInit();

	
	/* Delay init */

	TM_DELAY_Init();

	
	/* Init USB HID */

	TM_USB_HIDHOST_Init();


	while (1) {

		/* Process USB HID */

		/* This must be called periodically */

		TM_USB_HIDHOST_Process();
		
		/* Get connected device */

		USB_HID_Status = TM_USB_HIDHOST_Device();
		
		/* Switch status */

		switch (USB_HID_Status) {

			/* Keyboard connected */

			case TM_USB_HIDHOST_Result_KeyboardConnected:
				
				/* GREEN led ON */

				TM_DISCO_LedOn(LED_GREEN);
			
				/* Get keyboard data */

				TM_USB_HIDHOST_ReadKeyboard(&Keyboard_Data);

				/* Check if keyboard button is pressed */

				if (Keyboard_Data.ButtonStatus == TM_USB_HIDHOST_Button_Pressed) {

					if (Keyboard_Data.Button == 'a') {			/* Turn on RED led on 'b' button */

						TM_DISCO_LedOn(LED_RED);

					} else if 

(Keyboard_Data.Button == 'm') {	/* Turn off RED led on 'm' button */

						TM_DISCO_LedOff(LED_RED);

					}

				}

				
				break;

			
			/* Mouse connected */

			case TM_USB_HIDHOST_Result_MouseConnected:

				
				/* RED led ON */

				TM_DISCO_LedOn(LED_RED);

			
				/* Get mouse data */

				TM_USB_HIDHOST_ReadMouse(&Mouse_Data);

			
				/* Check buttons */

				if (Mouse_Data.LeftButton == TM_USB_HIDHOST_Button_Pressed) {	/* Left button */

					TM_DISCO_LedOn(LED_GREEN);
									/* Toggle GREEN led */

				}

				if (Mouse_Data.RightButton == TM_USB_HIDHOST_Button_Pressed) {	/* Right button */

					TM_DISCO_LedOff(LED_GREEN);
									/* Toggle GREEN led */

				}

				if (Mouse_Data.MiddleButton == TM_USB_HIDHOST_Button_Pressed) {	/* Middle button */

					TM_DISCO_LedToggle(LED_GREEN);
								/* Toggle GREEN led */

				}

				if (Mouse_Data.DiffX != 0 || Mouse_Data.DiffY != 0) {

					/* If there is a difference for mouse movement at any coordinate */

					TM_DISCO_LedToggle(LED_GREEN);

								/* Toggle RED led */

					
					/* If you need to move cursor now at fix position */

					/* Positions are stored like this */

					//Mouse_Data.AbsoluteX //Absolute X position for LCD

					//Mouse_Data.AbsoluteY //Absolute Y position for LCD

				}

			
				break;

			
			/* No device connected */

			case TM_USB_HIDHOST_Result_Disconnected:

				
				/* Turn off leds */

				TM_DISCO_LedOff(LED_RED | LED_GREEN);

			
				break;

			
			/* Device is not supported */

			case TM_USB_HIDHOST_Result_DeviceNotSupported:

				
				/* Device is not supported */

				/* Toggle leds forever */

				TM_DISCO_LedToggle(LED_RED | LED_GREEN);

				/* Delay */

				Delayms(50);

			
				break;

			
			/* Error occurred somewhere */

			case TM_USB_HIDHOST_Result_Error:

				
				/* Error occurred */

				/* Toggle RED LED forever */

				TM_DISCO_LedToggle(LED_RED);

				/* Delay */

				Delayms(50);

			
				break;

			
			/* Library is not initialized */

			case TM_USB_HIDHOST_Result_LibraryNotInitialized:

				
				/* Library is not initialized */

				/* Toggle GREEN LED */

				TM_DISCO_LedToggle(LED_GREEN);

				/* Delay */

				Delayms(50);

			
				break;

		}

	}

}

Link hướng dẫn: https://stm32f4-discovery.net/2014/08/library-31-usb-hid-host-for-stm32f4xx-devices/

Kĩ thuật đọc header của tập tin CSV có định dạng tiếng Nhật

Xin chào mọi người lại là mình đây chắc cũng khuya rồi nên nay viết một bài nhẹ nhẹ chia sẻ chút về việc đọc header trong tập tin CSV tiếng Nhật nha (.csv). Thường các tập tin tiếng Nhật có định dạng rất khó chịu khi chúng ta xử lý họ thường đính kèm thêm các chuỗi kí tự lạ vào đầu file hoặc đầu mỗi dòng vì thế chúng ta phải cận thận. Hay gần đây thì mình có gặp file không có đuôi định dạng và được họ compile rồi sau đó yêu cầu chúng ta xử lý với file đó 😀 

Lan man thế đủ rồi vào vấn đề chính thôi, mình đã thử đọc header bằng một số thư viện như OpenCSV, CSVParser và các lớp có sẵn của Java như Scanner và FileInputStream (đọc trực tiếp) đều gây ra lỗi định dạng kí tự đặc biệt vì thế mình quyết định dùng cách lấy thẳng MultipartFile sau đó parse file đó qua Bytes thì ok tuyệt vời. Sau đây là cách xử lý của mình:

try {

            byte[] bytes = file.getBytes();

            String body = new String(bytes, StandardCharsets.UTF_8).trim().replaceAll("[\"]", "");

            BufferedReader input = new BufferedReader(new StringReader(body));

            String line;

            int lineIndex = 0;

            while ((line = input.readLine()) != null) {

                if(lineIndex > 1) {

                    break;

                }

                String UTF8_BOM = "\uFEFF";

                if (line.startsWith(UTF8_BOM)) {

                    line = line.substring(1);

                }

                String[] row = line.replaceAll(" ", "").split(",");

                if (lineIndex > 0) {

                    // process with body of CSV file

                }

                else {

                    if (row.length != headerArr.length) {

                        // check number of CSV header

                    }

                    for(int i = 0; i < row.length; i++) {

                        if (!row[i].equals(headerArr[i])) {

                            // check header with list header (validate CSV file is right format or not

                        }

                    }

                }

                lineIndex++;

            }

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

Ok ha đầu tiên file ở đây là MultipartFile còn nếu các bạn truyền vào là File thì các bạn tìm cách thử xem File thì sẽ sử lý trong tiếng Nhật thế nào nhé. Mình getBytes() từ file đó ra thành mảng byte[], sau đó đưa mảng đó về String , bỏ dấu cách và các dấu \ thường là format bên Nhật. Tiếp theo sử dụng BufferedReader để đọc chuỗi String mình vừa parser được ha 😀

Tiếp theo thì ta đọc từng dòng của nó thôi và sử dụng lineIndex để check header và phần body của nó. Ở đây là logic code của mình thôi mọi người có thể chính sửa theo ý mọi người, phần mình nhắc đến đầu bài là các kí tự lạ trong tiếng Nhật chúng ta nên open file csv bằng Notepad++ kiểm tra coi phía đầu file có các kí tự được chèn hay không nó được gọi là BOM nếu có thì ta subString() dòng đọc của chúng ta nhé. À quên mất đọc từng dòng thì dùng lệnh (line = input.readLine()) != null để check. 

Sau khi đã loại bỏ các kí tự đặc biệt và các chuỗi bị chèn vào thì ta đưa header này vào mảng bằng hàm split(). Sau đó mảng header đã có từ đó mà chúng ta lần lượt check các index của header trong mảng có khớp với header format của File yêu cầu hay không nếu đúng thì cho upload file còn không thì thông báo lỗi cho người dùng. Ở đây mình ứng dụng cho việc:
+ Validate định dạng File với header
+ Xử lý với các tập tin tiếng Nhật có kí tự lạ
+ Một cách để đọc file được người dùng upload lên server

Trên đây là chia sẻ và thủ thuật nhỏ của mình, nếu mọi người có đóng góp gì có thể bình luận và chia sẻ, góp ý bên dưới nhé. Cảm ơn tất cả mọi người!