Home Blog Page 178

Bản chất của Lazy Loading Images

UX thì vô cùng quan trọng trong việc lôi kéo khách hàng quay trở lại website, hẳn bạn sẽ không bao giờ quay trở lại 1 trang web mà chờ hết thanh xuân cũng không load ra cho bạn cái nội dung cần thiết. Đối với website hình ảnh là thứ vô cùng quan trọng. Nó có ở hầu hết mọi nơi từ Logo, Banner, Product Image…

Thật không vui khi mà ngày nay thì ảnh có dung lượng ngày 1 lớn hơn tỉ lệ thuận với chất lượng hình ảnh đi kèm. Theo như thống kê của HTTP Archive’s State of Images report. Page size trung bình thường là 1511KB trong đó Images chiếm lên đến 45% (650KB). Vì vậy số lượng ảnh đương nhiên có ảnh hưởng lớn đến việc load trang. Éo le thay chúng ta không thể vứt bớt ảnh đi được.Lúc này chúng ta sẽ nghĩ ngay đến kĩ thuật Lazy Loading Images.

1. Lazy Loading là gì?

Lazy Loading(Lười tải, Tải chậm) hiểu nôm na thì nó là việc load dữ liệu khi cần sử dụng đến chúng.Chẳng hạn nhiều người dùng khi vào 1 page còn chẳng kéo xuống hết đến cuối trang để xem toàn bộ nội dung thì ta cần gì load toàn bộ nội dung trước?Việc ta nên làm là người dùng scroll đến đâu ta sẽ load dữ liệu đến đấy.Lazy Loading có thể áp dụng cho bất cứ resource nào trên 1 page,thậm chí là file JavaScript . Giờ thì chúng ta tập trung vào việc Lazy Loanding Images(load images khi thật sự cần).

2. Tại sao nên áp dụng

Lazy loading giảm việc tải dữ liệu => Tốc độc load trang nhanh hơn và giảm chí phí (bằng cách giảm tổng số bytes transferred)

3. Lazy Loading Images

Có 2 cách phổ biến để load Image trên 1 page đó là sử dụng thẻ <img> , sử dụng thuộc tính background-image của CSS.

Lazy Loading Images qua thẻ Img

Thẻ <img/> với đinh dạng cơ bản:

<img src="/path/to/some/image.jpg" />

Như đã biết trình duyệt đọc src attribute để trigger đến việc tải ảnh. Nên chúng ta sẽ move link image qua 1 attribute khác để ngăn chặn việc tải ảnh này. Dưới đây là 1 VD sử dụng data-src attribute , bạn hoàn toàn có thể đặt bất cứ tên attr nào mà bạn muốn.

<img data-src="https://ik.imagekit.io/demo/default-image.jpg" />

Sau khi ngăn chặn được việc load Images tức thời thì chúng ta cũng cần thông báo cho trình duyệt biết khi nào cần load Images lên. Lúc này ta sẽ sử dụng Javascript để bắt sự kiện của người dùng và add link từ data-src vào lại attr src.

Lazy Loading Images qua thuộc tính background-image

Với background-image , trình duyệt sẽ xây dựng cây DOM kèm theo CSSDOM và check xem kiểu CSS có áp dụng cho nút DOM hiện tại không. Nếu DOM hiện tại có background-image thì trình duyệt sẽ load Image. Tương tự như src attr , trước tiên ta sẽ set cho DOM có giá trị background-image: none sau đó sẽ change giá trị khi cần thiết.

Đương nhiên ta không thể thiếu class để trigger đến đối tượng thông qua JavaScript cho cả 2 trường hợp trên.

3. Ứng dụng

Sau khi hiểu bản chất của Lazy Loading Images và cơ chế hoạt động của nó, giờ việc của chúng ta là tìm 1 vài thư viện có sẵn và tích hợp vào project( vì không nên chế tạo lại chiếc bánh xe ) ) Dưới đây là 1 vài thư viện phổ biến

JQuery-Lazy : Thư viện hỗ trợ lazy load phổ biến được viết bằng JQuery.

Lazysizes : Đây là một thư viện rất phổ biến với chức năng mở rộng. Nó bao gồm hỗ trợ cho các attr srcset và size cho việc responsive kèm theo.

Các bạn có thể click vào mấy link trên và đọc hướng dẫn sử dụng để áp dụng ) .Rất dễ để dùng )

4. Testing Lazy Load

Khi đã tích hợp Lazy Loading Images thì chúng ta sẽ cùng check xem Images có được tải chậm thật không nhé. Mở chrome dev tool bằng cách nhấn F12 or click chuột phải chọn Inspect elements(Kiểm tra) sau đó chọn tab Network->Img. Ở lần refresh page đầu tiên bạn sẽ chỉ nhìn thấy 1 số image phía trên được load

alt

Sau đó khi bạn scroll xuống dưới thì sẽ để í thấy những Images khác ngay lập tức được load theo

alt

5 Kết luận

Cảm ơn các bạn đã đón đọc, mọi góp í xin để lại cmt bên dưới >< .

tham khảo: https://css-tricks.com/the-complete-guide-to-lazy-loading-images/

TopDev via Viblo

  Responsive HTML bằng một dòng CSS
  Mẹo quy ước tên cho CSS giúp bạn rút ngắn 2/3 thời gian khi debug!

Mẫu bảng mô tả công việc lập trình Ruby on Rails

Mẫu bảng công việc lập trình Ruby on Rails

Ruby on Rails Developer là người đảm nhiệm việc phát triển các server-side logic web ứng dụng bằng ngôn ngữ Ruby và framework Rails. Người lập trình Ruby on Rails thường phát triển các thành phần của Back-End, liên kết app với các web services khác (thường là third-party web) và hỗ trợ tương thích với Front-End của ứng dụng. Hy vọng, Mẫu bảng mô tả công việc lập trình Ruby on Rails này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.

Về lập trình viên Ruby on Rails : Để thành một Ruby on Rails Developer giỏi, ác lập trình viên cần nắm rõ cấu trúc dữ liệu và giải thuật, kỹ thuật lập trình hướng đối tượng cũng như có kinh nghiệm về ngôn ngữ Ruby và framework Rails để cùng tham gia nghiên cứu, thiết kế, phát triển và tích hợp các các giải pháp và hệ thống ứng dụng phục vụ công việc quản trị, vận hành và điều hành cho sản phẩm công ty/ khách hàng.

Tham khảo tuyển dụng ruby on rails lương cao trên TopDev

Mẫu bảng công việc lập trình Ruby on Rails

YÊU CẦU CÔNG VIỆC

  • Có kinh nghiệm làm việc với Ruby on Rails
  • Có kiến thức về ngôn ngữ và công nghệ của Front-End (JavaScript, HTML, CSS và JQuery)
  • Nắm vững phân tích và thiết kế hướng đối tượng
  • Kiến thức về các hệ thống kiểm soát thay đổi, đặt biệt là Git.
  • Nắm vững lập trình OOP, MVC
  • Có kinh nghiệm với các công nghệ Springboot, Mybatis, JUnit, Redis, Docker, Microservices là lợi thế
  • Kỹ năng tư duy logic và thuật toán tốt, phân tích và giải quyết vấn đề
  • Có khả năng đọc hiểu tiếng Anh chuyên ngành

MÔ TẢ CÔNG VIỆC

  • Lập trình chính trong các dự án công nghệ sử dụng Ruby on Rails;
  • Duy trì và phát triển các website, code và cấu trúc dữ liệu có sẵn của công ty;
  • Tích hợp tốt các giải pháp lưu trữ dữ liệu;
  • Tích hợp các yếu tố hướng tới người dùng được phát triển bởi Front-End Developer và server-side logic;
  • Nghiên cứu công nghệ mới để áp dụng cho các dự án của công ty;
  • Hỗ trợ các thành viên trong nhóm với các chức năng phức tạp, tham gia nhận xét, đánh giá source code của các thành viên trong nhóm.

Tham khảo thêm những tin tuyển dụng IT tại đây

Kỹ sư Việt Nam có khả năng nắm bắt và học hỏi không thua kém bất kỳ quốc gia nào

JSON-LD là gì ? Tổng quan về JSON-LD cho người mới

JSON-LD là gì

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

Mở đầu

Ok, trước khi bắt đầu, bạn cần có một chút kiến thức về SEO để hiểu những thứ bên dưới. Trước hết, có nhiều cách để cho Google và các search engines khác biết thông tin về trang web của bạn. Theo định kì các search engines sẽ ghé thăm trang web của bạn, nó sẽ chạy từ page này qua page khác để đọc dữ liệu, tìm hiểu xem trang web của bạn là gì, có những content gì, tiêu đề của content, nội dung của content, nếu là trang web bán hàng, nó sẽ xem sản phẩm tên gì, thuộc loại sản phẩm nào, giá bao nhiêu, sản xuất ở đâu,…v.v. Việc này có thể gây mất nhiều thời gian và có thể search engines đọc sai/không đủ thông tin về trang web của bạn, khiến search engines đánh độ ưu tiên trang web của bạn sai.

Vậy thì thay vì phải mất thời gian đọc qua lần lượt từ đầu như thế, tại sao chúng ta không cung cấp cho search engines luôn dữ liệu về trang web của chúng ta khi search engines ghé thăm, như thế sẽ tiết kiệm thời gian cũng như cung cấp được thông tin chính xác nhất cho search engines.

JSON-LD là một cách (tương đối) mới để thể hiện dữ liệu về nội dung của bạn với search engines. Nó đi kèm với một vài lợi ích chính, ok cùng bắt đầu nào.

JSON-LD là gì ?

JSON-LD là viết tắt của JavaScript Object Notation for Linked Data, là một phương thức mã hóa dữ liệu liên kết sử dụng JSON

JSON là một định dạng trao đổi dữ liệu nhẹ, dễ đọc và viết đối với con người và dễ phân tích và khởi tạo đối với máy tính. Xem thêm JSON là gì

Linked Data là cách sử dụng internet để kết nối các dữ liệu có liên quan

JSON-LD là kết hợp của cả hai thứ trên. Nó sẽ là một đoạn code cho bạn biết sản phẩm nào có giá thế nào, hoặc zip code này thuộc về công ty nào… Về cơ bản, bạn sẽ cung cấp một đoạn mã Javascript nhỏ có tất cả thông tin trên.

Nó là một cách định dạng cho dữ liệu tương tự có cấu trúc với Microdata and RDFa. Về cơ bản, theo điều khoản của SEO, JSON-LD là thể hiện bộ từ vựng của Schema.org, với sự đồng hợp tác của Google, Bing, Yahoo và Yandex từ năm 2011 để tạo ra một bộ từ điển đồng nhất dữ liệu cấu trúc cho các trang web. (Tuy nhiên, Bing và các search engines khác không chính thức công bố sự hỗ trợ đối với JSON-LD).

Schema.org là gì?

Ok chúng ta đã nói về Schema.org, vậy nó là cái gì? Thứ chúng ta đang nói tới ở đây là dữ liệu có cấu trúc cho trang web của bạn. Schema.org cung cấp những cách thể hiện thông tin của bạn với Google theo một cách mà máy tính có thể đọc được. Với dữ liệu có cấu trúc, bạn tạo ra các lựa chọn cho Google để thể hiện content của bạn theo ba loại Google Search:

  • Rick results: Các nội dung được thêm vào của bạn, như giá của sản phẩm, xếp hạng và sự khả dụng của sản phẩm đó, được hiển thị chính xác trong kết quả tìm kiếm dưới dạng thông tin bổ sung trong snippet của bạn.
  • Site links search boxes: Nếu trang web của bạn đủ điều kiện, bạn có thể tiến hành search content của trang web của bạn từ chính trang tìm kiếm.
  • Knowledge Graph cards: Cái này khó hơn một chút, vì bạn sẽ phải chứng minh trước tiên rằng bạn là người có thẩm quyền đối với một số nội dung nhất định. Sau khi bạn đã làm như vậy, Google có thể đưa dữ liệu của bạn vào Knowledge Graph cards.

Tại sao phải sử dụng JSON-LD?

Các phương thức từng được sử dụng để triển khai schema.org trước khi JSON-LD xuất hiện thì rất cồng kềnh. Bạn phải thêm các thuộc tính schema.org vào các đoạn mã trong markup của bạn. Markup có thể phải thay đổi từ trang này sang trang khác, mặc dù bạn đã gắn cùng một header ở mọi nơi. Điều này làm cho schema.org tốn rất nhiều công sức để thực hiện.

JSON-LD cho phép bạn thu thập tất cả dữ liệu về sản phẩm của bạn và hiển thị chúng trong một đoạn mã JavaScript nhỏ, có thể được đẩy vào trang ở bất kì chỗ nào. Điều này cho phép bạn làm việc trên schema.org sử dụng JSON-LD độc lập với sự phát triển trang web của bạn.

Trên thực tế, trong document của mình, Google thường tuyên bố JSON-LD là cách dễ nhất để thêm siêu dữ liệu vào các trang web. Nó là lựa chọn mà ít có khả năng bị “hỏng” nhất khi bạn thực hiện các thay đổi với trang web của mình.

JSON-LD có tác dụng gì?

JSON-LD chú thích các phần tử trên một trang, cấu trúc các dữ liệu, những thứ mà các công cụ tìm kiếm có thể sử dụng để định hướng các phần tử và thiết lập các thông tin xung quanh các thực thể, điều này liên quan đến việc tạo ra tổng thể một website tốt hơn, có tổ chức hơn.

Dữ liệu rất lộn xộn và không liên kết. JSON-LD tổ chức và kết nối chúng, tạo ra một Web tốt hơn.

JSON-LD nằm ở đâu trong trang HTML?

Google đề xuất bạn nên thêm JSON-LD vào phần <head> của HTML. Tuy nhiên, vẫn ổn nếu JSON-LD nằm trong phần <body>. Google cũng có thể nắm bắt các thẻ được tạo trong DOM. Tóm lại là nó nằm ở đâu Google cũng có thể nhận được =))

Phân tích JSON-LD

Ví dụ một đoạn JSON-LD đầy đủ:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "url": "http://www.example.com",
  "name": "Unlimited Ball Bearings Corp.",
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+1-401-555-1212",
    "contactType": "Customer service"
  }
}
</script>

Các thẻ không thay đổi

<script type="application/ld+json">
{
...
}
</script>

Khi bạn thấy JSON-LD, thứ đầu tiên bạn sẽ luôn thấy là thẻ <script>. Thẻ <script> có thuộc tính type cho biết: “Hey trình duyệt, tôi đang gọi JavaScript có chứa JSON-LD.”

Lưu ý: JSON-LD của bạn phải được đặt trong dấu ngoặc nhọn.

"@context": "http://schema.org/",

Phần tử thứ hai giữ vị trí cố định trong markup JSON-LD là @context với giá trị là http://schema.org. @Context nói: “Hey trình duyệt, đây là từ vựng tôi tham khảo. Bạn có thể tìm thấy nó tại http://schema.org”. Lợi ích cho SEO là chúng ta có thể sử dụng bất kỳ loại và thuộc tính nào mà Schema.org định nghĩa.

"@Type": "…",

Phần tử cuối cùng trong nhóm sao copy/paste JSON-LD Schema là đặc tả @type ( sau dấu hai chấm sẽ là chú thích dữ liệu). @type chỉ định loại danh mục được đánh dấu. Bạn có thể tìm thấy một danh sách tất cả các loại danh mục tại: https://schema.org/docs/full.html.

Ví dụ: "@type": "Person",

@type nói rằng: “Hey, tôi đang sử dụng loại danh mục Person (Bạn có thể tìm thấy tại http://schema.org/Person)”. Thật vậy, nếu bạn nhập URL vào trình duyệt, document của loại danh mục và thông số kỹ thuật sẽ xuất hiện, bao gồm mọi thuộc tính danh mục (và thường là một số trường hợp sử dụng ví dụ).

Các cặp Attribute-value

Bước tiếp theo là chú thích thông tin về loại danh mục. Bạn có thể tìm thấy các thuộc tính trong trang Schema.org.

  1. Attribute: Các thuộc tính xuất phát từ bộ từ vựng của Schema.org và phải được đặt trong cặp nháy kép, và phải thuộc về thuộc tính được cho phép trong loại danh mục đó.
  2. Value: Giá trị tương ứng với thuộc tính. String (kí tự) và URL cần đặt trong cặp ngoặc kép. Số (int, float hoặc double) thì bản thân nó không cần ngoặc kép, tuy nhiên đặt chúng vào cặp ngoặc kép vẫn ok (điều này có nghĩa là chúng sẽ được coi như dạng dữ liệu string)

Ngoặc vuông

Dấu ngoặc vuông tồn tại cho các tình huống có nhiều giá trị cho thuộc tính. Một cách sử dụng phổ biến là tận dụng thuộc tính sameAs như sử dụng [dấu ngoặc vuông] để liệt kê nhiều nền tảng truyền thông.

Lưu ý: Không có dấu phẩy sau phần tử cuối cùng trong ngoặc vuông. Điều này chỉ ra rằng không có thêm thông tin trong dấu ngoặc vuông.

Thêm JSON-LD vào website

Bạn có thể sử dụng bất kỳ thuộc tính schema.org nào vào trong JSON-LD. Bạn có thể tìm thấy một danh sách tất cả các loại danh mục và thuộc tính liên quan tại: https://schema.org/docs/full.html. Sau khi thêm script JSON-LD mới vào trang web của bạn, hãy đảm bảo xác thực code của bạn bằng công cụ kiểm tra dữ liệu có cấu trúc của Google. Ở đây bạn có thể kiểm tra xem đoạn code của bạn đã chính xác cấu trúc hay chưa.

Ngoài ra còn có một cách đơn giản hơn là sử dụng các template có sẵn (ví dụ như cái này) để tạo đoạn script nhanh hơn với các danh mục được liệt kê sẵn. Nếu bạn đang sử dụng WordPress, có rất nhiều plugin có thể giúp các bạn thêm đoạn JSON-LD trong 1 nốt nhạc.

Tổng kết

Trên đây là những kinh nghiệm của mình khi sử dụng JSON-LD, trong khuôn khổ bài viết chỉ mang tính giới thiệu và phân tích về JSON-LD.

Về cách sử dụng các bạn có thể thực hành bằng cách sử dụng thử các danh mục thuộc tính tại https://schema.org/docs/full.html và test lại với công cụ kiểm tra dữ liệu có cấu trúc của Google.

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

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

Xem thêm việc làm ngành it lương cao tại TopDev

11 mẹo đơn giản để tăng hiệu suất Java cấp tốc

11-meo-don-gian-de-tang-hieu-suat-java-cap-toc

Hầu hết các lập trình viên đều cho rằng việc optimize hiệu suất là một vấn đề phức tạp đòi hỏi nhiều kinh nghiệm và kiến thức. Tất nhiên, điều đó không phải sai, bởi optimize một ứng dụng để đạt được hiệu suất tốt nhất không phải là một nhiệm vụ dễ dàng. Nhưng điều đó không có nghĩa là bạn không thể làm bất cứ điều gì nếu bạn không có những kiến thức đó. Dưới đây là một số gợi ý và bài tập tốt nhất giúp bạn tạo ra một ứng dụng hiệu quả.

Hầu hết các mẹo này đều dành cho Java. Nhưng cũng có một số language-independent (ngôn ngữ độc lập), mà bạn có thể áp dụng cho tất cả các ứng dụng và ngôn ngữ lập trình. Chúng ta hãy nói về một số mẹo dành chung trước khi chúng ta đến các mẹo điều chỉnh hiệu suất của riêng trong khi lập trình Java.

Tìm Java job lương cao trên TopDev ngay!

1. Đừng Optimize khi nó không cần thiết

Đó là một trong những mẹo điều chỉnh hiệu suất quan trọng nhất. Bạn nên làm theo các bước bình thường một cách tốt nhất và thử test các trường hợp sử dụng. Nhưng điều đó không có nghĩa là bạn cần thay thế bất kỳ thư viện chuẩn nào hoặc xây dựng các bước optimize (tối ưu hoá) phức tạp trước khi bạn xác định được đó là điều cần thiết.

Trong hầu hết các trường hợp, optimize sớm khiến tốn rất nhiều thời gian và làm cho code khó đọc và khó giữ nguyên. Và tệ hơn nữa, những hành động optimize này thường không mang lại bất kỳ lợi ích nào vì bạn đang dành rất nhiều thời gian để optimize các phần không quan trọng của ứng dụng của bạn.

Vậy làm thế nào để xác định được bạn cần optimize cái gì?

Trước tiên, bạn cần phải xác định ứng dụng của mình chạy nhanh như thế nào, ví dụ bằng cách xác định thời gian phản hồi tối đa cho tất cả các lệnh call API hoặc số lượng bản record bạn muốn nhập trong một khung thời gian nhất định. Sau khi bạn đã bước đó, bạn có thể tính toán được những phần nào trong ứng dụng của bạn quá chậm và cần phải được cải thiện. Và khi bạn đã xác định được, bạn nên xem tiếp mẹo thứ 2.

2. Sử dụng Profiler để tìm điểm kém hiệu quả thật sự

Sau khi bạn làm theo mẹo đầu tiên và xác định được các phần của ứng dụng cần cải tiến, hãy tự đặt câu hỏi phải bắt đầu từ đâu?

Bạn có thể tự giải quyết câu hỏi này theo hai cách:

  • Xem code của bạn và bắt đầu với những phần có vẻ đáng ngờ nhất hoặc điểm mà bạn cảm thấy nó có thể gây ra vấn đề.
  • Hoặc bạn sử dụng profiler và để nhận được thông tin chi tiết về trạng thái và hiệu suất của từng phần trong code.

Tôi nghĩ có lẽ không cần phải giải thích tại sao bạn nên chọn cách thứ hai.

Rõ ràng là phương pháp dựa vào profiler sẽ giúp bạn hiểu rõ hơn về hiệu suất của code và cho phép bạn tập trung vào những phần quan trọng nhất. Và nếu bạn từng sử dụng một profiler, bạn sẽ nhớ một vài tình huống khiến bạn ngạc nhiên bởi những phần code đã tạo ra các vấn đề về hiệu suất.

3. Tạo một bộ test hiệu suất cho toàn bộ ứng dụng

Đây là một mẹo chung giúp bạn tránh được rất nhiều sự cố không mong muốn, thường xảy ra sau khi bạn đã triển khai bước cải tiến hiệu suất trong sản xuất. Bạn cần có một bộ test hiệu suất để kiểm tra toàn bộ ứng dụng, chạy nó trước và sau khi bạn cải tiến hiệu suất để so sánh.

Những lần test bổ sung này sẽ giúp bạn xác định các chức năng và hiệu suất đã thay đổi thế nào và đảm bảo rằng bạn không tung ra bản cập nhật làm hại đến ứng dụng. Điều này đặc biệt quan trọng nếu bạn làm việc trên các component được sử dụng bởi một số phần khác nhau của ứng dụng, như cơ sở dữ liệu hoặc caches.

4. Xử lý những nút thắt lớn nhất đầu tiên

Và sau khi bạn đã tạo bộ test và phân tích ứng dụng của bạn với một profiler, bạn sẽ có một danh sách các vấn đề bạn muốn giải quyết để cải thiện hiệu suất. Điều đó tốt, nhưng nó vẫn không giúp trả lời được câu hỏi rằng nên bắt đầu từ đâu. Bạn có thể tập trung vào quick win (những điểm cần xử lý nhanh chóng) hoặc bắt đầu với một vấn đề quan trọng nhất.

Có thể bắt đầu với quick win bởi vì bạn sẽ sớm có thể nhận được những kết quả đầu tiên. Đôi khi, điều này có thể cần thiết để thuyết phục các thành viên khác trong nhóm hoặc quản lý của bạn rằng việc phân tích hiệu suất là quan trọng.

Nhưng xét chung, tôi khuyên bạn nên bắt đầu từ đầu và đánh vào những vấn đề ảnh hưởng đến hiệu suất đáng kể nhất trước tiên. Điều đó sẽ giúp bạn cải tiến hiệu suất tốt nhất và bạn có thể không cần phải sửa nhiều mà chỉ cần sửa những vấn đề này để đạt được hiệu suất mong muốn.

4 mẹo vừa rồi là dành cho những vấn đề chung về hiệu suất. Chúng ta hãy cùng xem xét một số mẹo dành riêng cho Java nhé.

5. Sử dụng StringBuilder để nối các String

Có rất nhiều phương thức để kết nối strings trong Java. Bạn có thể dùng những cách đơn giản như `+` hoặc `+=`, StringBuffer hoặc StringBuilder.

Vậy bạn thích cách tiếp cận nào nhất?

Câu trả lời tùy thuộc vào code bạn kết nối String. Nếu là thêm nội dung với for-loop thì bạn nên dùng StringBuilder bởi nó dễ dùng và cho hiệu năng tốt hơn StringBuffer. (Lưu ý rằng StringBuffer thì an toàn và phù hợp cho nhiều tình huống).

Bạn chỉ cần instantiate một StringBuilder và call append method để add phần mới vào String. Sau khi đã add mọi thứ thì bạn có thể call toString() method để lấy lại các String được kết nối. Code snippet sau đây cho ta thấy trong mỗi lần iteration, loop convert i thành một String và add chúng với một khoảng trống vào StringBuilder sb. Do đó, Code viết vào log file như sau: “This is a test0 1 2 3 4 5 6 7 8 9”:

StringBuilder sb = new StringBuilder(“This is a test”);
for (int i=0; i<10; i++) {
    sb.append(i);
    sb.append(” “);
}
log.info(sb.toString());

Bạn có thể thấy trong code snippet, ta cung cấp yếu tố đầu tiên của String tới constructor method. Nó sẽ tạo ra StringBuilder mới chứa String được cung cấp kèm theo khoảng trống có thể thêm 16 kí tự nữa. Khi bạn add thêm kí tự vào StringBuilder, JVM sẽ ngay lập tức tăng size của StringBuilder lên rất nhiều.

Còn nếu bạn đã biết có bao nhiêu kí tự trong String, bạn có thể giới hạn số lượng khoảng trống và nhờ đó tăng hiệu năng bởi nó không cần phải tự tăng sức chứa.

  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
  10 Java Web Framework tốt nhất

6. Dùng + để kết nối String trong một Statement

Khi bạn triển khai ứng dụng đầu tiên trong Java, hẳn sẽ có ai đó nói với bạn rằng bạn không nên nối String bằng ‘+’. Và điều đó đúng nếu bạn đang nối String với application logic (các logic riêng cho một application cụ thể). Các String là không thay đổi và kết quả của mỗi String concatenation được lưu trong một String object mới. Điều đó đòi hỏi thêm memory và sẽ làm chậm ứng dụng của bạn, đặc biệt nếu bạn đang nối nhiều String trong một loop (vòng lặp).

Trong những trường hợp này, bạn nên làm theo mẹo số 5 và sử dụng một StringBuilder.

Nhưng đó không phải là lựa chọn nếu bạn đang muốn phá vỡ một String thành nhiều dòng để cải thiện tính dễ đọc của code.

Query q = em.createQuery(“SELECT a.id, a.firstName, a.lastName ”
+ “FROM Author a ”
+ “WHERE a.id = :id”);

Trong những trường hợp này, bạn nên nối String của mình với một ‘+’ đơn giản. Trình biên dịch Java của bạn sẽ optimize điều này và thực hiện các concatenation tại thời gian compile. Vì vậy, trong runtime, code của bạn sẽ chỉ sử dụng 1 String.

7. Sử dụng Primitives ở điểm có thể

Một cách nhanh chóng và dễ dàng để tránh chi phí phát sinh và cải thiện hiệu suất của ứng dụng là sử dụng các kiểu primitive thay vì các class wrapper của chúng. Vì vậy, tốt hơn hết là sử dụng một int thay vì một Integer, hoặc một double thay vì một Double. Điều đó cho phép JVM của bạn lưu trữ value trong stack thay vì trong heap để giảm mức độ tiêu thụ memory và xử lý tổng thể hiệu quả hơn.

8. Cố gắng tránh BigInteger và BigDecimal

Như chúng ta đã nói về các loại dữ liệu, chúng ta cũng nên xem nhanh BigInteger BigDecimal. Đặc biệt là vì tính chính xác của nó. Nhưng cái gì cũng có giá của nó.

BigInteger và BigDecimal yêu cầu memory nhiều hơn một long hoặc double đơn giản và làm chậm tất cả các phép tính một cách đáng kể. Vì vậy, tốt hơn hãy suy nghĩ thật kỹ, nếu bạn cần tăng độ chính xác hoặc nếu number của bạn vượt quá phạm vi của một long. Đây có thể là điều duy nhất bạn cần phải thay đổi để khắc phục các vấn đề về hiệu suất, đặc biệt là nếu bạn đang thực hiện một mathematical algorithm (thuật toán về toán học).

9. Kiểm tra ở Current Log đầu tiên

Điều này là hiển nhiên, nhưng thật không may, bạn có thể thấy hiện nay có rất nhiều đoạn code bỏ qua nó. Trước khi tạo một thông báo debug, bạn nên luôn luôn kiểm tra current log trước tiên. Nếu không, bạn có thể tạo một String mà log message sẽ bị bỏ qua.

Dưới đây là hai ví dụ về cách mà bạn KHÔNG nên làm.

// don’t do this
log.debug(“User [” + userName + “] called method X with [” + i + “]”);
// or this
log.debug(String.format(“User [%s] called method X with [%d]”, userName, i));

Trong cả hai trường hợp này, bạn sẽ thực hiện tất cả các bước cần thiết để tạo ra log message mà không cần biết liệu logging framework của bạn có sử dụng log message hay không. Tốt hơn hết là kiểm tra mức độ current log đầu tiên, trước khi bạn tạo ra các tin nhắn debug.

// do this
if (log.isDebugEnabled()) {
    log.debug(“User [” + userName + “] called method X with [” + i + “]”);
}

10. Sử dụng Apache thông thường StringUtils.Replace thay vì String.replace

Nói chung, method String.replace hoạt động tốt và hiệu quả khá cao, đặc biệt nếu bạn đang sử dụng Java 9. Nhưng nếu ứng dụng của bạn đòi hỏi nhiều hoạt động replace và bạn chưa cập nhật phiên bản Java mới nhất, thì vẫn có các lựa chọn thay thế nhanh hơn và hiệu quả hơn.

Một ứng cử viên sáng giá là method StringUtils.replace của Apache Commons Lang. Như Lukas Eder mô tả trong một trong các bài blog gần đây của họ, nó vượt trội hơn method String.replace của Java 8.

Và nó chỉ đòi hỏi ít sự thay đổi. Bạn cần phải thêm một Maven dependency  vào project Commons Lang của Apache vào application pom.xml của bạn và thay thế tất cả các lệnh call của method String.replace bằng method StringUtils.replace.

// replace this
test.replace(“test”, “simple test”);
// with this
StringUtils.replace(test, “test”, “simple test”);

11. Lưu trữ resource lớn, như kết nối Database

Caching (bộ nhớ đệm) là một giải pháp phổ biến để tránh việc lặp lại các đoạn code “nặng” hoặc thường xuyên được sử dụng. Ý tưởng chung đơn giản là: Tái sử dụng các resources như vậy sẽ đỡ tốn kém hơn so với việc tạo ra một cái mới hơn.

Một ví dụ điển hình là lưu trữ các kết nối cơ sở dữ liệu trong một pool. Việc tạo ra một kết nối mới đòi hỏi nhiều thời gian, bạn có thể tránh được điều đó nếu bạn sử dụng lại một kết nối hiện có.

Bạn cũng có thể tìm các ví dụ khác bằng chính ngôn ngữ Java. Method valueOf của class Integer, ví dụ, lưu các value giữa -128 và 127. Bạn có thể cho rằng việc tạo ra một Integer mới không phải là quá tốn kém, nhưng nó thường sử dụng cách lưu trữ các giá trị được sử dụng nhiều nhất để đạt hiệu suất tối đa.

Nhưng khi bạn nghĩ về cache, hãy nhớ rằng việc thực hiện cache cũng tiêu tốn resource. Bạn cần phải dành thêm memory để lưu trữ các resource tái sử dụng và bạn có thể cần phải quản lý bộ nhớ cache của mình để giúp cho các resource có thể truy cập được hoặc để xóa các resource lỗi thời.

Vì vậy, trước khi bạn bắt đầu bộ nhớ cache bất kỳ resource nào, hãy đảm bảo rằng bạn sử dụng chúng thường đủ để vượt quá chi phí của việc triển khai bộ nhớ cache của bạn.

Tổng kết

Như bạn đã thấy, đôi khi không cần quá nhiều công sức để cải thiện hiệu suất ứng dụng của bạn. Hầu hết các đề xuất trong bài này chỉ cần thêm một sự cố gắng nhỏ là có thể áp dụng chúng vào code của bạn.

Nhưng như thông thường, những khuyến nghị quan trọng nhất vẫn là:

  • Không optimize trước khi bạn biết nó là cần thiết
  • Sử dụng profiler để tìm ra nút thắt thực sự
  • Xử lý nút thắt lớn nhất trước tiên

<< Phần 5: Lập trình web với Java – 10 Java Web Framework tốt nhất

TopDev via Dzone

Tham khảo thêm các vị trí tìm việc ngành IT tại đây

Hot trend AI, không hề “gắt” như bạn nghĩ

Tác giả: Ryszard Szopa

Thế giới đang nằm trong “tâm bão” AI – Trí tuệ nhân tạo: Các chuyên gia về Machine Learning thì “hét” mức lương “trên trời”, còn nhà đầu tư cũng “giang rộng vòng tay” đổ không ít vốn vào các startup AI. Vì thế mới nói: đây là một trong những công nghệ gây chuyển biến mạnh mẽ nhất những thập kỉ vừa qua. Nó đã đến, ở lại và sẽ thay đổi cục diện cuộc sống của chúng ta.

Tuy nhiên, nó không đồng nghĩa với việc làm startup AI dễ ăn – dễ sống. Có một số “bẫy ngầm” mà bất cứ ai gia nhập vào ngành này chắc chắn sẽ dẫm phải. Bạn có vượt qua nó không mới quyết định được thành bại của startup mình.

“Tôi và con trai” – bức tranh được vẽ hoàn toàn bằng  Artistic Style Transfer – 1 dạng kỹ thuật Deep Learning gây không ít tranh cãi

Các kỹ năng về AI đang bị “hạ giá”

Vào năm 2015 khi tôi vẫn còn ở Google và còn chơi DistBelief (đã được đổi tên lại là TensorFlow). Nói thật là: nó chán vê-lờ… Viết cũng thấy ngượng ngượng, phần abstraction chính cũng chẳng được như bạn kỳ vọng. Giấc mơ build nó ngoài hệ thống build của Google thật sự đúng như tên gọi: một GIẤC MƠ.

Đến cuối năm 2016 thì tôi đang làm cho 1 project detect được bệnh ung thư dựa trên các ảnh mô bệnh (histopathological images). Lúc đó tôi muốn dùng transfer learning: bằng cách dùng Inception – công nghệ phân loại ảnh tốt nhất bấy giờ của Google, và “dạy” nó lại theo dữ liệu về bệnh ung thư tôi có. Tôi còn dùng những công nghệ của bản Inception trước-khi-train do Google cung cấp, chỉ thay đổi 1 chút ở phần layer trên cùng theo hướng tôi đang làm. Sau thời gian lăn lộn với TensorFlow, tôi cũng tìm ra được cách xử lý các layer khác nhau, và hầu hết đều hiệu quả. Nó đòi hỏi không ít kiên nhẫn và thời gian đọc lại source của TensorFlow. Ít ra tôi cũng không phải lo quá nhiều về các dependencies, vì những người làm TensorFlow đã (tốt bụng) chuẩn bị sẵn file docker.

Đầu 2018 thì task trên không còn phù hợp với intern như tôi nữa. Cũng may nhờ có Keras (một framework nền của TensorFlow) chỉ cần vài dòng code Python là bạn đã có thể hoàn thành công việc, và cũng không đòi hỏi bạn phải am hiểu chuyên sâu về nó nữa. Cái “đau đầu” duy nhất còn lại đó là phần Hyper Parameter tuning. Nếu bạn dùng Deep Learning model, bạn có thể tận dụng các knob, số lượng và size của layer,… Việc tối ưu configuration thật ra cũng không quan trọng lắm, và một số thuật toán như grid search cũng không thật sự hiệu quả. Bạn có thể tiến hành nhiều thử nghiệm, bạn sẽ thấy trải nghiệm của vụ này giống như 1 công trình nghệ thuật hơn là một nghiên cứu khoa học.

Giờ đây, khi đang ngồi mổ cò những dòng này (năm 2019), thì Google và Amazon đã offer các dịch vụ automatic model tuning (Cloud AutoMLSageMaker), phía Microsoft cũng đang lên lộ trình ra mắt các dịch vụ tương tự.

Đến đây chắc bạn đã hiểu cái tôi đang muốn nói đến rồi. Những bài toán hóc búa trong quá khứ, giờ đã trở nên dễ dàng hơn. Giờ bạn có thể làm được những thứ khó nhằn, mà không cần tốn công sức quá nhiều. Những công trình kỹ thuật vĩ đại ngày xưa giờ đây đã bị gán mác “lỗi thời”, và bạn cũng chẳng cần kỳ vọng những cái ta đang làm hiện tại sẽ khủng hơn trong tương lai. Đây chẳng qua là dấu hiệu của sự tiến bộ. Chúng ta nợ một lời cảm ơn đến các công ty như Google đã tiêu tốn không ít nghiên cứu & phát triển nên tool để hỗ trợ chúng ta và publish nó free. Lí do họ làm nên những việc này cũng có 2 mặt của nó.

Văn phòng của bạn sau khi được “tái cơ cấu”. 

Đầu tiên, đây là dạng Commoditize the complement (hàng hóa bổ sung) cho các sản phẩm hiện tại của họ, gọi là cloud infrastructure. Trong nền kinh tế, 2 món hàng mà bạn thường có xu hướng mua chung với nhau thì gọi là hàng hoá bổ sung, ví dụ: xe hơi mua chung xăng, sữa mua chung ngũ cốc, trứng thì mua chung với thịt. Nếu giá của 1 trong 2 giảm, thì cầu của nó tăng dẫn đến cầu của cái còn lại sẽ tăng. Phần “hàng hóa bổ sung” của cloud chính là phần mềm chạy trên đó, và nhờ đó, những thứ công nghệ liên quan đến AI cũng có một nguồn tài nguyên dồi dào để có thể triển khai một cách dễ dàng. Vì thế, Google cũng giải quyết được vấn đề chi phí -> về lâu về dài, việc phát triển công nghệ này sẽ trở nên tiết kiệm hơn.

Lí do thứ 2 mà Google lại rất hứng thú với AI là vì họ sẽ dành được lợi thế tương đương so với các đối thủ trên thị trường như Amazon và Microsoft. Họ làm nó trước, và chính họ là người mang concept Deep Learning ra thế giới, vì thế mà họ có rất nhiều nhân tài trong đội ngũ. Họ có nhiều kinh nghiệm về phát triển sản phẩm AI, từ đó tạo được nhiều ưu thế khi phát triển tool và dịch vụ ra ngoài thị trường.

Nghe có vẻ hay, nhưng đây là tin buồn cho cả công ty và các cá nhân đang nghiên cứ các kĩ năng AI. Ngày nay, họ sẽ cho bạn nhiều lợi thế cạnh tranh, vì một kĩ sư Machine Learning đủ chuẩn cần rất nhiều thời gian để đọc tài liệu, và phát triển background về toán thật vững để bắt tay vào việc. Tuy nhiên, vì tool có sẵn càng ngày càng tốt và hữu ích, lúc này skill của bạn lại bắt đầu “bớt hiệu lực”. Luật chơi bây giờ sẽ là “đọc hướng dẫn sử dụng” hơn là “đọc nghiên cứ tài liệu”. Nếu bạn không sớm nhận ra ưu thế của mình, đến intern cũng có thể ăn mất phần của bạn. Đặc biệt, nếu intern có data tốt hơn, và câu chuyện chưa dừng lại ở đó…

Data mới là thứ quan trọng hơn so với đống AI Architecture hào nhoáng!

Hãy cùng bàn về case của 2 startup founder, Alice và Bob. Côn ty của họ kêu gọi được cùng lượng tiền, và cạnh tranh khốc liệt trên cũng 1 thị trường. Alice đầu tư vào những kĩ sư giỏi nhất, từ PhD đến Doctor công nghệ siêu sao. Bob thì chỉ thuê các kĩ sư tầm trung, và đầu tư phần lơn vào bảo toàn data hiện có. Vậy công ty nào là lựa chọn của bạn?

Tôi sẽ nằm kèo anh Bob trong lần này. Tại sao? Machine learning hoạt động dựa trên một dataset và chuyển hoá nó vào các model weight. Một model tốt hơn sẽ hiệu quả hơn trong process này (về thời gian và năng suất chung), nhưng theo một số chuẩn thông thường, data tốt hơn sẽ mang đến architecture tốt hơn.

Để chứng minh luận điểm này, hãy thực hiện test sau. Tôi sẽ làm tạo các convolutional network đơn giản, một cái “ngon” và một cái “không ngon bằng”. Layer cuối cùng của bản “ngon” có 128 neuron, còn cái còn lại chỉ có khoảng 64 cái. Tôi đã “dạy” nó về subsets của MNIST dataset của size, và cho sẵn độ chính xác của model trên test set so với số sample mà chúng được học.

Màu xanh dương là model “ngon” hơn, màu xanh lá là model “xấu” hơn

Hiệu ứng tích cực của việc set dataset size rất rõ ràng (ít nhất cũng đến khi model bắt đầu fit và ổn định). Model “ngon” hơn – line màu xanh dương, rõ ràng sẽ làm tốt hơn so với cái kia – line xanh lá. Tuy nhiên, cái tôi muốn nhấn mạnh là độ chính xác của line xanh lá sau khi được học trên 40k mẫu lại tốt hơn hẳn so với line xanh dương chỉ được luyện trên 30k mẫu.

Điểm mấu chốt ở đây là, kĩ sư của Alice không chỉ đang cạnh tranh với kĩ sư của Bob. Nhờ có văn hoá mở của cộng đồng AI và tầm quan trọng của việc chia sẻ kiến thức, họ cũng đang chạy đua với cả các researcher tại Google, Facebook, Microsoft, và cả ngàn trường đại học trên thế giới. Sử dụng architecture phù hợp nhất cho data của bạn là một cuộc chiến thử nghiệm về chiến lược nếu như mục tiêu của bạn là giải quyết vấn đề (ngược lại với việc cống hiến bản gốc cho khoa học). Nếu không có sẵn những cái hiệu quả, việc đợi người mang giải pháp đến chỉ là vấn đề về thời gian. Bạn thậm chí có thể tổ chức một cuộc thi Kaggle để khuyến khích các researcher nghiên cứu phân tích vấn đề cho bạn.

Kĩ sư tốt là quan trọng, nhưng nếu bạn đang làm về AI, thì data mới là ưu thế cạnh tranh. Câu hỏi “Ai là triệu phú” ở đây đó là: Liệu bạn có khả năng tin tưởng vào data và giữ vững được lợi thế của mình không.

Giữ vững lợi thế cạnh tranh trong ngành AI là cực khó!

Với đống dữ liệu dataset khủng, Bob đã dành ưu thế hoàn toàn so với Alice. Bob launch được sản phẩm và dần dành lấy được nhiều thị phần. Chưa kể Bob đã bắt đầu thuê các kĩ sư cao cấp hơn, vì công ty của Bob đã ở một tầm cao mới.

Rồi một ngày Chuck xuất hiện, Chuck rất giàu, có nhiều tiền, nhưng Chuck sẽ phải làm rất nhiều thứ để bắt nhịp được cuộc chơi. Ném một đống tiền vào không đảm bảo việc một project có chạy nhanh hay không. Chưa kể, việc cố gắng gượng ép đưa càng nhiều kỹ sư vào lại còn gây hại hơn, dễ gây rối loạn tình hình. Tuy nhiên, việc tạo ra dataset thì lại khác. Thường thì nó cần rất nhiều nhận lực tay chân, thì bạn sẽ phải chi tiền để thuê thêm người. Hoặc có khi chỉ cần 1 người có thật nhiều data – khi đó tất cả những gì bạn phải làm đó là chi tiền cho license đó. Lúc này thì tiền mới thật sự có tác dụng.

Tại sap Chuck lại có thể kêu gọi được nhiều tiền đầu tư hơn Bob?

Khi một founder kêu gọi vốn được 1 vòng, họ thường sẽ cố gắng đi hai hàng, một là thêm thật nhiều tiền vào, tuy nhiên không được quá nhiều vì cổ phần sẽ bị pha loãng (dilute), Thêm một nhà đầu tư đồng nghĩa với việc bán đi một phần của công ty. Team lãnh đạo phải phải kiểm soát đủ cổ phần trong startup, để không mất động lực và tiền (làm startup khổ lắm quý vị, thật!…)

Mặc khác, nhà đầu tư lại muốn bơm tiền vào những ý tưởng tiềm năng, nhưng cũng phải kiểm soát rủi ro. Nếu rủi ro dự kiến tăng cao, thì họ sẽ kỳ vọng nhiều hơn trên mỗi đồng họ đã đầu tư.

Khi Bob kêu gọi vốn, việc AI sẽ giúp cho sản phẩm vượt trội hơn là điều không tưởng. Dù Bob và team xuất chúng đến đâu thì chuyện bị lên án chỉ trích là không thể tránh khỏi. Trường hợp của Chuck lại khác. Anh ấy hiểu rõ vấn đề, mọi thứ đều nằm trong tầm tay: Sản phẩm của Bob đã là bằng chứng “sống” rõ ràng nhất.

Bob đã đáp trả lại thử thách này bằng cách tiếp tục kêu gọi vòng khác. Bob vẫn đang dẫn đầu cuộc đua. Tuy nhiên tình hình lại phức tạp hơn, nếu như Chuck có thể bảo toàn được quyền access data bằng quan hệ hợp tác thì sao? Thử nghĩ về một startup chẩn đoán bệnh ung thư đi. Chuck hoàn toàn có thể dùng vị trí ngầm nào đó trong một viện y tế để bảo toàn deal với viện đó. Và Bob sẽ không bao giờ có đủ tài chính để làm chuyện đó.

Vậy nên, làm sao để giữ được ưu thế cạnh tranh của sản phẩm AI? Không lâu trước tôi đã vinh hạnh được nói chuyện với Antonio Criminisi của Microsoft Research. Bí mật nằm ở chỗ, chìa khóa của sản phầm không nên chỉ nằm ở AI (AI only), tức là không nên bỏ trứng vào cùng 1 rổ. Ví dụ, InnerEye project của anh ấy sử dụng AI và công nghệ computer vision truyền thống (không dựa trên ML) để phân tích các ảnh chụp x-quang. Khả năng đưa data vào một model và xem nó hoạt động thế nào khá là hay. Tuy nhiên, với một yếu tố kết hợp dùng AI với phần mềm truyển thống, sản phẩm của bạn sẽ khó đoán hơn, vì loại yêu cầu các lập trình viên phải suy nghĩ về các thuật toán và sử dụng một số kiến ​​thức khó để có được kiến ​​thức về miền, nói chung là rất khó để đối thủ có thể nắm bắt được.

AI chỉ nên được dùng như một “đòn bẩy”.

Một trong những cách để phân loại một doanh nghiệp chính là xem xét xem mô hình kinh doanh ấy đang thêm thắt giá trị gì cho những đối tác xung quanh. Hãy xem công ty e-commerce sau làm ví dụ. Nếu bạn tạo ra 1 dòng sản phẩm mới tức là bạn đang thêm giá trị trực tiếp. Trước đó chẳng có gì, giờ đây đã có widget và khách hàng sẽ chi tiền để mua nó. Còn cho ra một kênh phân phối mới, cái đó gọi là đòn bẩy. Bằng cách bán widget mới của bạn trên Amazon, tức là bạn đang nhân đôi lượng bán ra. Cắt giảm chi phí cũng được gọi là đòn bẩy. Nếu bạn thương lượng được một deal ngon với một nhà cung cấp từ Trung Quốc, bạn cũng đang nhân đôi lợi nhuận gộp (gross margin) của mình nữa.

Hãy tư duy theo kiểu thế này, chiếc đòn bẫy chỉ đóng vai trò như một lực đẩy nhẹ giúp bạn đi xa hơn, không nên gượng ép ứng dụng nó vào sản phẩm. Luôn nhớ rằng, đòn bẫy chỉ thật sự hữu ích khi nó được kết nối với một nguồn data giá trị, cũng giống như việc nếu bạn không có đủ loại hàng để bán, thì việc đẩy thêm kênh phân phối dường như không mang lại nhiều giá trị.

Vậy thì nhân tố AI ở đâu để chúng ta hiểu? Có rất nhiều công ty đang cố đưa AI trực tiếp vào sản phẩm của mình (vd: các API nhận diện hình ảnh và những cái tương tự). Đối với các chuyên gia AI thì còn gì hấp dẫn hơn được nữa. Tuy nhiên, đây là một ý tưởng khá fail.

  • Một là, bạn đang cạnh tranh với Google và Amazon. Thiệt luôn…
  • Hai là, việc tạo ra sản phẩm AI thuần một cách tỉ mỉ là việc khó không tưởng. VD: Tôi muốn dùng Vision API của Google. Đáng tiếc là, chúng tôi chưa reach đến được nhóm đối tượng có nhu cầu phù hợp. Nó hoặc hơi quá mức, hoặc chưa đủ đô, có khi lại cả hai…

Một lựa chọn hay hơn đó là đúng AI như một “đòn bẩy”. Bạn có thể dùng model hiện tại sẵn có và tăng tốc nó bằng AI. VD, nếu bạn đang có 1 quy trình tốn nhiều nhân lực người làm, việc tự động hoá đó sẽ mang đến điều kì diệu. Một số ví dụ điển hình sẽ là ECG analysisindustrial inspectionsatellite image analysis. Chính bởi vị AI nằm ở phía backend, bạn sẽ có nhiều option AI hơn để build và giữ được ưu thế cạnh tranh.

Kết luận

AI là một công nghệ thực sự xoay chuyển cuộc chơi. Thế nhưng xây dựng công ty của bạn phụ thuộc vào nó lại là một câu chuyện khác. Bạn không nên quá phụ thuộc vào các kĩ năng về AI, vì chúng đang dần bị “hạ giá” trên xu hướng thị trường nói chung. Việc xây dựng các AI model có vẻ thú vị thật, nhưng cái quan trọng là phải có nguồn data tốt hơn. Giữ lợi thế cạnh tranh đã khó, đặc biệt là khi gặp thằng đối thủ siêu giàu nữa thì nguy cơ cao đó là AI của bạn sẽ bị “nuốt chửng”. Bạn nên hướng về một process data scalable nào mà khó có thể bị bắt chước bởi đối thủ. AI sẽ là cách tiếp cận tốt nhất cho những công việc không cần quá nhiều nhận thức và đầu óc con người, vì sức mạnh lớn nhất của nó là tự động hoá.

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

  Máy học - Machine Learning và một vài hạn chế.

Speed up Microservices 3: Export dữ liệu ra Excel

Chào mọi người, nối tiếp bài trước là tận dụng caching ở trình duyệt để tăng tốc cho microservices. Ở bài này mình sẽ chia sẻ một case study khá thông dụng trong các dự án “vừa vừa”, đó là nhu cầu export dữ liệu ra file excel. Nếu như các bạn thường xuyên làm việc liên quan đến các hệ thống quản lý dữ liệu thì data table / grid sẽ xuất hiện khá nhiều, kéo theo tính năng thường xuyên được yêu cầu là export dữ liệu (ra file Excel).

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

  Giao tiếp hiệu quả giữa các Microservice
  Hướng dẫn vượt khó Microservices vô cùng giá trị dành cho bạn!
  Xác thực và phân quyền trong Microservices

Phương pháp export dữ liệu “cổ điển”

Trước khi đi sâu vào cách Teamcrop export dữ liệu, chúng ta cùng nhau bàn về cách tiếp cận “cổ điển” mà có lẽ bạn nào cũng đã từng triển khai. Để export dữ liệu, công đoạn khó nhất là lấy dữ liệu, code của bạn sẽ phải fetch data thông qua các câu truy vấn (thường là SELECT..) vào database, và cũng tránh mỗi lần query vào database quá nhiều record nên thường có lấy từng khúc (thông qua LIMIT..) và tất nhiên bạn sẽ phải có một vòng lặp vô hạn để đảm bảo lấy hết dữ liệu cần xuất.

Sau khi có được dữ liệu, bạn thường sẽ dùng một thư viện liên quan đến xử lý Excel để xây dựng file excel, thêm dòng, thêm cột và response data về cho client (trình duyệt), và người dùng sẽ tải được file này.

Dù theo kiến trúc nào (monolithic hay microservices), thì phương pháp này cũng có một vấn đề lớn là nếu lượng dữ liệu cần xuất quá nhiều, thì dẫn đến request của bạn sẽ xử lý lâu (IO), memory sẽ lớn vì lưu trữ dữ liệu chờ xuất, giữ kết nối tới DB lâu, thậm chí table có thể bị lock, cái gì cũng lâu, kéo theo làm giảm performance của hệ thống, nếu có nhiều người cùng export một lúc, mỗi request chờ 2, 3 phút thì đúng là thảm họa, vô tình bị rơi vào tình trạng tự mình DoS.

Ngoài những vấn đề nêu trên, thì phương pháp export “cổ điển” này phải triển khai theo dạng case-by-case, tức là bạn cần xuất dữ liệu gì, thế nào thì phía backend phải có xử lý tương ứng để lấy dữ liệu và export. Và các script export này cũng phải hỗ trợ các vấn đề liên quan đến kiếm tra quyền truy cập (được export hay không), cũng phải kiểm tra bộ lọc dữ liệu để người dùng có thể tùy biến dữ liệu cần xuất.

Vấn đề còn lớn hơn khi ở kiến trúc Microservices, vì dữ liệu lấy từ database của 1 service chỉ chứa khóa ngoại của service khác. Ví dụ trường hợp muốn xuất danh sách đơn hàng, để một file excel có thông tin cửa hàng, sản phẩm, nhân viên…thì đều phải dùng service khác để lấy dữ liệu từ phía service. Như vậy, trong kiến trúc microservices, ngoài việc bị delay do IO, còn phải delay do request đến các service liên quan để lấy đủ dữ liệu. Do đặc thù của export nên lượng dữ liệu sẽ lớn, kéo theo lượng request để lấy data của các service khác cũng sẽ tịnh tiến.

Phương pháp “cổ điển” cải tiến

Phương pháp cổ điển thường không có progress bar (%), nên nếu vô tình người dùng export những tính năng nhiều dữ liệu, xử lý lâu thì cảm giác chờ nhiều khi là…vô tận.

Để giảm cảm giác “chờ đợi” của người dùng khi export dữ liệu, có một phương pháp “xoa diệu” gọi là async export, tức là tất cả quy trình export diễn ra bất đồng bộ. Người dùng chỉ cần nhấn nút export và giao diện sẽ báo những thông báo dạng “chúng tôi sẽ email / thông báo / gọi điện cho bạn khi export xong”. Triển khai theo phương pháp này sẽ làm cho vấn đề phức tạp hơn vì với mỗi tính năng cần export, phải triển khai theo cơ chế lưu trữ kết quả export (thường là ghi file), rồi cơ chế thông báo (email, notification), rồi cơ chế xóa file (chẳng lẽ giữ file export này suốt trên server ^^!).

Do tính chất đặc thù của phương pháp async export này nên một hệ thống chỉ có 1 vài tính năng “bự” làm theo cách này mà thôi, hầu hết vẫn là nhấn-chờ-tải.

Phương pháp export của Teamcrop

Cropcom là hệ thống với hàng trăm tính năng liên quan đến bán hàng, nhân sự, logistic… nên tính năng export dữ liệu ra excel là rất nhiều. Lúc trước mình cũng tiếp cận theo phương pháp “cổ điển”, tuy nhiên khi các vấn đề mình nêu ra ngày càng lớn thì buộc phải “tìm” một phương pháp đơn giản, an toàn và hiệu quả hơn. Và sau một thời gian tìm hiểu thì hệ thống export của crop đã đạt được một số ý sau:

  • Phối hợp với bộ lọc của giao diện, người dùng đang xem / lọc / tìm kiếm gì thì có thể export bảng dữ liệu đó.
  • Tối ưu quá trình lấy dữ liệu từ các service khác trong kiến trúc microservices.
  • Có progress bar, người dùng biết được tiến trình download.
  • Trong trường hợp mạng bị lỗi (lag, rớt) giữa chừng thì có thể resume download.
  • Không cần case-by-case ở phía service, là một giải pháp general và chỉ cần định nghĩa template (cột) của file sẽ export.
  • Không tạo ra những request lâu hoặc truy cập nhiều dữ liệu một lúc.
  • Không tạo ra các file tạm trên server.

Để đạt được những yêu cầu như trên thì bên mình đã mang hoàn toàn tính năng export dữ liệu về phía client (JS) và tận dụng được tất cả cơ chế của client đã xây dựng.

Frontend đã viết 1 component (ExportDataComponent), component này thường được đặt chung với bảng dữ liệu và dùng chung với các tham số bộ lọc tìm kiếm, đường dẫn truy vấn lẫn dữ liệu. Khi người dùng tìm kiếm hay lọc dữ liệu thì component này cũng sẽ cập nhật được thông tin tìm kiếm mới để hỗ trợ cho việc thấy cái gì là export được cái đó.

Về phần dữ liệu thì do matching với cơ chế lọc dữ liệu nên tận dụng được API lấy danh sách. Ví dụ export đơn hàng thì sẽ gọi service lấy danh sách đơn hàng, và tất nhiên khi đi theo cơ chế này thì cũng sẽ được “phân trang tự nhiên”. Mỗi lần lấy dữ liệu thì lấy với số lượng recordPerPage như danh sách đang coi, và cũng như khi xem bảng dữ liệu người dùng nhấn trang tiếp theo, component này sẽ tự lặp và request cho đến hết các trang. Lợi thế của việc này là mỗi request lấy dữ liệu không làm treo hệ thống vì nó là request lấy dữ liệu (JSON) bình thường và có giới hạn mỗi lần lấy. Lợi thế thứ hai là trên giao diện sẽ thể hiện được progressbar, vì đã xác định được sẽ lấy bao nhiêu dữ liệu nên vẽ 1 cái progressbar rất đơn giản.

Việc lấy từng trang ở giao diện cũng hỗ trợ tính năng resume khi có lỗi. Khi một request lấy dữ liệu bị fail (ajax error) thì giao diện sẽ phản ứng, hiện thông báo và người dùng có thể nhấn nút resume để tiếp tục download từ trang bị lỗi.

Trong trường hợp kiến trúc Microservices, cũng giống như bài trước nói về caching của trình duyệt, mình có thể nhanh chóng lấy dữ liệu từ các nguồn đã cache ở client. Ví dụ cửa hàng, nhân viên, sản phẩm..

Đối với dữ liệu không cache (thường là transaction data, ví dụ khách hàng, phiếu thu chi, nhập xuất…), thì sẽ lấy theo idlist. Ví dụ thông tin khách hàng, mình sẽ làm 1 request bao gồm các ID của khách hàng, rồi làm 1 request lên service khách hàng để lấy dữ liệu. Phương pháp idlist này cũng được sử dụng ở lấy danh sách, chứ không dành riêng cho phần export.

Là một component thiết kế theo hướng generalize, mapping với tính năng lấy danh sách ở giao diện nên phía server không cần triển khai thêm code export, client vẫn lấy hết được dữ liệu mà không cần làm thêm gì cả. Công việc chính của việc export là định nghĩa cấu trúc cột & kiểu dữ liệu của file excel.

Sau khi đã có dữ liệu đầy đủ thì tiến hành dùng Javascript (của trình duyệt) để tạo một file excel. Excel thực chất là một file zip, trong đó có các file xml chứa format và dữ liệu (sheet) nên sử dụng thư viện JSZip để tạo file zip chứa các file xml và FileSaver để người dùng download trực tiếp file về máy.

Như vậy, với một vài thay đổi và cách tiếp cận mới thì tính năng export đã cải tiến khá nhiều và mang lại trải nghiệm người dùng tốt hơn cũng như phía service ít bị ảnh hưởng bởi các request export nhiều dữ liệu. Một lợi thế khác là code rất dễ maintain và cải tiến.

Hy vọng bài viết này sẽ giúp nhiều bạn trong việc tiếp cận hệ thống Microservices và tận dụng kiến trúc Single Page App ở Frontend để tối ưu trải nghiệm export dữ liệu.

  Speed up Microservices 2: Tận dụng trình duyệt và cache
  Microservices là gì? Speed up Microservices 1: Tác dụng phụ và một số chiến lược cơ bản

Nguồn: Bloghoctap

19 tips cho các kỹ sư phần mềm hữu ích trong 2024

Bước qua 2024 và thế giới lập trình sẽ có nhiều điều tuyệt vời xuất hiện. Nhưng đối với nhiều developer mới, triển vọng bước vào sự nghiệp coding có thể gặp nhiều khó khăn.

Có rất nhiều công nghệ để học và rất nhiều ngôn ngữ để lựa chọn. Do đó, tôi đã soạn ra một danh sách gồm 19 tip cho các kỹ sư phần mềm vào năm 2024.

Coding vui vẻ!!

1. Đừng nản lòng

Ngành công nghệ là một trong những ngành công nghiệp khốc liệt và biến động nhất hiện nay, và nó có thể khiến bạn không thể quyết định có nhảy vào hay không. Điều tôi cố gắng ghi nhớ mỗi ngày là mọi người, tại một thời điểm trong sự nghiệp coding của họ, đều bắt đầu tại điểm xuất phát như mình. Tất cả các nhà dẫn đầu trong ngành công nghệ này đều từng là người mới.

Có phải có một số người học nhanh hơn những người khác? Đúng vậy. Nhưng bạn không thể để điều đó ngăn cản bạn bắt đầu.

Sự nghiệp coding là rất đáng có vì một lý do tuyệt vời sau: bạn có thể tự học bất cứ điều gì trên internet … miễn phí! Và thường thì cách sống trong ngành công nghệ sẽ thoải mái hơn nhiều so với các nghề nghiệp khác.

Điều quan trọng cần ghi nhớ là: dù có rất nhiều tài nguyên ngoài kia, bạn không cần phải học tất cả mọi thứ. Hãy bắt đầu với những điều cơ bản trước.

Bước đầu tiên là quyết định xem bạn muốn bắt đầu sự nghiệp của mình là front-end (giao diện người dùng của ứng dụng bạn tương tác) hay back-end (làm việc với dữ liệu). Khi bạn chọn được công việc thích hợp với mình, hãy bắt đầu với những điều cơ bản.

Nếu bạn chọn con đường phát triển là front-end, hãy tìm hiểu về HTML, CSS và JavaScript. Đừng coi những kỹ năng này là điều hiển nhiên. Mặc dù thoạt nhìn nó có vẻ đơn giản, nhưng một kiến ​​thức vững chắc về nền tảng phát triển web sẽ đưa bạn đến với vai trò đầu tiên là Kỹ sư phần mềm. Đa số các công ty muốn thấy một ứng cử viên có kỹ năng nền tảng vững chắc hơn là sự hiểu biết khá tốt về một framework/library phổ biến.

Nếu bạn quyết định đi theo con đường phát triển là back-end, hãy thử một ngôn ngữ như Python hoặc Java. Đây là những kỹ năng rất cần thiết trong ngành công nghệ.

Nhưng đừng nản lòng. Sẽ có những ngày mà bạn cảm thấy hoàn toàn choáng ngợp. Nhưng nghĩ tới việc mọi người đều bắt đầu hành trình như bạn đã làm sẽ khiến mọi thứ trở nên dễ dàng hơn.

2. Học cách đọc và giải mã code

Một trong những kỹ năng mà tôi đã có được khi tôi bắt đầu hành trình coding của mình là khả năng đọc code của các developer khác. Đây là một kỹ năng thực sự quan trọng vì nó cho phép bạn làm việc hiệu quả trong nhiều cơ sở code khác nhau.

Bạn không cần phải biết tất cả các sắc thái của ngôn ngữ lập trình để giải mã code đó đang làm gì.

Có nhiều cách để học cách đọc code. Kiểm tra một số dự án nguồn mở. Đọc qua tài liệu và nguồn code và xem bạn có thể xác định rõ điều gì đang xảy ra hay không. Bạn sẽ dần dần bắt đầu nhận ra rằng bạn đang cải thiện hơn mỗi ngày, và thậm chí bạn có lẽ mở được một PR!

Học cách phân tích code và xác định xem nó có được viết theo cách hiệu quả nhất hay không.

Học cách đọc và xem lại code là một kỹ năng tốn thời gian, nhưng rất đáng nỗ lực.

3. Tìm phương pháp học tập phù hợp

Mọi người học theo nhiều cách khác nhau. Một số ghi nhớ kiến thức tốt nhất khi họ viết code. Một số khác lại học tốt nhất bằng cách đọc hoặc xem video.

Tôi thích xem các hướng dẫn online và đọc tài liệu để bổ sung kiến thức.

Tôi không phải là người có thể khởi động một ứng dụng sandbox và mã hóa nó. Tôi thích làm theo hướng dẫn và sau đó mở rộng các ý tưởng.

Hãy tìm phương pháp học tập của bạn. Thử các tài nguyên và platform khác nhau.

Một khi bạn tìm thấy phương pháp học tập phù hợp, bạn sẽ thấy rằng bạn học hiệu quả hơn nhiều.

4. Tham gia vào cộng đồng

Tôi đã không tham gia cộng đồng công nghệ online cho đến khi tôi đã coding được 3 năm. Điều này đã mang lại cho tôi một bất lợi rất lớn.

Tôi đã vật lộn rất nhiều với suy nghĩ rằng mình không có năng lực làm gì và thấy khó giữ được động lực. Nhưng khi tôi tìm thấy một cộng đồng các developer trên Twitter và các trang blog, tôi đã đầu tư nhiều hơn vào việc học.

Tìm một dự án nguồn mở. Tweet các dự án coding của bạn. Đẩy các dự án của bạn lên GitHub. Tìm cách tham gia và bạn sẽ nhanh chóng phát triển mối quan hệ mật thiết hơn với coding.

5. Cân bằng lý thuyết với thực hành

Để trở thành một lập trình viên hiệu quả, bạn phải hiểu lý thuyết đằng sau những mô hình nhất định (ở một mức độ nhất định).

Ví dụ: nếu bạn muốn hiểu tại sao một vòng lặp lồng nhau không có hiệu suất như hai vòng lặp trong cùng một phạm vi, bạn cần hiểu ký hiệu Big-O.

Chúng ta đang sống trong thời đại mà bạn không cần tấm bằng Khoa học Máy tính để thành công trong ngành công nghệ. Điều đang được nhắc tới là, một số khái niệm được dạy trong một bằng cấp CS là vô cùng có giá trị rồi (như là các thuật toán, phân tích thời gian chạy, v.v.).

Bạn không cần phải học tất cả các lý thuyết khoa học máy tính, nhưng bạn nên hiểu lý thuyết tại sao giải pháp này tốt hơn một giải pháp khác.

6. Đừng so sánh bản thân với người khác

Sự nghiệp của bạn sẽ không bao giờ đi theo con đường chính xác như một developer khác. Bạn không nên so sánh mình với người khác.

Bạn là bản thể độc nhất và các kỹ năng bạn có được sẽ chỉ phù hợp với bạn.

Vì một trong những người dẫn đầu ngành công nghệ đang học Ruby on Rails không có nghĩa là bạn phải học theo. Tìm các kỹ năng mà khiến bạn hào hứng với lập trình và học chúng với khả năng tốt nhất của bạn.

Không có khung thời gian dự kiến ​​liên quan đến việc học một công nghệ. Như tôi đã đề cập trong tip 3, mọi người học theo những phương pháp khác nhau và vì vậy họ học ở các mức độ khác nhau.

Chỉ vì bạn mất ba tháng để học JavaScript không có nghĩa là bạn là developer tệ hơn người học nó trong vòng một tháng.

7. Tham gia vào các dự án nguồn mở

Cộng đồng nguồn mở đang phát triển mạnh mẽ, vậy tại sao không tham gia? Nếu bạn cần một cách để tăng cường kỹ năng đọc code của mình, hãy tìm một dự án nguồn mở!

Bạn có thể bắt đầu với cộng đồng GitHub!

Bạn thậm chí có thể bắt đầu dự án nguồn mở của riêng bạn! Tôi đã thành lập dự án nguồn mở của riêng mình tên là Coding Coach vào tháng 9 năm ngoái và đó là một trải nghiệm mở mang tầm mắt.

Nếu bạn muốn tham gia và học hỏi từ một số developer tuyệt vời, hãy thử xem!

8. Hãy thoải mái với việc không thoải mái

Ngành công nghệ thay đổi liên tục, và điều đó có nghĩa là luôn có một kỹ năng mới để học hỏi.

Mặc dù điều này nhìn qua có lẽ đáng sợ, nhưng nó cũng tạo cho chúng ta nhiều cơ hội học một công nghệ mới (làm thế nào bạn có thể chán được chứ?!).

Cách tốt nhất để phát triển các kỹ năng coding của bạn là giải quyết các công việc khiến bạn sợ hãi. Bạn có thể làm được điều này bằng cách tình nguyện hoàn thành một nhiệm vụ đầy thách thức, hoặc trong thời gian rảnh rỗi với các công nghệ mới.

Bạn phải trở nên thoải mái với việc không thoải mái. Không phải lúc nào bạn cũng có tất cả các câu trả lời.

9. Đừng ngại đặt câu hỏi

Cuối cùng, bạn sẽ gặp phải một vấn đề mà bạn không biết cách giải quyết. Và không có câu trả lời nào trên Stack Overflow!

Điều quan trọng là nhận ra khi bạn cần hỏi để được giúp đỡ. Nếu bạn đã cố gắng giải quyết vấn đề và không còn cách nào khả thi, đã đến lúc tìm sự giúp đỡ.

Cần sự giúp đỡ không làm bạn trông yếu đuối; đây là điều mà tôi vẫn đang đấu tranh

Nếu bạn đang dành hàng giờ đồng hồ cố gắng để hiểu lý do tại sao biến của bạn lại bị ReferenceError, hãy tìm sự trợ giúp.

10. Bạn cần những người ủng hộ mình

Coding rất khó. Sẽ có những ngày bạn cảm thấy không muốn làm Kỹ sư phần mềm nữa.

Do đó, bạn phải có những người tin tưởng vào bạn. Tìm một nhóm bạn thân hoặc gia đình, những người sẽ xây dựng lòng tự trọng cho bạn, và nói lời tạm biệt với những người không làm vậy.

11. Tập trung vào một việc một lần

Thực nhiên nhiều việc một lần là cách nhanh nhất để khiến cho mọi việc có kết quả không tốt. Con người không thể đa nhiệm một cách hiệu quả.

Chọn một việc để tập trung vào một lần thôi. Học tập hoặc hoàn thành công việc, chọn một trong hai rồi làm với khả năng tốt nhất của bạn. Sau khi hoàn thành, chuyển sang việc tiếp theo.

Đừng cố gắng làm nhiều việc cùng một lúc.

12. Có cái nhìn tổng thể – làm thế nào để tất cả các công nghệ này khớp với nhau

Bạn sẽ học được nhiều công nghệ khác nhau trong suốt sự nghiệp coding của mình. Và có thể bạn sẽ cực kỳ mơ hồ khi xác định công nghệ nào giải quyết nhiệm vụ nào.

Tôi thích vẽ sơ đồ cho các vấn đề phức tạp. Nếu tôi được giao nhiệm vụ xây dựng một ứng dụng, tôi sẽ chia nó thành các miền. Ví dụ: tôi biết tôi cần HTML, CSS và JavaScript ở front-end, có lẽ tôi sẽ quyết định sử dụng React làm thư viện JS. Và có lẽ, nếu tôi cần ứng dụng này để mở rộng quy mô, tôi sẽ chọn Redux để quản lý trạng thái.

Tìm hiểu các cách sử dụng tốt nhất cho các công nghệ khác nhau. Khi nào bạn sẽ chọn cái này thay vì cái khác? Làm thế nào để chúng khớp với nhau?

Đây là những câu hỏi quan trọng bạn nên học cách trả lời.

13. Tìm toolbox của bạn – tool nào là tốt nhất cho công việc?

Ngày nay không thiếu các công cụ có sẵn cho các developer. Tôi có thể kể tên ít nhất năm IDE mà tôi đã  từng làm việc trong quá khứ.

Số lượng công cụ có sẵn có thể cực kỳ lớn. Hãy thực hiện một vài nghiên cứu, rồi quyết định công cụ nào phù hợp với bạn. Một số câu hỏi được đặt ra là:

  • Công cụ này có đang được duy trì?
  • Có cộng đồng developer nào đang phát triển mạnh mẽ đang sử dụng nó không (trong trường hợp bạn cần trợ giúp)?
  • Để đặt cấu hình nó khó như thế nào?
  • Tích hợp tool có gây ra tác động tiêu cực đến hiệu suất không?
  • Tôi có thể giải quyết công việc mà không cần tool không?

Một tool tồn tại không có nghĩa là bạn cần sử dụng nó.

14. Duy trì cân bằng công việc / cuộc sống

Bạn không cần phải dành cả ngày để coding. Thực ra, làm như vậy sẽ không tốt cho sức khỏe bạn.

Bạn phải duy trì sự cân bằng giữa công việc và cuộc sống, nếu không bạn có thể phải chịu hậu quả của sự kiệt sức.

Nếu bạn làm điều gì đó từ lúc thức dậy cho đến khi đi ngủ, bạn sẽ rất dễ bực bội.

Hãy dành thời gian cho bản thân và các sở thích khác của mình, và bạn sẽ duy trì được mối quan hệ tốt đẹp với việc coding.

15. Tìm hiểu những điều cơ bản của thiết kế

Nếu bạn đang xây dựng một ứng dụng hướng tới người dùng, bạn nên biết những điều cơ bản về thiết kế. Tôi không nói rằng bạn cần học cách sử dụng Sketch hoặc Adobe Illustrator, nhưng học những điều cơ bản về UX Design sẽ mang lại tác động tích cực đến các ứng dụng của bạn.

Bạn không thể cho rằng người dùng sẽ sử dụng ứng dụng của bạn theo cách mà bạn làm. Trên thực tế, bạn không nên đưa ra bất kỳ giả định nào về hành vi của người dùng.

Hiểu lý do đằng sau các nguyên tắc UI nhất định để xác định giải pháp tốt nhất cho ứng dụng của bạn.

Ví dụ, người ta thấy rằng các nút vuông thực sự tốt hơn cho người dùng so với các nút tròn, vì chúng chứa nhiều pixel hơn.

Tìm hiểu những điều cơ bản này và bạn có thể chắc chắn rằng ứng dụng web của bạn sẽ nổi bật.

16. Tìm một người hướng dẫn

Tìm một người hướng dẫn khá khó nhưng lại rất cần thiết. Bạn có thể học được những kỹ năng vô giá từ lời khuyên của họ và thực hành coding một cách tốt nhất.

Không bao giờ quá khó khăn khi hỏi một người trong ngành, người mà bạn ngưỡng mộ, để hướng dẫn cho bạn. Điều tồi tệ nhất họ có thể nói là không!

Và khi thời gian trôi qua, hãy nhớ đánh giá lại quá trình hướng dẫn của bạn để đảm bảo rằng việc này có lợi cho cả bạn và người hướng dẫn.

17. Xây dựng một portfolio và resume tuyệt vời

Portfolio và resume là thứ gây ấn tượng đầu tiên đối với một nhà tuyển dụng trong quá trình phỏng vấn. Nó rất quan trọng vì đó là cả bộ mặt của bạn.

Sửa lỗi chính tả và ngữ pháp. Và đảm bảo rằng mọi thứ được định dạng nhất quán và phù hợp.

Nếu bạn muốn biết thêm chi tiết về việc viết một resume tuyệt vời, hãy xem bài viết trên blog trước đây của tôi.

18. Thất bại nhanh chóng và thất bại thường xuyên

Thất bại là chủ quan. Nếu bạn mắc lỗi, hãy học hỏi từ nó. Đừng phạm sai lầm tương tự  lần hai. Chỉ vì một cái gì đó “thất bại” không có nghĩa là nó không có giá trị gì.

Người thành công nhất trong lịch sử đã tạo ra rất nhiều thành phẩm, nhưng chỉ một số ít trong đó được công nhận.

Bạn không cần phải code các website đẹp ngay từ bắt đầu cho đến khi kết thúc cho mỗi dự án bạn phát triển. Tập trung vào công nghệ cơ bản, và bạn có thể quan tâm đến việc làm cho nó trông đẹp hơn sau này.

19. Cứ tiếp tục

Sẽ có ngày bạn muốn từ bỏ coding. Đừng. Đây là một công việc khó khăn và mọi người đều mắc phải hội chứng kẻ mạo danh (suy nghĩ rằng bản thân là kẻ tầm thường và không có năng lực làm gì).

Bạn không cô đơn. Và coding sẽ trở nên dễ dàng hơn theo thời gian.

Làm mỗi ngày, và bạn sẽ ổn thôi.

Cứ tiếp tục.

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

TopDev via Dev

Tự tạo một chương trình CLI trong quản lý công việc

Tự tạo một chương trình CLI trong quản lý công việc

CLI là gì?

CLI là cách người dùng và chương trình giao tiếp với nhau thông qua các dòng lệnh. CLI là viết tắt Command – line –interface, VD: nếu người dùng đồng ý thì gõ vào phím y rồi nhấn enter…

Interface là gì?

Interface là cách các đối tượng giao tiếp với nhau. Ở đây ta xét 1 đối tượng là người, 1 đối tượng là chương trình máy tính. Có 2 loại interface thường được nhắc đến là GUI và CLI (để ý chữ I ở cuối).

GUI = Graphical User Interface: Người dùng và chương trình giao tiếp với nhau thông qua các nút bấm, hình ảnh…Thao tác tiêu biểu cho GUI là: nếu người dùng đồng ý thì bấm vào nút OK, không thì bấm vào nút Cancel.

Bạn có thể thao tác công việc nhanh hơn hẳn so với dùng GUI. Với CLI, bạn chỉ cần gõ bàn phím, nên nếu đã gõ quen rồi, bạn có thể vừa nhắm mắt, vừa gõ code (yaoming) => Khi làm việc sẽ không còn bị mỏi mắt nữa=))

Một ví dụ khác: Mặc dù bạn không nhớ câu lệnh như thế nào, nhưng CLI có lưu lại các câu lệnh bạn đã gõ. Vì vậy bạn chỉ cần gõ câu lệnh man để gọi lại lịch sử command, bạn sẽ thấy công việc code hàng ngày của bạn có những thay đổi đáng kể.

Terminal là gì?

Là thiết bị cuối – thiết bị cuối cùng của đường dây. Thiết bị này được dùng vào thời mà những chiếc máy tính còn đắt đỏ. Một terminal chỉ có bàn phím (input) và màn hình (output). Cái mà ngày nay chúng ta hay gọi là terminal chạy trên máy tính thực chất là “virtual terminal” – terminal ảo. Các hệ điều hành nhân Linux đều trang bị sẵn các virtual terminal (từ giờ gọi là terminal cho ngắn).
Các terminal phổ biến như: GNOME Terminal, Konsole, rxvt, terminator…

Tự tạo một CLI để quản lý công việc

Câu chuyện có thay đổi một chút. Những điều tôi tổng hợp ra dưới đây không chỉ là những việc mà một kỹ sư phần mềm cần làm, mà nó còn áp dụng chung cho tất cả những ai đang làm việc, giúp công việc của bạn đạt được hiệu suất cao hơn.

• Quản lý Memo (viết note những việc cần làm)
• Quản lý Task
• Quản lý thời gian
Hiện tại, tôi đang áp dụng quản lý các việc trên bằng CLI nên cũng muốn giới thiệu, chia sẻ cho các bạn biết.

Quản lý Memo

Tôi đã viết bằng Markdown và đang quản lý File bằng Private Responsitory của Github. Tôi chia file code của từng ngày ra và lưu lại. Bằng cách gọi câu lệnh dưới đây, tôi có thể mở ra các phần memo của ngày hôm nay. Gõ câu lệnh này ra, đầu tiên màn hình sẽ chuyển trạng thái thành Get emacs /diary/ emacs ~/diary/(date “+%Y/%m/%d.md”).

Cấu trúc Directory

Sau khi gõ câu lệnh trên, 1 file có Directory dạng là 年/月/日.md sẽ được tạo ra và có cấu trúc directory như dưới đây:

/home/sachaos/diary
├── 2016
│ ├── 06
│ ├── 07
│ ├── 08
│ ├── 09
│ ├── 10
│ ├── 11
│ └── 12
│ ├── …
│ ├── 20.md
│ ├── 21.md
│ ├── 22.md
│ ├── 24.md
│ ├── 25.md
│ └── 27.md
├── 2017
│ └── 01

Quản lý bằng Private Responsity của GitHub

Tôi đang quản lý file, code của mình trên Responsity của GitHub. Với chức năng này, bạn có thể dễ dàng share thông tin giữa các thiết bị ở nhà và các thiết bị tại công ty. Vì thế, khi bạn muốn xem lại thông tin, code…v.v trên các thiết bị di động, bạn có thể xem dễ dàng lại vì các thông tin, code đó đã được đã được viết thêm Markdown, hiển thị sao cho dễ nhìn , kể cả khi bạn Access vào Github.
Search Memo
Tôi quản lý memo trên git, nên tôi có thể search lại các phần memo đó, chỉ với 1 cú pháp đơn giản là git grep . Qủa thực là rất tiện lợi các bạn ạ!

Quản lý Task

Tôi đang sử dụng Web app có tên là Todoist để quản lý các Task cá nhân.
App này rất tiện và dễ dùng nữa. Nhưng vì tôi muốn dùng CLI nên tôi đã tạo CLI client bằng Golang và đang dùng app tự mình viết.

Demo

Tự tạo một chương trình CLI trong quản lý công việc

Quản lý thời gian

Để đo thời gian làm các task hết bao lâu, tôi dùng 1 Web app là toggl
Khi thực hiện đo thời gian một cách chuẩn xác như vậy thì lần sau các bạn sẽ estimate thời gian làm task chính xác hơn. Thời gian làm task sẽ được tổng hợp thành các biểu đồ. Bạn sẽ dễ dàng nhìn ra được: Bạn đã dành bao nhiêu thời gian cho 1 task, thời gian vượt dự kiến là bao nhiêu…v.v
Có thể các bạn nghĩ tôi tự phụ, “tự hát, tự khen hay” nhưng vì thích dùng CLI nên tôi cũng viết client cho app này luôn=))
• sachaos/toggl: Toggl CLI Client
demo

Tự tạo một chương trình CLI trong quản lý công việc

Tổng kết

Trên đây tôi đã giới thiệu cho các bạn về các phương pháp, tool tôi đang sử dụng trong thực tế để quản lý Memo, task, thời gian bằng CLI. Bằng cách liên tục cải tiến các quy trình, bắt đầu từ những việc nhỏ như vậy, chúng ta sẽ tiết kiệm được thời gian, nâng cao năng suất, hiệu quả trong công việc.
Chúc các bạn làm việc vui vẻ, xong sớm, về sớm! (len)

Link bài gốc: http://qiita.com/sachaos/items/ed06f09375b2cef55dda?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=d827451390-Qiita_newsletter_243_18_1_2017&utm_medium=email&utm_term=0_e44feaa081-d827451390-33433141

Sưu tầm & Dịch bài: Thanh Thảo

 

 

Cách build một extension (tiện ích mở rộng) trên Chrome

cách làm chrome extension

Có bao giờ các bạn tự hỏi cách build chrome extension là gì? Có dễ không? Gần đây mình đã tự tạo một phiên bản chrome extension đầu tiên cho mình. Nó tên là Catify, và nó có thể thay mọi hình ảnh trên giao diện page của bạn tràn ngập hình mèo.

Đây cũng là lần đầu mình thử cách build chrome extension và nó rất thú vị. Bạn có muốn tự tạo cho mình một tiện ích trên Chrome giống vậy chứ? Mình sẽ hướng dẫn cho các bạn cách build chrome extension. Và đừng quá lo lắng, tổng thời gian chỉ mất khoảng 1 ngày thôi.

Hướng dẫn cách build chrome extension

Chrome extension (Tiện ích mở rộng trên Chrome) là gì? Mặc dù Chrome đã là một trình duyệt tuyệt vời rồi, nhưng bạn có thể làm nó tuyệt vời hơn thế nữa. Bằng cách thêm các tiện ích (extension) cho nó. Để kiểm tra tiện ích nào đã có sẵn, bạn có thể xem tại Chrome Web Store. Chỉ cần truy cập và kiểm tra tất cả những tiện ích thú vị đang có sẵn. Và giờ hãy tưởng tượng tiện ích của riêng bạn cũng đang nằm trên store đó thì sao nhỉ? Hãy cùng biến điều đó thành hiện thực nào.

Chúng ta sẽ làm gì?

Vì có lẽ bạn đã có khá nhiều ý tưởng tung tăng trong đầu để xây dựng tiện ích đầu tiên của mình, nên chúng ta cần xem qua một tí căn bản ở bước đầu nhé. Để làm tiện ích, chúng ta hãy xem một trong những ví dụ căn bản của Google là page redder, và cùng thêm chút gia vị vào đó nào. Chúng ta tạo một tiện ích có thể chuyển màu nền của trang sang một màu bất kỳ mỗi khi bạn bấm vào icon tiện ích đó.

Bước đầu tiên: Tạo tệp kê khai

Hãy chắc chắn là bạn đã thiết lập kiểm soát nguồn và để trình soạn thảo mình thích trỏ đến đúng vị trí. Chúng ta bằng đầu bằng việc tạo tệp kê khai, đây là file cho Chrome biết mọi thứ nó cần về tiện ích của bạn. Những thứ như tên, icon cũng cần được cho phép và xác nhận nơi nó được code. Hãy tạo 1 tệp tên manifest.json và điền vào như thế này: 

{
  "name": "Make it rain(bow)",
  "description": "Embrace the inner unicorn and reflect on the page background.",
  "version": "0.0.1",
  "manifest_version": 2
}

Vậy chúng ta thấy gì ở đây nào? Đầu tiên là name. Đây là cách mà tiện ích sẽ xuất hiện ở store, trong phần tổng quan tiện ích và trừ khi có quy định khác về những gì bạn thấy khi bạn di chuột vào icon trong trình duyệt. Sau đó có description, cái này chỉ là một cái title, một đoạn mô tả hiển thị trong store và phần tổng quan về tiện ích. Tiếp theo là version của tiện ích.

Bạn nên sử dụng phiên bản semantic cho tiện ích của bạn và gia tăng điều này mỗi khi bạn update tiện ích của mình. Cuối cùng hãy xem qua manifest_version, lệnh này sẽ cho Chrome biết file này được viết bởi tệp kê khai version 2. Có lẽ nếu bạn sẽ muốn hỗ trợ Chrome trước phiên bản 18, bạn nên sử dụng manifest bản 1, nhưng đừng để lỡ những phiên bản mới hơn. Bây giờ đã xong những cái cơ bản, chúng ta có thể từ từ thêm nhiều thứ nữa nhé.

Thay đổi title khi di chuột vào icon

Bằng cách mặc định hiện tên của tiện ích, nhưng cũng không hẳn là giống nhau. Hãy thay đổi nó nào! Thêm các câu lệnh dưới đây vào root của manifest.json như sau:

"browser_action": {
  "default_title": "Unleash the unicorn dust!"
},

Bây giờ khi người dùng di chuột đến icon, nó sẽ hiển thị dòng chữ “Unleash the unicorn dust!”

Permissions và Script

Trước khi chúng ta có thể code thực cho tiện ích của mình, chúng nên thêm 2 thứ nữa vào manifest. Đầu tiên, chúng ta cần define các permission cần thiết. Trong trường hợp chúng ta không chỉ cần 1 permission, thì truy cập vào tab hiện hành. Hãy define cái này. Thêm những dòng lệnh như bên dưới vào root của manifest.json

"permissions": [
  "activeTab"
],

Tiếp theo chúng ta cần một vài script để chạy. Chúng ta sẽ thực hiện việc này trong script background, cũng là việc mà chúng ta cần define trong manifest.json. Thêm vào root như sau:

"background": {
  "scripts": ["background.js"],
  "persistent": false
},

Chúng ta sẽ define logic trong một file tên là background.js. Bên cạnh đó, nó sẽ không tồn tại lâu, bạn chỉ nên duy trì liên tục nếu tiện ích mở rộng dùng chrome.webRequest API để chặn hoặc sửa đổi yêu cầu mạng. Tới lúc xây dựng logic thực tế rồi!

Thay đổi màu background

Vì chúng ta đã báo cho Chrome biết rằng logic được đặt trong background.js, nên hãy dùng file này và build logic.

chrome.browserAction.onClicked.addListener(function(tab) {
  const colors = ['red', 'orange', 'yellow', 'green', 'blue', 'violet'];

  const colorPicker = () => {
    const randomIndex = Math.floor(Math.random() * colors.length);
    return colors[randomIndex];
  }

  chrome.tabs.executeScript({
    code: 'document.body.style.backgroundColor="' + colorPicker() + '"',
  });
});
});

Hãy nhìn qua các dòng code. Dòng đầu tiên cho biết chúng ta đã thêm 1 Listener vào onClick của browserAction. Là sao?? BrowserAction là một cái nút bạn sẽ thấy ở Chrome khi thêm một tiện ích, onClick xảy ra khi bạn click vào cái nút đó và thêm 1 Listener, điều này nghĩa là nó chỉ kích hoạt khi bạn click vào. Vậy nên phương pháp này được thực hiện khi bạn nhấp vào nút bên trong Chrome.

  30 tiện ích Chrome (extensions) cho Designer và Developer
  Một số mẹo vặt dành cho Developer trên Chrome

Tự thân dòng code đã thoát ra. Chúng ta có một list màu, một phương pháp chọn màu ngẫu nhiên từ cái list đó và thực hiện script để đổi màu background. Chúng ta làm điều này bằng cách thực thi một đoạn javascript bên trong tab trình duyệt mà hiển thị trong trang thực tế.

  Chrome DevTools: Performance tool

Thêm icon

Trước khi sử dụng thử tiện ích, chúng ta nên làm nó đẹp hơn một chút. Chúng ta sẽ define icon mà hiển thị trên đầu của trình duyệt cho tiện ích của mình. Bắt đầu bằng việc tạo một cái hình bất kỳ kích thước 128×128 mà bạn muốn. Giờ bạn sẽ lưu cái hình này dưới một số dạng sau:

  • 128×128 để sử dụng trong store của Chrome
  • 48×48 để sử dụng khi cài đặt
  • 32×32 để hiện thị trên các cửa sổ
  • 16×16 để sử dụng trong mỗi Chrome như icon hiển thị trên đầu màn hình của bạn

Để thêm những hình ảnh này, chúng ta hãy thay đổi một số cái trong manifest.json như bên dưới, thêm vào section browser_action:

"default_icon": "icon16.png"

Chúng ta chỉ cần ghi rõ hình 16×16 ở đây, vì icon đó luôn luôn để kích thước 16×16 trên mọi thiết bị. Và thêm phần này vào root:

"icons": { 
  "16": "icon16.png",
  "32": "icon32.png",
  "48": "icon48.png",
  "128": "icon128.png" 
},

Đây là những icon có thể dùng từ các ứng dụng của bạn và có sẵn các kích thước theo yêu cầu. Xem thêm: Cách tạo icon trên Android.

Hãy thử chạy nào!

Bạn có phấn khích không nào? Chắc chắn rồi, vì chúng ta sẽ chuẩn bị test thử tiện ích của mình trên trình duyệt. Bật trình duyệt lên và mở tiện ích của bạn bằng cách bấm vào nút menu và chọn More Tools -> Extensions. Việc đầu tiên bạn làm là enable Developer mode.

cách build chrome extension

Giờ bạn sẽ thấy 3 cái nút xuất hiện đầu tiên bên trái trang. Cho phép bạn tải tiện ích đã giải nén, nén tiện ích hoặc bắt buộc update. Click vào nút đầu tiên để tải lên tiện ích đã giải nén.

cách build chrome extension

Bây giờ hãy đến folder mà bạn đã tạo tiện ích và bấm Select folder. Tiện ích của bạn sẽ được cài đặt ngay, thật tuyệt vời! Sau khi cài đặt xong bạn sẽ thấy nó trên trang tiện ích của mình ở đầu trình duyệt.

cách build chrome extension

Giờ hãy mở thử nó nào! Mở một tab mới, đến dev.to và nhấn vào icon cầu vồng. Rồi nhấn nó nhiều lần nữa để thấy cầu vồng xuất hiện nhé.

cách build chrome extension

Hiệu nghiệm rồi!!

Publish tiện ích của bạn

Chỉ còn một chuyện nữa để làm, đó là publish tiện ích Make it rain(bow) tuyệt vời của bạn. Hãy làm theo các bước sau:

cách build chrome extension

Sau khi bạn đồng ý các điều khoản, bạn có thể tiếp tục với tiện ích của mình.

  1. Nhấn nút NEW ITEM ở trên cùng bên phải, sẽ hiện ra một cưa sổ, sau đó chọn file zip bạn đã tạo ở bước 1.

2. Sau khi upload, 1 cái form sẽ mở ra yêu cầu một vài chi tiết trước khi bạn có thể kích hoạt tiện ích của mình. Bạn sẽ phải điền:

  • Title
  • Tóm tắt
  • Mô tả chi tiết
  • Category
  • Ngôn ngữ
  • 1 ảnh chụp màn hình. Hãy điền hết những cái này.

cách build chrome extension

  • Bấm SAVE DRAFT và nếu mọi thứ đã được điền đúng, bạn sẽ có thể bấm “PUBLISH ITEM”. Click vào nó, và chỉ đợi một chút để được xác nhận. Bấm PUBLISH và hoàn tất nào. Vậy là bạn đã tự tạo được tiện ích đầu tiên của riêng mình rồi.

cách build chrome extension

Kết

Cảm ơn bạn đã đọc bài viết ‘cách build chrome extension’, mình hy vọng bạn có thể được gì đó sau khi đọc xong. Như bạn thấy đó, cách build chrome extension không quá khó. Có ý tưởng cho một tiện ích chưa có, sẽ là một câu chuyện hoàn toàn khác. Chúc bạn may mắn và hy vọng sẽ thấy được các tiện ích của bạn sớm.

Bài viết tham khảo:

Topdev via dev.to

Có thể bạn muốn xem thêm:

Xem thêm việc làm IT tại TopDev!

Giao tiếp hiệu quả giữa các Microservice

Lựa Chọn Giữa http/1.1 Và gRPC. TL; DR: Use gRPC

Làm thế nào mà việc giao tiếp giữa các microservice lại gây ảnh hưởng đến hiệu suất và khả năng mở rộng của ứng dụng. Giao tiếp giữa các dịch vụ có thể đồng bộ hoặc không. Đối với bài viết này, chúng tôi sẽ tập trung vào sự đồng bộ. Theo ý kiến cá nhân của chúng tôi thì có 2 giao thức phổ biến:

  • HTTP/1.1: giao thức http mặc định
  • gRPC: cuộc gọi thủ tục từ xa với hiệu suất cao (RPC framework). gRPC.io hoạt động dựa vào tài liệu toàn diện của mình.

Hãy thử xem một số code mẫu và chạy thử một số thử nghiệm hiệu suất để xem thử các lựa của chúng tôi

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

  Giải đáp những thắc mắc kĩ thuật quan trọng về Microservices
  Hướng dẫn vượt khó Microservices vô cùng giá trị dành cho bạn!
  gRPC và ứng dụng nó trong Microservices

 

Chế Độ Non-cluster

Cùng bắt đầu với một mô hình nhỏ và cố gắng nhận một cuộc trò chuyện microservice với một bên khác.

Sơ đồ cấu trúc ứng dụng đơn giản

Ứng dụng của chúng tôi bao gồm các thành phần:

  • Load Testing tool: jMeter
  • Service A: Đưa ra yêu cầu cho service B và trả về phản hồi đó.
  • Service B: Trả lời bằng static JSON sau 10ms cho tất cả các API
  • VMs: Cả hai VM đều là máy Amazon EC2 t2.xlarge

HTTP / 1.1

Đây là yêu cầu mặc định mà chúng tôi thực hiện khi sử dụng bất kỳ thư viện HTTP client nào như axios, superagent.

Hãy tạo ServiceB để triển khai API của chúng tôi.

server.route({
  method: 'GET',
  path: '/',
  handler: async (request, h) => {
    const response = await new Promise((resolve) => {
      setTimeout(() => {
        resolve({
          id: 1,
          name: 'Abhinav Dhasmana',
          enjoys_coding: true,

        });
      }, 10);
    });
    return h.response(response);
  },
});

Service B triển khai HTTP / 1.1

Tiếp theo, chúng tôi tạo serviceA gọi serviceB bằng HTTP / 1.1

server.route({
  method: 'GET',
  path: '/',
  handler: async (request, h) => {
    try {
      const response = await Axios({
        url: 'http://localhost:8001/',
        method: 'GET',
      });
      return h.response(response.data);
    } catch (err) {
      throw Boom.clientTimeout(err);
    }
  },
});

Service A triển khai HTTP/1.1

Với hai service đang chạy này chúng tôi có thể kích hoạt jMeter để thử nghiệm hiệu năng. Chúng tôi sẽ sử dụng 50 người dùng với 2000 yêu cầu mỗi người. Chúng ta có thể thấy trong ảnh chụp màn hình bên dưới trung bình của chúng là 37ms.

Kết quả hoạt động của HTTP / 1.1 ở chế độ Non-cluster

gRPC

gRPC sử dụng protocol buffers theo mặc định. Ngoài serviceAserviceB, chúng tôi còn cần thêm một file proto sẽ xác định cuộc gọi từ xa của chúng tôi.

syntax = "proto3";

service SampleDataService {
  rpc GetSampleData (Empty) returns (SampleData) {}
}

message SampleData {
  int32 id = 1;
  string name = 2;
  bool enjoys_coding = 3;
}

message Empty {}

File proto cho tiếp xúc với RPC

Hãy triển khai lại serviceB, lần này hãy sử dụng gRPC

const grpc = require('grpc');

const proto = grpc.load('serviceB.proto');
const server = new grpc.Server();

const GetSampleData = (call, callback) => {
  setTimeout(() => {
    callback(null, {
      id: 1,
      name: 'Abhinav Dhasmana',
      enjoys_coding: true,
    });
  }, 10);
};

server.addService(proto.SampleDataService.service, {
  GetSampleData,
});

const port = process.env.PORT;
console.log('port', port);

server.bind(`0.0.0.0:${port}`, grpc.ServerCredentials.createInsecure());

server.start();
console.log('grpc server is running');

Service B khi triển khai gRPC

Vài điều cần lưu ý:

  • Chúng tôi tạo máy chủ grpcline 4
  • Chúng tôi thêm một service vào máy chủ của mình ở line 16
  • Chúng tôi liên kết portcedentials ở line 23

serviceA được triển khai bằng cách sử dụng gRPC bên dưới

onst protoPath = `${__dirname}/../serviceB/serviceB.proto`;
const proto = grpc.load(protoPath);

const client = new proto.SampleDataService('localhost:8001', grpc.credentials.createInsecure());
const getDataViagRPC = () => new Promise((resolve, reject) => {
  client.GetSampleData({}, (err, response) => {
    if (!response.err) {
      resolve(response);
    } else {
      reject(err);
    }
  });
});

server.route({
  method: 'GET',
  path: '/',
  handler: async (request, h) => {
    const allResults = await getDataViagRPC();
    return h.response(allResults);
  },
});

Service A khi triển khai gRPC

Một số ghi chú:

  • Chúng tôi tạo client grpc tại line 4
  • Chúng tôi tựực hiện một cuộc gọi từ xa tại line 6

Hãy chạy thử nghiệm công cụ jMeter một lần nữa.

Kết quả hoạt động của gRPC ở chế độ Non-cluster

Như chúng ta có thể thấy từ dữ liệu này, gRPC nhanh hơn 27% so với yêu cầu HTTP / 1.1 thông thường.

Cấu Trúc Ứng Dụng Trong Chế Độ Cluster

Cấu trúc ứng dụng

Nếu bạn đang chạy bất cứ thứ gì trong quá trình sản xuất, rất có thể bạn đang chạy nhiều phiên bản của bất kỳ dịch vụ cụ thể nào. Trong trường hợp này, chúng ta đang thực hiện các thay đổi sau:

  • Chạy ba phiên bản dịch vụ của chúng tôi trên các cổng khác nhau
  • Chúng tôi đang sử dụng NGINX tạo sự cân bằng tải.

HTTP/1.1

Không có thay đổi được yêu cầu từ phía dịch vụ. Tất cả chúng ta cần làm đó là cấu hình nginx để cân bằng lưu lượng tải với serviceB. Chúng tôi có thể sửa đổi /etc/nginx/sites-available/default giống như bên dưới

upstream httpservers {
   server ip_address:8001; 
   server ip_address:8002; 
   server ip_address:8003; 
}
server {
   listen 80; 

   location / {
      proxy_pass http://httpservers;
   }
}

nginx với HTTP/1.1

Bây giờ chúng ta có thể bắt đầu với 3 phiên bản dịch vụ của chúng tôi và chạy thử nghiệm hiệu suất của chúng.

Kết quả hoạt động của HTTP / 1.1 ở chế độ Cluster

gRPC

Hỗ trợ cho gRPC gần đây đã được thêm vào  nginx phiên bản 1..13.10. Vì thế chúng ta cần sử dụng bản mới nhất vì sudo apt-get install nginx mặc định sẽ không thể hoạt động.

Chúng tôi không sử dụng node trong chế độ cluster vì gRPC không được hỗ trợ.

Thực hiện các bước dưới đây để có được nginx mới nhất.

sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx

Nhận ngay phiên bản nginx mới nhất

Chúng tôi cũng sẽ cần các chứng chỉ ssl. Chúng tôi có thể tạo các chứng chỉ tự ký bằng openSSL

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout localhost-privatekey.pem -out localhost-certificate.pem

Lệnh tạo chứng chỉ tự ký

Tiếp theo, chúng ta cần thay đổi tệp /etc/nginx/sites-available/default  để bắt đầu sử dụng gRPC.

upstream grpcnodes {
    server ip_address:8001;
    server ip_address:8002;
    server ip_address:8003;
}
server {

    listen 1443 http2;
	  ssl_certificate /home/ubuntu/interserviceCommunication/http2/certificates/localhost-certificate.pem;
          ssl_certificate_key /home/ubuntu/interserviceCommunication/http2/certificates/localhost-privatekey.pem;

	  location / {
                grpc_pass grpcnodes;
##		try_files $uri $uri/ =404; // Don't forget to comment this else you will get 404 as a response
	}

Chính là nó. Hãy chạy thử nghiệm hiệu suất một lần nữa

Kết quả hoạt động của gRPC ở chế độ non cluster

Như chúng ta có thể thấy gRPC nhanh hơn 31% so với HTTP / 1.1

Kết Luận

gRPC thì nhanh. Trong các bản thử nghiệm ở trên, chúng ta có thể thấy nó nhanh hơn 31% so với HTTP / 1.1 chỉ bằng cách thay đổi cách mà chúng tôi trao đổi.

Những mã nguồn này có thể tìm thấy trên GitHub

Topdev via ITNEXT

====

Tuy nhiên, đối với những dự án cần một số yếu tố như tốc độ truyền thông cao và độ trễ thấp, truyền dữ liệu kiểm stream, các hãng công nghệ lớn thường có xu hướng chuyển đổi sang một framework RPC mới dựa trên protobufs và HTTP/2 của Google là gRPC API. 

Tại buổi meetup ngày 14/01/2020 với chủ đề “Migrating APIs from REST to gRPC and LOOP Case study” do anh Việt Nguyễn – CTO | LOOP trình bày, hứa hẹn sẽ mang đến những giải pháp cho vấn đề giao tiếp giữa các services từ chính trường hợp của LOOP.

Tham gia ngay buổi meetup để trao đổi chi tiết hơn cùng cộng đồng IT và chuyên gia đến từ LOOP ngay nhé! 

 = = =
**Nhập ngay code EARLYBIRD@1401 để giảm 100.000đ cho các vé đầu tiên
⏰ Thời gian: 18:30 – 21:00 ngày 14/01/2020
📌 Địa điểm: UP Bách Khoa Hà Nội, tầng 3 toà nhà A1-7, 17 Tạ Quang Bửu, HBT.
🎟 Đăng ký ngay tại: https://meetup.vn/e/F3S

===

LIÊN HỆ

Event team: event@applancer.net | 028 6681 3236
Ms. Thoa | thoa.nguyen@applancer.net | 038 5098 969
=== Sự kiện thuộc chuỗi PRODUCT IN REAL LIFE hằng tuần được tổ chức bởi TopDev – Giải pháp tuyển dụng ngành IT ===

Service B triển khai HTTP / 1.1

Lập trình viên Việt Nam có nền tảng để trở thành những chuyên gia AI hàng đầu Đông Nam Á!

Hãy cùng Techtalk gặp gỡ và trò chuyện cùng những chuyên gia công nghệ tại Axon để hiểu thêm về định hướng, tầm nhìn và những chia sẻ sâu sắc của họ về thị trường công nghệ tại Việt Nam. Các lời khuyên của họ cũng sẽ là một hành trang vô cùng quý giá cho những lập trình viên sau này.

Có thể các bạn đã biết, Axon thành lập cách đây 25 năm, với sứ mệnh cốt lõi chính là: Bảo vệ tính mạng của tất cả mọi người – cả người dân và cảnh sát trong các tình huống nguy hiểm cũng như khi người dân và cảnh sát phải đụng độ trực tiếp.

Một trong những dịch vụ và phần mềm đám mây chứa thông tin theo dạng video (video information) lớn nhất thế giới để thay đổi cách thức thực thi công lý của các đơn vị chính quyền – cảnh sát mà không làm ảnh hưởng đến tính mạng con người.

2 năm trước, khách hàng của Axon cần một giải pháp công nghệ để xử lý và sắp xếp lại một số lượng lớn video bằng chứng để công bố thông tin rộng rãi đến công chúng cũng như báo chí. Và rồi, chúng tôi mua lại nhóm Computer Vision của Misfit, đây cũng là điểm khởi nguồn cho tất cả những thành phẩm tuyệt vời mà chúng tôi đang thực hiện hoá hiện nay trên quy mô toàn cầu.

Hiện nay, ngoài trụ sở Hoa Kỳ, nhánh Axon Việt Nam là trung tâm nghiên cứu và phát triển trọng điểm của tập đoàn Axon, với hơn 90 nhân viên & kỹ sư và ngày càng phát triển nhanh chóng.

Có 3 điều làm nên một Axon hoàn toàn khác biệt:

Thứ nhất, chúng tôi giải quyết các vấn đề gây trăn trở và khó khăn nhất của xã hội hiện đại, và công nghệ được phát triển ở đây có thể bảo vệ mạng sống bất cứ ai trên thế giới. Sẽ không có nhiều nơi trên thế giới mà bạn mang trong mình sứ mệnh “Loại bỏ đạn bạc – Bảo vệ con người” như thế.

Và cuối cùng, hãy thử tưởng tượng xem, cách đây 25 năm, nếu bạn nói với ai đó rằng một ngày bạn có thể ngăn chặn một tên tội phạm mà không gây nên bất kỳ thương tích nghiêm trọng nào, hoặc ngăn chặn nó từ chính thiết bị di động của bạn và gửi thông tin đó ngay cho cảnh sát địa phương để giải quyết, mọi người sẽ nghĩ bạn bị điên và thay vào đó sẽ báo bạn lên cho cảnh sát… Và giờ đây, bạn đã hoàn toàn có thể thực hiện nó chỉ trong cái chạm tay và có thể cứu lấy không ít người.

Có một điểm tôi rất muốn chia sẻ: Các kỹ sư và lập trình viên tại Việt Nam chưa bao giờ làm tôi hết bất ngờ. Từ thủ đô Hà Nội đến thành phố Hồ Chí Minh, tôi nhận thấy các bạn đều có nền tảng rất tốt về toán học và khoa học cơ bản, và điều đó là vô cùng quan trọng khi bạn bắt tay vào thiết kế các hệ thống AI và phần mềm phức tạp và độ chính xác cao.

Rất nhiều kỹ sư của chúng tôi ở đây có nền tảng mạnh về toán học và khoa học cơ bản, và điều đó là vô cùng quan trọng khi bạn bắt tay vào thiết kế các hệ thống AI và phần mềm phức tạp và độ chính xác cao. Có thể nói, các kỹ sư và lập trình viên Việt Nam thật sự rất đam mê và nghiêm túc với những gì họ đang làm để mang đến những sản phẩm và giải pháp tốt nhất.

Không ngừng xây dựng các mối quan hệ & kết nối mới – Gặp gỡ, chia sẻ thông tin và kiến ​​thức là một trong những yếu tố quan trọng nhất để duy trì và củng cố sự phát triển bền vững của trong cộng đồng kỹ thuật Việt Nam hiện có.

Triết lý cá nhân của tôi đó là các kỹ sư khắp Việt Nam cần chia sẻ tài năng của họ trên quy mô toàn cầu. Tôi không nhìn nhận các công ty khác ở đây là đối thủ cạnh tranh, nhưng thấy đó là cơ hội để tất cả chúng ta trở nên mạnh mẽ & phát triển hơn.

Có một câu ngạn ngữ Anh nói rằng:

“A rising tide lifts all boats” (Sóng lên thì thuyền lên)

tức khi công nghệ ngày càng phát triển thì ai cũng sẽ được hưởng lợi từ nó.

Tại Axon, mọi người làm việc thoải mái và mang tính chủ động cao, để cô đọng hơn về môi trường làm việc ở đây, mình sẽ nói về 6 giá tr ị cốt lõi khi bạn làm việc tại Axon:

Outsource và Product có cách tư duy khác nhau. Dù sao đi nữa, thì để hiểu một công nghệ nào thì đối với Outsource hay Product tốn khá nhiều thời gian và tư duy. Theo mình thì những bạn theo làm Product sẽ có tư duy phản biện tốt hơn, và có thể trả lời được câu hỏi “Tại sao mình phải làm như vậy?”. Còn về outsource, các bạn có thể làm việc tốt hơn dù dưới áp lực về thời gian hay yêu cầu về sản phẩm.

Bên mình có một số sản phẩm dựa trên nền tảng AI. Ví dụ như tính năng tự động làm mờ những thông tin cá nhân trong các video chứng cứ khi camera quay và upload các chứng cứ lên trên mạng. Tính năng đó có tên là Redaction. Tất cả những thông tin cá nhân sẽ bị thay đổi trước khi chuyển sang cho giới truyền thông… Để xóa một video 10 phút cần một người làm việc trong 40 phút để chính sửa. Và bên mình đang nghiên cứu để sử dụng AI hỗ trợ rút ngắn thời gian đó xuống.

Về tiếng súng, Axon đang sử dụng các đặc điểm MFCC (Mel-scale Frequency Cepstral Coefficient), để chuyển các tín hiệu âm thanh thành dạng hình ảnh 2D, mà bọn mình có thể dùng khai thác tính toán. Đây cũng là kĩ thuật mà Google và Apple dùng đằng sau câu lệnh gọi điện thoại “Hey, Google” và “Hey Siri”. Chỉ khác là ở đây mình sẽ dùng tiếng súng.

Ở Axon, công ty quan trọng cách bạn suy nghĩ và tư duy giải quyết vấn đề hơn là bạn biết dùng công nghệ gì. Trong khi công nghệ bạn sử dụng có thể thay đổi được, cách suy nghĩ theo mình rất khó để đào tạo. Do đó khi phỏng vấn mình đặc biệt chú ý đến thái độ và cách bạn đó suy nghĩ, giải quyết vấn đề. Bên cạnh đó, mình cũng chú ý đến tính cách và khả năng hòa nhập với công ty, và các giá trị của công ty mà mình tìm nơi bạn đó.

Một lời khuyên cho các bạn ứng vên về sách đọc thuật toán nói riêng: cuốn Cracking the code interview. Ở trong cuốn này có nhiều mẹo nhỏ về những thuật toán nhỏ mình thường gặp. Nhưng mình muốn nói thêm rằng đây chỉ là cookbook để chuẩn bị cho phỏng vấn, và chắc chắn kiến thức thì không thể hình thành trong một ngày hai ngày, mà đó là cả một quá trình.

Công nghệ AI ở VN có khá nhiều hướng đi: một số công ty làm về Fintech, một số outsource làm về thị giác máy tính, và một số khác thiên về quảng cáo: xử lý ngôn ngữ tự nhiên, phân tích thái độ của bình luận. Một điều mình hay thấy ở nhiều start-up đó là vấn đề cây búa và cây đinh: đôi khi vấn đề mà họ đang gặp phải chưa cần đến những công cụ như machine learning, deep learning để giải quyết nhưng họ vẫn quyết tâm sử dụng. Tuy nhiên, cũng có rất nhiều công ty khác có nguồn dữ liệu dồi dào và nhiều người tham gia nghiên cứu đang tìm cách giải quyết những vấn đề rất thú vị, mà khi đó áp dụng những kĩ thuật mới như machine learning và deep learning sẽ mang lại ưu thế lớn hơn so với các phương pháp truyền thống cổ điển.

Cảm ơn phần chia sẻ rất hữu ích của hai anh về Axon cũng như những công nghệ mà công ty đang đem lại, hy vọng sẽ sớm được nhận nhiều chia sẻ hơn của hai anh trong thời gian tới.

  Top 20 API trong AI và Machine Learning bạn nên biết
  Deep learning là gì? Những quan niệm sai lầm về Deep Learning

2/9 này làm gì? Làm hiệu ứng “lá cờ bay trong gió” bằng JavaScript cực đơn giản

Làm hiệu ứng lá cờ bay trong gió bằng JavaScript

Giới thiệu

Chào anh em. Hôm nay mình xin chia sẻ về một hiệu ứng rất thú vị. Đó là Flying flag effect: Làm hiệu ứng lá cờ bay trong gió bằng JavaScript, HTML và CSS.

Bắt tay vào làm nào!

  Bí kíp tạo ra một tokenizer về toán học bằng Javascript

Cách làm hiệu ứng lá cờ bay trong gió bằng JavaScript

Mình sẽ demo trên http://jsfiddle.net cho anh em dễ theo dõi nhé.

Về phần HTML của effect rất đơn giản:

<div class='flag'>
</div>

Còn đây là CSS:

.flag {
    width:300px;
    height:200px;
    margin:50px;
}
.flag-element {
    -webkit-animation:oscill 1s ease-in-out infinite alternate; 
    -moz-animation:oscill 1s ease-in-out infinite alternate; 
    -ms-animation:oscill 1s ease-in-out infinite alternate; 
    animation:oscill 1s ease-in-out infinite alternate; 
    background: url('http://i.imgur.com/8VSL8Ve.gif');
    background-size: 300px 100%;
    position:relative;
    height:100%;
    width:1px;
    display:inline-block;
    box-shadow:0 1px grey, 0 -1px gray;
}
@-webkit-keyframes oscill {
    0% {
        top: 5%;
    }        
    100% {
        top: -5%;
    }
}
@-moz-keyframes oscill {
    0% {
        top: 5%;
    }        
    100% {
        top: -5%;
    }
}
@-ms-keyframes oscill {
    0% {
        top: 5%;
    }        
    100% {
        top: -5%;
    }
}
@keyframes oscill {
    0% {
        top: 5%;
    }        
    100% {
        top: -5%;
    }
}

Cuối cùng, tuy ngắn nhưng rất quan trọng đó là JavaScript:

var h = $('.flag').width();
for(var i = 0; i < h; i++){
    var flagElement = $("<div class='flag-element'>");
    flagElement.css('background-position', -i + "px 0");
    flagElement.css('-webkit-animation-delay', i * 10 + 'ms');
    flagElement.css('-moz-animation-delay', i * 10 + 'ms');
    flagElement.css('-ms-animation-delay', i * 10 + 'ms');
    flagElement.css('animation-delay', i * 10 + 'ms');
    $('.flag').append(flagElement);
}

Và kết quả là:

Làm hiệu ứng lá cờ bay trong gió bằng JavaScript

Kết

Như vậy là mình đã hướng dẫn cách làm hiệu ứng là cờ bay trong gió bằng JavaScript. Rất dễ phải không các bạn.

Chúc các bạn thành công và vui vẻ trong ngày Quốc Khánh nhé !!

Đừng bỏ lỡ những bài viết hay liên quan:

Xem thêm việc làm JavaScript trên TopDev

  Cách đặt tên class của element trong HTML sao cho phù hợp?

Hướng dẫn cách fix và restore WordPress bị shell hack hoặc chiếm quyền điều khiển

Các nguyên nhân chính dẫn đến site bị hack:

– Đặt pass dễ nhớ nên bị brute force password
– Thông tin hosting cũng tương tự như trên
– Server OS bị bug và quá cũ dễ bị exploit
– Cài đặt plugin hoặc themes có bug + shell và lâu rồi ko được update để fix
– OS của bạn đang sử dụng bị virus và trực tiếp lây nhiễm vào OS và FTP Client.

  Cấu hình Redis Caching để tăng tốc site WordPress của bạn
  Wordpress - Cách tối ưu web lên 99 điểm trên di động PageSpeed Insights

Cách fix và restore site, làm tuần tự (nếu may mắn còn database + folder uploads):

– Đầu tiên export database ra để backup.
– Vào folder wp-content/plugins lưu lại danh sách các plugins hiện đang dùng.
– Đổi pass hosting (bao gồm ftp và cpanel quản lý nếu có), nếu dùng vps thì thường hay dùng account root thì đổi luôn password của root và tốt nhất là thêm việc đổi luôn port ssh của vps.
– Đổi pass mysql nếu hosting chứa nhiều database thì cũng đổi hết tất cả các database tương ứng (bước này áp dụng cả vps lẫn hosting).
– Xóa toàn bộ code hiện có chỉ chừa lại folder wp-content/uploads, folder này chứa các static files (chủ yếu là các file ảnh hoặc các file không phải là php) sau đó download folder này về và dùng các chương trình search với phần mở rộng là .php để xóa các file php thường là file shell được upload lên hoặc được giấu ở folder này.
– Install một bản wp fresh (download bộ cài từ wordpress.org) ở localhost và import file database đã backup ở bước đầu tiên vào, thay đổi các thiết lập trong wp_config.php để phù hợp với database đã import (thường thì chỉ là prefix thôi).
– Vào phpmyadmin kiểm tra bảng wp_users xem có account nào khả nghi và có quyền administrator thì một là xóa luôn nếu không biết acc của ai, 2 là nếu đã biết thì đổi luôn password (lưu ý là việc này cần xác nhận user đã biết là ai và user đó chắc chắn email không bị lộ pass và máy tính không nhiễm virus vì có quyền admin đương nhiên có thể request password qua mail và lại upload shell lên coi như công cốc)
– Copy hoặc move folder uploads đã backup ở trên vào wp-content/ (overwrite nếu cần).
– Xem lại list các plugins đã ghi lại ở bước trên và tiến hành download ở các nguồn tin tưởng (phiên bản càng mới càng tốt) và copy vào thư mục wp-content/plugins
– Đăng nhập vào wp-admin và check lại mọi thứ lần cuối sau đó backup lại và thử upload lên hosting để hoàn tất quá trình restore lại site.

Ngoài ra thì có thể cài thêm một số plugin hỗ trợ bảo mật như bên dưới để tăng cường:

  • iThemes Security: plugin này có chức năng firewall cơ bản là block các request dạng như bruteforce password, ẩn wp-admin link đăng nhập, disable việc thực thi php ở folder uploads (cái này chỉ hỗ trợ đối với server đang chạy là apache nhé), chế độ rảnh ngoài giờ của admin nghĩa là ko đăng nhập được trong khoảng thời gian nào đó cho dù đúng password, blacklist ip, scan files theo lịch và thông báo các thay đổi có liên quan đến database cũng như physical files, vân vân và mây mây rất nhiều…
  • Sucuri: chức năng report thay đổi database và file cũng gần như bên trên, firewall cơ bản. Bọn này nó có cái WAF bản trả phí thì có full bộ firewall về bruteforce lẫn ip blacklist, ngoài ra thêm kiểu chế độ quét định kỳ và fix lỗi site nếu bị hack luôn dạng dịch vụ.

Các plugin backup có thể sử dụng để backup site hoặc database:

  • BackupBuddy: hỗ trợ backup định kỳ cả file + database hỗ trợ dạng send email attachments hoặc lên Gdrive, Onedrive, Dropbox…
  • Updraft Plus như trên dùng 1 trong 2 =.=
    Lưu ý là nếu plugin nguồn gốc rõ ràng mà đã chứa bug sẵn thì mọi cách làm bên trên đều bị vô nghĩa.
  11 cách tăng tốc nhanh cho WordPress bằng file wp-conig.php

Tham khảo thêm vị trí tìm việc làm WordPress hấp dẫn tại Topdev

Tác giả: Xman

Node.js & MongoDB – Xây dựng một ứng dụng Messenger trò chuyện trực tuyến

1. Video demo ứng dụng mà các bạn sẽ làm được sau khóa học.

Mình tóm tắt lại sơ sơ những tính năng của ứng dụng nhé (trong video cũng đã mô tả kỹ rồi):

  • Đăng ký đăng nhập đăng xuất tài khoản Local, lưu trực tiếp email và băm mật khẩu của người dùng.
  • Gửi E-mail xác nhận kích hoạt tài khoản.
  • Đăng ký đăng nhập đăng xuất bằng 2 kiểu tài khoản mạng xã hội Facebook & Google.
  • Cập nhật các thông tin của người dùng như ảnh đại diện, tên hiển thị, số điện thoại…vv…
  • Tìm kiếm người dùng để thêm bạn bè.
  • Quản lý danh sách bạn bè, thêm, sửa, xóa, đếm số lượng bạn bè, gửi lời mời kết bạn, hủy yêu cầu, xác nhận bạn bè…vv…
  • Bắn các thông báo real-time thời gian thực khi có thông báo đến, ví dụ khi có ai gửi lời mời kết bạn đến (tương tự facebook)…vv…
  • Phân biệt, đánh dấu & đếm số lượng thông báo đã đọc, chưa đọc.
  • Nhắn tin văn bản kèm các biểu tượng cảm xúc emoji 😀 🙁 …vv
  • Nhắn tin hình ảnh.
  • Nhắn tin tệp đính kèm.
  • Nghe gọi, trò chuyện video trực tuyến.
  • Hiển thị preview các tin nhắn mới nhất, hiển thị typing real-time khi có ai đó chat đến.
  • Cập nhật trạng thái người dùng Online – Offline.
  • Tìm kiếm bạn bè để thêm và tạo một nhóm trò chuyện. Xử lý trò chuyện nhiều người trong nhóm.
  • Xem thêm danh sách bạn bè, danh sách thông báo, danh sách các cuộc trò chuyện (trò chuyện cá nhân, trò chuyện nhóm)…vv…
  Node.js & MongoDB – Xây dựng một ứng dụng Messenger trò chuyện trực tuyến
Pro MERN Stack – Lập Trình Ứng Dụng Web Full Stack với Mongo, Express, React, và Node”]


2. Các bạn sẽ học được những gì từ khóa học này.

Học là phải đi đôi với thực hành, nếu chỉ học basic cơ bản mà không có cơ hội áp dụng vào một ứng dụng lớn cụ thể thì sẽ rất khó cho các bạn mới. Nên mình đã soạn ra khóa học này.

  • Node.js & MongoDB:
    Dĩ nhiên chắc chắn phải nói đến đầu tiên là Node.js và MongoDB trước rồi, một cách cụ thể hơn, các bạn sẽ nắm được rất nhiều kỹ thuật xử lý Javascript nâng cao trên platform Node.js và framework Express.js, cùng kết hợp tương tác với cơ sở dữ liệu MongoDB để lưu trữ dữ liệu.
  • Xử lý bất đồng bộ trong javascript:
    Các kỹ thuật coding Javascript ES6Promise + Async – Await từ cơ bản đến nâng cao, áp dụng vào các trường hợp, các bài toán làm dự án cụ thể, từ đó các bạn sẽ có nhiều kinh nghiệm lập trình hơn là việc chỉ học và làm các ví dụ basic.
  • Phân tích thiết kế cơ sở dữ liệu:
    Cách để lên ý tưởng, dựa vào ý tưởng rồi thiết kế cơ sở dữ liệu, áp dụng coding với MongoDBđể lưu trữ dữ liệu cho ứng dụng.
  • Xử lý Real-time:
    Các kỹ thuật xử lý real-time thời gian thực sử dụng Web Socket & module Socket.IO
  • Streaming Video với công nghệ Web RTC:
    Công nghệ Web RTCPeer to PeerTurn Server là gì và ứng dụng chúng vào việc streaming video trực tuyến giữa các người dùng với nhau, hay gọi đơn giản là chức năng call video trực tuyến real-time.
  • Các kiến thức xử lý giao diện – Front-end:
    Các kiến thức nâng cao về HTML – HTML5, CSS – CSS3, xử lý DOM với Javascript & Jquery, Ajax request… và áp dụng vào từng bài toán xử lý hiển thị ứng dụng phía client.
  • Nâng cao về Design Pattern, tư duy logic code:
    Tới một góc nhìn bao quát và nâng cao hơn là sau khóa học, các bạn có thể làm được và nắm vững được trong tay cách để tạo ra một Design Pattern tối ưu cho dự án.
    Một luồng Request API hoạt động như thế nào, chạy từ đâu tới đâu, clientsroutingcontrollerservicesmodel…vv…
  • Coding conventicons, clean code, sử dụng Git – GitHub:
    Cho tới việc coding conventionsclean code, các kỹ thuật sử dụng Git – Github chuyên nghiệp trong quy trình làm việc nhóm – Teamwork thực tế mà ít nơi nào có thể dạy cho các bạn trước khi các bạn đi làm.
  • Chia sẻ Tip tricks, những kinh nghiệm xử lý logic code:
    Và còn rất nhiều những tip tricks, những kinh nghiệm từ quá trình đi làm dự án thực tế của mình cũng áp dụng và truyền đạt lại cho các bạn trong khóa học này.
  • 58 Video hướng dẫn rõ ràng chi tiết từ A-Z, từ những dòng code đầu tiên:
    Còn về ứng dụng, chắc chắn mình sẽ hướng dẫn rõ ràng từ A-Z, từ dòng code số 0 trở đi cho các bạn để khi học hết khóa học, các bạn sẽ làm được một ứng dụng Mesenger hoàn chỉnh các chức năng như trong video mình demo ở trên.

 

3. Khóa học này phù hợp với những đối tượng như thế nào?

Quan trọng:

– Trước hết, có một điều mình cần làm rõ với các bạn luôn, đó là mình không đi theo lối dạy basic cơ bản như rất nhiều khóa học trên mạng hiện tại, mà mình dạy các bạn làm một dự án thực tế (như trong video mình đã giới thiệu).
– Chính vì vậy mà mỗi video mình làm ra trung bình sẽ dao động trong khoảng 30 phút đến 1 tiếng, có vài cái nhiều hơn một chút, vì khi làm dự án thực tế những tính năng có khi phải mất đến 1 hoặc 2 ngày mới xong, nên con số 30 phút hay 1 tiếng là không thể giảm hơn được nữa.
– Nên nếu đọc đến đây, bạn nào tự thấy không thể kiên nhẫn xem một cái video dài thì có thể dừng lại nhé.

Một điều quan trọng nữa mà mình muốn nhấn mạnh trong phần này đó là:
“Không cần bạn phải có một bộ não xuất sắc, hay là IQ cao thì mới học được lập trình, mà điều thực sự quan trọng mình mong ở các bạn là phải rèn được đức tính kiên trì, sự chịu khó tìm tòi học hỏi, thì bạn đã dư khả năng để theo ngành lập trình này rồi.”

Trước khi đến với khóa học này, mình cần các bạn phải là người có kiến thức nền tảng cơ bản về lập trìnhngôn ngữ nào cũng được, ưu tiên nhất vẫn là Javascript.

Tại sao phải cần có nền tảng về lập trình? Vì khóa học của mình không dạy các bạn if – else hay for, while…. là gì, đó là những kiến thức rất căn bản, mà mình sẽ dạy các bạn sử dụng chúng cho mục đích hoàn thành công việc.

Các bạn có thể xem thêm trong bài viết này của mình, Nodejs không dành cho người mới tinh, tờ giấy trắng.

Các kiến thức nền tảng về HTML – CSS – Javascript – Jquery ở mức cơ bản. Những kiến thức này rất dễ học và học rất nhanh, các bạn chỉ cần follow theo các đường link dưới đây thôi:
HTML: https://www.w3schools.com/html/default.asp
CSS: https://www.w3schools.com/css/default.asp
Javascript: https://www.w3schools.com/js/default.asp
Jquery: https://www.w3schools.com/jquery/default.asp

Node.js và MongoDB cơ bản, cái này nếu các bạn có thì càng tốt, còn nếu các bạn chưa có kiến thức này thì cũng không vấn đề gì, các bạn vẫn sẽ học được khóa học của mình.
Mình vẫn khuyến khích các bạn tham khảo qua trước 2 liên kết dưới đây thì sẽ dễ dàng hơn với các bạn trong quá trình học:
Node.js: https://www.w3schools.com/nodejs/
MongoDB: https://www.w3schools.com/nodejs/nodejs_mongodb.asp

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

TopDev via trungquandev

6 lý do Async/Await của Javascript đánh bại Promises

6 Lý do Async/Await của Javascript đánh bại Promises

Trong trường hợp bạn đã quên mất, Node.js đã hỗ trợ async/await kể từ phiên bản 7.6. Nếu bạn chưa thử qua, bài viết này sẽ liệt kê các lý do cùng ví dụ để giải thích tại sao bạn nên chọn nó.

Async/await 101

Với những ai chưa hề nghe qua về Async/await thì đây là những giới thiệu ngắn gọn:

  • Async/await là cách mới để viết code bất đồng bộ. Các phương pháp làm việc với code bất đồng bộ trước đây là sử dụng callback và promise.
  • Async/await là khái niệm được xây dựng ở tầng trên promise. Do đó nó không thể sử dụng với callback thuần.
  • Async/await cũng giống như promise, là non-blocking.
  • Async/await làm cho code bất đồng bộ nhìn và chạy gần giống như code đồng bộ.

Cú pháp

Giả sử một hàm getJSON trả về một promise, promise đó chứa 1 vài đối tượng JSON. Ta cần gọi hàm đó, log các đối tượng JSON ra, sau đó trả về "done".

Đoạn code sau miêu tả quá trình trên, sử dụng promise.

const makeRequest = () =>
  getJSON()
    .then(data => {
      console.log(data)
      return "done"
    })

makeRequest()

Còn đây là đoạn code sử dụng async/await:

const makeRequest = async () => {
  console.log(await getJSON())
  return "done"
}

makeRequest()

Có 1 vài điểm khác biệt cần để ý:

  1. Hàm có thêm từ khóa async phía trước. Từ khóa await chỉ được sử dụng bên trong hàm được định nghĩa với async. Bất cứ hàm async nào cũng sẽ trả về 1 promise một cách không tường minh, và giá trị resolve của promise sẽ là bất cứ cái gì mà hàm return (trong trường hợp này là chuỗi "done" ).
  2. Nhận xét trên cũng đồng nghĩa với việc ta không thể sử dụng await phía trước đoạn code chứa từ khóa async
// this will not work in top level
// await makeRequest()

// this will work
makeRequest().then((result) => {
  // do something
})

await getJSON() có nghĩa là lời gọi console.log sẽ chờ đến khi promise getJSON() được xử lý và trả về giá trị.

Cập nhật tin tuyển dụng lập trình viên JavaScript mới nhất tại TopDev

Ưu điểm của Async/await là gì?

1. Code ngắn và sạch hơn

Đơn giản nhất chính là số lượng code ta cần viết đã giảm đi đáng kể. Trong ví dụ trên, rõ ràng rằng ta đã tiết kiệm được rất nhiều dòng code. Ta không cần viết  .then, tạo 1 hàm anonimous để xử lý response, hay là đặt tên data cho 1 biến ta không sử dụng. Ta tránh được các khối code lồng nhau. Những lợi ích nho nhỏ này sẽ tích tụ dần dần trong những đoạn code lớn, những project thật và sẽ trở nên rất đáng giá.

2. Error handling

Async/await giúp ta xử lý cả error đồng bộ lẫn error bất đồng bộ theo cùng 1 cấu trúc. Tạm biệt try/catch. Với đoạn code dưới dùng promise, try/catch sẽ không bắt được lỗi nếu JSON.parselỗi do nó xảy ra bên trong promise. Ta cần gọi  .catch bên trong promise và lặp lại code xử lý error, điều mà chắc chắn sẽ trở nên rắc rối hơn cả console.logtrong đoạn code production.

const makeRequest = () => {
  try {
    getJSON()
      .then(result => {
        // this parse may fail
        const data = JSON.parse(result)
        console.log(data)
      })
      // uncomment this block to handle asynchronous errors
      // .catch((err) => {
      //   console.log(err)
      // })
  } catch (err) {
    console.log(err)
  }
}

Bây giờ hãy nhìn vào đoạn code sử dụng async/await. Khối catchgiờ sẽ xử lý các lỗi parsing.

const makeRequest = async () => {
  try {
    // this parse may fail
    const data = JSON.parse(await getJSON())
    console.log(data)
  } catch (err) {
    console.log(err)
  }
}

3. Câu lệnh điều kiện

Hãy xem thử 1 đoạn code như dưới đây. Đoạn code này sẽ fetch dữ liệu và quyết định trả về giá trị hay là lấy thêm dữ liệu.

const makeRequest = () => {
  return getJSON()
    .then(data => {
      if (data.needsAnotherRequest) {
        return makeAnotherRequest(data)
          .then(moreData => {
            console.log(moreData)
            return moreData
          })
      } else {
        console.log(data)
        return data
      }
    })
}

Đoạn code đã dần dần giống với mô hình “xyz hell” mà ta thường thấy. Tổng cộng code có 6 level nested. Khi sử dụng async/await, ta sẽ có đoạn code mới dễ đọc hơn.

const makeRequest = async () => {
  const data = await getJSON()
  if (data.needsAnotherRequest) {
    const moreData = await makeAnotherRequest(data);
    console.log(moreData)
    return moreData
  } else {
    console.log(data)
    return data    
  }
}

4. Giá trị intermediate

Hẳn bạn đã từng lâm vào tính huống sau: bạn cần gọi promise1, sau đó sử dụng giá trị nó trả về để gọi promise2 cuối cùng sử dụng kết quả trả về của cả 2 promise trên để gọi promise3. Code của bạn sẽ thành ra thế này.

const makeRequest = () => {
  return promise1()
    .then(value1 => {
      // do something
      return promise2(value1)
        .then(value2 => {
          // do something          
          return promise3(value1, value2)
        })
    })
}

Nếu promise3không yêu cầu tham số value1 , promise sẽ bớt lớp nest đi 1 chút. Nếu bạn theo chủ nghĩa cầu toàn, bạn có thể giải quyết bằng cách wrap cả 2 giá trị value1value2 bằng Promise.all tránh được các lớp nest giống như đoạn code dưới.

const makeRequest = () => {
  return promise1()
    .then(value1 => {
      // do something
      return Promise.all([value1, promise2(value1)])
    })
    .then(([value1, value2]) => {
      // do something          
      return promise3(value1, value2)
    })
}

Phương pháp này đã hi sinh tính ngữ nghĩa để đổi lấy tính dễ đọc của code. Đơn giản vì chả có lý do gì mà value1 & value2 được đặt chung vào 1 mảng, ngoại trừ việc làm như thế sẽ tránh được promise bị nest.

Tuy nhiên cái logic này trở nên cực kì ngớ ngẩn khi ta sử dụng async/await.

const makeRequest = async () => {
  const value1 = await promise1()
  const value2 = await promise2(value1)
  return promise3(value1, value2)
}

5. Error Stack

Hình dung 1 đoạn code gọi đến nhiều promise theo chuỗi. Tại 1 vị trí nào đó, đoạn code sẽ quăng ra 1 error.

const makeRequest = () => {
  return callAPromise()
    .then(() => callAPromise())
    .then(() => callAPromise())
    .then(() => callAPromise())
    .then(() => callAPromise())
    .then(() => {
      throw new Error("oops");
    })
}

makeRequest()
  .catch(err => {
    console.log(err);
    // output
    // Error: oops at callAPromise.then.then.then.then.then (index.js:8:13)
  })

Error Stack trả về từ chuỗi promise không thể giúp ta xác định error xảy ra ở đâu. Tệ hơn nữa, nó còn làm ta hiểu lầm rằng lỗi nằm ở hàm callAPromise

Tuy nhiên, với async/await, Error Stack sẽ chỉ ra được hàm nào chứa lỗi.

const makeRequest = async () => {
  await callAPromise()
  await callAPromise()
  await callAPromise()
  await callAPromise()
  await callAPromise()
  throw new Error("oops");
}

makeRequest()
  .catch(err => {
    console.log(err);
    // output
    // Error: oops at makeRequest (index.js:7:9)
  })

Khi bạn phát triển ứng dụng trên môi trường local, điều này thoạt nhìn không có quá nhiều tác dụng. Tuy nhiên với production server, nó lại rất hữu ích với Error Logs. Với những tình huống đó, biết được error xảy ra trong makeRequestsẽ tốt hơn rất nhiều khi được báo rằng error nằm trong then phía sau then  phía sau then ….

6. Debug

Điều tuyệt vời cuối cùng khi bạn làm việc với async/await đó là việc debug trở nên rất đơn giản. Debug với Promise chưa bao giờ là công việc dễ chịu vì 2 lý do sau:

1/ Bạn không thể đặt breakpoint trong arrow function trả về expression.

6 Lý do Async/Await của Javascript đánh bại Promises

2/ Nếu bạn đặt breakpoint bên trong khối .then và sử dụng short-cut debug như step-over, trình debug sẽ không chuyển đến khối .then  kế tiếp bởi vì nó chỉ “step” ở các đoạn code đồng bộ. Với async/await, bạn không cần arrow function quá nhiều nữa, bạn hoàn toàn có thể step qua lời gọi await y như với code đồng bộ.

6 Lý do Async/Await của Javascript đánh bại Promises

Kết luận

Async/await là 1 trong những tính năng mang tính cách mạng được thêm vào JavaScript trong vài năm gần đây. Nó giúp bạn nhận ra Promise còn thiếu sót như thế nào, cũng như cung cấp giải pháp thay thế.

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

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

TopDev via Hackernoon

Mẫu bảng mô tả công việc lập trình Mobile

Mẫu bảng công việc lập trình Mobile

Mobile Developer là những lập trình viên chuyên về công nghệ di động như phát triển ứng dụng trên các nền tảng Google Phone Android, Apple Apple iOS và Microsoft, Windows Phone. Nhiệm vụ chính của một Mobile Developer là phối hợp với các nhóm chức năng để xây dựng và phát triển các chức năng của ứng dụng di động, không ngừng cải thiện và tối ưu hóa ứng dụng di động để đáp ứng nhu cầu người dùng. Hy vọng, Mẫu bảng công việc lập trình Mobile này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.

Về lập trình viên Mobile: Để thành một Mobile Developer giỏi, các lập trình viên cần nắm rõ cấu trúc dữ liệu và giải thuật, kỹ thuật lập trình hướng đối tượng cũng như có kiến thức hoặc kinh nghiệm về một trong các ngôn ngữ các ngôn ngữ Java (Android) hoặc Swift/Objective-C (iOS).… để cùng tham gia nghiên cứu, thiết kế, phát triển các ứng dụng phục vụ cho sản phẩm công ty/ khách hàng.

Mẫu bảng công việc lập trình Mobile

YÊU CẦU CÔNG VIỆC

  • Kinh nghiệm làm việc với lập trình Mobile trên nền tảng Android hoặc iOS
  • Thành thạo một trong các ngôn ngữ các ngôn ngữ Java (Android) hoặc Swift/Objective-C (iOS).
  • Trải nghiệm với các thư viện và API của bên thứ ba
  • Có kiến thức tốt về lập trình hướng đối tượng
  • Kỹ năng phân tích tuyệt vời và thái độ giải quyết vấn đề tốt
  • Khả năng thực hiện trong môi trường nhóm
  • Có sản phẩm được phát hành trên App store là lợi thế

MÔ TẢ CÔNG VIỆC

  • Xây dựng và phát triển các tính năng mới cho các ứng dụng iOS / Android
  • Phân tích, thiết kế và lập trình các ứng dụng theo định hướng của công ty
  • Hỗ trợ toàn bộ vòng đời ứng dụng (khái niệm, thiết kế, thử nghiệm, phát hành và hỗ trợ
  • Phát triển giao diện lập trình ứng dụng (API) để hỗ trợ chức năng di động
  • Khắc phục sự cố và gỡ lỗi để tối ưu hóa hiệu suất
  • Nghiên cứu và đề xuất các sản phẩm, ứng dụng và giao thức di động mới

Tham khảo thêm những công việc lập trình hot nhất thị trường tại đây

[Updated] Top 22 công cụ cho lập trình viên React 2024

Top 22 công cụ cho lập trình viên React 2019

Như chúng ta đã biết, React là một thư viện JavaScript giúp thiết kế UI. Nhưng không phải ai cũng biết hết các công cụ mà mình giới thiệu hôm nay, sẽ giúp các bạn có những trải nghiệm với React thú vị hơn rất nhiều.

Dưới đây là 22 công cụ cho lập trình viên React 2021 bạn không thể bỏ qua. Cùng khám phá nhé!

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

webpack-bundle-analyzer

Có bao giờ bạn tự hỏi liệu có package hay phần nào trong app của bạn đang chiếm hết dung lượng chưa? Nếu vậy thì webpack-bundle-analyzer sẽ giúp bạn trả lời câu hỏi này đấy. Công cụ này sẽ giúp bạn biết được những file đầu ra đang chiếm nhiều dung lượng trong app.

Nó sẽ tạo ra một máy chủ trực tiếp và hiển thị trực quan hoá treemap tương tác cho bạn. Với công cụ này, bạn có thể biết file đó nằm ở đâu, kích cỡ gzip của chúng, các tệp cha/con của chúng,…

Bạn có thể tối ưu app React của mình hơn rất nhiều với công cụ này. Mình đã screenshot lại cho các bạn thấy lúc nó hoạt động:

công cụ cho lập trình viên React 2019

Dễ dàng thấy là các gói pdf chiếm hầu hết dung lượng của app. Bên cạnh đó chúng còn chiếm nhiều phần hiển thị trên màn hình, rất dễ thấy và phân tích.

Tuy nhiên, hình trên chỉ là phần cơ bản. Bạn có thể tuỳ chỉnh để thấy chi tiết hơn như generateStatsFile: true và có thể lưu file HTML tĩnh ở đâu đó bên ngoài để sử dụng cho lần sau.

react-proto

react-proto là một công cụ prototyping dành cho lập trình viên và designer. Đây là một phần mềm dành cho máy tính để bàn, nên bạn cần phải download và cài đặt nó trước khi sử dụng.

Khi sử dụng nó sẽ trông như thế này:

công cụ cho lập trình viên React 2019

Ứng dụng này cho phép bạn khai báo props và các loại của chúng, xem component trong 1 cây, thêm hình nền, định nghĩa chúng là stateful hay stateless, component cha là gì, phóng to/thu nhỏ, xuất prototype vào một project mới hoặc project đã có sẵn…

Mặc dù ứng dụng này có vẻ dành cho người xài Mac, nhưng nó vẫn hoạt động rất tốt trên Window các bạn nhé.

Sau khi hoàn thành UI, bạn có thể chọn xuất sang một project đã có sẵn hoặc là một project mới vẫn được. Nếu bạn chọn xuất sang project có sẵn và chọn thư mục gốc, nó sẽ xuất chúng sang component ./src/ như thế này:

công cụ cho lập trình viên React 2019

Và đây là một ví dụ của một trong các component mà chúng ta có:

công cụ cho lập trình viên React 2019

react-proto hiện đã có hơn 2000 sao trên GitHub. Cá nhân mình thấy ứng dụng này cần update và làm việc với các phát hành react hook nhiều hơn. 

Nó không phóng to được nếu bạn không có hình nền. Nói một cách khác, nếu bạn import hình nền, zoom out, sau đó xoá hình nền thì bạn sẽ không thể zoom trở lại vì các nút đã bị mờ đi. Cách duy nhất để zoom trở lại là thêm một cái hình nền lại, sau đó xoá nó trước khi bạn zoom. 

Chính lỗ hổng này làm mình thay đổi quan điểm về ứng dụng này, nhưng mình vẫn quyết định đưa nó vào danh sách hôm nay vì chúng ta chưa thấy nó ở bấy kì đâu. Thêm nữa là ứng dụng này có khả năng tạo danh sách kho lưu trữ mở, một xu hướng của tương lai (tính năng của chúng rất quan trọng, nhưng có lẽ chúng vẫn còn chưa được tập trung phát triển).

why-did-you-update

Why-did-you-update là công cụ giúp monkey patch React để thông báo cho bạn các tái xuất có thể tránh được. Công cụ này không chỉ hỗ trợ bạn cải thiện performance cho dự án, mà nó còn giúp bạn hiểu được cách React hoạt động. Khi bạn đã hiểu hơn về cách hoạt động của React, bạn sẽ trở thành một lập trình viên React tốt hơn.

Bạn có thể đính kèm một listener cho một component bất kỳ bằng cách khai báo whyDidYouRender với giá trị true như sau:

import React from 'react'
import Button from '@material-ui/core/Button'

const Child = (props) => <div {...props} />

const Child2 = ({ children, ...props }) => (
  <div {...props}>
    {children} <Child />
  </div>
)

Child2.whyDidYouRender = true

const App = () => {
  const [state, setState] = React.useState({})

  return (
    <div>
      <Child>{JSON.stringify(state, null, 2)}</Child>
      <div>
        <Button type="button" onClick={() => setState({ hello: 'hi' })}>
          Submit
        </Button>
      </div>
      <Child2>Child #2</Child2>
    </div>
  )
}

export default App

Sau đó giao diện điều khiển của bạn sẽ có nhiều cảnh báo cực kỳ khó chịu:

công cụ cho lập trình viên React 2019

Nhưng đừng hiểu sai nhé. Hãy tận dụng những thông báo khó chịu đó để khắc phục những rerender lãng phí, và bạn cũng sẽ được yên thân ngay thôi.

create-react-app

Mọi người chắc hẳn đã biết create-react-app là công cụ nhanh nhất để bắt đầu một dự án React (Tất nhiên là với những tính năng hiện đại nữa). Còn gì dễ hơn npx creat-react-app <name> nữa đúng không nào?

Hầu như mọi tutotials của mình đều là về xây dựng giao diện React với create-react-app, đơn giản là vì nó nhanh và dễ dàng.

Một vài thứ mà có thể bạn chưa biết là cách tạo một dự án typescript sử dụng CRA. Bạn chỉ cần thêm --typescript vào cuối như thế này:

npx create-react-app <name> --typescript

Và thế là bạn không còn gặp rắc rối khi thêm thủ công typescript vào CRA nữa rồi đó.

react-lifecycle-visualizer

react-lifecycle-visualizer là một npm hỗ trợ tìm và hiển thị các phương pháp vòng đời của React Component tuỳ ý.

Xem thêm vòng đời của React Component là gì

Tương tự như why-did-you-render, bạn có thể kích hoạt bất kì component nào bạn chọn để trình hiển thị vòng đời:

import React from 'react'
import {
  Log,
  VisualizerProvider,
  traceLifecycle,
} from 'react-lifecycle-visualizer'

class TracedComponent extends React.Component {
  state = {
    loaded: false,
  }

  componentDidMount() {
    this.props.onMount()
  }

  render() {
    return <h2>Traced Component</h2>
  }
}

const EnhancedTracedComponent = traceLifecycle(TracedComponent)

const App = () => (
  <VisualizerProvider>
    <EnhancedTracedComponent />
    <Log />
  </VisualizerProvider>
)

Và kết quả là:

công cụ cho lập trình viên React 2019

Tuy nhiên, công cụ này có một nhược điểm là nó chỉ hoạt động với các class component, còn hook thì chưa được hỗ trợ.

Guppy

Guppy là một trình quản lý ứng dụng thân thiện, miễn phí cho React chạy trên máy tính để bạn. Công cụ này có vẻ dành cho những người mới làm quen với React. Tuy nhiên nó cũng rất hữu ích đối với các lập trình viên “lão làng” đấy.

Nó cũng cấp giao diện người dùng thân thiện cho nhiều loại tác vụ mà lập trình viên React thường gặp như khởi tạo dự án mới, thực hiện các tác vụ và quản lý các dependency.

Windows đã hỗ trợ công cụ này vào tháng 8 năm 2018, nên bạn có thể yên tâm là nó đa nền tảng.

công cụ cho lập trình viên React 2019

react-testing-library

Mình rất thích react-testing-library nó luôn đem lại cảm giác làm test unit rất trơn tru. Thư viện này cung cấp các tiện ích test DOM, khuyến khích thực hành test rất tốt cho các bạn.

Giải pháp này hướng đến giải quyết vấn đề về test các chi tiết triển khai. Thay vào đó, nó sẽ test đầu vào/ra của các React Component như những gì mà người dùng thấy.

Kiểm tra chi tiết thực hiện không phải là cách hiệu quả để đảm bảo app của bạn hoạt động như mong đợi. Chắc chắn là bạn sẽ thấy tự tin hơn khi biết cách component nhận data cần thiết, hay phương pháp sắp xếp nào để sử dụng,… thế nhưng nếu bạn phải đổi cách thực hiện, trỏ đến một cơ sở dữ liệu khác và test unit của bạn sẽ thất bại vì chúng là những chi tiết triển khai được kết hợp logic.

Vấn đề này cũng được react-testing-library giải quyết, vì tất cả bạn cần cũng chỉ là giao diện người dùng của bạn hoạt động tốt và chính xác, cách đưa data vào component cũng không thật sự quan trọng miễn là output như mong đợi là được.

Đây là một ví dụ cách mà bạn có thể đặt test khi sử dụng thư viện này:

// Hoist helper functions (but not vars) to reuse between test cases
const renderComponent = ({ count }) =>
  render(
    <StateMock state={{ count }}>
      <StatefulCounter />
    </StateMock>,
  )

it('renders initial count', async () => {
  // Render new instance in every test to prevent leaking state
  const { getByText } = renderComponent({ count: 5 })

  await waitForElement(() => getByText(/clicked 5 times/i))
})

it('increments count', async () => {
  // Render new instance in every test to prevent leaking state
  const { getByText } = renderComponent({ count: 5 })

  fireEvent.click(getByText('+1'))
  await waitForElement(() => getByText(/clicked 6 times/i))
})

React Developers Tools

React developer tools là một tiện ích cho phép kiểm tra phân cấp React Component trong các công cụ dành cho nhà phát triển Chrome và Firefox.

Đây là công cụ phổ biến nhất trong danh sách này và là một trong những công cụ hỗ trợ các nhà phát triển rất nhiều để debug ứng dụng.

Bit

Một cách thay thế hay nhất cho việc dùng các thư viện component như material-ui hay semantic-ui-react chính là Bit. Công cụ này cho phép bạn khám phá hàng ngàn component mã nguồn mở và sử dụng chúng để xây dựng dự án.

công cụ cho lập trình viên React 2019

Có rất nhiều React Component có sẵn khác nhau dành cho mọi người. Bao gồm tab, button, chart, table, điều hướng, dropdown, tải spinner, bộ chọn ngày, breadcrumb, icon, layout,… Chúng được tải lên bởi những React Developer khác như mình và bạn. Nhưng cũng có các tiện ích có sẵn như định dạng khoảng cách giữa các ngày,…

Storybook

Nếu bạn chưa biết về storybook, mình thật lòng khuyên bạn nên bắt đầu dúng nó ngay bây giờ nếu bạn muốn xây dựng UI component dễ dàng hơn. Công cụ này khởi động một máy chủ phát triển trực tiếp với tính năng hot reloading, giúp bạn phát triển react component theo thời gian thực.

Điều thú vị nữa ở công cụ này là bạn có thể sử dụng các addon mã nguồn mở hiện tại để đưa trải nghiệm phát triển của bạn lên tầm cao mới. Ví dụ, với storybook-readme, bạn có thể tạo một documentation readme trong khi phát triển react component để sử dụng sản production ngay trên cùng một trang. 

công cụ cho lập trình viên React 2019

React Sight

Có bao giờ bạn suy nghĩ rằng app của bạn sẽ như thế nào ở trong 1 flow chart? React sight sẽ cho bạn hình dung ra bằng cách hiển thị một cây hiearachy của toàn bộ app. Công cụ này cũng hỗ trợ react router, redux và react fiber nữa.

Với công cụ này, bạn chỉ cần di chuột qua các node là các liên kết đến các component liên quan trực tiếp đến chúng trong cây.

Nếu bạn gặp vấn đề trong việc coi kết quả, bạn có thể gõ chrome:extensions trên thanh địa chỉ của bạn, vào react-sight và kích hoạt Allow access to file URLs

công cụ cho lập trình viên React 2019

react-cosmos

react-cosmos là một công cụ phát triển giúp tạo các react component tái sử dụng.

Nó scan project của bạn cho các component và cho phép bạn:

  1. Render component dưới bất kỳ props, context và state nào.
  2. Mock mọi dependency bên ngoài (như API response. localStorage,…)
  3. Xem trạng thái ứng dụng phát triển trong thời gian thực khi tương tác với các phiên bản đang chạy.

Xem thêm việc làm lập trình React trên TopDev

CodeSandbox

Đây là một trong những công cụ tốt nhất hiện có giúp react nhanh hơn cả cái chớp mắt.

CodeSandbox là một trình chỉnh sửa online cho phép bạn tạo ứng dụng web từ prototype đến lúc triển khai, tất tần tật chỉ trên 1 website thôi.

Ban đầu CodeSanbox chỉ hỗ trợ React ở các giai đoạn trước. Thế nhưng giờ đây chúng đã mở rộng sang các mẫu khởi động bổ sung cho các thư viện như Vue và Angular. Nó cũng hỗ trợ khởi động project react web tiếp theo bằng cách tạo các project với các trình tạo trang tĩnh phổ biến như gatsby hay nextjs.

Có nhiều thứ để nói về CodeSandbox, như là tính active của nó.

Nếu bạn cần khám phá một vài project mà người ta đang xây dựng, bạn chỉ cần click explore và truy cập vào một đống ví dụ code giúp bạn hoàn thiện ở các project sau:

công cụ cho lập trình viên React 2019

Công cụ này không khác gì một trình soạn thảo VSCode mạnh mẽ.

Bạn có thể tìm hiểu chi tiết hơn về CodeSandbox tại đây.

React Bits

React bits là một kho online bao gồm react pattern, kỹ thuật, tips và tricks… Giúp bạn tiếp cận nhanh chóng với các design pattern và kỹ thuật khác nhau, anti-pattern, styling, biến thể UX và các tài liệu react liên quan vô cùng hữu ích.

Nó có một vài ví dụ về concept như các prop proxying, composition xử lý các UX khác nhau trong các tình huống khác nhau, và thậm chí phơi bày một số vấn đề mà mọi nhà phát triển React cần biết.

công cụ cho lập trình viên React 2019

Folderize

Folderize là một tiện ích của VSCode mới được ra mắt trong thời gian gần đây. Nó cho phép bạn chuyển 1 file component thành một cấu trúc folder component. React Component sẽ vẫn là component, chỉ là giờ nó được chuyển thành một danh mục.

Ví dụ: Nếu bạn đang tạo 1 react component cần một vài file như props để hiển thị thông tin hữu ích như meta data. Logic ở đây là meta data component tốn nhiều dòng nên bạn quyết định chia chúng thành 1 file riêng. Nhưng khi bạn làm vậy, bạn sẽ có 2 file có liên hệ với nhau. Nếu bạn có một danh mục thì nó sẽ như thế nào:

công cụ cho lập trình viên React 2019

Bạn có thể lấy FileView.jsFileMetadata.js vào một danh mục như Apples.

Đặc biệt bạn có thể muốn add thêm component liên quan đến file như FileScanner.js.

Và đó là những gì folderize sẽ làm cho bạn để có một cấu trúc như thế này:

công cụ cho lập trình viên React 2019

import React from 'react'
import FileView from './src/components/FileView'

const App = (props) => <FileView {...props} />

export default App

React Starter Projects

React Starter Projects cho bạn một danh sách các dự án khởi tạo React rất đỉnh. Nếu bạn là kiểu người muốn tìm hiểu nhanh và cần nhiều sự lựa chọn tốt, công cụ này chắc chắn dành cho bạn.

Khi tìm được project khởi tạo ưng ý, bạn có thể clone repository dễ dàng, sửa đổi cho phù hợp rồi có ngay một ứng dụng của riêng mình. Tuy nhiên không phải tất cả đều dành cho việc clone, vì một số thứ cần được cài đặt thay thế. Điều này sẽ gây khó khăn cho dự án của bạn. Tuy nhiên bạn có thể update thường xuyên và luôn giữ cho project của mình clean nhất.

công cụ cho lập trình viên React 2019

Highlight Updates

Mình nghĩ đây là công cụ quan trọng nhất mà bất kì ai cũng nên có trong “đồ đồ nghề” của mình. Đây là một tính năng tiện ích mở rộng devtools, cho phép bạn xem component nào trên trang re-render không cần thiết:

công cụ cho lập trình viên React 2019

Nó giúp bạn phát hiện các tắt nghẽn trong lúc lập trình và tô màu cam hoặc đỏ các lỗi để dễ nhìn thấy hơn.

Trừ khi bạn muốn tạo app không ai dùng, thì tạo sao không thử ngay công cụ này nào.

React Diff Viewer

react-diff-viewer là một trình xem văn bản đơn giản và đẹp đẽ dành cho Diff và React. Công cụ này hỗ trợ các tính năng như chế độ xem split, chế độ xem inline, word diff, line highlight,…

Công cụ này sẽ vô cùng hữu ích nếu bạn đang cố gắng nhúng tính năng này vào Ahem Boostnote và tuỳ chỉnh để nó phù hợp với app của bạn. (như màu của theme, kết hợp tài liệu với storybook,…)

công cụ cho lập trình viên React 2019

js.coach

js.coach là trang mình dùng nhiều nhất để tìm tài liệu liên quan đến React. Mình không hiểu vì sao không có nhiều người nói về trang này, nhưng thật sự là mình tìm được mọi thứ mình cần trên đó. Nhanh chóng, dễ dàng, cập nhật liên tục và không bao giờ thiếu tài liệu cần thiết là tất cả mà bạn cần cho dự án của bạn.

Gần đây học còn thêm tab React VR vào nữa, rất tuyệt đúng không.

awesome-react

Kho lưu trữ mã nguồn mở awesome-react của GitHub là một kho đầy những thứ đỉnh cao về React dành cho bạn.

Mình có thể chẳng cần quan tâm đến những website khác và chỉ cần học về React trên đây thôi cũng đủ rồi. Bạn sẽ tìm được hàng loạt tài nguyên hữu ích giúp tạo nên những app React tuyệt vời.

proton-native

proton-native cho bạn một môi trường react để tạo các ứng dụng máy tính để bàn đa nền tảng.

Công cụ gần như thay thế cho Electron, có một số tính năng như:

  • Cùng syntax với React Native
  • Làm việc với các thư viện React hiện nay như Redux
  • Đa nền tảng
  • Native component, không còn Electron
  • Tương thích với mọi package Node.js thông thường

Nếu bạn cần có thể đọc chi tiết về công cụ này tại đây.

Devhints React.js Cheatsheet

Devhints React.js Cheatsheet là một cheatsheet khá tốt cho react, mặc dù nó vẫn còn thiếu các react hook.

Kết

Trên đây mình đã giới thiệu đến các bạn 22 công cụ cho lập trình viên React 2022 mà có thể bạn cần.

Hy vọng các bạn thấy bài viết này bổ ích.

Cảm ơn các bạn đã theo dõi!

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

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Maven Apache

1. Maven là gì?

Maven là công cụ quản lý và thiết lập tự động 1 dự án phần mềm. Chủ yếu dùng cho các lập trình viên java, nhưng nó cũng có thể được dùng để xây dựng và quản lý các dự án dùng C#, Ruby, Scala hay ngôn ngữ khác.

  • Maven phục vụ mục đích tương tự như Apache Ant, nhưng nó dựa trên khái niệm khác và cách hoạt động khác.
  • Maven hỗ trợ việc tự động hóa các quá trình tạo dự án ban đầu, thực hiện biên dịch, kiểm thử, đóng gói và triển khai sản phẩm.
  • Được phát triển bằng ngôn ngữ Java cho phép Maven chạy trên nhiều nền tảng khác nhau: Windows, Linux và Mac OS…

2. Maven hoạt động như nào?

  • Maven dùng khái niệm Project Object Model (POM) để mô tả việc build project, các thành phần phụ thuộc và các module. Nó định nghĩa trước các target cho việc khai báo task, trình biên dịch, đóng gói và thứ tự hoạt động để mọi việc diến ra tốt nhất.
  • Trong mỗi project Maven tạo ra một file .pom, trong file này định nghĩa ra những task như task khi chạy test, task khi build và khi chạy Maven sẽ dựa vào những định nghĩa này để thao tác với project.

Ví dụ file .pom

<!-- .pom -->
<project>
  <!-- model version is always 4.0.0 for Maven 2.x POMs -->
  <modelVersion>4.0.0</modelVersion>

  <!-- project coordinates, i.e. a group of values which
       uniquely identify this project -->

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>

  <!-- library dependencies -->

  <dependencies>
    <dependency>

      <!-- coordinates of the required library -->

      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>

      <!-- this dependency is only used for running and compiling tests -->

      <scope>test</scope>

    </dependency>
  </dependencies>
</project>

3. Tại Sao cần Maven?

  • Khi một project do nhiều nhóm phát triển ví dụ có 2 team cùng tham gia dự án, 2 team đó ở 2 quốc gia khác nhau vì thế chúng ta luôn cần có một sự liên lạc để thông nhất trong việc lập trình vì thế phải có một cái chuẩn nào đó để tất cả mọi người cùng tuân theo, như trong việc sử dụng những thư viện nào, version của thư viện tất cả những thứ như vậy đều được Maven quản lý.
  • Đối với những hệ thống lớn, phức tạp sử dụng nhiều thư viện lại đòi hỏi phải release liên tục cho nên công việc đóng gói (build & deploy), quản lý, nâng cấp và bào trì chúng rất mất thời gian, và lúc đó ta có Maven.

4 Cài đặt Maven

  • Cài đặt từ reposite của Ubuntu.
$ sudo apt-get install maven
  • Verification:
$ mvn -version
Apache Maven 3.0.4
Maven home: /usr/share/maven
Java version: 1.7.0_09, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.5.0-17-generic", arch: "amd64", family: "unix"

5. Khởi tạo một Project Java bằng Maven

  • Tạo Project:
mvn archetype:generate -DgroupId=com.mycompany.app 
    -DartifactId=my-app 
    -DarchetypeArtifactId=maven-archetype-quickstart 
    -DinteractiveMode=false
  • Tham số :
    • groupId: thường đặt theo tên của tổ chức hoặc nhóm tạo ra dự án
    • artifactId: thường lấy theo tên viết tắt của dự án.
    • archetypeArtifactId: là loại dự án sẽ được tạo, Maven cung cấp nhiều kiểu mẫu có sẵn cho người dùng lựa chọn khi khởi tạo.
  • Kết quả: ta sẽ thu được một project với kiến trúc như sau:

 

6. Cấu trúc POM.xml

  • <groupId>, <artifactId>, <version> bộ ba thông tin để mô tả tên, version của project. com.framgia.maven (namespace)
  • <artifactId>helloworld</artifactId> (tên project)
  • <version>1.0</version> (vesion)
  • packaging định nghĩa định dạng khi đóng gói thành phần, có thể là jar, war, ear… jar (đóng gói thành .jar )
  • <dependency> nơi khai báo các thư viện sử dụng trong dự án
<dependencies>
  <dependency>
    <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
  </dependency>
</dependencies>
  • <plugins>định nghĩa những Plugin sử dụng trong project trong dự án:

(Ví dụ khi sử dụng Plugin để build một java project)

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <mainClass>com.framgia.app.App</mainClass>
            </manifest>
          </archive>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      <version>2.3.2</version>
   </plugin>
  </plugins>
</build>

Dependency Trong Maven

  • Dependency chính là cách import thư viện vào project thông qua Maven
  • Cơ chế import thư viện thông qua maven.
    • Ví dụ để import thư viện redis, bình thường ta sẽ dowload file redis.jar về rồi buildpath trong eclipse, nhưng với thẻ dependency, Maven sẽ tự động dowload thư viện đó về thư mục ~/.m2 trên máy local và buildpath vào project.
    • http://mvnrepository.com/artifact/redis.clients/jedis.
    • Thư mục ~/.m2/repository Sẽ chứa tất cả các thư viện mà Maven dowload về từ server center.

 

  • Các Dependency sẽ tự động được buildpath trong Eclipse.
<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.7.2</version>
</dependency>

7. Maven commands

  • Build project với maven: mvn package
  • Deploy to Tomcat: mvn tomcat:deploy
  • Tạo file .project để có thể import vào eclipse: mvn eclipse:eclipse
  • Chạy unit test mvn test
  • Clean project: mvn clean

8. Demo

  • Step1: Khởi tạo một project:
mvn archetype:generate -DgroupId=com.mycompany.app 
-DartifactId=my-app 
-DarchetypeArtifactId=maven-archetype-quickstart 
-DinteractiveMode=false
  • Step2: nội dung file main.java

package com.mycompany.app;

/**
* Hello world!
*
*/
public class App 
{
  public static void main( String[] args )
  {
      System.out.println( "Hello World!" );
  }
}

Step 3: Thay đổi .pom, add thêm plugin để build project:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
  <!-- Build an executable JAR -->
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.4</version>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
        <mainClass>com.mycompany.app.App</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>
</plugins>
</build>
</project>

Step 4: Build

$ mvn package

Step 5:Run project

$ java -jar [file_dot_jar]

Tác giả: Lê Minh Tuấn

Xử lý Date/Time dễ dàng với Carbon trong Laravel

Làm việc với ngày và giờ trong PHP không phải là nhiệm vụ dễ dàng gì. Chúng ta phải đối mặt với các vấn đề về thời gian, định dạng, nhiều tính toán, v.v.

Có một package khá tiện lợi có tên Carbon có thể giúp việc xử lý ngày / giờ trong PHP dễ dàng hơn và có nhiều ngữ nghĩa hơn để code của chúng tôi có thể trở nên dễ đọc và dễ bảo trì hơn.

Carbon là gì?

Carbon là một gói phần mềm được phát triển bởi Brian Nesbit mở rộng từ class DateTime của PHP. Từ phiên bản 5.3, Laravel đã tích hợp sẵn thư viện này vào Project. Việc sử dụng tốt thư viện này sẽ giúp bạn rất nhiều vấn đề về xử lý thời gian. Thư viện này giúp chúng ta rất nhiều trong việc xử lý datetime trong PHP. Điển hình như:

  • Xử lý timezone.
  • Lấy ngày tháng hiện tại dễ dàng.
  • Convert datetime sang định dạng khác để đọc
  • Dễ dàng thao tác với datetime.
  • Chuyển đổi cú pháp là cụm từ tiếng anh sang datetime.

Cách sử dụng Carbon trong Laravel

– Bạn cần import thư viện để sử dụng:

<?php
use Carbon\Carbon;
  • Lấy thời gian:
Carbon::now(); // thời gian hiện tại 2018-10-18 14:15:43
Carbon::yesterday(); //thời gian hôm qua 2018-10-17 00:00:00
Carbon::tomorrow(); // thời gian ngày mai 2018-10-19 00:00:00
$newYear = new Carbon('first day of January 2018'); // 2018-01-01 00:00:00
  • Để lấy tgian hiện tại tại Việt Nam ta sẽ thêm locale của Việt nam như sau:
echo Carbon::now('Asia/Ho_Chi_Minh'); // 2018-10-18 21:15:43
  • Để biết thêm về các nước khác bạn có thể tại trang chủ của PHP: Timezone
  • Bạn cũng có thể chuyển đổi kiểu datetime khác:
$dt = Carbon::now('Asia/Ho_Chi_Minh');

echo $dt->toDayDateTimeString();  Thu, Oct 18, 2018 9:16 PM

echo $dt->toFormattedDateString(); // Oct 18, 2018

echo $dt->format('l jS \\of F Y h:i:s A'); // Thursday 18th of October 2018 09:18:57 PM

echo $dt->toDateString();               // 2018-10-18
echo $dt->toTimeString();               // 21:16:20
echo $dt->toDateTimeString();           // 2018-10-18 21:16:16

– Các bạn cũng có thể chỉ lấy ngày, tháng, năm, giờ, phút, giây, ngày của tuần, ngày của tháng, ngày của năm, tuần của tháng, tuần của năm, số ngày trong tháng. Thật dễ dàng :))

Carbon::now()->day; //ngày
    Carbon::now()->month; //tháng
    Carbon::now()->year; //năm
    Carbon::now()->hour; //giờ
    Carbon::now()->minute; //phút
    Carbon::now()->second; //giây
    Carbon::now()->dayOfWeek; //ngày của tuần
    Carbon::now()->dayOfYear; //ngày của năm
    Carbon::now()->weekOfMonth; //ngày của tháng
    Carbon::now()->weekOfYear; //tuần của năm
    Carbon::now()->daysInMonth; //số ngày trong tháng

– Có thể tăng giảm ngày, tháng, năm, giờ, phút, giây bằng hàm 2 hàm add() và sub()

$dt = Carbon::now();

echo $dt->addYears(5);                 
echo $dt->addYear();                    
echo $dt->subYear();                  
echo $dt->subYears(5);            

echo $dt->addMonths(60);                
echo $dt->addMonth();       
echo $dt->subMonth();                   
echo $dt->subMonths(60);  

echo $dt->addWeeks(3);                 
echo $dt->addWeek();                  
echo $dt->subWeek();                
echo $dt->subWeeks(3);       

echo $dt->addDays(29);                  
echo $dt->addDay();                   
echo $dt->subDay();                     
echo $dt->subDays(29); 

echo $dt->addHours(24);                  
echo $dt->addHour();                 
echo $dt->subHour();                   
echo $dt->subHours(24);   
...

– Ta cũng có thể so sánh với thời gian hiện tại một cách dễ dàng: Nó sẽ trả về là true hay false.

$now = Carbon::now();
    $now->isWeekday();
    $now->isWeekend();
    $now->isYesterday();
    $now->isToday();
    $now->isTomorrow();
    $now->isFuture()
    $now->isPast();
    $now->isBirthday(); // là ngày sinh nhật hay không

– Tính toán sự khác nhau giữa 2 datetime:

$dt = Carbon::create(2018, 10, 18, 21, 40, 16); //Tạo 1 datetime
    $now = Carbon::now();
    echo $now->diffInSeconds($dt);
    echo $now->diffInMinutes($dt);
    echo $now->diffInHours($dt);
    echo $now->diffInDays($dt);
    echo $now->diffInMonths($dt);
    echo $now->diffInYears($dt);

– Như trên facebook các bạn thấy các bài viết sẽ có trạng thái là 1 phút trước, 1 giờ trước chẳng hạn Carbon cũng hỗ trợ các bạn phần này luôn:

Carbon::setLocale('vi'); // hiển thị ngôn ngữ tiếng việt.
    $dt = Carbon::create(2018, 10, 18, 14, 40, 16);
    $dt2 = Carbon::create(2018, 10, 18, 13, 40, 16);
    $now = Carbon::now();
    echo $dt->diffForHumans($now); //12 phút trước
    echo $dt2->diffForHumans($now); //1 giờ trước

Trên đây mình chỉ liệt kê những kiểu thường dùng, ngoài ra còn rất nhiều các kiểu khác nữa, bạn có thể tham khảo tại trang chủ của Carbon tại carbon.

Có thể bạn muốn đọc thêm:

Xem thêm việc làm laravel hấp dẫn lương cao tại TopDev!