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 ❤ ❤ ❤

Advertisements

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!

Tận dụng tối đa các hàm làm việc với chuỗi trong ví dụ đọc dữ liệu Tiếng Nhật

Xin chào mọi người, nay có làm một task xử lý một đoạn chuỗi mà chia làm nhiều header với content theo nó, mà content thì có xuống dòng các kiểu nên mạn phép chia sẻ với mọi người chút về đoạn xử lý của mình. Đơn giản thôi chỉ là sử dụng các hàm có sẵn trong Java mà xử lý. Mình có chia làm 2 cách và mình sẽ chú thích sau mỗi cách nhé. Nào bắt đầu thôi, đầu tiên là đoạn Data mẫu từ Excel file: 

Đoạn data có các header nằm trong cập dấu [] và nội dung đi theo bên dưới (có xuống dòng) và yêu cầu đặt ra là cần lấy header ra một List và content thì ra một List riêng để sau này convert data từ CSV qua PDF mình sẽ điền data này vào PDF. Ở bài sau mình sẽ giới thiệu về thư viện Apache POIPDFBox để làm việc qua lại giữa CSV và PDF nhé, nay thì mình làm việc với chuỗi Data thôi.

Cách 1 : Các bạn đưa chuỗi về mảng char[] sau đó dùng vòng lặp và check các dấu [ và nếu gặp dấu [ thì khởi động vòng lặp thứ 2 kiểm tra dấu ] , cứ như vậy thì thêm vào list header. Cách này làm việc với hàm .toCharArray() còn lại phía sau sử dụng vòng lặp thôi không có gì hết 😀

char[] header = sheet.getRow(47).getCell(2).getRichStringCellValue().getString().toCharArray();

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

    if (header[i] == '【') {

         String title = "【";

         for (int j = i + 1; j < header.length; j++) {

             title += header[j];

             if (header[j] == '】') {

                 break;

             }

          }

          headerList.add(title);

     }

}

Cách 2: Cách này sẽ thuần hơn sử dụng các hàm xử lý chuỗi có sẵn trong Java:

String rowData = sheet.getRow(rowIndex).getCell(2).getStringCellValue();

int indexNewHeader = 0;

while (indexNewHeader < rowData.length()){

     headerList.add(rowData.substring(rowData.indexOf("【", indexNewHeader),rowData.indexOf("】", indexNewHeader) + 1));

     indexNewHeader = rowData.indexOf("】", indexNewHeader);

     // check last header

     if(indexNewHeader == rowData.lastIndexOf("】")) {

         // get content by header

         String[] contents = rowData.substring(rowData.lastIndexOf("】") + 1).split("\r\n");

         List<String> contentData = new ArrayList<>();

         for(String content: contents) {

             contentData.add(content);

         }

         contentList.add(contentData);

         break;

     }

     else {

        // get content by header

        String[] contents = rowData.substring(rowData.indexOf("】", indexNewHeader) + 1, rowData.indexOf("【", indexNewHeader)).split("\r\n");

         List<String> contentData = new ArrayList<>();

         for(String content: contents) {

              contentData.add(content);

          }

          contentList.add(contentData);

      }

      indexNewHeader++;

}

Cách dưới mình tiến hành substring từ vị trí có dấu [ đến vị trí có dấu ] và có thêm tham số fromIndex là indexNewHeader, các bạn chú ý fromIndex chính là ta tiến hành cắt chuỗi từ vị trí index bao nhiêu ví dụ mình đưa vào là 10 thì dù phía trước kí tự thứ 10 có dấu [ hay ] thì nó cũng chỉ tính bắt đầu từ index thứ 10 mà thôi. indexNewHeader là biến để mình đặt header mình vừa cắt kết thúc ở đâu và lần sau mình cắt chuỗi fromIndex từ vị trí lần trước . Hàm lastIndexOf() kiểm tra vị trí cuối cùng của kí tự mình kiểm tra, ở đây mình kiểm tra kí tự cuối cùng của dấu ] để mình so sánh với thằng indexNewHeader vì nếu tìm đến thằng header cuối cùng trong chuỗi rồi thì nội dung chỉ cần cắt từ đó về cuối và thoái khỏi vòng while mà thôi 😀 

Còn lấy nội dung thì ta tiến hành cắt chuỗi từ vị trí dấu ] vừa gặp + 1 đến vị trí tiếp theo của dấu [ các bạn luôn nhớ phải fromIndex nhé vì mình viết muốn xử lý nhanh nên không xử lý nhiều mà dùng hàm của Java luôn. Cuối cùng là split(“\r\n”) là gặp dấu xuống dòng định dạng trong Windows nên nó cắt thành mảng và từ mảng đó mình thêm vào List content nha.

Ok bên trên là 2 cách nhỏ mình muốn chia sẻ với các bạn nếu muốn từ một chuỗi mà có header và content trộn lẫn vào nhanh muốn tách riêng nó ra để convert data mới hoặc chỉnh sửa data thì ta có thể sử dụng cách này. Cảm ơn mọi người đã theo dõi nha!

Review sách “Đi tìm lẽ sống” và lẽ sống của lập trình viên như mình

Xin chào mọi người, tạm dừng bài viết về Tìm hiểu về blockchain trong lĩnh vực giáo dục (Phần 1) , nay mình muốn review về cuốn sách “Đi tìm lẽ sống” mà mình mua dạo gần đây. Trong cuộc sống cũng như trong việc học tập, làm việc công sở, có lắm lúc chúng ta tự hỏi ý nghĩa cuộc sống là gì và làm sao để đi tìm nó. Lắm lúc chúng ta rơi vào “trạng thái tồn tại chân không” là không biết mình tồn tài làm gì và chán nản thực sự. 

Ok nay mình chia sẻ một chút về mình và review cuốn sách, dạo này mình chạy đồ án cũng như học tiếng Anh để ra trường. Giờ tiếng Anh đã xong rồi thi TOEIC 700, bây giờ mình sẽ tập trung làm đồ án các môn còn lại. Thực sự lắm lúc không hiểu học nhiều như vậy có ý nghĩa gì không nhưng quay đi lại thấy những cố gắng của mình chắc chắn không vô ích. Giống như Viktor E. Frankl có nói “Dù là để tốt hơn hay là làm xấu đi con người vẫn phải quyết định trong mọi thời điểm rằng cái gì là dấu ấn trong sự tồn tại của mình”. Chúng ta vẫn phải sống, làm việc và xác định được ý nghĩa của cuộc sống và công việc của mình.

Nói về cuốn sách được chia làm 2 phần: 
+ Phần 1: Những trải nghiệm của tác giả trong trại tập trung
+ Phần 2: Sơ lược về liệu pháp ý nghĩa
Tác giả đã trải qua những đau khổ trong trại tập trung nơi mà Đức quốc xã bắt các công dân Do thái đến và làm việc khổ sai trong diều kiện làm việc tồi tệ. Trong chương này mọi người sẽ thấy tác giả không đi chi tiết vào việc miêu tả nổi đau sự cơ cực khi làm việc mà tập trung vào các tác giả cũng như các bạn của tác giả cố gắng tạo ra những suy nghĩ những động lực để tồn tại. Tác giả là một người cực giỏi trong việc biết tạo ra những tưởng tượng những sức mạnh tinh thần để vượt qua thực tại đau khổ từ đó tạo ra những suy nghĩ về ý nghĩ cuộc sống. Tiếp theo đó là chương 2 nơi tác giả đi một cách tóm lược về liệu pháp ý nghĩa, sự tồn tài, tìm ra ý nghĩa cuộc sống từ tình yêu, đau khổ. Chương này mang đến người đọc nhiều khía cạnh phân tích cũng như ví dụ mà tác giả đưa ra từ bà mẹ đau khổ muốn tự tử vì đứa con tật nguyền nhưng đứa trẻ ấy lại khao khát sống vì cậu tìm thấy ý nghĩa cuộc sống cho tới ví dụ về sự đau khổ của một bác sĩ về người vợ đã mất, nhưng khi thay đổi góc nhìn vì ông có thể chịu nỗi đau đớn “khi người thân yêu ra đi” này thay cho người vợ, ông bác sĩ đã trở nên ổn định tâm lý hơn. Và các phân đoạn cuối phân tích cho người đọc các khái niệm trong liệu pháp ý nghĩa này. Mọi người có thể mua sách giấy online trên các trang mua sách vì mua vậy sẽ rẻ hơn mà chất lượng rất ok cũng giống mình đi mua trực tiếp chỉ có điều phải chờ ship thôi 😀 hoặc đọc ebook online như vậy cũng là một cách giúp các bạn tiết kiệm thời gian khi phải tìm mua và đặt sách các kiểu.

Mình là một người sống 50-50 giữa cảm xúc và lý trí nên nhiều khi cũng cảm thấy trống rỗng nếu không được làm việc. Cuộc sống và công việc, học tập liên tục tạo nên sự cố gắng trong mình, không được bỏ cuộc, phấn đấu vì gia đình vì ý nghĩa của nó và vì em gái của mình. Mọi người ơi, trong mỗi hoàn cảnh lúc bạn cảm thấy buồn nhất, trống rỗng nhất hãy nghĩ về người bạn, người em, cha mẹ hay một điều ý nghĩa nào đó trong cuộc đời của bạn dù điều đó ở trong quá khứ hay tương lai. Hãy lấy nó làm mục tiêu, làm điểm tựa làm ý nghĩa giúp mình hoàn thiện mình hơn ngày hôm nay nhé! Cuộc đời lập trình viên là chuỗi ngày không ngừng cố gắng, học tập những cái mới trong thế giới công nghệ thay đổi từng giờ này và nếu ta không cố gắng không vì lẽ sống của mình chúng ta rất dễ chán và từ bỏ vì vậy hãy cố gắng lên nhé mọi người! 

Tìm hiểu Blockchain trong lĩnh vực giáo dục (Phần 1)

Hiện nay, rất nhiều quốc gia trên thế giới tập trung đầu tư và phát triển lĩnh vực giáo dục. Bởi vì giáo dục là một phần quan trọng của tương lai, đặc biệt giáo dục liên quan đến các lĩnh vực như: khoa học, y tế, nông nghiệp, công nghiệp, tất cả những lĩnh vực đó phát triển được phụ thuộc vào sự phát triển của giáo dục quốc gia đó.

Mặc dù việc phát triển robot tự động hóa và Internet of thing hiện nay rất đáng chú ý nhưng nguồn lực con người vẫn là nguồn lực quý giá nhất trong một doanh nghiệp. Trái ngược với đa số ý kiến, công nghệ cao giúp cải thiện lĩnh vực đào tạo nhân sự và giải quyết rất nhiều vấn đề. Tức là, con người áp dụng các công nghệ kỹ thuật tập trung vào đạo tạo nên nguồn lực, nhân sự công ty.

0_qswFrkCXbfcygUCP_

Không chỉ áp dụng cho các doanh nghiệp tư nhân mà còn trong các tổ chức chính phủ thì việc áp dụng các công nghệ cũng như công cụ blockchain đang ngày càng được sử dụng rỗng rãi. Các doanh nghiệp, tổ chức tích cực tiến hành các cuộc nghiên cứu để tìm hiểu về các khía cạnh ưu, nhược điểm của công nghệ blockchain. Bây giờ chúng ta sẽ cùng nhau xem xét các vấn đề trong lĩnh vực giáo dục và cách áp dụng và ví dụ thực tiễn công nghệ blockchain vào lĩnh vực giáo dục.

Blockchain thay thế cho giấy viết

Một lợi ích mà không cần bàn cãi của công nghệ blockchain là giảm thiểu việc sử dụng giấy có sẵn hiện nay. Blockchain cũng được mong đợi hỗ trợ đắc lực cho việc tránh thất lạc hoặc sai lệch thông tin của các tài liệu giấy thông thường.

Bằng chứng nhận tốt nghiệp đại học, giấy chứng nhận của trường và chứng chỉ khóa đào tạo có thể bị mất trong quá trình di chuyển hoặc bảo quản của học sinh, sinh viên và bản gốc có thể bị mất theo thời gian. Sau khi được đưa vào blockchain, thông tin về điểm số của học sinh và các khóa học đã được thực hiện sẽ không bị mất và không thể thay đổi hoặc làm sai lệch thông tin. Đồng thời, người ta có thể dễ dàng truy cập thông tin này với sự đồng ý của chủ sở hữu.

Ngày nay, lĩnh vực giáo dục đang cần các tổ chức, trường đại học tập trung vào việc kiểm tra các chứng chỉ. Mỗi ngày, các cơ sở giáo dục phải xử lý hàng ngàn yêu cầu từ các tổ chức giáo dục khác nhau để gửi các bản sao tài liệu. Họ muốn chắc chắn rằng người đó đã tốt nghiệp từ một trường đại học nào đó hay chưa để chắc chắn bằng tốt nghiệp là thật tức là xác thực thông tin.

Đưa thông tin về giáo dục vào blockchain sẽ loại bỏ nghi ngờ của các nhà tuyển dụng về chứng chỉ, học vấn của nhân viên. Sử dụng công nghệ blockchain để lưu trữ thông tin về trình độ học vấn của một người thì chắc chắn thông tin học, tốt nghiệp, thời gian nhận bằng của người đó không thể bị làm giả được vì có liên kết thông tin với trường đại học. Nó có hiệu quả vì nó sẽ giải quyết vấn đề trình độ chuyên môn thấp của các bác sĩ, luật sư, kỹ sư, nhà kinh tế và các ngành nghề phổ biến khác mà đòi hỏi phải có giáo dục chính quy.

Cơ sở dữ liệu sử dụng công nghệ blockchain lưu trữ khóa, bao gồm các kỹ năng, khóa học hoặc khóa đào tạo của một người đã được hoàn thành và các tiết học, bài học mà sinh viên đã tham dự. Nhờ cơ sở dữ liệu này, nhà tuyển dụng sẽ có thể thu thập và lọc thông tin về kiến ​​thức của nhân viên một cách nhanh chóng và dễ dàng, không nghi ngờ gì về mức độ liên quan hoặc độ tin cậy của nó.

Ngày nay, tuyển dụng cho các vị trí cụ thể là một quá trình tốn thời gian và phức tạp. Không có thuật toán duy nhất nào có thể thu hẹp tìm kiếm xuống chỉ những người nộp đơn có kiến ​​thức cần thiết. Thay vì tích lũy giấy tờ và giấy chứng nhận trong giáo dục trong suốt cuộc đời của họ, mọi người sẽ có thể ghi lại thông tin trong blockchain, mà sẽ làm cho nó có sẵn cho các nhà tuyển dụng bất cứ nơi nào trên thế giới. Ngoài việc cấp bằng và chứng chỉ, các tổ chức giáo dục phải lưu giữ hồ sơ giấy tờ về tiến bộ của học sinh trong suốt thời gian học tập, điều này có thể gây khó khăn cho các giao viên hoặc tạo nên giai lận trong việc thay đổi số liệu. Tuy hiện nay có nhiều trường đã áp dụng mô hình lưu trữ trực tuyến nhưng trong việc bảo mật các văn bản, công văn, và cơ sở dữ liệu của sinh viên vẫn có thể bị truy cập trái phép nếu có lỗ hỏng bảo mật trên server.

Hôm nay mình dịch tới đây thôi nay muốn review về cuốn sách mình mới đọc nên sẽ để dành tiếp trong phần 2 nhé mọi người.

Link bài viết tiếng Anh đây nha mọi người: https://medium.com/universablockchain/blockchain-in-education-49ad413b9e12

Ký hiệu Big O – Sử dụng toán học để đo lường hiệu quả thuật toán

Dạo này mình đang cày lại cấu trúc dữ liệu và giải thuật, tìm được một bài viết hay nên tiện thể viết bài chia sẻ về Big O luôn. Mọi người học cấu trúc dữ liệu và giải thuật hay trong lập trình chắc đều nghe tới khái niệm Big O rồi chứ nhỉ, ví dụ như giải thuật tìm kiếm này mất O(n) đơn vị để thực hiện,….

Vậy Kí hiệu Big O là gì?

Ký hiệu Big O là ngôn ngữ chúng ta sử dụng để nói về một thuật toán, giải thuật mất bao lâu để chạy. Đó là cách chúng ta so sánh hiệu quả của các cách tiếp cận khác nhau (áp dụng các giải thuật) đối với một vấn đề.

Nó giống như toán học ngoại trừ nó là một loại toán học tuyệt vời, không nhàm chán, nơi bạn có thể bỏ qua các chi tiết vê mặt toán học và chỉ tập trung vào những gì cơ bản nhất đang xảy ra bên trong theo các quy tắc của chúng ta đặt ra (sẽ nói trong phần ví dụ các quy tắc này). Với ký hiệu O, chúng ta thể hiện thời gian chạy theo thuật ngữ – brace yourself – mình không dịch thuật ngữ vì có thể làm biến tấu ý nghĩa, theo mình hiểu là tự gấp đôi chính mình – tốc độ thực thi nhanh hay chậm liên quan tới tập đầu vào vì tập đầu vào tùy ý có thể lớn thì tốc độ có thể chậm hơn bình thường. Vậy hãy chia nhỏ vấn đề trong câu phân tích này ra nhé:
1. Thời gian chạy nhanh hay chậm như thế nào – Thật khó để biết thời gian chạy chính xác của một thuật toán. Nó phụ thuộc vào tốc độ của bộ xử lý, máy tính khác đang chạy cái gì, v.v.. Vì vậy, thay vì nói về thời gian chạy trực tiếp, chúng tôi sử dụng ký hiệu O để nói về thời gian chạy nhanh đến mức như thế nào.
2. Liên quan đến tập đầu vào – Nếu thực tế nếu chúng ta tham gia chạy việt dã chúng ta có thể dễ dàng đo được thời gian chạy theo giây, phút, giờ. Nhưng trong việc thực thi thuật toán, với ký hiệu Big O, chúng ta sử dụng kích thước của đầu vào, mà chúng ta gọi là “(n)” Vì vậy, chúng ta có thể nói những thứ như thời gian chạy tăng lên “theo thứ tự kích thước của đầu vào” (O(n)) hoặc “theo thứ tự của bình phương kích thước của đầu vào” (O(n^2)).
3. Tập đầu vào tùy ý – Thuật toán của chúng ta có thể có các bước có vẻ tốn kém khi n nhỏ nhưng sẽ bị “lu mờ” bởi các bước khác khi n trở nên rất lớn. Đối với việc phân tích O, chúng ta quan tâm nhất về những thứ phát triển nhanh nhất khi đầu vào tăng lên, bởi vì mọi thứ khác nhanh chóng bị lu mờ khi n trở nên rất lớn. (Nếu bạn biết asymptote là gì, bạn có thể thấy tại sao “phân tích O” đôi khi được gọi là “phân tích tiệm cận“. Ý ở đây muốn nói nếu tập hợp chúng ta với phần tử ít khoảng 100, 1000 phần tử thì khi duyệt chúng ta chỉ mất O(100), O(1000) nhưng nếu tập đầu vào là tập 1 triệu phần tử mà duyệt thì O bây giờ nhìn vào chúng ta sẽ phát sợ ngay chính vì vậy mà các giải thuật ra đời để giảm chi phí thực hiện này xuống. Continue reading