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/

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! 

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

So sánh hiệu năng về thời gian duyệt phần tử khi sử dụng vòng lặp For, ForEach, Iterator và ListIterator trong Java Collection

Các khái niệm và so sánh sự khác nhau mình đã làm một bài viết So sánh Iterator và ListIterator rồi nên hôm nay mình sẽ đi vào luôn ví dụ để so sánh hiệu năng về thời gian duyệt phần tử của 4 người bạn này nhé.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

class EffectiveIterator {
    ArrayList<Integer> list = new ArrayList<>();

    //init list with 1000 elements
    public  EffectiveIterator() {
        for (int i = 0; i < 1000; i++) {
            list.add(i);
        }
    }

    // method browse using For
    public void browseFor(int times) {
        int temp = 0;
        for (int i = 0; i < times; i++) {
            for (int j = 0; j < list.size(); j++) {
                temp = list.get(j);
            }
        }
    }

    // method browse using ForEach
    public void browseForEach(int times) {
        int temp = 0;
        for (int i = 0; i < times; i++) {
            for (Integer integer : list) {
                temp = integer;
            }
        }
    }

    // method browse using Iterator
    public void browseIterator(int times) {
        int temp = 0;
        Iterator<Integer> integers = list.iterator();
        for (int i = 0; i < times; i++) {
            while (integers.hasNext()) {
                temp = integers.next();
            }
        }
    }

    // method browse using ListIterator
    public void browseListIterator(int times) {
        int temp = 0;
        ListIterator<Integer> listIterator = list.listIterator();
        for (int i = 0; i < times; i++) {
            while (listIterator.hasNext()) {
                temp = listIterator.next();
            }
        }
    }

    public static void main(String[] args) {
        EffectiveIterator checkEffectiveIterator = new EffectiveIterator();

        long start = System.currentTimeMillis();
        checkEffectiveIterator.browseFor(10000000);
        long end = System.currentTimeMillis();
        System.out.println("Time For: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        checkEffectiveIterator.browseForEach(10000000);
        end = System.currentTimeMillis();
        System.out.println("Time ForEach: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        checkEffectiveIterator.browseIterator(10000000);
        end = System.currentTimeMillis();
        System.out.println("Time Iterator: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        checkEffectiveIterator.browseListIterator(10000000);
        end = System.currentTimeMillis();
        System.out.println("Time ListIterator: " + (end - start) + " ms");
    }
}

Kết quả ta được:

Capture

Một sự hơn thua “đáng sợ” extreme_sexy_girl

Cảm ơn mọi người đã theo dõi bài viết nhé! Hẹn gặp mọi người trong bài viết tiếp theo.  Code bài này mình tham khảo ở blog : Hà Viết Tráng’s blog

Quy trình từ zero đến hero của một dự án thực tế

Hé lô mọi người lại là mình đây, tuần sau mình sẽ được làm một dự án thực nên tiện đây muốn chia sẻ với anh em chút kinh nghiệm làm việc mà mình học được ở công ty nè.
Giai đoạn 1. Đầu tiên các bạn sẽ nhận được một bản requirement, các bạn có thể xem nó như một bài kiểm tra đi thì cái yêu cầu này là để bài. Tiếp theo sau khi có đề bài, team leader và technical cùng anh em trong team sẽ ngồi lại với nhau phân tích requirement vạch ra các hướng phân tích và yêu cầu mọi người phải hiểu tường tận chi tiết bản yêu cầu này để tránh gặp phải rắc rối sau này khi mình đã build hoàn chỉnh mà sai requirement thì rất mất thời gian. Sau khi họp xong nếu có câu hỏi thác mắc gì chúng ta sẽ note lại và gửi Q&A với khách hàng. Khi mọi vấn đề đã được giải đáp ổn thỏa thid chúng ta bắt đầu gì tiếp theo nhỉ? Thiết kế database, viết code luôn …..
Giai đoạn 2. Câu trả lời là “Chưa phải lúc này”, sau khi đã confirm với khách hàng team sẽ họp lại tạo một bản High-level hệ thống các module cần làm trong dự án, trong các module đó chúng ta sẽ có các chức năng gì? Trong từ chức năng chúng ta lại tiếp tục chia nhỏ thành các task. Mockup UI từ bản Module này từ đó gửi lại cho khách hàng confirm.
Giai đoạn 3. Tiến hành ước lượng thời gian cuae các module, qua trình implementation và integration lên front-end. Quá trình này được gọi là Estimationm, việc ước lượng thời gian này càng chi tiết, càng chia nhỏ các task ra thì chúng ta càng kế hoạch được dự án, quản lý thời gian cũng như dự án, resource của team một cách tốt nhất. Mình sẽ chia sẻ với các bạn chi tiết về giai đoạn này trong các bài viết sau.
Giai đoạn 4. Thiết kế database tùy vào độ “khủng” của dự án mà ta lựa chọn cơ sở dữ liệu cho phù hợp và các quan hệ giữa các bảng có cần thiết hay không nếu không chúng ta sẽ tạo ràng buộc dữ liệu ngay trong code mà không cần phải tạo ràng buộc dữ liệu trong database. Bước thiết kế database cũng cực kỳ quan trọng bởi vì chúng ta phải tính các field chúng ta sẽ dùng đến trong quá trình code, cấu trúc database để sau này có chỉnh sửa thì cũng chỉnh sửa mau lẹ gọn gàng :D.
Giai đoạn 5. Sau bước này team sẽ hoàn thành công việc setup project, structure, environment, tạo 1 project trên gitlab. Tiến hành tạo các entity model các package của một dự án. Ở đây mình đang làm việc với dự án Spring Boot Web Application nên sẽ tạo các package như API, Service, Repository, Utils,…
Giai đoạn 6. Tiếp theo lần lượt implement thực thi các module, các bạn nên nhớ bước này chúng ta nên hoàn thành có thứ tự các chức năng sau thì nên hoàn thành chức năng tiền xử lý của nó. Ví dụ chúng ta thực hiện cho Admin tạo user thì cần xử lý các bước đăng nhập, phân quyền, kiểm tra authentication, session, nếu phân quyền liên quan tới các API của bên thứ 3 thì nên hoàn thiện các API này như grant Access Token, refresh Access Token chẳng hạn. Continue reading

Sau một tháng thực tập học được những gì?

Xin chào mọi người lâu lắm rồi mới viết lại bài, xin lỗi vì series Gulp mình chưa ra kịp nhé mình sẽ cố bù lại cho mọi người ngay. 2 tháng rưỡi hè vừa qua có cực kỳ nhiều kỷ niệm đối với bản thân mình. Chạy đồ án cuối kỳ cho 2 môn tự mình viết ứng dụng Android, làm quen với Firebase từ đó nhận thấy khá nhiều điều hay và thú vị bên cạnh đó rút ra một số kinh nghiệm theo lời nhận xét của giáo viên. Sau đó về quê có chút việc của gia đình về 2 tuần lại quay vào lại thành phố, tưởng thế là được chơi cả hè rồi thế mà hứng lên lại nộp CV đi thực tập surrender . Buổi phỏng vấn được anh Technical Leader và anh CEO phỏng vấn cũng tạm ổn có một số câu hỏi giải quyết vấn đề thì mình còn hơi kém nhưng vân đề ra giải pháp được hehe. Sau đó 1 tuần thì mình đi thực tập đó là ngày 16/7/2018 . Mới vào công ty còn khá lạ mình cũng ít nói nên khó hòa nhập, nhưng anh chị với mọi người trong công ty khá vui nên sau 1 tháng thì giờ cũng tạm ổn rồi tuy vẫn ít nói như vậy phải cố gắng khắc phục thôi. À quên mất mình thực tập Java Web Developer ở công ty, công ty chuyên về cloud, giải quyết về các vấn đề bảo mật sử dụng Spring Boot và front end thì làm việc với AngularJS. Sau một tháng thì mình học hỏi được một số kinh nghiệm sau mình sẽ chia sẻ cũng như tự nhìn nhận lại :
1. Thường sẽ có 30 phút Daily Scrum mỗi ngày báo cáo công việc ngày hôm trước và các task sẽ làm trong ngày hôm nay, cuối tuần thì đặc biệt hơn một chút có khoảng 1 tiếng để Weekly Report báo cáo lại tiến độ dự án, các task đã làm trong tuần qua. Cá nhân mình thấy buổi scrum này cực kỳ thú vị và có giá trị, công ty được ngồi lại nói về tất cả dự án của công ty chứ không riêng gì các dự án mà mình đang tham gia. Công ty là công ty startup nên các buổi scrum này khá hay, anh CEO chia sẻ về các kinh nghiệm, các sự kiện mà anh tham gia từ đó chia sẻ khá nhiều thứ.
2. Cuối ngày sẽ có một bản report chúng ta ghi lại những task đã hoàn thành “DONE” và task nào đang còn làm dở “ON-PROGRESS” từ đó có kế hoạch cho ngày hôm sau. Mình khá may mắn khi thực tập 2 tuần thì được join vào dự án thực làm quen với các cấu hình, các thiết lập của một dự án thực, kết hợp giữa Front-end và backend như thế nào.
3. Sử dụng IDE nào không quan trọng, quan trọng là việc coding và cấu hình dự án, đa phần công ty mình sẽ sử dụng IDE IntelliJNetbeans. Bên cạnh đó một điều không thể thiếu là làm việc với Git, Gitlab, các bạn phải tập làm quen với Git nhé sau này dùng nhiều lắm, cuối ngày Leader sẽ review code sau đó mọi thứ ok sẽ commit, pull, push code và merge code lại cho ngày hôm sau. Một điều quan trọng nữa là luôn luôn phải nhớ câu thần chú “COMMIT – PULL – PUSH” kẻo làm mất code của đồng nghiệp đấy nhé hungry Continue reading