Home Blog Page 133

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Bài viết được sự cho phép của tác giả Vân Anh

Cơ bản là dạo này nhiều việc linh tinh lớn chiếm nhiều thời gian quá, thành ra không còn nguồn lực dành cho viết bài được, vẫn là tranh thủ thời gian chờ thang máy đọc mấy cái linh tinh thì mới lại nhớ ra mấy trò hay ho này nên tổng hợp thành một bài, danh sách có nhiều thứ và ở nhiều chủ đề khác nhau cơ, nhưng cơ bản là lười với lại vẫn là không sắp xếp được thời gian nên là chỉ có nhiêu đây thôi :))

  10 câu nói cực hay về lập trình
  10 hiểu lầm tai hại về lập trình

Ngoi lên chút để thấy là mình vẫn không quên cái trang blog này, đã bao lâu rồi, đã bao nhiêu món nợ chưa trả được… ây za.. nhưng mà yên tâm, mình sắp trở lại rồi đây!!!!!

1. Sinh tự động chuỗi ký tự trong Word và Excel

Chắc hẳn là trong chúng ta đã từng rơi vào trường hợp kiểu như là muốn ghi nháp một vài từ nào đó mà tự dưng ko biết ghi cái gì đành gõ bừa bàn phím một cách loạn xạ và nhanh nhất có thể. Từ nay khi biết đến sự tồn tại của hàm này bạn sẽ có thể nhanh chóng tạo ra được một đoạn ký tự mẫu đẹp mắt và chuyên nghiệp hơn.

Trong MS Word, chỉ cần gõ: =rand() sau đó nhấn enter, lúc này Microsoft Word sẽ tự động sinh ra một đoạn ký tự ngẫu nhiêu mà bạn không cần phải gõ thêm tí nào nữa.

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Với hàm trên, ta cũng có thể thêm các đối số cho nó ví dụ như =rand(2,3), lúc này đoạn ký tự được sinh ra sẽ có 2 đoạn, mỗi đoạn sẽ có 3 câu.

Bên cạnh =rand(), MS cũng cung cấp một số hàm khác mà bạn có thể sử dụng với tính năng tự như:

=lorem() và =rand.old()

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Còn với MS Excel, hàm =rand() sẽ giúp bạn sinh một số thập phân ngẫu nghiên nằm trong khoảng từ 0 đến 1. :D. Hoặc có thể sinh một số ngẫu nhiên trong một khoảng số nào đó thì có thể dùng hàm =randbetween(lớn hơn số này, nhỏ hơn số này), ví dụ: =randbetween(45;80) – thì có nghĩa là sinh ngẫu nhiên 1 số nằm trong khoảng từ 45 đến 80, ta có thể kéo công thức này cho các ô phía dưới hoặc bên cạnh như hình minh họa phía dưới.

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

2. Tìm kiếm linh hoạt và chủ động hơn với Google

Đơn giản như bạn muốn tìm nhanh thông tin hoặc tài liệu theo định dạng file cụ thể nào đó, thì chỉ cần gõ từ khóa tìm kiếm đó vào ô tìm kiếm của Google với cú pháp sau:

Filetype:file_format

Ví dụ gõ: ISTQB filetype:pdf > nhấn Enter => Kết quả tìm kiếm sẽ hiển thị tương tự như hình phía dưới đây.

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Tương tự đối với các loại định dạng file khác nhau, có thể là doc, pttx, xlsx… bất kỳ định dạng nào mà bạn muốn tìm kiếm đều có thể sử dụng cách tìm kiếm này để tối ưu hơn.

Bên cạnh tips nhỏ phía trên, ta còn có thể sử dụng trực tiếp công cụ tìm kiếm nâng cao của Google bằng cách nhấn nào link Cài đặt > Tìm kiếm nâng cao. (https://www.google.com/advanced_search)

Ở tìm kiếm nâng cao, chúng ta có thể tùy chọn việc tìm kiếm còn linh hoạt hơn nữa, với các tiêu chí cụ thể hơn. Các bạn tham khảo hình, và thử tìm kiếm vài thứ xem sao nhé! 😀

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

3. Hẹn giờ tắt máy

Có khá là nhiều cách để tắt máy tính sau khi làm việc, thường thi sau khi làm việc xong thì chỉ cần nhấn nút nguồn là máy tắt, chọn Start > Shutdown là xong. 😀 Còn không thì cứ để máy ngâm đó, sau khoảng thời gian máy sẽ tự sleep… 😀

Trò này thì có thể không phải chị em nào cũng biết, vậy thì hôm nay mình giới thiệu thêm cho các bạn một trò tắt máy khác là dùng run, gõ lệnh shutdown –s

Có cái này còn hay hơn là hẹn giờ để tắt máy, nghĩa là mình muốn sau khi mình đi khỏi chỗ 30 phút thì mới thực hiện tắt máy, vẫn dùng run, gõ lệnh “shutdown -s -t 1800″ (Sau 30 phút = 1800 giây) 😀

Hihi, chắc hẳn cái này không có gì là mới, nhưng cũng có thể là không nhiều người biết, cứ chia sẻ thôi nha 😀

4. Một vài phím tắt hay ho có thể dùng trong các trình duyệt

Alt+D → Address bar – Bôi đen nhanh địa chỉ web tại tab đang mở

Ctrl+N → New Window – Mở nhanh của sổ trình duyệt mới

Ctrl+Shift + N → New Incognito Window – Mở cửa sổ trình duyệt ẩn danh mới

Ctrl+T → Open New Tab – Mở một tab mới tại trình duyệt đang mở

Ctrl+Tab → Toggle between Tabs – Chuyển qua lại giữa các tab đang mở trong cửa sổ trình duyệt

Ctrl+Number → Switch to the numbered tab (Ex: Ctrl+2 → Switch to 2nd tab) – Chuyển sang trình duyệt ở số thứ tự tương ứng, ví dụ nhấn Ctrl +2 thì trình duyệt sẽ nhảy sang tab thứ 2 trong cửa sổ trình duyệt đó.

Ctrl+F4/Ctrl+W→ Close current tab – Đóng tab hiện tại

Ctrl+Shift+T → Reopen recently closed tab – Mở lại tab vừa đóng. – Hữu ích khi mà nhỡ tay đóng mất tab không muốn đóng.

Ctrl+Left_Click → Open link in a New Tab – Nhấn để mở link trong tab mới

Ctrl+H → History – Hiển thị lịch sử duyện web

F11 → Full Screen Browsing – Hiển thị trình duyệt toàn màn hình

Ctrl+Enter → Adds “www.” at start and “.com” at the end of the word you type in address bar –  Sau khi nhập vào một chuỗi ký tự, nhấn tổ hợp phím này thì thanh địa chỉ trình duyệt sẽ add thêm “www.” vào đầu và “.com” vào cuối chuỗi ký tự mình nhập vào trước đó.

Ví dụ: khi gõ chữ “pinterest” sau đó nhấn tổ hợp phím “Ctrl+Enter” thì trình duyệt sẽ tự thêm và duyệt đến địa chỉ web là www.pinterest.com

Nói chung thì có khá là nhiều trò hay ho nhưng mà để tổng hợp dần dần, bản thân mình thấy các phím tắt sử dụng với trình duyệt kia không phải là ít người biết đến, với cũng thường dùng chuột quen rồi, tuy nhiên nếu hạn chế chuột thì mình thấy sử dụng phím sẽ nhanh và tiện hơn rất nhiều. 😀

Hầu hết trong bài viết này là những cái mà mình đã từng và có cái là sử dụng liên tục, có thể nói là hàng ngày (trừ thứ 7, chủ nhật) vậy nên cũng rất vui nếu giúp ích ai đó trong việc làm cho công việc thường ngày đỡ nhàm chán đôi khi mang đi thể hiện với những người không chuyên còn thấy rất ngầu nữa =)) Haha

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

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

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

Ghi chú về JWT

Ghi chú về JWT

Bài viết được sự cho phép của tác giả Lưu Bình An

Cơ bản, cần nắm

JWT có thể nhớ nôm na là một JSON đã encrypt => gọi là token, chứa thông tin giúp backend có thể định danh bạn là ai, bạn có quyền gì

Ghi chú về JWT

Nguyên nhân ra đời của JWT là để giải quyết bài toán định danh trong microservice

Phía Back end

Ở phía Backend có 2 vấn đề chính cần quan tâm

  1. Tạo như thế nào
  2. Validate ra làm sao
  Hiểu rõ về JSON là gì? Cách lấy dữ liệu từ JSON
  JSON Web Token (JWT) là gì ?

Việc tạo, thật ra sử dụng những thư viện có sẵn (jsonwebtoken nếu bạn đang dùng Node.js), bạn chỉ cần quan tâm những giá trị đã hoặc muốn nhét thêm trong JSON

Một trường tối quan trong trong JSON là expiresIn, cho phép token sẽ expire sau bao lâu.

Việc validate, thì dùng thư viện nào tạo token, nó sẽ có luôn phương thức để kiểm tra token đó có hợp lệ không.

Phía client dùng SPA

So sánh định danh bằng Session và Token

Giống nhau

  1. Chức năng như nhau, để định danh
  2. Sau khi định danh ở Backend, nó trả về token cho client
  3. Gửi kèm token trên khi muốn dùng một service ở phía backend

Khác nhau

  • Session thì dữ liệu và trạng thái đăng nhập của user được lưu ở bộ nhớ phía server. Không phù hợp với RESTful APIs, mỗi service đều phải stateless, anh là ai, anh từ đâu tới đều phải đưa chứng minh nhân dân chứ chúng tôi không ai rảnh đầu ngồi nhớ mặt hết những ai ra vào service.
  • Session sẽ lưu thông tin về user ở cookie của trình duyệt, vấn đề là các service có thể khác domain, trình duyệt không biết và sẽ không đưa thông tin cookie cho các domain khác

Vấn đề với XSS và CSRF khi dùng JWT

Hết sức thận trọng khi xử lý JWT trong code, token là mồi ngon cho XSS và CSRF

Tuyệt đối không dùng local storage để lưu JWT trên phía frontend. Localstorage có thể được truy xuất bằng JS cùng domain, attacker có thể dùng điểm này để inject thêm mã để lấy local storage. (XSS)

Vì cookie được gửi trên tất cả request, attacker có thể lợi dụng điểm này để gửi một link yêu cầu đổi password (CSRF)

Nếu không còn lựa chọn nào khác, lưu trong bộ nhớ, lưu ý sẽ mất khi user refresh.

Cookie thật ra không phải là không dùng được, nhưng dùng thì phải kiểm tra

  • Dùng httpOnly để cookie không thể được truy cập thông qua JS
  • Dùng SameSite để hạn chế cấp phát cookie đi các domain chỉ định. Nếu phải đưa qua nhiều domain khác nhau, dùng Lax, nó cho phép gọi truyền cookie khác domain nếu là GET

Nếu muốn 100% an toàn tuyệt đối, một số cái giá phải trả, như tắt cross-domain request.

Nếu sử dụng axios, và backend tạo cookie đúng chuẩn, để axios lo phần đó cho an toàn, không cần lo việc xử lý token, cookie một cách thủ công, thiếu chuyên nghiệp.

axios.defaults.withCredentials = true;

Code tham khảo

Có cần HTTPS với JWT?

HTTPS có đảm bảo an toàn tuyệt đối cho site, là yêu cầu bắt buộc khi sử dụng JWT?

100% bảo mật là con số chưa ai giám nhận, hay nói tẹc ra là không thể. Sẽ luôn có đâu đó một con người tài giỏi, thông minh hơn bạn, họ sẽ tìm được cách tấn công phù hợp. May mắn thay những người xuất chúng như vậy họ cũng có đạo đức cao và không rảnh để làm những việc quá tầm thường. Đừng có lên mạng mà “Anh đố chú hack được site anh!”

HTTPS là cơ chế encrypt thông tin đi-về giữa client và server, đảm bảo không có người ngoài nào có thể dòm ngó và đọc được bạn đang gửi gì, nhưng nếu nó đã chui được vào nhà bạn rồi thì thành thật mà nói HTTPS cũng không phải là cánh cửa chỉ có bạn mở được.

Khi nào không nên dùng JWT

Nếu bạn đang muốn sử dụng một stateful backend, JWT là thừa thãi không cần thiết.

JWT sinh ra và phù hợp nhất với stateless API

Thư viện ngon

Vue: vuejs-jwt

React: react-jwt

Angular: angular-jwt

Ghi chú từ bài viết JWT Authentication Best Practices

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

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

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

6 Công cụ miễn phí cực hay cho Startup

Khái niệm transaction trong database

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

1. Beetle.email – EMAIL MARKETING INSIGHT

Đúng như tên gọi, hệ thống này giúp bạn follow rất nhiều chiến dịch của các thương hiệu lớn cũng như timeline triển khai dự án và analytics của từng chiến dịch.

Dựa vào những campaign này, và những số liệu thực tế, bạn hoàn toàn có thể có những chiến dịch Email Marekting phù hợp

>>> Link: https://beetle.email/

13907058_1167149149974920_6330693835639545302_n

2. Templated.co

Website cung cấp template viết bằng CSS và HTML5 miễn phí nhưng cực kì chất lượng Hiện website có khoảng 845 template, tất cả đều được thiết kế theo phong cách hiện đại.

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS

Những template này đều hỗ trợ giao diện responsive, được thiết kế và code bởi Cherry + AJ và được xuất bản theo giấy phép Creative Commons. Bạn có thể sử dụng miễn phí những template này cho nhu cầu cá nhân hoặc thương mại.

>>> Link: https://templated.co/

3. Ruzzit.com

Trang web giúp bạn nắm bắt xu hướng content “hot” nhất của các mạng xã hội hàng đầu thế giới.

>>> Link: http://www.ruzzit.com/

4. Compressor.io

Công cụ giúp bạn có thể nén tối đa kích thước của ảnh mà vẫn giữ được một chất lượng “high quality” cho chúng

>>> Link: https://compressor.io/

5. EMOTIFY – EMOTIONAL INTELLIGENCE FOR YOUR WEBSITE

Bạn thấy các tương tác cảm xúc của Facebook rồi chứ? Hệ thống này cũng tương tự, nó sẽ giúp bàn chèn những icon cảm xúc và người dùng sau khi đọc xong hoặc sử dụng xong sản phẩm của bạn, họ có thể phản hồi về những điều họ cảm thấy.

Vì hệ thống này free, nên bạn hãy cứ thử nghiệm đi nhé 😉

>>> Link: https://www.goemotify.com/

6. Google PageSpeed Insights

Đây là một công cụ kiểm tra hiệu suất website từ Google. Công cụ này sẽ hiển thị trạng thái, hiệu suất hoạt động của blog/website và hướng dẫn cho bạn cách để cải thiện nó.

>>> Link: https://developers.google.com/speed/pagespeed/insights/


Nguồn: MediaZ

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

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

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

Có nên học Kotlin?

Có nên học Kotlin?

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

Mấy ngày này cái tên Kotlin đã tạo nên một cơn địa chấn làm rung chuyển giới công nghệ, bạn đã xem phim “Đường Sơn Đại Địa Chấn” chưa? nếu bộ phim vô cùng hay này đã cướp đi không biết bao nhiêu nước mắt của khán giả thì Kotlin làm điều ngược lại, nó lan tỏa không biết bao nhiêu nụ cười cho giới lập trình viên bởi nhiều tiện ích mà nó đem lại. Đặc biệt ngày 17/05/2017 vừa rồi Google đã công bố Kotlin trở thành ngôn ngữ lập trình Android chính thống giáo, từ phiên bản Android Studio 3.0 các lập trình viên có thể tha hồ tung hoành!

  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
  Java đang ngăn cản sự phát triển của Android và Kotlin không phải là cách giải quyết

Và Tui dự đoán rằng: Trong tương lai sẽ có làn sóng mạnh mẽ về tuyển dụng lập trình viên Android bằng ngôn ngữ Kotlin, các công ty sẽ rất khát nhân lực, các bạn cần nhanh chóng nghiên cứu Kotlin để đi đầu về công nghệ.

Nếu bạn còn bảo lưu quan điểm Chậm Mà Chắc, thì Tui nghĩ nó không còn đúng nữa. Thời đại này khác xưa rồi, các bạn phải Nhanh Mà Chắc mới hơn người ta được, đừng chờ cho tới khi Kotlin quá phổ biến thì lúc đó bạn là người đến sau. Hãy chiến đấu ngay từ bây giờ để đi đầu về công nghệ!

Hi hi hi, nghe tới đây bạn Đã Ghiền Kotlin chưa? Ngày xưa Tui học Văn là dốt nhất lớp, toàn bị 4.5 điểm, nên cố gắng lắm mới viết được một chút ít giới thiệu về Kotlin

Có nên học Kotlinha ha – nhìn hình này có vẻ Toptal nói Java già cỗi

Kotlin có nhiều ưu điểm, ở đây Tui liệt kê một số để các bạn tham khảo (dĩ nhiên các bạn có thể tìm hiểu thêm):

Có nên học KotlinNgắn gọn như thế nào?

  • Ta có thể dễ dàng viết các POJO (Plain Old Java Object) trên một dòng :
data class Customer(val name: String, val email: String, val company: String)
  • Ta có thể dùng Lambda để lọc dữ liệu một cách nhanh chóng:
val positiveNumbers = list.filter { it > 0 }
  • Ta có thể tạo đối tượng bằng SingleTon:
object ThisIsASingleton {
    val companyName: String = "https://ssoftinc.com/"
}

Và còn nhiều cách viết ngắn gọn khác nữa, các bạn có thể tham khảo thêm trên http://kotlinlang.org/

An toàn như thế nào?

Kotlin tự động kiểm tra lỗi biễn dịch Null pointer exception, các hành vi trên tập dữ liệu null, tự động ép kiểu đúng một cách chính xác cho ta, ví dụ so sánh:

Có nên học KotlinĐa năng như thế nào?

Phải nói Kotlin có thể làm các multiplatform applications. Có thể build Kotlin cho Server-side , cho Android, cho Javascript, Native….

Khả năng tương tác như thế nào?

Kotlin có thể sử dụng được 100% các thư viện từ JVM, có thể dễ dàng từ Kotlin triệu gọi Java và từ Java triệu gọi Kotlin. Giúp các Lập trình viên không lo lắng về việc chuyển đổi coding, tăng khả năng tương tác mạnh mẽ trong hệ thống.

Ngoài ra Kotlin còn có thể dễ dàng lập trình trên nhiều công cụ khác nhau: Website, Eclipse, Netbeans, Android Studio, JetBrains… Tài liệu lập trình phong phú, cộng đồng hỗ trợ Kotlin ngày càng không ngừng phát triển.

Các cuốn sách Lập trình viên có thể nghiên cứu:

1.Kotlin in Action

Có nên học KotlinCuốn sách có 11 chương, giúp bạn hiểu rõ về Kotlin từ cơ bản tới nâng

2.Kotlin for Android Developers

Có nên học KotlinSách dành cho những ai đã rành về Kotlin, tiếp tục phát triển Kotlin bên Android (phần đầu vẫn dạy về Kotlin), được xé nhỏ thành 26 chương giúp ta dễ dàng học

3.Modern Web Development with Kotlin

Có nên học KotlinCuốn sách dạy về Web với Kotin, đặc biệt EcmaScript 6 chuẩn mới nhất, Json….Các bạn quan tâm có thể học, khoảng 115 trang.

4.Programming Kotlin

Có nên học KotlinCuốn này cũng tương tự, giúp ta có thể học tốt Kotlin. Bố trí thành 13 chương (420 pages ) các bạn có thể bám theo cuốn này để học

5.Fundamental Kotlin

Có nên học KotlinCuốn sách này khá hay, bạn có thể tham khảo.

Chúc các bạn nhanh chóng học tốt Kotlin, hẹn gặp các bạn ở những bài sau

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

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

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

Low Coupling và High Cohesion là gì?

LOW COUPLING VÀ HIGH COHESION LÀ GÌ?

Bài viết được sự cho phép của Edward Thiên Hoàng

Low coupling và high cohesion là 2 thuộc tính đi cùng với nhau như là mục tiêu cần đạt được trong thiết kế, trong bài viết này, cùng tìm hiểu xem chúng là gì, làm sao để đạt được và tránh các lỗi liên quan đến coupling và cohesion khi thiết kế phần mềm.

COUPLING

Low couplingloose coupling hay high coupling và tight coupling, ắt hẳn ai trong chúng ta khi học về các nguyên lý lập trình căn bản đều biết về khái niệm coupling này. Coupling đề cập đến vấn đề phụ thuộc lẫn nhau giữa các component. Low coupling, loose coupling có nghĩa là các component ít phụ thuộc vào nhau, sự thay đổi trong component này ít khi, hoặc không ảnh hưởng đến component kia. Ngược lại, high coupling và tight coupling cho thấy các component phụ thuộc nhiều vào nhau, khi thay đổi 1 component thì các component kia đều bị ảnh hưởng và có khả năng phải thay đổi theo. Tất nhiên, low coupling là mục tiêu chúng ta cần hướng đến để đảm bảo cho hệ thống ít bị ảnh hưởng khi có thay đổi và do đó, tăng tốc độ thực hiện công việc và bảo trì.

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  20 trường hợp sử dụng lệnh Docker cho developer

Thêm một ví dụ nữa về coupling

Trong câu hỏi trên StackOverflow có một câu trả lời cho thấy một mô tả hài hước nhưng khá chính xác và rõ ràng về những gì 1: 1 coupling là:

iPod là một ví dụ tốt về tight coupling: một khi pin chết bạn cũng có thể mua một chiếc iPod mới vì pin được hàn cố định và sẽ không bị lỏng, do đó thay thế rất tốn kém. Một cái máy có tính loosely coupled sẽ cho phép thay đổi pin dễ dàng.

iPods are a good example of tight coupling: once the battery dies you might as well buy a new iPod because the battery is soldered fixed and won’t come loose, thus making replacing very expensive. A loosely coupled player would allow effortlessly changing the battery.

Tương tự, 1: 1, trong phát triển phần mềm.

Chúng ta sẽ xem xét diagram dưới đây:

tight_coupling

Nếu chúng ta nhìn vào hình trên, nó cho chúng ta thấy một mối liên hệ giữa hai class được gọi là tight coupling. Class1 ở trên tạo ra các đối tượng của Class2 trực tiếp, và thậm chí là đi đến các biến thành viên và truy cập vào. Điều này làm cho nó rất phụ thuộc vào Class2. Điều gì sẽ xảy ra nếu chúng ta quyết định rằng chúng ta muốn thêm tham số thêm vào trong constructor của Class2 và đặt mặc định là private? Sau đó, chúng ta phải thay đổi mọi cách sử dụng Class2 ở mọi nơi. Không đẹp lắm, heh? Có thể là một cơn đau đầu rất lớn và là một trong những vấn đề đầu tiên trong thiết kế.

Dưới đây là ví dụ bằng code:

public class ClassA {

    private boolean attributeA;

    public int methodA() {
        if(attributeA) {
            return new ClassB().attributeB;
        }
        return -1;
    }

    public String getValue() {
        return new ClassB().getValue();
    }

}

public class ClassB {

    public int attributeB;

    public String getValue() {
        return "Heh?!?";
    }

}

MỘT SỐ GIẢI PHÁP

DEPENDENCY INVERSION

Ví dụ trong Java, ta sẽ thêm một interface. Đó là cách Class1 sẽ chỉ phụ thuộc vào interface đó, chứ không phải là implementation thực tế của Class2, do đó giảm thiểu sự phụ thuộc trực tiếp giữa 2 class với nhau.

LAW OF DEMETER (DON’T TALK TO STRANGERS!)

Lợi điểm của Law of Demeter là nó giúp hệ thống của chúng ta đứng vững trước những thay đổi bằng cách giảm coupling hay còn gọi là cách design loose coupling, mọi sự thay đổi sẽ là nhỏ nhất nếu có thể.

COHESION

Còn high cohesion (trái ngược với nó là low cohesion) là gì? Khi nói đến cohesion chúng ta nghĩ đến nhiệm vụ của từng module. Nhiệm vụ của từng module càng rõ ràng và tách biệt thì cohesion càng cao (high cohesion), và đó là mục tiêu cần đạt tới khi thiết kế. Giải thích bằng code có lẽ sẽ không rõ ràng, hãy xem xét câu dưới đây:

Tại kỳ họp Quốc hội thứ năm, khi thảo luận về quản lý chất lượng vệ sinh an toàn thực phẩm có vị đại biểu Quốc hội đã ví việc có tới 5 bộ chịu trách nhiệm chính như vậy cũng giống như “nhiều sãi không ai đóng cửa chùa”.Bởi thế, làm rõ trách nhiệm của từng cơ quan quản lý Nhà nước về an toàn thực phẩm là một yêu cầu được nhấn mạnh khi xây dựng Dự Luật An toàn thực phẩm.

Nguồn: http://vneconomy.vn/thoi-su/an-toan-thuc-pham-bo-nao-trang-trai-bo-nao-ban-an-20100519102635734.htm

Nếu xem Dự Luật An toàn thực phẩm là một feature thì rõ ràng nó đã không đạt được tính high cohesion trong thiết kế vì nó phải dàn trải và phụ thuộc vào rất nhiều module (5 bộ, phòng ban) khác nhau. Do đó, khi cần chỉnh sửa bổ sung dự luật sẽ rất khó khăn vì phải sửa 1 lúc 5 module, mà bạn thấy đó, điều đó rõ ràng là rất khó. Nếu quy trách nhiệm xây dựng bộ luật này cho một bộ ban duy nhất thì sẽ giảm tính phức tạp và do đó, tăng tính cohesion. High cohesion thường đạt được nếu ta tuân thủ theo nguyên tắc đơn nhiệm (Single responsibility principle), mỗi module, khi đó chỉ đảm nhiệm một nhiệm vụ duy nhất, không hơn không kém, và không có chuyện 2 module cùng làm một nhiệm vụ, một tính năng.

Đến đây chắc ai cũng hiểu được rồi đúng không? Ít nhất là về mặt lý thuyết, hãy xem xét bảng sau trước khi mình đi vào các dẫn giải tiếp theo.

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

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

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

Laravel 8: dễ dàng đổi giá trị auto increment mặc định database

Laravel 8: dễ dàng đổi giá trị auto increment mặc định database

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

Laravel 8 bổ sung một phương thức hoàn toàn mới để giúp việc thay đổi giá trị auto increment trở nên dễ dàng và đây là thông báo chính thức được đưa ra trên Twitter của Taylor Otwell:

Sneaking this into Laravel 8.x today… 👨‍🔬 pic.twitter.com/Bg24S7iX4j

— Taylor Otwell 🛸 (@taylorotwell) September 6, 2020

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id()->startingValue(1200);
        ...
    });
}

Việc thay đổi auto-increment thông qua các nền tảng cơ sở dữ liệu (database platforms) khác nhau luôn có thể thực hiện được, nhưng bạn cần thực hiện điều đó thông qua một lệnh thô (raw command). Với việc bổ sung phương thức startValue, điều này cho phép bạn thiết lập số đầu tiên để tăng tự động sẽ bắt đầu.

Đối với hầu hết các ứng dụng, bạn có thể sẽ không cần điều này nhưng trong những trường hợp bạn không muốn người dùng biết rằng ứng dụng của bạn chỉ có 10 người dùng, thì đây là một tùy chọn rất hữu ích phải k nào.

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

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

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

                                        Việc làm laravel chất nhất các ngành hot

Khái niệm transaction trong database

Khái niệm transaction trong database

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

Khái niệm transaction trong database là một khái niệm quan trọng mà tất cả các lập trình viên nên biết bởi vì chúng ta sẽ làm việc rất nhiều với khái niệm này. Trong bài viết này, mình xin trình bày với các bạn về khái niệm này!

Để dễ hình dung, mình xin lấy một ví dụ như sau: chúng ta đang làm việc với một ứng dụng bên ngân hàng, ứng dụng này có một tính năng đó là chuyển tiền giữa các tài khoản ngân hàng với nhau, ví dụ chuyển tiền cho tài khoản A sang tài khoản B. Đây là một tính năng mà quá trình xử lý sẽ gồm 2 bước:

Tuyển database lương cao hấp dẫn trên TopDev

Tuyển dụng IT lương cao nhiều ngành nghề

  • Thứ nhất là trừ tiền trong tài khoản A
  • Và bước thứ hai là cộng tiền vào tài khoản B.

Rõ ràng, như các bạn thấy, đây là một quá trình nếu gọi là thành công thì bắt buộc 2 bước trên phải thành công, hoặc nếu thất bại thì bắt buộc 2 bước trên cũng phải thất bại luôn. Nếu chỉ một trong 2 bước trên thành công hoặc thất bại thì chúng ta sẽ gặp vấn đề ngay. Và chúng ta khi xây dựng ứng dụng cũng phải đảm bảo 2 điều kiện trên.

Đây chính là ý tưởng chính của khái niệm transaction trong database. Trong database, một transaction là một tập hợp các thao tác mà ở đó hoặc là các thao tác đó được thực hiện thành công, hoặc là không một thao tác nào được thực hiện thành công cả. Khi các bạn suy nghĩ về transaction trong database, các bạn hãy hình dung nó là “hoặc là tất cả hoặc là không gì hết”.

Ở đây, chúng ta có một chữ viết tắt ACID (Atomicity, Consistency, Isolation, Durability) định nghĩa các tính chất của một transaction trong database.

Trong đó:

  • Atomicity: tính chất này thể hiện khái niệm “hoặc là tất cả hoặc là không gì hết”. Toàn bộ các bước được thực hiện trong một transaction nếu thành công thì phải thành công tất cả, nếu thất bại thì tất cả cũng phải thất bại. Nếu một transaction thành công thì tất cả những thay đổi phải được lưu vào database. Nếu thất bại thì tất cả những thay đổi trong transaction đó phải được rollback về trạng thái ban đầu.

Trong ví dụ của mình, rõ ràng khi đã trừ tiền trong tài khoản A thì bắt buộc việc cộng tiền vào tài khoản B phải xảy ra. Còn không thì không có gì xảy ra hết, đã không trừ tiền trong tài khoản A thì chắc chắn rồi, việc cộng tiền vào tài khoản B cũng không xảy ra.

  • Consistency: dữ liệu từ thời điểm start transaction với lúc kết thúc phải nhất quán.

Trong ví dụ của mình thì, nếu đã trừ 10$ trong tài khoản A thì trong tài khoản B phải được cộng 10$.

  • Isolation: nếu chúng ta có nhiều transaction cùng một lúc thì phải đảm bảo là các transaction này xảy ra độc lập, không tác động lẫn nhau trên dữ liệu.

Trong ví dụ của mình, giả sử cùng môt lúc xảy ra 2 transaction như trên thì rõ ràng chúng ta không xác định được trạng thái của tài khoản A và tài khoản B sau khi thực hiện cùng 1 lúc. Mà điều này thì rất nguy hiểm.

  • Durability: điều này có nghĩa dữ liệu sau khi thực hiện transaction sẽ không thay đổi nếu chúng ta gặp vấn đề gì đó liên quan đến database.

Ví dụ sau khi chuyển tiền vào tài khoản B thành công thì dù database có gặp bất cứ vấn đề gì thì tài khoản B vẫn đảm bảo đã nhận đủ 10$.

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

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

Tất tần tật về Apache Cassandra

Tất tần tật về Apache Cassandra

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

Nói về cơ sở dữ liệu thì chắc ai cũng nghĩ ngay đến hệ quản trị cơ sở dữ liệu quan hệ như Mysql, PostgreSQL, hay NoSQL như MongoDB, DynamoDB, Cassandra…

Và theo mình nghĩ đa số anh em ở đây cũng đang sử dụng chủ yếu là MySQL. Mình cũng vậy, từ lúc đi làm đến giờ toàn phang MySQL, chưa có cơ hội làm việc với NoSQL (tự tìm hiểu thì có còn dùng trong dự án thật thì chưa)

  Maven Apache
  20 trường hợp sử dụng lệnh Docker cho developer

Kể cả các công ty to như Pinterest hay Instagram cũng vậy, họ vẫn đang dùng MySQL.

Còn NoSQL thì hiện nay thấy rất nhiều công ty đã dùng vào hệ thống chính của họ. Ví dụ như Netflix, Discord, Spotify …

Nên hôm nay quyết định viết bài này để tìm hiểu xem thật sự thằng Cassandra này nó có ưu điểm, nhược điểm gì, dễ scale hay không …

Khái quát qua về Cassandra

Cassandra là NoSQL, được phát triển bởi Facebook vào năm 2007. Sau đó nó được tặng cho quỹ Apache vào 2/2010 và nâng cấp lên thành dự án hàng đầu của Apache.

Cassandra là hệ cơ sở dữ liệu phân tán, kết hợp những gì tinh tuý nhất của Google Bigtable và Amazon DynamoDB. Ngôn ngữ phát triển Cassandra là Java.

Cassandra được thiết kế có thể chạy trong phần cứng giá rẻ, và cung cấp write throughput khá là cao (latency tầm 0.5ms), trong khi read throughput thì thấp hơn (latency tầm 2.5ms).

Nếu nói đến NoSQL thì chắc ai cũng đều có chút liên tưởng nó hoạt động thế nào rồi. Cassandra cũng vậy, dữ liệu được lưu vào table, sau đó dùng 1 ngôn ngữ query như SQL để thực hiện thao tác với dữ liệu.

Cassandra là hệ cơ sở dữ liệu phân tán, dữ liệu được lưu trữ trên nhiều node của nhiều máy khác nhau, theo cơ chế P2P. Hiệu năng xử lý của hệ thống cũng tăng theo số node (nếu càng nhiều node thì càng xử lý được nhiều request).

Điều đó sẽ giúp cho Cassandra dễ dàng scale theo chiều ngang.

Về hiệu năng thì Netflix cũng đã thực hiện đo benchmark, kết quả ngoài mong đợi. Với 288 nodes, Casandra đã đạt được throughput lên đến 1 triệu write/s. Khá kinh khủng.

Kết quả thực hiện đo benchmark ở đây: https://medium.com/netflix-techblog/benchmarking-cassandra-scalability-on-aws-over-a-million-writes-per-second-39f45f066c9e

Use Cases của Cassandra

Cassandra là 1 hệ cơ sở dữ liệu không quan hệ, và thường được sử dụng trong nhiều loại ứng dụng khác nhau. Dưới đây là 1 số use cases mà Cassandra thường hay được sử dụng.

Messaging

Cassandra rất thích hợp trong những ứng dụng hay service làm về chat. Hiện nay có 1 số công ty đang dùng như Facebook, Discord.

Internet of things

Cassandra cũng rất thích hợp cho những dòng ứng dụng mà có tốc độ dữ liệu gửi đến cực khủng từ nhiều thiết bị khác.

Social Media Analytics and recommendation engine

Cassandra cũng rất thích hợp cho những chức năng về recommendation hay 1 vài chức năng liên quan đến analytics.

Điểm mạnh của Cassandra

Hệ thống phân tán

Do Cassandra được kế thừa từ Amazon DynamoDB nên tính mở rộng của nó là khá lớn. Khi tốc độ xử lý của hệ thống không đủ thì ta chỉ cần thêm node mới vào là được.

Partitioning

Là kiến trúc phân phối dữ liệu trên nhiều node bên trong cluster.

Dựa theo thuật toán Consistent Hashing thì mỗi node sẽ được cấp phát 1 token, và dựa vào token này sẽ phân phối dữ liệu đến từng node.

Dữ liệu được tạo ra nhờ replication sẽ tự động phân chia đến từng node.

Tất tần tật về Apache Cassandra

Gossip Protocol

Là giao thức truyền thông giữa các node trong cluster. Cơ bản là truyền thông P2P.

Cơ chế lưu dữ liệu

Cassandra thực hiện việc lưu dữ liệu thông qua 2 chỗ:

  • Không gian bộ nhớ (được gọi là memtable)
  • Không gian đĩa (được gọi là SSTable)

Khi write dữ liệu thì đầu tiên sẽ lưu trên memtable. Sau khi dữ liệu trên memtable full thì khi đó sẽ thực hiện ghi toàn bộ dữ liệu trên memtable xuống SSTable.

Khi read dữ liệu thì đầu tiên sẽ tìm trong memtable trước. Nếu không có thì lại tìm xuống SSTable để lấy.

→ Chính vì dữ liệu được lưu trên memory nên việc việc lấy dữ liệu trên Cassandra trở lên khá là nhanh.

Khi xoá dữ liệu thì thực tế dữ liệu không được xoá, mà nó được gán 1 cái cờ gọi là tombstone. Sau 1 khoảng thời gian nào đó sẽ có 1 con batch chạy đi scan và thực hiện xoá.

Tính nhất quán dữ liệu trong cluster

Khi nhận được request đọc ghi đến DB của Cassandra, khi đó cái node nhận được request này sẽ đảm nhiệm 1 chức vụ được gọi là coordinator, và tiến hành xử lí request đọc ghi đến những node liên quan.

Dựa vào cấp độ của tính nhất quán (Consistency Level) mà việc kết nối đến từng node sẽ khác nhau.

Cấp độ của tính nhất quán sẽ được set trên mỗi câu truy vấn đọc ghi. Do đó giúp nhà phát triển ứng dụng sẽ dễ dàng điều chỉnh Consistency Level cho phù hợp với yêu cầu của họ: muốn kết quả trả về nhanh hay muốn dữ liệu trả về chính xác.

  • Nếu Consistency Level được set là 1 thì khi đó coordinator chỉ cần kết nối trực tiếp đến 1 node -> kết quả trả về nhanh
  • Nếu Consistency Level đươc set là ALL thì khi đó coordinator phải kết nối đến toàn bộ node và thực hiện xử lý dữ liệu. -> dữ liệu trả về chính xác

Tính dư thừa

Các node trong cluster có vai trò như nhau, không có node nào làm node chính cả. Hơn nữa dữ liệu không chỉ được lưu trên 1 node mà nó được lưu trên toàn bộ các node, do đó độ chịu lỗi của nó là khá cao.

Cho dù có 1 node bị lỗi đi chăng nữa thì khi truy vấn kết quả, nó sẽ được điều hướng sang các node khác để lấy.

Trong trường hợp mà chúng ta phục hồi dữ liệu từ 1 node bị lỗi thì nó sẽ xử lý như thế nào?

Giả sử như trong khi đang phục hồi thì có dữ liệu mới đến, khi đó dựa vào cơ chế Hinted Handoff thì cái node nhận được dữ liệu mới này sẽ thực hiện việc lưu tạm thời dữ liệu lại. Và cái node bị lỗi sau khi phục hồi dữ liệu xong thì sẽ tiến hành update dữ liệu dựa vào cái thông tin đã lưu lúc trước.

Ngoài ra dựa vào cơ chế Read Repair, khi chúng ta query dữ liệu. Chẳng may cái dữ liệu nhận được nó cũ hơn dữ liệu đang có ở các node khác. Khi đó nó sẽ tự động tiến hành update dữ liệu.

Cấu trúc dữ liệu

Dữ liệu được lưu trữ trong DB của Cassandra thuộc dạng Key value store (KVS).

Có thể tạo được nhiều table trong database nhưng mà giữa các table sẽ không có mỗi quan hệ nào. Nhiều table được tổng hợp lại thành keyspace.

Thông thường database trong NoSQL thì không cần thiết phải tạo schema ngay lúc đầu. Thế nhưng Cassandra thì lại khác. Trước khi insert dữ liệu thì cần phải tạo keyspace và schema của table.

Có thể thực hiện được 1 số câu query như select, update, insert, delete, drop.

Tổng kết

Mình tổng hợp lại 1 số đặc tính của Cassandra như sau:

  • Là NoSQL
  • Dữ liệu được phân tán trên nhiều node khác nhau.
  • Node càng nhiều thì throughput của nó càng tăng.
  • Write throughput luôn luôn cao hơn read throughput.
  • Tính chịu lỗi khá cao, cho dù node bị chết đi chăng nữa thì khi truy vấn sẽ được chuyển hướng đến node khác.
  • Backup, restore dữ liệu 1 cách đơn giản.
  • Tốc độ truy vấn cao

Đọc đến đây chắc hẳn các bạn cũng biết Cassandra nó làm việc thế nào rồi phải không.

Bài sau mình sẽ đi đào sâu vào 1 số hệ thống lớn xem họ đang áp dụng nó thế nào.

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

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

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

Giới thiệu React Router

Giới thiệu React Router

Bài viết được sự cho phép của tác giả Lưu Bình An

Giới thiệu về React Router

Cách tiếp cận của React Router không khác mấy so với các thư viện Router trước đây

Ví dụ với 1 component Home

class Home extends React.Component{
  render(){
    return(
      <h1>Welcome Home</h1>;
    )
  }
}
ReactDOM.render( (<Home/>), document.getElementById('root'));

Sử dụng với React-Router

ReactDOM.render((
  <Router>
    <Route path="/" component={Home} /> 
  </Router>
), document.getElementById('root'));

Câu khai báo trên có thể diễn giải là với route “/” (tương đương với trang chủ), thì gọi render component Home

2 component <Router> và <Route> là những component React không render trong DOM, nếu path khớp với uri, nó render ra component chúng ta truyền vào cho nó (qua props component), chúng ta sẽ gặp lại khái niệm này thường xuyên: Một component bản thân không render trong DOM, mà render một component khác

Xem thêm tuyển dụng lập trình viên React lương cao

Nhiều Route

Xét ví dụ

ReactDOM.render((
  <Router>
    <Route path="/" component={Home}></Route>
    <Route path="/tags" component={TagsPage}></Route>
    <Route path="/post/:id" component={Post}></Route>
  </Router>
), document.getElementById('root'));
  • Với URL yourpage.com/ -> render component Home
  • Với URL yourpage.com/tags -> render component TagsPage
  • Với URL yourpage.com/post/12 -> render component Post

Tái sử dụng component với Nested Route

Khai báo nested Route

ReactDOM.render((
  <Router>
    <Route component={MainLayout}>
      <Route component={SearchLayout}>
        <Route path="users" component={UserList} />
      </Route> 
    </Route>
  </Router>
), document.getElementById('root'));

Khi user truy cập đường dẫn /users, React Router sẽ render component <UserList /> bên trong component <SearchLayout/>, cả 2 component này lại đặt trong component <MainLayout/>

Nếu muốn trang chủ cũng render <MainLayout/> cùng với component <Home/>

ReactDOM.render((
  <Router>
    <Route component={MainLayout}>
      <Route path="/" component={Home} />
      <Route component={SearchLayout}>
        <Route path="users" component={UserList} />
        <Route path="widgets" component={WidgetList} />
      </Route> 
    </Route>
  </Router>
), document.getElementById('root'));
  3 bước tối ưu hiệu năng React App bằng các API mới của React
  3 tools giúp bạn tăng hiệu năng của React App một cách bất ngờ

IndexRoute

Thay vì viết như trên, có thể sử dụng component IndexRoute cũng cho cũng kết quả

ReactDOM.render((
  <Router>
    <Route path="/" component={MainLayout}>
      <IndexRoute component={Home} />
      <Route component={SearchLayout}>
        <Route path="users" component={UserList} />
        <Route path="widgets" component={WidgetList} />
      </Route> 
    </Route>
  </Router>
), document.getElementById('root'));

Một số cách khai báo với Route

Nếu có một khai báo cho trang User như bên dưới

<Route path="user/settings" component={UserSettings} />
<Route path="user/inventory" component={UserInventory} />
<Route path="user/orders" component={UserOrders} />

Viết lại cho gọn

<Route path="user">
  <Route path="settings" component={UserSettings} />
  <Route path="inventory" component={UserInventory} />
  <Route path="orders" component={UserOrders} />
</Route>

Cần bổ sung thêm component cho trang /user

<Route path="user">
  <IndexRoute component={UserProfile} />
  <Route path="settings" component={UserSettings} />
  <Route path="inventory" component={UserInventory} />
  <Route path="orders" component={UserOrders} />
</Route>

Khi đã định nghĩa với Route, nếu muốn dẫn đến một route nào đó, sử dụng component <Link to="" /> thay cho tag <a/>

<div className="app">
  <header className="primary-header"></header>
  <aside className="primary-aside">
    <ul>
      <li><Link to="/">Home</Link></li>
      <li><Link to="/user">Users</Link></li>
      <li><Link to="/user/settings">Settings</Link></li>
    </ul>
  </aside>
  <main>
    {this.props.children}
  </main>
</div>

Với <Link> nó biết khi nào đang active

<Link to="/users" activeClassName="active">Users</Link>

Browser History

<Router> muốn hoạt động được, phải khai báo với ReactRouter.browserHistory

var browserHistory = ReactRouter.browserHistory;

ReactDOM.render((
  <Router history={browserHistory}>
  </Router>
), document.getElementById('root'));

Những version trước đây của React Router, attribute history có giá trị mặc định là hashHistory giống như router của Backbone.js, các version sau này, attribute history sẽ không có giá trị mặc định và bắt buộc phải khai báo khi sử dụng

Nếu muốn redirect user đến một route nào đó

browserHistory.push('/some/path');

Route với parameter string

<Route path="users/:userId" component={UserProfile} />

Component UserProfile sẽ được render trong các trường hợp: users/1users/145users/abc, React Router sẽ truyền vào giá trị userId vào UserProfile như một props, access đến giá trị này bằng this.props.params.userId

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

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

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

Sử dụng Google Keep hiệu quả A-Z

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

Dễ nhất là viết về 1 cái mà ai cũng biết, và khó nhất cũng là viết về 1 cái mà ai cũng đang xài, vì nó không còn gì mới mẻ, không còn gì hay ho để người ta có thể khám phá.

Google Keep là một công cụ như thế các bạn ạ!

Mình dùng Google Keep đến nay đã sang năm thứ 5, mỗi tháng mình checked khoảng 500 checklists, toàn bộ công việc cá nhân, công ty, và gia đình thú thực mình đều quản lý trên Google Keep, vô cùng đơn giản, hiệu quả, và tiết kiệm thời gian.

Đầu tiên chúng ta vẫn cứ phải nhắc lại Google Keep là gì đã nhé…

  Ứng dụng mới cực hot từ Google: Android Sunflower
  10 Add-on Google Sheets phải có dành cho các Recruiters

1. Giới thiệu về Google Keep

Google Keep là dịch vụ ghi chú được phát triển bởi Google. Ra mắt vào ngày 20 tháng 3 năm 2013, Google Keep có sẵn trên web và có các ứng dụng di động cho hệ điều hành di động Android và iOS. Keep cung cấp nhiều công cụ để ghi chú, bao gồm văn bản, danh sách, hình ảnh và âm thanh.

_ Trích Wikipedia

571819-7-reasons-to-actually-start-using-google-keep.jpg (1280×720)

Google có giới thiệu về công cụ Google Keep của mình như thế này: [bg_collapse view=”button-blue” color=”#fff” expand_text=”Click để xem thêm thông tin” collapse_text=”Rút gọn lại” ]


Ghi lại nội dung quan trọng và làm được nhiều việc hơn.

Sắp xếp. Ghi lại cảm hứng và việc cần làm một cách dễ dàng. Cộng tác trên ghi chú với các thành viên trong nhóm và đặt nhắc nhở để luôn theo kịp tiến độ. Mọi thứ đều đồng bộ hóa trên các thiết bị của bạn nên nội dung quan trọng luôn trong tầm tay.

Cùng nhau làm được nhiều việc hơn.
Với Keep, bạn có thể dễ dàng cộng tác với đồng nghiệp trên các ghi chú, danh sách, ảnh, âm thanh và bản vẽ. Ghi lại các ý tưởng đột phá một cách nhanh chóng, giữ trong tầm tay khi bạn làm việc và xem những việc cần làm được đánh dấu hoàn thành trong thời gian thực.

Cập nhật ghi chú mọi lúc, mọi nơi.
Truy cập, tạo và chỉnh sửa ghi chú ở bất cứ đâu — từ máy tính, điện thoại hay máy tính bảng — ngay cả khi không có kết nối. Mọi chỉnh sửa bạn thực hiện sẽ được lưu và cập nhật tự động trên tất cả các thiết bị.

Tìm nhanh nội dung bạn cần.
Keep giúp bạn dễ dàng sắp xếp ghi chú và tìm thấy nội dung mình đang tìm kiếm nhanh hơn nữa. Lọc nhanh ghi chú theo màu, nhãn hoặc thuộc tính như danh sách có hình ảnh, ghi chú âm thanh có nhắc nhở hoặc ghi chú được chia sẻ. Hoặc ghim các ghi chú quan trọng vào đầu danh sách của bạn.

Không bao giờ bị lỡ thời hạn.
Nhắc nhở trong Keep giúp bạn hoàn tất công việc mọi lúc, mọi nơi bạn cần. Bạn có dự thảo thuyết trình phải hoàn thành lúc 3 giờ chiều? Hãy đặt nhắc nhở theo thời gian. Bạn cần mua đồ ăn nhanh cho chuyến dã ngoại của nhóm? Hãy thêm nhắc nhở theo vị trí để thông báo cho bạn khi bạn đi qua cửa hàng tạp phẩm.

Làm cho ý tưởng trở nên sống động.
Nhanh chóng ghi lại các ghi chú và ý tưởng trong Keep, sau đó dễ dàng tham chiếu để lấy cảm hứng khi bạn cộng tác với các thành viên nhóm trong Tài liệu. Chỉ cần truy cập giấy ghi chú Keep qua menu Công cụ của Tài liệu và bạn sẽ thấy tất cả ghi chú Keep trong một bảng điều khiển bên.

[/bg_collapse]


Vậy tại sao 1 phần mềm ghi chú lại hữu dụng, được nhiều người tin tưởng sử dụng đến vậy?

2. Ai có thể sử dụng Google Keep?

69CFF8C1-98C1-4D39-AFDD-FDBEAAE4B14C.png (2476×1552)

Bất cứ ai nếu có nhu cầu quản lý công việc và các ghi chú cá nhân hiệu quả hơn, ngoài ra:

  • Bạn muốn miễn phí
  • Bạn muốn đồng bộ giữa nhiều thiết bị để có thể ghi chú cũng như theo dõi ở bất cứ đâu
  • Muốn làm việc nhóm, lên ghi chú và mục tiêu với team của mình
  • Bạn có xu hướng và mong muốn quản lý và giao tiếp công việc theo mục tiêu (OKRs) để có thể linh hoạt và sáng tạo, thay vì bó hẹp theo đừng đầu mục chi tiết có trước.
  • Bạn muốn tối ưu thời gian và không bao giờ quên việc!!!

3. Tại sao lại là Google Keep?

Đương nhiên bạn sẽ hỏi câu hỏi này, vì có rất nhiều công cụ ghi chú khác như Evernote, OneNote, hay thậm chí Sticky Note trên Windows 10, Ghi chú trên IPhone… [bg_collapse view=”button-blue” color=”#fff” expand_text=”Click để xem so sánh Google Keep vs Evernote vs One Note” collapse_text=”Rút gọn nội dung” ]

OneNote Evernote Keep
Developer Microsoft Evernote Google
Delivery Web, Mobile, Desktop Web, Mobile, Desktop Web, Mobile
Windows Yes Yes Online Only
Mac OS X Yes Yes Online Only
Android Yes Yes Yes
iOS Yes Yes Online Only
Windows Phone Yes Yes Online Only
Blackberry Online Only Yes Online Only
# of Devices Per License Unlimited Unlimited Unlimited
Packages and Cost in USD Free Free or Premium Available ($5 to 10 USD/user/month) Education or Business version also available (varied) Free
Microsoft Office Document Compatibility Can Attach Can Attach Can’t Attach Files
Open Document Compatibility Can Attach Can Attach Can’t Attach Files
Portable Document Format (PDF) Can Attach Can Attach Can’t Attach Files
Autosave and Backup Excellent Excellent Excellent
Security, Document Password Protection, Encryption Excellent Excellent Excellent
Accessibility Excellent Poor (Your device may have some features) Good (Your device may have more)
Update Process Excellent Excellent Excellent
Support Good Good Good
Web Clipper App OneNote Web Clipper Evernote Web Clipper Chrome App or “Share via”
News App Several including Feedly and News 360 Several including Feedly and News 360 No
Email App Email to OneNote, CloudMagic and Powerbot CloudMagic and Powerbot Gmail
Printing / Scanning App Several including OfficeLens and NeatConnect Several including ScannerPro and CamScanner Google Drive Apps available
SmartPen App Livescribe and ModNotebooks Livescribe and ModNotebooks LiveScribe to Google Docs (not Keep)
Connection to Other Major Web Apps IFTTT and Zapier IFTTT and Zapier IFTTT and Zapier (though with fewer options)
Home Screen Display Widget Available Available Available
Annotation / Quick Sketch App Skitch Skitch and Penultimate Sketch for Keep
User Interface & Customization Excellent Excellent Excellent
Text & OCR Excellent (with Office Lens) Excellent Good
Handwriting Excellent Excellent Poor
Images Excellent Excellent Excellent
Audio Excellent Excellent Good
Task Lists and Alerts / Reminders Excellent Excellent Good
Notebooks, Tags, & Categories Excellent Excellent Good (hashtags available but not as many organization tools)
References Poor Poor Poor
Comments Poor Poor (Markup available though) Poor
Spelling & Grammar Check Excellent Excellent Excellent
Printing & Exporting Good (requires cloud printing) Good (requires cloud printing) Good (requires cloud printing)
Cloud Environment Microsoft OneDrive Evernote Cloud Google Drive
Asynchronous Collaborative Editing Excellent – available in free version Good – available in Shared Notes (Premium version) or Related Notes (Business version) Poor (share to Google+ but no collaborative editing)
Online to Offline Syncing & Editing Excellent Good in Free, Excellent in Premium Only in the Chrome app
Social Sharing With Zapier app Depends on device (Facebook, Google+, Twitter, LinkedIn) Google+
Templates Excellent (page templates) Excellent (download from Evernote site) Poor

Nguồn tham khảo: https://www.lifewire.com/comparison-evernote-microsoft-onenote-google-keep-2512005

[/bg_collapse]

Nhìn vào bảng trên chắc bạn sẽ thắc mắc: “ủa thế google keep hơn onenote hay evernote ở điểm nào?”, thì câu trả lời cho câu hỏi này có lẽ sẽ không bao giờ có thể thuyết phục được tất cả người dùng! Chúng ta chỉ là đang đi tìm câu trả lời cho câu hỏi: “Công cụ nào phù hợp với mình nhất?” mà thôi!

Xem thêm 1 bài so sánh khác: https://usefyi.com/google-keep-vs-evernote/

Bảng trên giúp bạn xem các tính năng hiện có của Google Keep, và xem xét trên nhu cầu của bản thân để xem có phù hợp không, không quan trọng nhiều hay ít tính năng, quan trọng có đủ dùng không!!!  Có 2 lợi thế không có trong bảng so sánh, đó là:

  • Google Keep nhẹ hơn 2 công cụ kia
  • Google Keep thuộc hệ sinh thái của Google nên nếu bạn quen sử dụng các công cụ của Google rồi thì thực sự rất rất tiện.

4. Sử dụng Google Keep như thế nào?

Như lúc đầu mình có viết, Google Keep thực sự rất dễ dùng, bạn chỉ cần truy cập: https://keep.google.com và đăng nhập tài khoản Google mà mình muốn sử dụng.

15-Ways-for-Students-to-Use-Google-Keep-5.png (850×2000)

Có một số tính năng quan trọng mà bạn cần phải lưu ý, vì nếu ứng dụng đủ sâu, Google Keep sẽ mang lại những hiệu quả cực lớn cho cách bạn quản lý và sắp xếp công việc:

  1. Ghim ghi chú: Hiểu đơn giản là bạn đánh dấu ghi chú nào là quan trọng, ưu tiên hiển thị lên đầu tiên.
  2. Tiêu đề ghi chú: Tên chủ đề của mỗi ghi chú / công việc để bạn có thể phân loại và làm việc tập trung hơn.
  3. Ghi chú: Bạn sẽ có 2 lựa chọn tạo Ghi chú mới hoặc Danh sách mới (Checklist), thường là những cái cần note nhanh hoặc lưu tạm.
  4. Danh sách mới: Hầu hết mọi người đều ưu tiên sử dụng tính năng này, tạo một danh sách các đầu việc cần đánh dấu hoàn thành, đây là một tính năng đơn giản nhưng cực hữu dụng.
  5. Lời nhắc: Nhắc bạn lưu ý hoặc hoàn thành các ghi chú/danh sách trong thời gian phù hợp, có thể chọn ngày giờ và địa điểm (liên kết đến Google Calendar)
  6. Cộng tác viên: Thêm người cùng theo dõi các ghi chú, cùng sửa đổi, cùng hoàn thành.
  7. Thay đổi màu: Nghe là hiểu rồi nhỉ 😀
  8. Thêm hình ảnh: Thêm hình ảnh vào Ghi chú để có thể tiện theo dõi, thảo luận, trao đổi, tương tác hơn.
  9. Lưu trữ: Khi một ghi chú hoàn thành, bạn có thể ấn Lưu trữ để tối ưu số lượng Ghi chú có trên Google Keep của bạn, nhiều sẽ loạn, sau này tìm vẫn ra!
  10. Thêm nhãn: Đánh dấu các ghi chú theo mức độ liên quan đến chủ đề, một dạng danh mục ghi chú, rất tiện nếu bạn muốn xem tập trung vào mục nhãn (danh mục) cụ thể
  11. Thêm bản vẽ: Thêm bản vẽ tay trên ghi chú để tương tác và thảo luận trên đó.
Keep.jpg (640×360)

Hướng dẫn sử dụng Google Keep hiệu quả

5. Case Study sử dụng Google Keep

Cách sử dụng

  • Áp dụng nguyên tắc đánh giá công việc, tạo các keep với mức độ quan trọng [PIN] và không quan trọng
  • Để phân loại hiệu quả: Tên Keep / màu săc / tag
  • Share cho người khác để cùng tương tác

TIPS

  • Liên tục note việc mới và checked việc đã hoàn thiện
  • Review mỗi sáng và mỗi tối trong ngày
  • Khi đã note việc lên: cần phải biết rõ lúc nào hoàn thành thì hợp lý, hoàn thành như
  • thế nào, và chất lượng hoàn thành ra sao.
  • Tạo 1 keep có title: “Việc trong ngày” – mọi việc trong ngày (only today) hãy note
  • vào đây và nghiêm túc với điều đó!!!
  • Sử dụng Google Header (hình ảnh đầu ghi chú) để tăng hiệu quả làm việc: https://meredithakers.com/2017/08/01/organizing-google-keep-with-headers/

Nguyên tắc chung

1. Hãy nhớ nguyên tắc đánh giá công việc:

Sử dụng Google Keep hiệu quả A-Z 5

Việc quan trọng là việc có ảnh hưởng trực tiếp tới công việc, đời sống cá nhân, gia đình, các mối quan hệ xã hội, và quyền lợi của bạn.

Việc gấp là việc cần phản hồi sớm trong tối đa 1 ngày, tùy vào yêu cầu phản hồi.

Ví dụ: 

  • Đi làm, có khách tiềm năng mới, luật của công ty là phải liên hệ không quá 3h đồng hồ kể từ khi khách liên hệ, đây là việc gấp.
  • 30p nữa bạn có lịch đi pitching 1 dự án lớn vài tỷ đồng – đây là việc quan trọng, tuy nhiên gia đình bạn lại đang xảy ra 1 sự cố và rất cần bạn có mặt – đây là việc gấp và quan trọng.
  • Có 1 email từ 1 ai đó gửi cho bạn để hẹn cafe – đây là việc không gấp và không quan trọng.

2. Hãy nhớ nguyên tắc ưu tiên công việc

Sử dụng Google Keep hiệu quả A-Z 6

Sức khỏe có thể không phải là tất cả, nhưng nếu thiếu sức khỏe thì tất cả không có ý nghĩa gì!

  1. Sức khỏe

(kaka phần này là quan điểm cá nhân thôi, anh chị em tùy biến thứ gì là quan trọng nhất với mình nhé, sức khỏe có thể cho xuống cuối cũng được :D)

CASE STUDY

1. Làm sau để follow tất tần tật việc trên Google Keep?

a. Hãy tạo Các nhãn theo chủ đề:

  • Việc cá nhân
  • Việc gia đình
  • Việc công ty (trong này có thể lại chia nhỏ ra nhiều nhanh nữa)

Sử dụng Google Keep hiệu quả A-Z 7

Ví dụ nhãn của mình…

b. Hãy lưu ý chỉ Ghim (PIN) những ghi chú quan trọng

c. Những công việc trong ngày, hãy tạo riêng 1 ghi chú là Việc trong ngày:

  • Mỗi đầu ngày hãy note tất cả việc cần làm vào đây
  • Mỗi cuối ngày hãy checked hết tất cả việc đã làm xong, chưa làm xong cần tính toán phân bổ về các ghi chú khác phù hợp hơn hoặc cam kết ngày hôm sau phải hoàn thành.

Sử dụng Google Keep hiệu quả A-Z 8

d. Tất cả các công việc không quan trọng, hãy cứ note ra nhưng đừng bao giờ ghim, cũng đừng bao giờ bỏ, vì đó là cơ hội.

2. Làm sao để quản lý một dự án trên Google Keep?

Đầu tiên chúng ta cần phải hiểu OKR là gì, bạn có thể xem thêm ở đây: https://hocvienagile.com/okr-la-gi/, nôm na là:

Tôi có một yêu cầu triển khai dự án với mục tiêu như thế này, anh tự bóc tách đầu việc, tự xác định thời gian, rồi anh hoặc người của anh tự làm. Luôn luôn nhớ rằng phải đảm bảo đúng deadline.

Nghe có vẻ quan liêu vl, nhưng thực sự OKR đã giúp các doanh nghiệp tiết kiệm vô cùng nhiều thời gian cũng như tăng khả năng sáng tạo lên max level. Tại sao vậy:

  • Vì OKR tập trung vào tính cam kết và những nỗ lực về thời gian cũng như hiệu suất
  • Vì OKR chỉ hiệu quả với người thực sự hiểu việc và biết phải bắt đầu từ đâu (thường chỉ work với ban lãnh đạo cấp cao của 1 doanh nghiệp ở VN)
  • VÌ OKR hướng đến một mục tiêu chung và tất cả cùng tự giác triển khai công việc của mình.

Vậy ứng dụng vào Google Keep như thế nào?

Khi bạn Start 1 dự án, hãy tạo 1 Keep (ghi chú) mới và invite (mời) tất cả người liên quan vào Keep đó.

  1. Tạo checklist các đầu việc và để tên người triển khai ở trước mỗi checklist, ví dụ: [DucNT] Hoàn thành Landing Page launching 1-11/2019
  2. Ai hoàn hoàn checklist nào thì check done vào đó.
  3. Mục tiêu cuối cùng là không còn checklist nào nữa -> ấn lưu trữ -> hoàn thành

3. Mua sắm hiệu quả hơn?

Chúng ta thường mua sắm vô tội vạ và trong nhất thời vì thích một món đồ theo cảm xúc mà chi tiêu không hợp lý. Google Keep giúp bạn được việc đó, hãy thử theo cách này:

  1. Tạo 1 Keep mới với tên Shopping Whistlist
  2. Hãy nhớ đừng bao giờ cho Keep này vào mục cần phải ghim
  3. Cứ khi nào bạn cần mua 1 món đồ gì hãy note nó ra + cả giá + link mua nhé -> note để đấy thôi
  4. Ít nhất 24h sau vào xem lại, nghĩ kỹ xem có thực sự cần mua không? -> Nếu cần hãy mua và check done, nếu không hãy cứ check done…
  5. Rồi để xem, sau 3 tháng bạn tiết kiệm được bao tiền 😀

Thực ra, còn cả trăm ngàn ví dụ nữa cơ, nhưng do mình ngại viết quá, không ngờ rằng bài viết này cũng ngốn hơn 2h đồng hồ của mình!!! Hy vọng nó đáng và hữu ích với anh chị em bạn bè!!!

Nếu các bạn cần viết thêm case study, hãy comment nhé, mình sẽ update trong thời gian sớm nhất. Chúc một ngày thật nhiều niềm vui ^^!

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

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

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

Thiết lập sự nghiệp mới tại Stratavo – Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Thiết lập sự nghiệp mới tại Stratavo - Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Đón đầu xu hướng công nghệ, Stratavo là công ty start up đang ngày càng khẳng định vị thế của bản thân trên thị trường với các sản phẩm phần mềm và dịch vụ Công nghệ cao cấp, trở thành “điểm đến” lý tưởng cho các lập trình viên phát triển tiềm năng. Cùng với sự ra đời của trung tâm công nghệ tại Thành phố Hồ Chí Minh và Đà Nẵng, Stratavo hứa hẹn là nơi thắp lên ngọn lửa nhiệt huyết cho các tài năng công nghệ tỏa sáng sự nghiệp.

Thiết lập sự nghiệp mới tại Stratavo - Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Góp mặt vào đường đua công nghệ, Stratavo không ngừng tăng tốc giành lấy ngôi vị dẫn đầu

Stratavo là startup trẻ đến từ xứ sở “Sương mù” (Vương quốc Anh), chuyên cung cấp các dịch vụ tư vấn công nghệ mới với các phần mềm và dịch vụ Cloud chất lượng, hướng đến việc kiến tạo một cuộc sống dễ dàng và tiện nghi hơn.

Sở hữu đội ngũ nhân viên đến từ nhiều quốc gia trên thế giới, yếu tố cốt lõi giúp gắn kết con người tại Stratavo chính là mục tiêu tạo ra những sản phẩm và dịch vụ tuyệt vời. Đối với mỗi thành viên tại Stratavo, đam mê chính là bí quyết giúp làm việc hăng say, không ngừng học hỏi và sẵn sàng vươn mình tỏa sáng.

Xây dựng một nền văn hóa đề cao sự tôn trọng và quyền tự chủ của mỗi nhân viên, Stratavo mang đến cho các “phần tử” tài năng của mình cơ hội bứt phá tài năng, vững bước trên con đường xây dựng sự nghiệp rực rỡ của bản thân.

Giờ đây, với sự phát triển không ngừng, Stratavo mở rộng thị trường và đồng thời trao cơ hội cho các tài năng công nghệ, những người với cùng niềm đam mê và lòng nhiệt huyết phát triển sự nghiệp rực rỡ tại trung tâm nghiên cứu của Stratavo.

Stratavo đang rộng cửa chào đón nhân tài công nghệ cùng phát triển và “chạm đích” thành công

Thiết lập sự nghiệp mới tại Stratavo - Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Và nếu bạn đã sẵn sàng để trở thành một phần quan trọng của Stratavo, chớ nên bỏ qua những vị trí hấp dẫn mà “ngôi nhà” Stratavo đang tìm kiếm:

Bạn tự tin với kỹ năng sáng tạo và giải quyết vấn đề xuất sắc cùng với khả năng quản lý con người? Các vị trí sau đây sẽ là sự lựa chọn tuyệt vời cho bạn tại bứt phá năng lực và đạt đến những giới hạn mới:

Bạn mong muốn tạo ra các thiết kế UX/ UI có tầm ảnh hưởng và mang lại trải nghiệm tuyệt hảo cho người dùng? Đừng ngại phát triển tài năng của mình với vị trí Senior English Speaking UX/UI Designer tại Stratavo để cùng nhau tạo nên những sản phẩm đỉnh cao.

Bạn vững vàng với 5 năm kinh nghiệm áp dụng công nghệ để giải quyết bài toán kinh doanh của khách hàng? Hãy để tài năng của bạn được đồng hành với sự phát triển của công ty, vị trí Senior English Speaking Solution Architect vẫn rộng mở cơ hội cho bạn.

Bạn tìm kiếm cơ hội tỏa sáng tài năng với những kiến thức và kinh nghiệm về OpenStack? Stratavo có ngay vị trí OpenStack Developer với nhiều dự án hấp dẫn, hứa hẹn là bệ phóng cho tài năng của bạn vươn tầm cao mới.

Bạn mong muốn phát triển các sản phẩm web nổi bật và sáng tạo? Cơ hội phát triển sự nghiệp tại vị trí Senior English Speaking Web & Graphic Designer đang rộng mở chào đón sự góp mặt của bạn.

Bạn có khả năng phân tách số liệu với lối tư duy logic? Vị trí Senior English Speaking Business Analyst tại Stratavo hứa hẹn là nơi giúp sự nghiệp bạn thăng hoa. Tài năng của bạn chính là yếu tố quan trọng góp phần cho những sản phẩm chất lượng của công ty. 

Chỉ cần bạn dám chấp nhận cùng Stratavo đương đầu với những thách thức sắp tới, những điều bạn sẽ nhận được tại đây là vô cùng xứng đáng. 

  • Đến với Stratavo, bạn được thỏa sức thể hiện tài năng, bởi mỗi đóng góp của bạn chính là chiếc chìa khóa để Stratavo ngày càng phát triển. 
  • Trải nghiệm cuộc sống hiện đại với các công cụ, thiết bị mới nhất. Bạn sẽ sẽ luôn được cập nhật các xu hướng hiện đại, tiên tiến về công nghệ.
  • Cơ hội làm việc cùng những người đồng đội thân thiện, trẻ trung, làm việc hết mình, ăn chơi hết mức và không quên hỗ trợ nhau cùng phát triển tốt hơn. Đội ngũ công nghệ hàng đầu với đội ngũ nhân viên giàu kinh nghiệm để hỗ trợ ứng viên mới Vận hành văn hóa học hỏi và cải tiến liên tục để cho phép …

Bên cạnh đó, những đãi ngộ cực tốt tại Stratavo sẽ giúp kích hoạt động lực trong bạn:

  • Về tay mức lương xứng đáng với năng lực lên đến $4,000 + lương tháng 13 hấp dẫn;
  • Trải nghiệm văn phòng đầy tiện ích với khu vực thư giãn, cà phê và trà miễn phí cùng hồ bơi tuyệt đẹp;
  • Phát triển sự nghiệp với nhiều cơ hội làm việc với các đối tác nước ngoài;
  • Và nhiều phúc lợi, đặc quyền hấp dẫn chờ bạn tại gia đình “Stratavo”.

“Lên dây cót” cho sự nghiệp mới và chiến ngay chờ chi!

 Nộp CV ngay hôm nay!

Làm thế nào để thiết lập kế hoạch nhân sự chuyên nghiệp?

freelancer IT
freelancer IT

Tháng 11 – 12 được xem là thời gian “vàng” để thiết lập kế hoạch tuyển dụng nhân sự.freelancer it hay bất kỳ một vị trí chuyên về tuyen dung it nào cũng cần đảm bảo một quy trình khoa học. Vậy đâu là một kế hoạch nhân sự chuyên nghiệp? Cùng TopDev tìm hiểu bài viết sau đây!

Nắm rõ thị trường và nhu cầu nguồn nhân lực

freelancer it
Tìm hiểu về nhu cầu nguồn nhân lực rất quan trọng.

Thị trường tuyen dung it luôn biến động. Ví dụ như việc các freelancer it ngày càng nhiều tạo ra sức ép cạnh tranh lớn. Freelancer it không chỉ cạnh tranh với các đối thủ thuộc cùng lĩnh vực freelancer it. Họ còn có những đối thủ là những ứng viên it với nhiều chuyên môn khác nhau. 

Ngoài ra, nhu cầu nguồn nhân lực lại rất quan trọng. Tăng – giảm, những biến động đều thể hiện nguồn nhân lực thay đổi ra sao. Vì thế, phòng kế hoạch nhân sự cần lập các kế hoạch tuyển dụng nhân sự.

Rà soát và tổng hợp nguồn dữ liệu liên quan: khối lượng công việc, mô tả công việc, chế độ lương thưởng,… Phân tích rõ về môi trường làm việc, các yêu cầu  – chính sách liên quan đến hợp đồng lao động, phúc lợi,… Tổng hợp nhu cầu tuyển dụng nhân sự từ các trưởng bộ phận/ phòng ban.

Để thiết lập một kế hoạch tuyển dụng nhân sự hoàn hảo, định hướng phát triển thật sự quan trọng. Do vậy, nên đặt nhu cầu nguồn nhân lực gắn liền với định hướng hoạt động. Từ cơ sở đó, xác định rõ các số lượng chi tiết về nhu cầu: số lượng nhân sự mới cần tuyển, chất lượng chuyên môn và các kỹ năng cần có; thời gian phù hợp để tuyen dung it.

Đánh giá “trình” tuyển dụng tại doanh nghiệp

Đây được xem là bước quan trọng của quy trình thiết lập kế hoạch nhân sự hiệu quả. 

freelancer IT
Liệu bạn có đánh giá chính xác Level tuyển dụng tại doanh nghiệp?

Ban nhân sự cần đánh giá lại tình hình chung cùa doanh nghiệp: Hệ thống nhân sự, cơ cấu doanh nghiệp gồm những ai? Liệu những nhân sự đều thật sự phù hợp với vị trí đó? Họ có sự thay đổi gì về sự thể hiện của bản thân?

Xem thêm các việc làm NTQ Solution tuyển dụng

Giải đáp những thắc mắc đó giúp bộ phận nhìn lại tổng quan đến chi tiết mỗi nhân viên trong tổ chức. Đồng thời, đó cũng là cách thức phù hợp giúp thiết lập một hệ thống tổ chức hoàn chỉnh hơn. Một điều lưu tâm là nhân sự nên xem xét vấn đề này trong cùng một khía cạnh về chế độ đãi ngộ, chính sách quản lý,..

Thách thức đặt ra – Bài toán tăng hay giảm nhân sự?

Từ những phân tích trên, các nguồn cứ liệu quan trọng đã được tập hợp. Bộ phận nhân sự bắt đầu xác định liệu nhân lực. Từ cơ sở đó, thực trạng thiếu hay thừa dựa trên hiệu suất của công việc.

freelancer IT
Vấn đề tăng hay gia giảm nhân sự là câu chuyện riêng của từng doanh nghiệp.

Các phán đoán, đề xuất và việc quyết định chính thức bổ sung hay cắt giảm đều dựa trên nguồn dự liệu thu thập. Ví dụ như tuyển dụng Data Scientist hay freelancer it.

Nhân sự cần đặt ta các cơ sở liệu có nên tuyển thêm họ không nếu có sự bất ổn định trong việc thực hiện các nhiệm vụ.

Triển khai kế hoạch thực hiện chiến lược

Một chiến lược phát triển kế hoạch tuyen dung it sẽ gồm các trình tự như sau:

– Đưa ra bản kế hoạch chi tiết tuyển dụng nhân viên:

+ Về số lượng, vị trí và các yêu cầu

+ Mô tả từng nhiệm vụ

+ Mức lương phù hợp, thời gian và hình thức tuyen dung it

+ Dự trù kinh phí

Ví dụ: một dự án đó cần bao nhiêu freelancer it, Senior Developer,…

– Phương án tái cơ cấu nhân sự: Phân bổ, sắp xếp lại nhân sự thuộc các phòng ban phù hợp với năng lực, kinh nghiệm, trách nhiệm.

– Kế hoạch, chỉ tiêu thăng tiến phù hợp với năng lực

– Vấn đề cắt giảm nhân sự: Đưa ra những cơ sở rõ ràng, có cơ sở pháp lý, tránh tranh chấp nảy sinh.

Đây là một kế hoạch dài hạn. Do vậy, nó cần đảm bảo tính khả thi. Bộ phận nhân sự cần thảo luận để đưa ra những đánh giá bổ sung. Mặt khác, nên có những back-up phù hợp để tối ưu hóa hiệu quả thực hiện dự án. Điều này có ý nghĩa rất quan trọng. Vì tổ chức cần theo dõi và tìm ra các rủi ro tiềm ẩn có thể xảy ra. Đồng thời, lên kế hoạch thiết lập các giải pháp hoàn thiện nhất trong các trường hợp thực tế không lý tưởng.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

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

Xem thêm việc làm Developers hàng đầu tại TopDev

Tại sao bạn lại muốn trở thành Product Manager?

product manager là gì
Tại sao bạn lại muốn trở thành Product Manager?

Tác giả: Dr. Nancy Li

Mục đích của nhà tuyển dụng khi đặt câu hỏi này với Product Manager là gì?

Lý do nhà tuyển dụng muốn hỏi bạn câu hỏi này là để tìm hiểu xem tại sao bạn muốn làm việc ở vị trí này, bạn sẽ làm gì để sử dụng những kinh nghiệm trước đây vào công việc Product Manager hiện tại. Nội dung bài viết này sẽ chia sẻ với bạn cách để trả lời câu hỏi “Lý do bạn muốn trở thành Product Manager là gì?” với những ứng viên chưa từng có kinh nghiệm.

Product Manager
Công việc của PM có sự kết hợp giữa business và tech

Cách trả lời giúp ứng viên ghi điểm với nhà tuyển dụng

Biết cách kết hợp giữa business và tech trong câu trả lời

Đầu tiên là bạn cần làm rõ vai trò quản lý sản phẩm chính là sự kết hợp giữa yếu tố kinh doanh và công nghệ. Vì một Product Manager cần làm việc với các kỹ sư phần mềm để build MVP và phát hành sản phẩm. Bên cạnh đó, bạn cũng cần phải trao đổi thường xuyên với bộ phận sales và marketing để lên ý tưởng cho chiến lược thị trường và lộ trình phát triển của tất cả các sản phẩm.

Chẳng hạn bạn có thể chia sẻ rằng “Cá nhân tôi đã có kinh nghiệm 5 năm làm việc ở vai trò là dev và cũng là một leader nên tôi đã có quen khi làm việc với những team khác như dev, marketing để tìm kiếm những kế hoạch tốt nhất cho lần phát hành sản phẩm sắp tới. Vậy nên tôi tin rằng mình chính là ứng viên phù hợp nhất nhờ khả năng teamwork với các bên liên quan khá tốt”.

  Bí kíp để trở thành một Product Manager giỏi
  Con đường trở thành Product Manager từ lập trình viên tại Amazon

Bạn thấy gì trong câu trả lời vừa rồi của tôi? Tôi vừa trình bày được Product Manager là gì, vừa giới thiệu được những kinh nghiệm mình có. Đó là cách PR bản thân tốt nhất để nhà tuyển dụng nhìn thấy tiềm năng trong bạn.

product manager tuyển dụng
Team work và nắm bắt nhanh suy nghĩ người khác giúp công việc PM trôi chảy hơn

Nêu được bản chất công việc của Product Manager là gì

Lấy ví dụ, Product Manager là một CEO của sản phẩm. Điều này đồng nghĩa với việc họ phải dẫn dắt và làm việc với các bên liên quan đa chức năng để phát hành sản phẩm ra thị trường.

Xem thêm Phỏng vấn Product Manager: Giới thiệu về bản thân sao cho ấn tượng?

“Vì tôi đã từng là một leader trong công việc trước đây nên tôi rất hứng thú với việc phát triển ý tưởng và làm việc với các bên để thực hiện nó. Bản thân tôi là một người có tư duy kinh doanh, vai trò quản lý sản phẩm có thể cho tôi cơ hội lên kế hoạch tăng doanh thu cho công ty. Cùng lúc đó, tôi cũng có thể quản lý nhiều công việc ở các bên khác. Do đó tôi nghĩ rằng cơ hội làm việc với vai trò là một Product Manager khiến tôi rất hứng thú.”

Thấu hiểu khách hàng

Khi lựa chọn chương trình Product Manager tuyển dụng của bất cứ công ty nào, bạn sẽ phải tiếp xúc thường xuyên với khách hàng và là người làm việc trực tiếp với họ cho một dự án.

“Tôi có khả năng nắm bắt được suy nghĩ của người khác. Tôi hiểu được khách hàng muốn gì và họ thật sự thích gì, nhờ vậy mà tôi biết cách để giải quyết vấn đề cho họ. Trở thành một Product Manager có thể cho tôi cơ hội gần hơn với khách hàng và phát hành một sản phẩm mà họ thật sự thích”.

Xem thêm các việc làm product manager lương cao cho bạn

product manager
PM cần nắm bắt tâm lí khách hàng

Rõ ràng với cách trả lời rõ ràng như thế này, bạn sẽ vừa thể hiện được hiểu biết của mình về trách nhiệm của một Product Manager là gì, lại vừa cho thấy nhiệt huyết và đam mê trong mong muốn được trở thành một Product Manager của bạn.

Kết luận

Quan trọng nhất là khi trả lời những câu hỏi như thế này, bạn nên thể hiện nhiều nhất những hiểu biết của mình về vị trí Product Manager và khẳng định được bản thân mình là ai, có thể đáp ứng được những gì mà vị trí này cần. Trên đây là một số chia sẻ về cách để trả lời phỏng vấn tạo ấn tượng nhất. Dù không quyết định tất cả nhưng nếu làm tốt ở vòng này sẽ mở ra cho bạn nhiều cơ hội để được nhận vào làm việc ở những công ty tốt, như các chương trình của KMS Technology tuyển dụng.

Bài viết được transcript từ video gốc

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

Xem thêm việc làm tuyển dụng IT hấp dẫn tại TopDev

Kiểm thử một đối tượng Textbox

Kiểm thử một đối tượng Textbox

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

Đối tượng textbox là một trong những đối tượng UI mà kỹ sư kiểm thử phần mềm hay tương tác nhất. Đối tượng này khá quan trọng vì nó cho phép người dùng nhập liệu dữ liệu xuống hệ thống, nên khả năng làm cho hệ thống không hoạt động như mong muốn ban đầu.

  4 lý do để VS Code là Text Editor ưa thích của mọi lập trình viên
  10 theme Sublime Text tốt nhất

Xác định loại hình của đối tượng textbox

Để có thể lên kế hoạch kiểm thử và viết kịch bản kiểm thử, trước hết, chúng ta cần xác định đối tượng textbox của chúng ta ở dạng như thế nào. Textbox không chỉ là một đối tượng UI đề người dùng nhập liệu đơn thuần, mà nó còn bao gồm cả định dạng cho dữ liệu được đưa vào phụ thuộc vào mục đích của đối tượng UI đó. Về cơ bản, chúng ta có một số loại textbox với định dạng như sau:

  • Dành cho tên – Chỉ được nhập ký tự alphabel
  • Dành cho số – Chỉ được nhập số
  • Dành cho địa chỉ – Được nhập cả số, ký tự alphabel và ký tự đặc biệt
  • Dành cho địa chỉ thư điện tử – Phải theo định dạng của thư điện tử
  • Dành cho mật khẩu – Không hiển thị giá trị nhập liệu
  • Textbox bất kỳ – Không giới hạn định dạng nhập liệu
  • Và cuối cùng, chúng ta không thể không để ý đến việc “bắt buộc phải có” (mandatory field) của đối tượng textbox.

Ý tưởng cho việc kiểm thử textbox

Sau khi chúng ta xác định được kiểu và định dạng của textbox, chúng ta có thể lên kế hoạch kiểm thử cho đối tượng này:

Đầu tiên, chúng ta phải tạo ra các dữ liệu kiểm thử – chấp nhận và không chấp nhận – cho textbox với câu hỏi “ký tự nào có thể nhập vào textbox này?

  • Về số, số tự nhiên, số nguyên hay số thập phân. Có thể nhập số logarit hay không. Có định dạng cho số nhập liệu hay không. Ví dụ như, nhập giá trị trên 1000 thì sẽ có dấu phẩy phần ngàn. Hoặc, có giới hạn (lớn nhất và nhỏ nhất) cho giá trị nhập liệu hay không.
  • Về ký tự, chúng ta cần xem xét đến độ dài của chuỗi được nhập liệu, có cho phép ký tự hoa, thường hay đặc biệt. Xa hơn, chúng ta cũng cần xem xét đến các chuỗi giá trị mã lập trình web hoặc java (trường hợp kiểm thử web) hoặc các giá trị SQL.

Sau khi xác định được dữ liệu kiểm thử, chúng ta có thể tiến hành kiểm thử với các cách nhập liệu khác nhau.

  • Gõ bàn phím: Cách này thì như bình thường rồi hen.
  • Sao chép và dán. Phương pháp này nên được kiểm thử hai chiều, đặc biệt là với textbox dành cho mật khẩu.
  • DragnDrop. Một số textbox hiện nay cho phép chúng ta dùng chuột để di chuyển một khối văn bản từ bên ngoài lên trên nó.

Bên cạnh đó, chúng ta cũng có thể kiểm thử vài trường hợp đặc biệt khác:

  • Dấu con trỏ được hiển thị trên textbox hay không
  • Dữ liệu sau khi nhập vào có được canh lề hay không
  • Textbox có chấp nhận giá trị rỗng hay không – Đặc biệt cho đối tượng được xác định là cần thiết – mandatory
  • Textbox có chấp nhận khoảng trống ở đầu và cuối của dữ liệu nhập vào hay không.

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

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

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

Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?

Loại bỏ các phần tử trùng trong một ArrayList như thế nào?

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

Trong bài viết Loại bỏ các phần tử trùng trong một ArrayList , tôi đã giới thiệu với các bạn các cách để loại bỏ phần tử trùng trong một ArrayList với Java <= 7. Trong bài này, tôi sẽ giới thiệu với các bạn một số cách khác với sự hỗ trợ của các tính năng mới trong Java 8.

Sử dụng phương thức distinct() trong Stream API

Phương thức distinct() trả về một Stream gồm các phần tử duy nhất, việc xác định các phần tử trùng lặp được so sánh theo theo phương thức Object.equals(Object).

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Đối với ordered Stream, thứ tự sắp xếp các phần tử là ổn định (stable) : đối với các phần tử trùng lặp, phần tử xuất hiện đầu tiên trong vùng gặp phải được giữ nguyên.

Đối với các unordered Stream, không đảm bảo tính ổn định (unstable) thứ tự các phần tử.

Ví dụ:

package com.gpcoder.remove_duplicate;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class RemoveDuplicateInArrayList1 {

    public static void main(String[] args) {
        List listWithDuplicateElements = new ArrayList();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");

        List listWithoutDuplicateElements = listWithDuplicateElements
                .stream()
                .distinct()
                .collect(Collectors.toList());
        System.out.println(listWithoutDuplicateElements); // [JAVA, J2EE, JSP, SERVLETS, STRUTS]
    }
}

Sử dụng phương thức removeIf()

Phương thức removeIf() : chấp nhận đối số là 1 Predicate, nó loại bỏ tất cả các phần tử của Collection thỏa mãn điều kiện đã cho.

Ý tưởng cách này là lợi dụng tính năng không chứa phần tử trùng của HashSetLinkedHashSet để kiểm tra tồn tại và loại bỏ phần nó.

Ví dụ:

package com.gpcoder.remove_duplicate;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class RemoveDuplicateInArrayList2 {

    public static void main(String[] args) {
        List listWithDuplicateElements = new ArrayList();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");

        Set elementsAlreadySeen = new LinkedHashSet<>();
        listWithDuplicateElements.removeIf(s -> !elementsAlreadySeen.add(s));
        System.out.println(elementsAlreadySeen); // [JAVA, J2EE, JSP, SERVLETS, STRUTS]
    }
}

Sử dụng phương thức collect() với Collectors.toCollection

Phương thức collect() chấp nhận đối số là một Collector. Trong Java 8, chúng ta có thể sử dụng phương thức Collectors.toCollection() để tạo ra Collector. Phương thức này, chấp nhận đối số là Supplier. Ý tưởng cách này cũng là lợi dụng tính năng không chứa phần tử trùng của HashSetLinkedHashSet / TreeSet.

Ví dụ bên dưới dùng để loại bỏ các sinh viên có cùng email với TreeSet.

package com.gpcoder.remove_duplicate;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

class Student {
    private String name;
    private String email;

    public Student(String name, String email) {
        super();
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", email=" + email + "]";
    }
}

public class RemoveDuplicateInArrayList3 {

    public static void main(String[] args) {
        List studentsWithtDuplicate = new ArrayList<>();
        studentsWithtDuplicate.add(new Student("Nguyen Nhat", "nguyennhat@gmail.com"));
        studentsWithtDuplicate.add(new Student("Le Van", "levan@gmail.com"));
        studentsWithtDuplicate.add(new Student("Tran Khoa", "trankhoa@gmail.com"));
        studentsWithtDuplicate.add(new Student("Le Vo", "levan@gmail.com"));
        studentsWithtDuplicate.add(new Student("Ly Nguyen", "lynguyen@gmail.com"));

        Set studentsWithoutDuplicate = studentsWithtDuplicate.stream()
                .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getEmail))));
        studentsWithoutDuplicate.forEach(s -> System.out.println(s));
    }
}

Output của chương trình:

Student [name=Le Van, email=levan@gmail.com]
Student [name=Ly Nguyen, email=lynguyen@gmail.com]
Student [name=Nguyen Nhat, email=nguyennhat@gmail.com]
Student [name=Tran Khoa, email=trankhoa@gmail.com]

Trong thực tế, người ta thường sử dụng phương thức distinct() để loại phần tử trùng. Sử dụng removeIf() hay collect() không tốt về performance so với distinct() và nó trả về một Set thay vì List như mong muốn, cần phải chuyển Set sang List. Tuy nhiên trong một số trường hợp chúng ta cũng có thể sử dụng cách này, nên tôi cũng giới thiệu với các bạn để thêm lựa chọn khi sử dụng.

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

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

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

Làm việc với cơ sở dữ liệu trong Laravel

Làm việc với cơ sở dữ liệu trong Laravel

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

Trong rất nhiều các bài viết trước, chúng ta phải thực hiện việc cập nhật dữ liệu vào cơ sở dữ liệu một cách giả tưởng. Chờ đợi và giờ là lúc chúng ta cùng tìm hiểu làm việc với CSDL trong Laravel.

Nếu như bạn đã từng lập trình PHP hoặc các ngôn ngữ khác, kết nối đến CSDL là một trong những việc quan trọng, phần lớn các project đều phải có CSDL chứa dữ liệu cho dự án. Làm việc với CSDL trong Laravel hết sức đơn giản, Laravel hiện đang hỗ trợ 4 loại CSDL phổ biến hiện nay: MySQL (Oracle) đã chuyển lên MariaDB, Postgres, SQLite, SQL Server (Microsoft). Laravel hiện chưa hỗ trợ kết nối đến CSDL Oracle, tuy nhiên có rất nhiều các gói thư viện hỗ trợ kết nối đến Oracle trên Github, tôi sẽ có một bài riêng về Làm việc với CSDL Oracle trên Laravel.

Truy vấn đến CSDL trong Laravel có 3 phương thức là truy vấn SQL thuần túy, sử dụng Query Builder và sử dụng Laravel Model (Eloquent ORM). Trong bài viết này chúng ta sẽ tập trung vào cấu hình kết nối Laravel đến CSDL và sử dụng truy vấn SQL thuần túy để truy xuất dữ liệu.

Tìm việc làm Laravel lương cao đến 2000 USD

Thiết lập cấu hình kết nối cơ sở dữ liệu trên Laravel

Trong bài viết Thiết lập cấu hình Laravel chúng ta cũng đã nói sơ qua về cấu hình kết nối CSDL, tất cả các thiết lập kết nối CSDL được đưa vào trong file config/database.php và kết hợp cùng với các biến môi trường được thiết lập trong file .env ở thư mục gốc của project. Ví dụ về một thiết lập trong .env và config/database.php:

DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE='adshare'
DB_USERNAME='admin'
DB_PASSWORD=secret
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
  ...

        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'adshare'),
            'username'  => env('DB_USERNAME', 'admin'),
            'password'  => env('DB_PASSWORD', '12345678'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
  ...
],

Laravel hỗ trợ các kiến trúc đa máy chủ CSDL, ví dụ trong hệ thống máy chủ đã định sẵn một máy chủ CSDL chuyên cho các tác vụ đọc dữ liệu và một máy chủ CSDL khác chuyên cho tác vụ ghi dữ liệu, chúng ta có thể thiết lập cấu hình như sau:

'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
  ...

        'mysql' => [
            'read' => [
                'host' => '192.168.1.1',
            ],
            'write' => [
                'host' => '196.168.1.2'
            ],
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'adshare'),
            'username'  => env('DB_USERNAME', 'admin'),
            'password'  => env('DB_PASSWORD', '12345678'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
  ...
],

Các tác vụ đọc dữ liệu sẽ được chuyển đến máy chủ 192.168.1.1 và ghi dữ liệu được chuyển đến 192.168.1.2. Ngoài ra Laravel còn cho phép kết nối đến nhiều CSDL đồng thời, sử dụng phương thức connection() với tham số truyền vào là tên connection được khai báo trong config/database.php.

$users = DB::connection('foo')->select(...);

Raw SQL query trong Laravel

Facade DB cung cấp các phương thức để thực hiện truy xuất dữ liệu như sau: select(), insert(), update(), delete() và statement(). Chúng ta sẽ tìm hiểu lần lượt từng phương thức này.

Phương thức select()

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Danh sách người dùng trong hệ thống
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::select('select * from users where active = ?', [1]);

        return view('user.index', ['users' => $users]);
    }
}

Tham số thứ nhất của select() là một câu truy vấn SQL thuần túy, tham số thứ hai là các giá trị cần đưa vào câu truy vấn. Phương thức này sẽ trả về một mảng, mỗi kết quả trong mảng là một đối tượng StdClass trong PHP, để truy xuất vào các giá của kết quả sử dụng cú pháp như ví dụ dưới:

<table>
    <tr>
        <th>User ID</th>
        <th>User name</th>
    </tr>
@foreach($users as $user)
    <tr>
        <th>{{ $user-> id }}</th>
        <th>{{ $user->name }}</th>
    </tr>
@endforeach
<table>

Với id, name là các trường trong bảng users trong CSDL. Để truyền giá trị vào trong một câu truy vấn sử dụng ?, ví dụ:

$results = DB::select('select * from users where email = :email', ['email' => 'myemail@gmail.com']);

Phương thức insert()

Thực hiện đưa một bản ghi vào một bảng trong CSDL

DB::insert('insert into users (id, name) values (?, ?)', [13, 'FirebirD']);

Phương thức update()

Sử dụng để cập nhật dữ liệu vào một bản ghi có sẵn trong CSDL.

$updated = DB::update('update users set name = 'Đặng Kiên' where id = ?', [13]);

Phương thức delete()

Xóa các bản ghi khỏi CSDL

$deleted = DB::delete('delete from users where active = 0');

Phương thức statement()

Sử dụng để chạy bất kỳ một câu lệnh SQL nào.

DB::statement('drop table users');

Ví dụ sử dụng raw SQL query trong Laravel

Chắc bạn đang chờ đợi đến phần ví dụ, chúng ta quay lại với ví dụ đăng ký thành viên trong bài Laravel Form validate kiểm soát thông tin nhập liệu. Trong ví dụ này, chúng ta chưa làm gì ở phần lưu thông tin người dùng vào CSDL. (Bạn nào mới nên đọc lại Laravel Form validate kiểm soát thông tin nhập liệu để xem ví dụ đang làm đến đâu) Đầu tiên chúng ta thực hiện tạo một database tên laravel-test và tạo một bảng users như sau:

Làm việc với cơ sở dữ liệu trong Laravel

 Tạo bảng users

Làm việc với cơ sở dữ liệu trong Laravel

Ok, tiếp theo cấu hình kết nối đến database. Mở file config/database.php và thiết lập:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'laravel-test',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],

Vì cài đặt trên máy dev, tôi vẫn để user root có mật khẩu mặc định là rỗng, để cấu hình cho nhanh đưa hết cấu hình vào config/database.php mà không qua file .env. Tiếp theo, chúng ta cập nhật phương thức storeUser() trong UserController (xem file app\Http\Controllers\UserController.php).

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Validator;
use DB;

class UserController extends Controller
{
    //
    public function showRegisterForm(){
      return view('fontend.register');
    }

    public function storeUser(Request $request){
      //dd($request->all());

      $messages = [
        'required' => 'Trường :attribute bắt buộc nhập.',
        'email'    => 'Trường :attribute phải có định dạng email'
    ];
    $validator = Validator::make($request->all(), [
            'name'     => 'required|max:255',
            'email'    => 'required|email',
            'password' => 'required|numeric|min:6|confirmed',
            'website'  => 'sometimes|required|url'

        ], $messages);

        if ($validator->fails()) {
            return redirect('register')
                    ->withErrors($validator)
                    ->withInput();
        } else {
          // Lưu thông tin vào database, phần này sẽ giới thiệu ở bài về database
          $name = $request->input('name');
          $email = $request->input('email');
          $password = $request->input('password');
          $website = $request->input('website');

          DB::insert('insert into users (name, email, password, website) values (?, ?, ?, ?)', [$name, $email, $password, $website]);
          return redirect('register')
              ->with('message', 'Đăng ký thành công.');
        }
    }

}

Truy cập http://laravel.dev/register và nhập thông tin đăng ký

Làm việc với cơ sở dữ liệu trong Laravel

Click đăng ký sau đó mở bảng users chúng ta thấy dữ liệu đã được cập nhật vào CSDL.

Làm việc với cơ sở dữ liệu trong Laravel

  Các Laravel route tips giúp bạn cải thiện routing
  Cách sử dụng Laravel với Socket.IO

Quản lý transaction trong CSDL

Giao dịch (transaction) là một nhóm các hành động có thứ tự trên CSDL nhưng lại được người dùng xem như là một đơn vị thao tác duy nhất. Ví dụ: một giao dịch thanh toán trực tuyến cho một món hàng trên mạng sẽ bao gồm nhiều hành động trên CSDL:

  • Trừ tiền từ tài khoản người dùng.
  • Cộng tiền vào tài khoản nhà cung cấp.
  • Giảm số lượng hàng trong kho.

Khi đó, bất kỳ một hành động nào bị lỗi sẽ dẫn đến giao dịch lỗi. Trong thực tế khi lập trình, người ta thường nhóm các nhiều các hành động trên CSDL vào thành một nhóm và thực hiện chúng như một giao dịch, nếu một hành động lỗi, hệ thống sẽ thực hiện các lệnh sao cho quay về trạng thái ban đầu (rollback). Laravel cũng hỗ trợ quản lý transaction, thực hiện chúng khá đơn giản với cú pháp:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
}, 5);

Chú ý tham số thứ 2 của phương thức transaction() là số lần thử thực hiện lại khi gặp tình trạng deadlock. Ngoài ra bạn có thể thao tác quản lý transaction một cách thủ công như khi nào mới rollback hoặc khi nào mới commit một cách tùy ý:

DB::beginTransaction();
// Bắt đầu các hành động trên CSDL

...
//Gặp lỗi nào đó mới rollback
DB::rollBack();
...

//Commit dữ liệu khi hoàn thành kiểm tra
DB::commit();

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

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

Xem thêm Việc làm it hồ chí minh hấp dẫn trên TopDev

Tổng hợp một số mẫu CV đẹp mắt dành cho lập trình viên

tuyen dung it da nang
tuyen dung it da nang

CV được xem là vũ khí bí mật để giúp bạn ghi điểm với các nhà tuyển chọn. Vậy thế nào là một CV IT chuẩn? Cùng TopDev điểm qua một số mẫu CV đẹp chất nhờ vào sự đẹp mắt và tính chuyên nghiệp. Đây sẽ là những CV đẹp giúp các bạn nổi bật hơn trong mắt các nhân sự của các công ty tuyển dụng.

Mẫu CV tuyển dụng được thiết kế phong cách

Nếu bạn là một tín đồ của sự sáng tạo thì mẫu CV này thật sự dành cho bạn. Với những mẫu thiết kế đậm tính thời trang, bạn hoàn toàn dễ dàng chiếm cảm tình từ nhà tuyển dụng.

mẫu CV

Với đặc trưng về màu sắc, đường nét và hiệu ứng khác nhau, đây là mẫu CV phù hợp với những con người về nghệ thuật như nhà thiết kế, nhiếp ảnh gia, nhà sáng tạo nội dung,…

mẫu CV

Bố cục được sắp xếp một cách khá khoa học với sự sắp xếp không gian, thứ tự về kiểu chữ, từ ngữ, nội dung thông tin. Bạn có thể dễ dàng chỉnh sửa hoặc thêm những nội dung bất kỳ.

Tạo CV IT chuẩn ATS miễn phí trên TopDev

Mẫu CV/Resume A4 hiện đại được thiết kế gọn gàng và tỉ mỉ

Đây được xem là mẫu CV được sử dụng ưa chuộng vì tính chuyên nghiệp của nó. 

Mẫu CV tuyển dụng
M3 – mẫu CV đẹp

Nhiều doanh nghiệp không quá để tâm đến việc một CV quá được trang trí về hình thức mà chỉ cần đảm bảo CV chuẩn format, đủ nội dung. Dù cho bạn ứng tuyển bất kỳ vị trí nào trong các tổ chức với mô hình hoạt động ra sao thì mẫu CV này vẫn đáp ứng ứng được nhu cầu và tiêu chuẩn chung.

Mẫu CV tuyển dụng
M4 – mẫu CV IT đẹp

Mẫu CV tuyển dụng thiết kế kết hợp

Nếu tạo ra sự phá cách và nổi bật, bạn có thể sử dụng kiểu CV này.  Đây là mẫu CV có thiết kế chữ cái bìa giúp bạn để một ấn tượng khó quên đối với các nhà tuyển dụng các lập trình.

Mẫu CV tuyển dụng
M5 – tuyen dung it da nang

Việc lựa chọn mẫu CV còn phụ thuộc vào yêu cầu từng trị vị khác nhau như tuyển dụng Data Scientist, freelancer it; sở thích và mục đích cá nhân của từng ứng viên. TopDev giới thiệu đến bạn giải pháp hỗ trợ bạn thiết kế CV hiệu quả, đơn giản và nhanh chóng mang tên TopCV – Online. Nền tảng đang từng bước hoàn thiện và phát triển nhiều hơn.

TopDev hy vọng, các bạn sẽ có những thông tin bổ ích. Từ đó, chuẩn bị cho mình một CV thật chuyên nghiệp. Hy vọng các bạn sẽ chinh phục thành công nhà tuyển dụng it da nang.

Tải ngay những mẫu CV đẹp dành cho lập trình viên tại đây

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

Xem thêm tuyển dụng ngành IT hàng đầu tại TopDev

Xu Hướng Kiểm Thử Phần Mềm

Xu Hướng Kiểm Thử Phần Mềm

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

Cũng như các lĩnh vực công nghệ sôi động khác, software development và cụ thể là ngành công nghiệp software testing thay đổi từng ngày. Là một tester, bạn cần phải cập nhật những kiến thức gì để tiếp tục làm chủ cuộc chơi? Thức xin chia sẻ một số xu hướng Kiểm Thử Phần Mềm mới để các bạn testers có thể “sharpen the saw”.

Blockchain app testing

Bạn có lẽ đã nghe nhiều về Bitcoin, Ethereum và Blockchain. Những buzzwords đang làm mưa làm gió những năm gần đây, đặc biệt là năm 2017 vừa qua. Ngày càng có nhiều các khoản đầu tư đổ dồn vào việc phát triển các ứng dụng dựa trên Blockchain. Điều này đồng nghĩa với nhu cầu kiểm thử các ứng dụng dựa trên Blockchain ngày càng tăng và càng cấp thiết. Bạn đã sẵn sàng kiểm thử ứng dụng blockchain chưa?

  Các mức độ kiểm thử được sử dụng trong kiểm thử chức năng của một phần mềm
  Kịch bản kiểm thử trang Login

Expert Tip: “Mastering Bitcoin: Unlocking Digital Cryptocurrencies” của Andreas Antonopoulos là quyển sách rất đáng đọc nếu bạn vừa bắt đầu tìm hiểu về Blockchain. Quyển sách cung cấp những lý giải và ví dụ đơn giản dễ hiểu về Bitcoin, ứng dụng đầu tiên và lớn nhất của Blockchain up to now.

Smart product testing

Các thiết bị có cảm biến (đồ chơi thông minh như Anki Overdrive), các thiết bị dựa trên giọng nói & Artificial Intelligence như Amazon Alexa đang ở giai đoạn hưng thịnh. Hàng triệu thiết bị Amazon Echo và Google Home đã được sản xuất và tung ra thị trường. Trong năm nay, các nhà nghiên cứu dự đoán sẽ có 24.5 triệu sản phẩm voice-based được bán ra thị trường. Gartner dự đoán thị trường sản phẩm thông minh toàn cầu sẽ đạt 2 tỷ USD vào năm 2020. Đây là cơ hội vô cùng to lớn cho cả developers và testers.

Expert Tip: Bạn có thể bắt đầu học cách viết “skills” (tên gọi khác của apps trên Alexa Marketplace) bằng việc đăng ký tài khoản Amazon Webservices (free, bạn chỉ cần cung cấp số thẻ tín dụng) và viết ngay một Lambda function (guide). Kiến thức về cloud services là nền tảng cơ bản của smart product testing.

More test automation

Công việc dành cho Manual testers ngày càng ít đi. Lĩnh vực kiểm thử phần mềm đòi hỏi testers phải có nhiều kỹ năng technical hơn như khả năng tạo ra các framework kiểm thử tự động.

Expert Tip: Nếu bạn đang là Manual tester, vẫn chưa muộn để bắt đầu học Test Automation hôm nay. Bạn có thể tham khảo guideline này: http://qr.ae/TbSswT

Wiring automated tests into the pipelines

Trong thế giới DevOps ngày nay, các bản hotfixes và features mới được liên tục released trực tiếp cho người dùng cuối (continuously). Sẽ là thảm họa nếu sản phẩm không được kiểm thử một cách chu đáo (regression test). Nhưng con đường để đạt được Continuous Testing không phải là đơn giản.

Expert Tip: Bạn không cần phải là chuyên gia về code để có thể ráp nối automated tests của bạn vào trong pipeline. Hầu hết các tools như Jenkins, Concourse, TFS… đều hỗ trợ giao diện command line.

Service-oriented testing

Đây không phải là trend quá mới của năm 2018. Xu hướng này đã bắt đầu từ rất lâu: số lượng API tests tăng lên trong khi GUI testing tiếp tục giảm. API testing rõ ràng là sâu hơn (để tìm lỗi), chạy nhanh hơn và đáng tin cậy hơn.

Expert Tip: Hãy bắt đầu nghiên cứu cách sự dụng những REST endpoints bằng tools như POSTMAN hoặc curl ngay hôm nay. Ngoài việc thấu hiểu cách sử dụng REST API, bạn nên tìm hiểu thêm về cách viết API test bằng RestAssured.

Involvement of non-engineering testers

Ngày càng nhiều “test analysts” hoặc “domain experts” tham gia vào quá trình kiểm thử phần mềm mặc dù họ không có nền tảng kỹ thuật. Xu hướng này đòi hỏi một scripting language hiệu quả, để những testers không có nền tảng kỹ thuật có thể đọc hiểu, tạo và chạy automated tests.

Expert Tip: Tập trung vào business flows và logics của phần mềm bạn đang test thay vì code. Hãy để việc code những test cases đó cho các chuyên gia automation. Ngoài ra, hãy làm quen với phương pháp kiểm thử keyword-driven. Đây là giải pháp để non-technical testers có thể hợp tác hiệu quả với automation experts.

Lời Kết

Các xu hướng kiểm thử phần mềm này sẽ là trọng tâm cho sự phát triển của lĩnh vực kiểm thử phần mềm trong những năm tiếp theo. Để bắt kịp các xu hướng thay đổi thường xuyên của software testing, bạn có thể đọc một số kênh thông tin dưới đây. Thứ tự sắp xếp chỉ là quan điểm cá nhân của tác giả. Các bạn VNTesters có thể bổ xung hoặc điều chỉnh bằng cách để lại bình luận.

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

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

Xem thêm IT jobs for Developer hấp dẫn trên TopDev

Một vài khái niệm cơ bản về HTTP dành cho các tester

Một vài khái niệm cơ bản về HTTP dành cho các tester

Bài viết được sự cho phép của tác giả Vân Anh

Lâu rồi mới trở lại, vì dạo này mình bận quá bận, lại mới hồi sức nên đã bị chậm tiến độ cam kết khá là nhiều. Hic. Nên hôm nay quyết định quay trở lại với chủ đề không mới, cũng không cũ lắm. Hehe, tuy nhiên tổng hợp lại kiến thức cũng hay mà. 😀

HTTP là gì?

HTTP là viết tắt của từ Hypertext Transfer Protocol – Giao thức truyền siêu văn bản.

HTTP là một giao thức giao tiếp, được sử dụng để gửi và nhận các trang web, các tập tin thông qua internet.

HTTP làm việc bằng cách sử dụng một tác nhân người dùng (có thể là một trình duyệt nào đó) để kết nối tới một máy chủ. Máy chủ này phải được xác định vị trí bằng cách sử dụng một URL hoặc URI. Địa chỉ này luôn bao gồm các ký tự http:// ở đầu. Và thường kết nối tới cổng 80 trên một máy tính cụ thể nào đó.

Tuyển nhân viên tester từ các công ty tập đoàn

HTTPS là gì?

HTTPS là viết tắt của từ Hypertext Transfer Protocol Secure – Giao thức truyền siêu văn bản an toàn. Với giao thức này thì đường truyền sẽ được bảo mật an toàn hơn so với HTTP và URL sử dụng sẽ được bắt đầu với cú pháp https://. HTTPS sẽ thực hiện mã hóa tất các các thông tin được nhận và gửi đi. Do đó có thể ngăn chặn người dùng không tin cậy, có ý đồ xấu như việc  các tin tặc đánh cắp thông tin của người dùng, đặc biệt trong các ứng dụng thanh toán. HTTPS sử dụng cổng 443 để giao tiếp thay vì sử dụng cổng 80 như HTTP.

Một HTTP Request là gì?

Sử dụng HTTP là một cách để truyền tin từ một máy tính sang một máy tính khác thông qua internet.

Một HTTP request được gửi tới một địa chỉ URL cụ thể, và sẽ bao gồm một Động từ, một bộ HTTP Header và Body/ hoặc Payload.

Một ví dụ về HTTP request:

GET https://www.testingexcellence.com/ HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/plain
Host: testingexcellence.com
User-Agent: Apache-HttpClient/4.5.4 (Java/1.8.0_144)
Accept: text/html,application/xhtml+xml

URL

URL – viết tắt của từ Uniform Resource Locator là một địa chỉ mà chúng ta sử dụng để truy cập tới một website hay một ứng dụng web nào đó. Các URL chúng ta biết đến thường sử dụng để dẫn đến các trang web (http), nhưng cũng có thể được sử dụng cho truyền file (ftp), email (mailto), và các ứng dụng khác.

Hầu hết các trình duyệt web hiển thị URL của trang web ở phía bên trên của trang trên thanh địa chỉ. Một ví dụ về địa chỉ URL điển hình có thể thấy như http://www.abc.com/index.html : ở đây ta có 1 giao thức là http, 1 hostname là http://www.abc.com và một tên file là index.html

Các động từ Request ( Request verb)

Request Verb – là một số động từ chỉ những loại yêu cầu cụ thể nào đó mà các bạn cũng đã khá là quen thuộc như GET, POST, PUT, DELETE.

Một trình duyệt web sẽ thường tạo ra các GET, POST request khi làm việc với các API HTTP, các động từ HTTP thường sử dụng thì có GET, POST, PUT, DELETE.

GET, giống như tên gọi của nó, get là lấy về. Nó sẽ gửi yêu cầu để lấy tài nguyên hoặc đọc thông tin từ máy chủ. Ví dụ là khi ta click vào một link nào đó. Ta có thể nhìn thấy Request GET trên thanh địa chỉ của trình duyệt.

POST, bên cạnh việc lấy thông tin về local, thì POST giúp chúng ta gửi, cung cấp thông tin đến máy chủ, ví dụ việc gửi thông tin đăng nhập hoặc các thông tin trong form đăng ký chẳng hạn. Để tạo một thực thể, chúng ta cần sử dụng POST request. Các POST request sẽ không được hiển thị trên thanh địa chỉ của trình duyệt.

PUT, được sử dụng để gửi yêu cầu cập nhật thông tin trên server. Ví dụ như việc một người dùng đã tồn tại trên hệ thống gửi thông tin cập nhật cho password của mình, lúc này PUT request sẽ được sử dụng để thực hiện việc này.

DELETE, được sử dụng để gửi yêu cầu xóa thông tin trên server.

POST và PUT request sẽ thường có body request. Còn đối với GET và DELETE thì không có.

Request Headers (Tiêu đề của yêu cầu)

Request headers xác định một số thông tin cụ thể như loại trình duyệt, loại nội dung trong message và loại phản hồi nào được chấp nhận.

Một ví dụ về Request Headers:

Content-Type: text/plain
User-Agent: Apache-HttpClient/4.5.4 (Java/1.8.0_144)

Request Body / Payload

Một Playload là phần thân của 1 HTTP request hoặc response.

Một request body có thể là một đoạn text thuần túy, HTML, XML, JSON, Javascript, hoặc một tập các cặp key-value dạng form-data.

Khi bạn mở một web, trình duyệt sẽ nhận payload dạng HTML, nó chính là giao diện mà chúng ta quan sát được trên trình duyệt đó.

Thông thường khi làm việc với các HTTP APIs chúng ta sẽ gửi và nhận các payload dạng JSON hoặc XML.

Không phải tất cả các message HTTP đều phải có payload: POST và PUT có thể có, còn với GET và DELETE thì có thể không có payload.

  Hiểu hơn HTTPS với bồ câu đưa thư
  HTTP là gì? Các khía cạnh cơ bản của HTTP

Một HTTP Response là gì?

Khi một request được gửi đến server, thì server sẽ gửi lại phản hồi cho request đó. Phản hồi từ server sẽ báo cho bạn biết khi request được gửi thành công hay nó đã xảy ra một vấn đề abcd nào đó.

Một phương thức HTTP response được cấu thành từ 3 thành phần: Response status coderesponse headersresponse body, môm na theo tiếng Việt nó là Mã trạng thái phản hồi, tiêu đề phản hồi và phần thân của phản hồi.

Một ví dụ về response:

HTTP/1.1 200 OK
Content-Length: 859
Content-Type: text/html; charset=utf-8
Date: Fri, 23 Feb 2018 14:38:21 GMT
Server: Werkzeug/0.14.1 Python/3.6.3

Response Status Codes (Mã trạng thái phản hồi)

Dưới đây là một số mã phản hồi phổ biến mà chúng ta có thể gặp như:

  • 2xx đại diện cho trạng thái thành công. Thường thấy nhất là code 200 có nghĩa là OK.
  • 3xx đại diện cho việc Chuyển hướng,  và một trong số những code phổ biến là 301 và 303 lần lượt có nghĩa là Chuyển hướng vĩnh viễn hoặc Chuyển hướng bởi lý cho chưa xác định.
  • 4xx để đại diện các vấn đề do ứng dụng lỗi, hai trong số các mã phổ biến mà bất cứ ai trong chúng ta đã từng gặp ít nhất một lần trong đời =)) là 403 và 404 do “Forbidden” và “Not Found”.  Nôm na tiếng Việt là bạn đang truy cập vào một trang bị cấm hoặc trang bạn muốn truy cập không thể tìm được ra :v
  • 5xx mô tả cho trường hợp lỗi máy chủ, đỡ quê hơn thì dùng tiếng Anh là “Server Error”, và một trong số những code phổ biến nhất là mã 500 có nghĩa là “Server Error” :))))

API là gì?

API là Application Programming Interface -.- nôm na google dịch thì là Giao diện lập trình ứng dụng. Đây là giao diện dành cho các ứng dụng, được thiết kế cho các hệ thống máy tính khác sử dụng. Khác với GUI là giao diện người dùng, được thiết kế để cho người sử dụng.

Hầu hết các API hiện đại đều dựa trên HTTP và được sử dụng để truy cập các ứng dụng web được triển khai cho các máy chủ có thể truy cập qua Internet.

Web Service là gì?

Các ứng dụng được truy cập thông qua API HTTP thường được gọi là Web Service. Nói cách khác, một Web Service là một chức năng có thể được truy cập bởi các chương trình khác trên web (HTTP).

Sẽ có bài viết khác chuyên sâu hơn về Web Service, nếu bạn nào nôn nóng quá có thể tham khảo bài viết về Web Service phiên bản tiếng Anh tại đây nhé. Hoặc tiếng Việt cũng có rất nhiều bài viết chi tiết và đầy đủ về Web Service, gõ nhẹ Google là ra liền ah.

JSON là gì?

JSON – Khái niệm nghe khá là nhiều rồi đúng không, nó là viết tắt của cụm JavaScrip Object Notation và là một cách biểu diễn văn bản, cũng là một mã JavaScript hợp lệ. Đặc biệt có nhiều cách đọc :)) Cũng tìm kiếm Google để xem mọi người trên thế giới phát âm nó như thế nào nha :v

{
   "employers":{
      "employee":[
         {
            "id":1,
            "name":"Dan Brown",
            "position":"Director",
            "status":"active",
         }
      ]
   }
}

JSON có thể được coi là một tập hợp các cặp khóa / giá trị phân cấp, trong đó giá trị có thể là:

  • Object (Đối tượng) – Được đặt trong dấu { and }
  • Array (Mảng)  – Được đặt trong dấu [ and ]
  • String (Kiểu chuỗi) – Được đặt trong dấu ” and “
  • Integer (Kiểu số)

Một mảng là một danh sách các đối tượng hoặc các cặp key/ value. Các key là các giá trị String , theo ví dụ bên trên ta có các key như: “employee”, “id”, “name”…

—–

Bài viết tranh thủ dịch từ  Tiếng Anh, mỗi ngày được một đoạn nho nhỏ, nếu có lỗi đâu đó rất mong các bạn góp ý giúp mình nha. Hihi

Bản gốc tại: https://www.testingexcellence.com/http-basics/

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

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

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

Đua tốc độ với Protoco Buffer

Đua tốc độ với Protoco Buffer

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

Vốn là một thằng đam mê tốc độ, chạy xe 80,90km/h trên cao tốc như cơm bữa, trong quá trình học tập mình luôn giành thời gian tìm hiểu xem có giải pháp nào nhanh hơn giải pháp hiện tại không ? Và đương nhiên sẽ đánh đổi lại bằng nhiều như điển hình như độ phức tạp và thời gian triển khai, nhanh thì thực ra còn tuỳ thuộc vào bối cảnh, và bản chất của vấn đề cần giải quyết.

Sau tháng ngày dài làm việc cùng với JSON, chỉ biết JSON thì được ông anh giới thiệu cho thằng Protobuf, với một câu nói “nhanh lắm” mình liên bắt tay vào tìm hiểu và quả thực nó nhanh thât.

  Javascript prototype chuyên sâu

  Nếu vỗ ngực xưng tên là một javascript developer sành sỏi, mà không giải thích được prototype inheritance thì thật là kỳ

Đầu tiên nói về Protobuf, protobuf là một giao thức để tuần tự hoá dữ liệu có cấu trúc, tương tự với JSON hay XML, nhưng tốc độ thì JSON phải gọi bằng ông nội còn XML thì thôi không nói nữa, các bạn xem qua hình dưới nhé , sơ sơ thì tốc độ encode gấp 3 JSON và decode gấp 4–5 lần.

Đua tốc độ với Protoco Buffer

Nhìn bề ngoài vậy thôi chứ bản chất Protobuf nó lưu trữ data dưới dạng Binary nên làm mất khả năng đọc hiểu của loài người.

Khi làm việc với Protobuf, bạn định nghĩa các mà data được cấu trúc như thế nào,sau đó thì Proto Complier sẽ biên dịch ra mã nguồn tuỳ theo ngôn ngữ mà các bạn sử dụng, không như JSON được sử dụng rộng rãi mà mọi ngôn ngữ đều có thể áp dụng một tiêu chuẩn chung còn Protobuf là hàng nội bộ của Google nên chỉ Google mới có thể tạo ra những driver cho từng ngôn ngữ.

Protobuf rất phù hợp để làm ngôn ngữ giao tiếp giữa các server hơn là server và browser-client đơn giản là vì hầu hết browser-client giao tiếp với server bằng style REST API +JSON cộng thêm vẫn cần khả năng readable ở browser.

Mỗi file .proto gồm nhiều “message type” hiểu tương tự như struct trong go lang và class trong c++, mỗi message có thể embedded một hay nhiều message khác ví dụ trong file dứoi đây của mình, message user có thể embedded message contact.

syntax = "proto3";

package user;

message ContactProtobuf {
	string phoneNumber = 5;
	string country = 6;
}

message UserProtobuf { 
	string first_name = 1;
	string last_name = 2;
	string email = 3;
	repeated ContactProtobuf contact = 4;
}

Hãy biên dịch ra file .go xem trong file đó có gì hay. Để biên dịch các bạn phải download proto compiler và xem hướng dẫn cài đặt trong file readme tại đây và plugin cho từng ngôn ngữ, với Golang để cài đặt compiler plugin thì chỉ cần

go get -u github.com/golang/protobuf/protoc-gen-go

Để compile thì chạy lệnh

protoc -I=<include-folder-path> --go_out=<out-put> path-to-file

Trong đó -I dùng khi các bạn cần dùng các file Proto của bên thứ 3, các bạn xem tại đây. Trong trường hợp của mình mình cần biên dịch ra cùng thư mục với thư mục chứa file proto nên mình chạy lênh

protoc --go_out= . *.proto

Đua tốc độ với Protoco Buffer

Và được file user.pb.go, sau đó mình sẽ copy file này vào trong thư mục trongproject nơi chứa package user và sử dụng, cùng xem file output có gì nào.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: user.proto

package user

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type ContactProtobuf struct {
	PhoneNumber          string   `protobuf:"bytes,5,opt,name=phoneNumber,proto3" json:"phoneNumber,omitempty"`
	Country              string   `protobuf:"bytes,6,opt,name=country,proto3" json:"country,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ContactProtobuf) Reset()         { *m = ContactProtobuf{} }
func (m *ContactProtobuf) String() string { return proto.CompactTextString(m) }
func (*ContactProtobuf) ProtoMessage()    {}
func (*ContactProtobuf) Descriptor() ([]byte, []int) {
	return fileDescriptor_116e343673f7ffaf, []int{0}
}

func (m *ContactProtobuf) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ContactProtobuf.Unmarshal(m, b)
}
func (m *ContactProtobuf) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ContactProtobuf.Marshal(b, m, deterministic)
}
func (m *ContactProtobuf) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ContactProtobuf.Merge(m, src)
}
func (m *ContactProtobuf) XXX_Size() int {
	return xxx_messageInfo_ContactProtobuf.Size(m)
}
func (m *ContactProtobuf) XXX_DiscardUnknown() {
	xxx_messageInfo_ContactProtobuf.DiscardUnknown(m)
}

var xxx_messageInfo_ContactProtobuf proto.InternalMessageInfo

func (m *ContactProtobuf) GetPhoneNumber() string {
	if m != nil {
		return m.PhoneNumber
	}
	return ""
}

func (m *ContactProtobuf) GetCountry() string {
	if m != nil {
		return m.Country
	}
	return ""
}

type UserProtobuf struct {
	FirstName            string             `protobuf:"bytes,1,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"`
	LastName             string             `protobuf:"bytes,2,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"`
	Email                string             `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"`
	Contact              []*ContactProtobuf `protobuf:"bytes,4,rep,name=contact,proto3" json:"contact,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *UserProtobuf) Reset()         { *m = UserProtobuf{} }
func (m *UserProtobuf) String() string { return proto.CompactTextString(m) }
func (*UserProtobuf) ProtoMessage()    {}
func (*UserProtobuf) Descriptor() ([]byte, []int) {
	return fileDescriptor_116e343673f7ffaf, []int{1}
}

func (m *UserProtobuf) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UserProtobuf.Unmarshal(m, b)
}
func (m *UserProtobuf) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UserProtobuf.Marshal(b, m, deterministic)
}
func (m *UserProtobuf) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UserProtobuf.Merge(m, src)
}
func (m *UserProtobuf) XXX_Size() int {
	return xxx_messageInfo_UserProtobuf.Size(m)
}
func (m *UserProtobuf) XXX_DiscardUnknown() {
	xxx_messageInfo_UserProtobuf.DiscardUnknown(m)
}

var xxx_messageInfo_UserProtobuf proto.InternalMessageInfo

func (m *UserProtobuf) GetFirstName() string {
	if m != nil {
		return m.FirstName
	}
	return ""
}

func (m *UserProtobuf) GetLastName() string {
	if m != nil {
		return m.LastName
	}
	return ""
}

func (m *UserProtobuf) GetEmail() string {
	if m != nil {
		return m.Email
	}
	return ""
}

func (m *UserProtobuf) GetContact() []*ContactProtobuf {
	if m != nil {
		return m.Contact
	}
	return nil
}

func init() {
	proto.RegisterType((*ContactProtobuf)(nil), "user.ContactProtobuf")
	proto.RegisterType((*UserProtobuf)(nil), "user.UserProtobuf")
}

func init() { proto.RegisterFile("user.proto", fileDescriptor_116e343673f7ffaf) }

var fileDescriptor_116e343673f7ffaf = []byte{
	// 190 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2a, 0x2d, 0x4e, 0x2d,
	0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x01, 0xb1, 0x95, 0x7c, 0xb9, 0xf8, 0x9d, 0xf3,
	0xf3, 0x4a, 0x12, 0x93, 0x4b, 0x02, 0x40, 0xa2, 0x49, 0xa5, 0x69, 0x42, 0x0a, 0x5c, 0xdc, 0x05,
	0x19, 0xf9, 0x79, 0xa9, 0x7e, 0xa5, 0xb9, 0x49, 0xa9, 0x45, 0x12, 0xac, 0x0a, 0x8c, 0x1a, 0x9c,
	0x41, 0xc8, 0x42, 0x42, 0x12, 0x5c, 0xec, 0xc9, 0xf9, 0xa5, 0x79, 0x25, 0x45, 0x95, 0x12, 0x6c,
	0x60, 0x59, 0x18, 0x57, 0x69, 0x22, 0x23, 0x17, 0x4f, 0x68, 0x71, 0x6a, 0x11, 0xdc, 0x30, 0x59,
	0x2e, 0xae, 0xb4, 0xcc, 0xa2, 0xe2, 0x92, 0xf8, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x46, 0xb0, 0x6a,
	0x4e, 0xb0, 0x88, 0x5f, 0x62, 0x6e, 0xaa, 0x90, 0x34, 0x17, 0x67, 0x4e, 0x22, 0x4c, 0x96, 0x09,
	0x2c, 0xcb, 0x01, 0x12, 0x00, 0x4b, 0x8a, 0x70, 0xb1, 0xa6, 0xe6, 0x26, 0x66, 0xe6, 0x48, 0x30,
	0x83, 0x25, 0x20, 0x1c, 0x21, 0x7d, 0x90, 0xe5, 0x60, 0x17, 0x4b, 0xb0, 0x28, 0x30, 0x6b, 0x70,
	0x1b, 0x89, 0xea, 0x81, 0x7d, 0x85, 0xe6, 0x8d, 0x20, 0x98, 0xaa, 0x24, 0x36, 0xb0, 0x7f, 0x8d,
	0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x87, 0xe1, 0xdb, 0xfd, 0x00, 0x00, 0x00,
}

Xem qua có thể thấy, compiler đã generate ra một struct và các method như Marshal , UnMarshal để encode message sang binary và decode to message struct từ binary. Và để tạo nên một message thì ta làm như sau.

Đua tốc độ với Protoco Buffer

Đua tốc độ với Protoco Buffer

Việc decode từ Binary sang ProtoBuf cũng rất nhanh so với JSON thuần để so sánh thì bài có làm một bài test, follow thực hiện ta tạo ra một message sau đó encode sang binary rồi lại decode ra message như ban đầu, cùng thực hiện trên cả JSON và Protobuf với N lần.

package user

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/golang/protobuf/proto"
)

type Contact struct {
	PhoneNumber string `json:"phone_number`
	Country     string `json:"country"`
}

type User struct {
	FirstName string    `json:"first_name`
	LastName  string    `json:"last_name"`
	Contact   []Contact `json:"contact"`
}

func Benchmark() {
	n := 5000000
	fmt.Println("JSON - START")
	now := time.Now()

	for i := 1; i <= n; i++ {
		u := User{
			FirstName: "Dong",
			LastName:  "Nguyen",
			Contact: []Contact{
				Contact{
					PhoneNumber: "039 390 1228",
					Country:     "Viet Nam",
				},
			},
		}
		binary, _ := json.Marshal(u)
		var v User
		json.Unmarshal(binary, &v)
	}
	fmt.Println("JSON - END :", time.Now().Sub(now))
	fmt.Println("PROTOBUF - START")
	now = time.Now()
	for i := 1; i <= n; i++ {
		u := &UserProtobuf{
			FirstName: "Dong",
			LastName:  "Nguyen",
			Contact: []*ContactProtobuf{
				&ContactProtobuf{
					PhoneNumber: "039 390 1228",
					Country:     "Viet Name",
				},
			},
		}
		binary, _ := proto.Marshal(u)
		var v UserProtobuf
		proto.Unmarshal(binary, &v)
	}
	fmt.Println("PROTOBUF - END :", time.Now().Sub(now))

}

package main

import "bench/user"

func main() {
	user.Benchmark()
}

Và đây là kết quả. Thực tế thì Protobuf nhanh hơn so với JSON khoảng 4 đến 5 lần.

Đua tốc độ với Protoco Buffer

Mặc dù hơi tốn sức trong việc define các message type rồi compile nhưng thành quả nhận được rất là xứng đáng.

Đua tốc độ với Protoco Buffer

Đến đây mình xin dừng bút trong bài sau mình sẽ giới thiệu gRPC cái thứ mà nếu dùng với Protobuf thì các các server của các bạn sẽ trở thành ma tốc độ.

Bye bye các bạn, cảm ơn đã đọc bài 😀

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

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

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