Home Blog Page 191

Các Tools bạn có thể rất cần cho các React Components của mình

Component là gì? Hiểu về Component trong React và Vue

Là một react developer, tôi tin rằng những ai đang làm một project react phải develop tất cả các components riêng biệt để tận dụng triết lý component đằng sau framework front-end ấn tượng này.

Develop các components riêng biệt giúp bạn kiểm soát được project workflow của bạn, cho phép bạn develop và test mọi component đầu tiên mà không phải lo lắng về logic của cả project, ngoài ra bạn còn có thể cải thiện việc tái sử dụng component, khả năng test và tốc độ dev để đơn giản hóa các task của tổ chức cũng như phân phối đều task trong team.

Nếu đây là lần đầu tiên bạn nghe về storybook hoặc react styleguidist, bài viết này là điểm khởi đầu hoàn hảo để tìm hiểu, nhưng nếu bạn đã từng nghe về nó hoặc làm việc với nó, bài viết vẫn giúp ích vì cung cấp cho bạn nhiều lựa chọn storybook tuyệt vời.

Storybook: (21K Stars)

alt text

Một trong những react tool phổ biến và quyền lực nhất để build components, được tả trong GitHub như một component interactive UI dev & test mà có support react, react-native, vue và angular.

Nói cách khác, storybook như một môi trường dev UI components. Nó cho phép bạn browse tất cả các components project và view các states khác of mỗi component.

Storybook mang theo rất nhiều add-ons cho việc design components, tư liệu, test và hơn thế. Từ ví dụ này, bạn có thể thử hết với các component props một cách dễ dàng bằng các add-on storybook prop.

Bạn có thể dùng storybook-preview và storybook-deploy để tạo và triển khai các stories như một documentation static website.

React Cosmos: (4k Starts)

alt text
Cosmos sẽ scan project của bạn để tìm component và cho phép bạn render các components trong các bộ props, context, và state bất kì. Nó cũng đồng nghĩa là bạn đã bắt tay vào project và bạn cần add các functionalities mới vào components mà không phát điên lên.

Cosmos sẽ Mock mọi external dependency như API còn lại của bạn hoặc local storage. Đồng thời, bạn cũng có thể thấy các states phát triển trong real-time trong khi tương tác với các instances đang chạy, để xử lý hết các features này, Cosmos sử dụng đến fixture và proxy architecture.

React Styleguidist: (4k stars)

alt text

React Styleguidist là một môi trường dev component gồm dev server reloaded và các hướng dần live mà bạn có thể share với team. Nó list ra các component prototypes và hiể thị nó live, các ví dụ usage có thể edit được dựa trên file Markdown và hoạt động cúng react tạo app.

Catalog: (500 stars)

alt text
Catalog là một tool tạo các chỉ dẫn live cho các digital products. Nó kết hợp các tư liệu design và assets bằng các components thực và live tại một chỗ. Tôi nghĩ tool này mạnh hơn cả khi bạn cần hiển thị trên system mình đầy đủ màu design, typography, audio, video và đương nhiên là, react component, cùng nhiều thứ khác trên các trang markdown và nhiều options về size của screen.

Ngoài ra còn có các tool khác như AtellierCarte BlancheReact BlueKitReact CardsReact-demo.

Tham khảo thêm vị trí tuyển dụng React lương cao cho bạn

  67 tools, libraries và resources giúp Web developer "dễ thở" hơn
  Những "mánh khoé" sử dụng React Context

Tuyệt chiêu đảm bảo tính bất biến trong JavaScript

Khi làm việc với React, hẳn bạn đã nghe đến tính bất biến của dữ liệu (immutability). Đặc tính này, nói một cách đơn giản, là khả năng giá trị của dữ liệu không bị thay đổi sau khi đã được khai báo. Tính bất biến giúp cho chương trình trở nên dễ dự đoán, ít xảy ra lỗi và trong một số trường hợp còn tăng hiệu suất của ứng dụng. Do đó, React (và Redux) đều khuyến khích mọi người viết code để hướng đến đặc tính này.

Tuy vậy, nếu mới làm quen với JavaScript và React, có thể bạn sẽ bỡ ngỡ không biết làm thế nào cho “chuẩn nhất”. Bài viết dưới đây giới thiệu một số kỹ thuật giúp bạn hướng đến immutability một cách dễ dàng hơn. Chúng ta sẽ nói về hàm thuần khiết, các thao tác xử lý dữ liệu trên mảng và object. Cuối cùng, bạn có thể áp dụng ngay những “tuyệt chiêu” vừa học để xây dựng một demo nhỏ bằng React.

Luôn dùng const khi khai báo dữ liệu

Lời khuyên đầu tiên và cũng là căn bản nhất, luôn dùng const khi khai báo. Chắc bạn cũng đã biết, let và const được giới thiệu từ phiên bản ES6, cho phép khai báo biến có tầm vực theo khối và không thực hiện hoisting. Điểm khác biệt giữa let và const là bạn có thể thay đổi giá trị của biến khai báo với let, trong khi không thể với const.

let foo = 1
foo = 2 // Không thành vấn đề

const bar = 1
bar = 2 // Error: Assignment to constant variable.

Do đó, trong hầu hết các trường hợp bạn nên khai báo bằng const để tránh xảy ra lỗi khi giá trị của khai báo bị thay đổi bất ngờ. Cũng cần lưu ý là khi khai báo objects với const, mặc dù bạn không thể gán giá trị mới cho object nhưng giá trị của các thuộc tính vẫn có thể bị thay đổi.

const obj = { name: 'foo' }
obj = { name: 'bar' } // Error: Assignment to constant variable.

// Nhưng bạn có thể...
obj.name = 'bar'
console.log(obj) // { name: 'bar' }

Thao tác trên object

Như vậy để thay đổi giá trị của object mà vẫn đảm bảo tính chất bất biến, chúng ta cần sử dụng Object.assign(target, ...sources). Hàm này có tác dụng sao chép thuộc tính của các đối tượng sources vào target. Ví dụ như:

const a = { name: 'foo' }
const b = Object.assign({}, a, { name: 'bar', age: 1 }, { id: 9 })
console.log(b) // { name: 'bar', age: 1, id: 9 }

Cần lưu ý để đảm bảo tính bất biến thì tham số target nên luôn là {}, vì khi đó các giá trị của sources sẽ được sao chép vào đối tượng mới. Một cách dùng sai là:

const a = { name: 'foo' }
const b = Object.assign(a, { name: 'bar', age: 1 }, { id: 9 })
console.log(b) // { name: 'bar', age: 1, id: 9 }
console.log(a) // Giá trị của a cũng bị thay đổi thành { name: 'bar', age: 1, id: 9 }
console.log(a === b) // true

Ngoài Object.assign(), bạn cũng có thể dùng cú pháp spread cho object. Ví dụ:

const a = { name: 'foo' }
const b = { ...a, name: 'bar', age: 1, id: 9 }
console.log(b) // { name: 'bar', age: 1, id: 9 }
console.log(a === b) // false

Lưu ý là cú pháp này hiện vẫn đang được đề xuất và chưa được hỗ trợ trên hầu hết các trình duyệt. Nếu muốn xài thì bạn phải dùng Babel hay Bublé để chuyển đổi nhé.

Tìm việc làm Javascript lương cao trên TopDev

Một số thao tác thường gặp khác trên object

Lấy tên các thuộc tính của một object

const obj = { name: 'bar', age: 1, id: 9 }
Object.keys(obj) // ['name', 'age', 'id']

Lấy giá trị của các thuộc tính của một object

const obj = { name: 'bar', age: 1, id: 9 }
Object.values(obj) // ['bar', 1, 9]

Lấy cặp [thuộc tính, giá trị] của một object

const obj = { name: 'bar', age: 1, id: 9 }
Object.entries(obj) // [ ['name', 'bar'], ['age', 1], ['id', 9] ]

Xóa một thuộc tính ra khỏi object

const a = { name: 'bar', age: 1, id: 9 }

// Xóa thuộc tính age
const b = Object.entries(a).reduce((acc, [key, value]) => {
  return key === 'age' ? acc : { ...acc, [key]: value }
}, {})

console.log(b) // { name: 'bar', id: 9 }
  15 chứng chỉ "vàng" đáng giá trong ngành lập trình
  JavaScript Tip: Đặt tên function để debugging một cách dễ dàng hơn

Thao tác trên mảng

Bên cạnh object, mảng là cấu trúc dữ liệu rất thường gặp khi làm việc trong JavaScript. Để thay đổi dữ liệu của một mảng mà vẫn đảm bảo tính bất biến, bạn có thể sử dụng cú pháp spread, được giới thiệu từ ES5. Với một số yêu cầu khác, chúng ta có thể áp dụng các hàm có sẵn của lớp Array, như map()filter()reduce(). Một đặc điểm của các hàm này là chúng luôn trả về mảng/giá trị mới chứ không thay đổi mảng ban đầu.

Áp dụng cú pháp spread

Bạn có thể dùng spread để nhân bản một mảng.

const a = [1, 2, 3, 4, 5]
const b = a
console.log(a === b) // true

const c = [...a]
console.log(a === c) // false 

Thêm một phần tử vào mảng

const a = [1, 2, 3]

// Không nên: a.push(4)
const b = [...a, 4] // [1, 2, 3, 4]

// Không nên: a.unshift(0)
const c = [0, ...a] // [0, 1, 2, 3]

Nối hai mảng với nhau

const a = [0, 1]
const b = [2, 3]

// Hoặc a.concat(b)
const c = [...a, ...b]

Áp dụng hàm có sẵn để:

Xóa một phần tử ra khỏi mảng các đối tượng

const a = [{ id: 1, name: 'Foo' }, { id: 2, name: 'Bar' }, { id: 3, name: 'Baz' }]

const b = a.filter(obj => obj.id !== 2)
console.log(b) // [ { id: 1, name: 'Foo' }, { id: 3, name: 'Baz' } ]

Xóa một phần tử ở đầu mảng, cuối mảng hay ở bất cứ vị trí nào

const a = [0, 1, 2, 3, 4]

// Xóa phần tử ở đầu mảng
// Không nên: a.shift()
const b = a.filter((_, index) => index !== 0) // [1, 2, 3, 4] 

// Xóa phần tử ở cuối mảng
// Không nên: a.pop()
const c = a.filter((_, index, arr) => index != arr.length - 1) // [0, 1, 2, 3] 

// Xóa phần tử ở vị trí bất kỳ
// Không nên: a.splice(3, 1)
const d = a.filter((_, index) => index !== 3) // [0, 1, 2, 4] 

Thay đổi dữ liệu của mảng

const a = [1, 2, 3]
const b = a.map(x => x * 2) // [2, 4, 6] 

const c = [ { id: 1, name: 'Foo' }, { id: 2, name: 'Bar' }, { id: 3, name: 'Baz' } ]
const d = c.map(obj => Object.assign(obj, { name: obj.name.toUppercase() }))
console.log(d) // [ { id: 1, name: 'FOO' }, { id: 2, name: 'BAR' }, { id: 3, name: 'BAZ' } ]

Sắp xếp mảng: tránh dùng phương thức .sort để sắp xếp mảng, vì phương thức này thay đổi thứ tự của các phần tử trong mảng được sắp xếp. Thay vào đó:

const a = [ { id: 1, name: 'Foo' }, { id: 2, name: 'Bar' }, { id: 3, name: 'Baz' } ]
const b = [...a].sort((x, y) => y.id - x.id)
console.log(b) // [ { id: 3, name: 'Baz' }, { id: 2, name: 'Bar' }, { id: 1, name: 'Foo' } ]

Cũng tương tự khi bạn muốn đảo ngược (reverse) mảng.

const a = [0, 1, 2, 3, 4]
const b = [...a].reverse() // [4, 3, 2, 1, 0]

Trong React, giữ cho phương thức render() thuần khiết

Một hàm được xem là thuần khiết (pure) khi nó luôn trả về cùng một kết quả, nếu giá trị của tham số truyền vào không đổi, đồng thời bản thân hàm không thực hiện những thao tác có thể tạo ra hiệu ứng lề. Ví dụ:

// pure 
function add(x, y) {
  return x + y
}

// impure
function addAndShow(x, y) {
  console.log(x + y)
}

Hàm add() được xem là thuần khiết vì add(2, 3) luôn trả về giá trị 5. Hàm Math.random() thì ngược lại, vì giá trị trả về luôn thay đổi. Bên cạnh đó, addAndShow() cũng bị xem là không thuần khiết, vì nó in kết quả ra console.

Do đó khi làm việc với React, bạn nên xem render() như một hàm thuần khiết với dữ liệu đầu vào là this.props. Hạn chế viết logic bên trong hàm render() mà thay vào đó nên đưa các bước thao tác dữ liệu thành từng phương thức riêng.

Không nên

class Cart extends React.Component {
  render() {
    let total = 0
    for (let i = 0; i < this.props.cart.products; i++) {
      total = this.props.cart.products[i].price + total
    }

    return (
      <div>
        <h1>Cart total: {total}</h1>
        <ProductList products={this.props.sort((a, b) => b.price - a.price)} />
      </div>
    )
  }
}

Nên

class Cart extends React.Component {
  getSortedProducts(cart) {
    return [..cart.products].sort((a, b) => b.price - a.price)
  }

  getCartTotal(cart) {
    return cart.products.reduce((acc, product) => acc + product.price, 0)
  }

  render() {
    const { cart } = this.props

    const total = this.getCartTotal(cart)
    const sortedProducts = this.getSortedProducts(cart)

    return (
      <div>
        <h1>Cart total: {total}</h1>
        <ProductList products={sortedProducts} />
      </div>
    )
  }
}

Hoặc thay vì sử dụng class components, bạn có thể dùng functional components, như kiểu:

function getCartTotal(cart) {
  return cart.products.reduce((acc, product) => acc + product.price, 0)
}

function Cart(props) {
  return <h1>Cart total: {getCartTotal(props.cart)}</h1>
}

Functional components có kha khá lợi ích:

  • Tương đối thuần khiết, vì được thiết kế theo kiểu một props vào, và JSX đi ra. Và không có this.state.
  • Không phải quan tâm đến this
  • Khuyến khích tách biệt phần code xử lý business logic và phần xây dựng giao diện
  • UI được tách thành những component nhỏ, dễ quản lý hơn
  • (Nghe đồn là) nhanh và ít tốn bộ nhớ hơn so với class components

Và dĩ nhiên cũng có những bất lợi:

  • Thiếu đi một số tính năng: không hỗ trợ life-cycle hooks, không có this.state, không có this
  • Không thân thuộc với lập trình viên OOP

Demo

Chúng ta có thể áp dụng những kỹ thuật ở trên để xây dựng một trang liệt kê sản phẩm đơn giản. Bạn có thể xem danh sách sản phẩm, sắp xếp sản phẩm theo tên và giá. Bạn cũng có thể tìm kiếm và xóa sản phẩm. Bên cạnh đó, chúng ta có thể làm thêm 2 nút “rảnh đời”, có tác dụng chuyển tên tất cả sản phẩm sang chữ in hoa, và tăng giá sản phẩm lên gấp đôi. Cuối cùng, trong trang có một nút Reset để khôi phục dữ liệu về lại trạng thái ban đầu.

Bạn có thể xem demo ở đây

Mã nguồn có thể tìm thấy tại: https://github.com/ehkoo/react-immutability-techniques

Kết

Những tuyệt chiêu được đề cập trong bài viết này có thể áp dụng trong tất cả ứng dụng JavaScript, chứ không chỉ dành riêng cho React, Vue hay Angular. Mỗi khi bạn có ý định viết let, hãy hít thật sâu, thở chầm chậm và suy nghĩ cách nào đó để chuyển thành const (và trong đa số trường hợp đều có thể làm được). Đồng thời khi làm việc với mảng hay object, luôn để ý xem thao tác này có thay đổi bản thân của đối tượng bị tác động hay không.

Cho đến ngày JavaScript ràng buộc tính bất biến cho dữ liệu một cách mặc định, lập trình viên chúng ta còn lắm gian truân.

Cập nhật: Ngoài các kỹ thuật ở trên, bạn cũng có thể sử dụng các thư viện được thiết kế riêng cho mục đích giữ tính bất biến, ví dụ như immutable-jsupdeepbaobabseamless-immutable hay mori. Điểm bất lợi khi sử dụng các thư viện này, có lẽ là kích thước của chúng.

TopDev via ehkoo.com

  Tính năng ít được biết đến trong JavaScript
  Những hàm Javascript hay sử dụng mà bạn nên nhớ (Phần 1)

Tìm việc làm IT đãi ngộ tốt trên TopDev

5G & IoT hứa hẹn điều gì trong tương lai?

5G & IoT hứa hẹn điều gì trong tương lai?

“92% thành viên từ 100 nhà khai thác viễn thông mạnh nhất toàn cầu đều thống nhất rằng 5G sẽ mở đường cho các công nghệ mới” – Theo khảo sát của Ericsson

The Fifth Generation – một trong những xu hướng công nghệ hot nhất trong năm 2019 chính là công nghệ truyền thông không dây thứ năm – 5G. 5G được kỳ vọng là chất xúc tác cho các nền công nghiệp khi người người nhà nhà đều sẵn sàng nâng cấp lên 5G. Hệ thống mạng 5G phát huy tầm quan trọng của Internet, biến Internet thành một phần không thể tách rời trong cuộc sống hàng ngày.

Theo suy đoán của Gartner, vào năm 2020 có tới 20,4 tỷ thiết bị sẽ được kết nối và con số này sẽ không dừng lại ở đó. Hiện tại, cơ sở hạ tầng không dây không thể chứa quá nhiều thiết bị và không thể đảm bảo việc trao đổi dữ liệu mượt mà.

mobile and 5G

5G (The Fifth Generation) hứa hẹn một hệ sinh thái thân thiện hơn với IoT (Internet of Things) với những cải tiến vượt bậc so với 4G. Không chỉ truyền dữ liệu với tốc độ cực cao, mà còn giảm độ trễ của mạng (latency) xuống chỉ còn 1 mili giây. Điều này đồng nghĩa với việc 1 bộ phim HD có thể tải xuống trong vài giây. So với 4G LTE, số lượng thiết bị được kết nối sẽ nhiều hơn tới 100 lần trên mỗi đơn vị diện tích.

Việc làm iot lương cao hấp dẫn tại Topdev.vn

Vậy làm cách nào mà 5G có thể mở rộng platform IoT? Bên trong, IoT có rất nhiều thiết bị thu thập dữ liệu trong khoảng thời gian thực trong khoảng cụ thể. Tuy nhiên, việc trao đổi dữ liệu không ngừng sẽ gây ảnh hưởng ít nhiều tới thời lượng pin của các thiết bị. Công nghệ mạng không dây đời mới này sẽ giảm đến 90% mức sử dụng năng lượng mạng và với các thiết bị IoT năng lượng thấp, thời lượng pin sẽ được duy trì đến 10 năm.

Trước mắt vẫn còn là chặng đường dài trước khi 5G dẫn đầu xu hướng, tuy nhiên các doanh nghiệp ngay từ bây giờ nên bắt đầu phát triển và mô phỏng các dịch vụ cũng như sản phẩm của mình để tận dụng khả năng vượt trội của 5G. Cùng điểm qua vài ngành công nghiệp có thể bị gián đoạn bởi 5G và IoT:

1) Xe oto tự lái:

Các cảm biến trên xe tự lái tạo ra số lượng lớn dữ liệu, nhiệt độ, điều kiện giao thông, thời tiết, vị trí GPS, …. Việc sản xuất và cảm biến lượng dữ liệu khổng lồ như vậy sẽ tiêu tốn khá nhiều năng lượng. Xe tự lái đồng thời lệ thuộc rất nhiều vào việc truyền tải thông tin theo thời gian thực để đáp ứng một cách tốt nhất. Tuy nhiên, với khả năng kết nối tốc độ cao và độ trì hoãn (latency) thấp, những dòng xe thông minh này sẽ liên tục thu thập tất cả các loại dữ liệu, bao gồm cả những data rất quan trọng về thời gian mà thuật toán tự hoạt động để theo dõi tình trạng hoạt động của xe và cải thiện thiết kế trong tương lai.

2) Chăm sóc sức khỏe:

Lĩnh vực y tế cũng sẽ được cải thiện khi tất cả các thiết bị y tế đều được tích hợp IoT. Khu vực nông thôn hay các khu vực vùng xa chưa có trang thiết bị y tế tân tiến sẽ tận dụng được ưu điểm IoT. Với độ trễ thấp như vậy, những dịch vụ y tế đòi hỏi sự chính xác cao như phẫu thuật đều có khả năng thực hiện từ xa.

3) Logistics:

Kết nối 5G sẽ giúp sensor cảm biến IoT hoạt động liên tục. Không chỉ có tốc độ cao và độ trễ thấp giúp thu thập data trong thời gian thật, mà hiệu quả năng lượng cũng có thể tích luỹ dữ liệu có tính chất đa dạng tại các điểm trong chuỗi cung ứng trong khoảng thời gian dài. Người tiêu dùng có thể cập nhật những thông tin chi tiết nhất, như món cá họ vừa mua được đánh bắt tại vùng nước nào, nhiệt độ trữ lạnh thực phẩm trong quá trình vận chuyển ra sao và được giao tới tay người bán khi nào.

smart city 5G

4) Thành phố thông minh:

5G cho phép các ứng dụng phổ biến rộng rãi hơn từ xử lý nước và chất thải, giám sát giao thông đến các cơ sở chăm sóc sức khoẻ nâng cao. Thành phố thông minh tận dụng lợi ích từ mạng thế hệ mới khi ngày càng có nhiều sensor xâm nhập vào cơ sở hạ tầng thành phố. 5G không chỉ có khả năng xử lý data khổng lồ mà còn giúp tích hợp nhiều hệ thống khác nhau, liên tục truyền thông tin với nhau để toàn bộ thành phố được kết nối và “xích lại gần nhau”.

5) Hệ thống bán lẻ:

IoT sẽ nhận ảnh hưởng tích cực từ sự ra đời của 5G khi các nhà bán lẻ có thể nhận được sự tham gia trải nghiệm của khách hàng qua smartphone. Chất lượng kết nối tốt hơn cùng với sự gia tăng số lượng thiết bị giúp họ tương tác với người tiêu dùng nhanh hơn với bảng chỉ dẫn digital. Các cách thức tương tác khách hàng mới mẻ và sáng tạo kết hợp với Augmented Reality và Virtual Reality sẽ trở nên phổ biến hơn. Nhà bán lẻ có thể nâng cao trải nghiệm mua sắm thông qua các hoạt động bán lẻ ở nhiều kênh một cách hiệu quả.

Nếu số lượng thiết bị kết nối phần cứng lên tới hàng tỷ thì tiềm năng cho các sản phẩm tiêu dùng có identical twins sẽ nhiều hơn đáng kể. Các sản phẩm tiêu dùng không cần thiết phải kết nối Internet thường xuyên như các thiết bị phần cứng nhưng có thể gửi và nhận thông tin khi kết nối với các sản phẩm thông minh dựa trên tương tác người tiêu dùng và các thực thể khác thông qua scan, RFID, NFC, … cơ sở hạ tầng wireless hiện tại không thể dựa trên task quản lý số lượng lớn sản phẩm online, nhưng 5G sẽ biến điều đó thành khả thi. Đóng gói thông minh (Smart Packaging) và nhãn kỹ thuật số (Digital Labels) sẽ thay đổi cách quản lý hàng tồn kho và theo dõi logistics cũng như cung cấp phương tiện tương tác với người tiêu dùng.

“5G và IoT cùng đưa mọi mặt hàng lên kệ trên Internet bằng cách tạo ra cặp song sinh kỹ thuật số (digital twins)”

4G không đủ khả năng xử lý dữ liệu khi số lượng sensor và các thiết bị online ngày càng tăng, hạn chế khả năng IoT. 5G với tốc độ truyền tải dữ liệu cao, độ trễ thấp, linh hoạt hơn cùng với sự tiêu thụ năng lượng thấp, tiết kiệm chi phí và khả năng hỗ trợ số lượng lớn các thiết bị, sẽ là công cụ hoàn hảo cho IoT. Trong tương lai, không chỉ smartphone, máy tính hay máy tính bảng mới được liên kết Internet mà là hàng loạt các vật dụng hàng ngày, sản phẩm tạp hoá. Điều này hứa hẹn mang đến các cơ hội cho các tổ chức cung cấp dịch vụ và ứng dụng để quản lý các hệ IoT phức tạp và chuyển đổi dữ liệu thành sự hiểu biết thông minh (smart insights). 5G sẽ đóng vai trò quan trọng trong việc chuyển đổi không chỉ cách chúng ta giao tiếp mà ảnh hưởng lên cả doanh nghiệp và toàn xã hội.

Khá nhiều điều thú vị về lĩnh vực IoT trong thế giới 5G mà chúng ta cần khám phá, bạn đừng bỏ lỡ những update mới nhất tại Vietnam Mobile Day năm thứ 9 đánh dấu sự trở lại của hội nghị công nghệ lớn nhất hằng năm.

(Techtalk via ecnmag)

🔥🔥🔥 Những slots EARLY BIRD cuối cùng đang được săn đón, đừng bỏ qua cơ hội hấp dẫn này nhé. Nhập ngay code: EARLYBIRD@VMD2021 để giảm ngay 100.000đ/vé. Chuẩn bị bùng nổ tại #VMD2021 nào! 

OAuth2 là gì? Tìm hiểu về OAuth2

oauth2-la-gi

OAuth2 là gì?

OAuth2 là gì? – Nó là viết tắt của Open với Authentication hoặc Authorization. OAuth ra đời nhằm giải quyết vấn đề trên và xa hơn nữa, đây là một phương thức chứng thực giúp các ứng dụng có thể chia sẻ tài nguyên với nhau mà không cần chia sẻ thông tin username và password.

Ứng dụng

  • Authentication: xác thực người dùng.
  • Authorization: người dùng ủy quyền cho ứng dụng truy cập tài nguyên của họ.

Nếu bạn thấy một website (hay phần mềm) nào đó cho phép đăng nhập bằng tài khoản Facebook hay Google mà không cần tạo nick mới thì đó chính là OAuth.

Thực tế, mỗi người trong chúng ta đã từng có hàng vài chục tài khoản ở các website khác nhau đến nỗi phải đặt các tài khoản này giống hệt nhau.

  Code nhanh và hiệu quả hơn với VSCode tips, tricks

  Những Plugin không thể thiếu cho VSCode

Quá trình phát triển

  • Năm 2006, Twitter đưa ra chuẩn OAuth đầu tiên có tên là OpenID, điểm yếu đó là yêu cầu người dùng phải cung cấp thông tin cá nhân (username + password).
  • Năm 2010, phát hành phiên bản chính thức đầu tiên của Oauth 1.0 (RFC 5849).
  • Sau đó lỗi bảo mật nghiêm trọng được phát hiện với tên gọi Session Fixation cho phép Hacker chiếm quyền truy cập vào tài nguyên của người dùng.
  • Năm 2012, OAuth2 ra đời, tuy vẫn còn những lỗi bảo mật như dùng Chrome để Hack Facebook nhưng hiện vẫn đang được sử dụng khá rộng rãi.

OAuth2 hoạt động như thế nào?

Khi bạn đăng nhập bằng Facebook hay Gmail, website sẽ dẫn bạn đến trang (hoặc phần mềm) Facebook và liệt kê những quyền mà nó cần phải có để cho phép bạn đăng nhập và sử dụng dịch vụ.

Nếu bạn đồng ý thì lúc này Facebook sẽ phát cho website một cái token Token này chứa một số quyền hạn nhất định giúp cho website có thể xác minh bạn là ai cũng như giúp cho website có thể hoạt động được.

Nếu website này bị hacker tấn công thì nó chỉ lấy được thông tin hay hoạt động của bạn trên website đó mà không ảnh hưởng đến những website khác mà bạn đang sử dụng.

Do đó cách đăng nhập bằng phương thức OAuth này rất an toàn cho người dùng cuối như chúng ta.

Sơ đồ luồng hoạt động của OAuth2

  Học lập trình thế nào để không thất nghiệp?

  Lập trình đâu chỉ có những dòng code

  Liệu tôi có làm Junior Developer "mãn kiếp"?
  1. Ứng dụng (website hoặc mobile app) yêu cầu ủy quyền để truy cập vào Resource Server (Gmail,Facebook, Twitter hay Github…) thông qua User
  2. Nếu User ủy quyền cho yêu cầu trên, Ứng dụng sẽ nhận được ủy quyền từ phía User (dưới dạng một token string)
  3. Ứng dụng gửi thông tin định danh (ID) của mình kèm theo ủy quyền của User tới Authorization Server
  4. Nếu thông tin định danh được xác thực và ủy quyền hợp lệ, Authorization Server sẽ trả về cho Ứng dụng access_token. Đến đây quá trình ủy quyền hoàn tất.
  5. Để truy cập vào tài nguyên (resource) từ Resource Server và lấy thông tin, Ứng dụng sẽ phải đưa ra access_token để xác thực.
  6. Nếu access_token hợp lệ, Resource Server sẽ trả về dữ liệu của tài nguyên đã được yêu cầu cho Ứng dụng.

oauth2 là gì

Tổng kết oauth2 là gì

Luồng hoạt động thực tế có thể sẽ khác nhau tùy thuộc vào việc ứng dụng sử dụng loại ủy quyền (authorization grant type) nào, trên đây chỉ là ý tưởng chung để thực hiện.

Bài viết sẽ không đi sâu vào vấn đề làm thế nào để bạn có thể triển khai hệ thống OAuth trên Server của bạn mà chỉ giới thiệu thêm về luồng hoạt động của OAuth cũng như những việc cần làm khi ứng dụng của bạn phải triển khai chức năng.

Để thực hiện chi tiết bạn tìm kiếm thêm trên Google để xem cách triển khai cho từng framework hay ngôn ngữ mà sản phẩm của mình đang làm nhé.

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

Xem thêm tuyển dụng ngành cntt hấp dẫn tại TopDev!

Làm kỹ sư AI, mức lương 500 triệu là bình thường

Thị trường lao động riêng ngành lập trình sẽ cần 350.000 nhân lực đến trước cuối năm 2021 trong khi với khả năng hiện tại chỉ có khoảng 200.000 lao động đáp ứng được nhu cầu công việc.

Trong khi đó, giai đoạn 5 năm gần đây thì công nghệ AI (trí tuệ nhân tạo) được nhiều chuyên gia trong ngành đánh giá đã đạt mức hoàn thiện sau một quãng thời gian phát triển nhất định. Riêng tại thị trường Việt Nam, hiện có rất nhiều startup lớn nhỏ đang phát triển các dự án tiềm năng liên quan đến trực tiếp đến AI và Machine Learning tạo được nhiều giá trị đột biến cho toàn ngành công nghệ nói chung. Cũng chính vì sự phát triển này mà mức lương cũng như độ nóng của kỹ sư AI được dự báo sẽ tăng mạnh trong những năm sắp tới.

Ở những kỳ hội thảo công nghệ thường niên như Vietnam Web Summit và Vietnam Mobile Day gần đây, rất nhiều doanh nghiệp đã đề cập đến các xu hướng đổi mới sáng tạo, trải dài từ trí tuệ nhân tạo đến tối ưu trí tuệ doanh nghiệp (Business Intelligence). Từ đó, chúng tôi đã đúc kết được một vài điểm nổi bật nhất cho thị trường việc làm IT trong năm nay.

Theo nhiều báo cáo thị trường gần đây cho thấy, năm 2018 sẽ là năm phát triển mạnh mẽ nhất cho các công nghệ ứng dụng trí tuệ nhân tạo (AI) và khối chuỗi (Blockchain) vào thực tiễn cuộc sống. Mở ra một kỷ nguyên mới với hàng ngàn cơ hội hấp dẫn cho tất cả các doanh nghiệp tại Việt Nam. Có thể nói, xu hướng tối ưu hoá trí tuệ doanh nghiệp cùng xu hướng AI đang dần vượt trội so với công nghệ blockchain.

Thực tế cho thấy, với những làn sóng đầu tư và phát triển tại Việt Nam trong những năm qua, các “ông lớn” trong nước như FPT, Viettel, VNG… đều đã bắt đầu nghiên cứu và cho ra đời nhiều giải pháp, ý tưởng phát triển sản phẩm ứng dụng AI vào thực tế cuộc sống. Không chỉ những công ty lớn, hàng trăm các startup cũng đã và đang ứng dụng những công nghệ này trực tiếp vào sản phẩm của mình. Có thể kể đến những cái tên như EyeQ, Cinnamon AI Labs,… Đây là một dấu hiệu rõ ràng nhất cho một xu hướng công nghệ mạnh mẽ, một làn sóng mới tại Việt Nam trong thời gian tới.

Thiếu hụt nhân sự, AI Engineer đạt mức lương cao nhất!

Với sự thay đổi chóng mặt của thị trường, TopDev – nền tảng tuyển dụng IT hàng đầu thuộc Công ty Cổ phần Applancer vừa phát hành “Báo cáo thị trường IT và tình hình nhân lực IT Việt Nam” Quý 4 – 2018 với thông tin được thu thập từ hơn 100.000 dữ liệu việc làm trong năm 2018 và có trên 15.000 ứng viên tham gia, đã đúc kết được nhiều góc nhìn thú vị cho thị trường IT trong năm nay cũng như dự đoán những xu hướng mới cho năm 2019.

Thiếu hụt nhân sự luôn là một bài toán nan giải cho thị trường IT, dù xu hướng lương và phúc lợi đang tăng mạnh cho ngành này, nhưng nhiều chuyên gia dự báo năm 2019 Việt Nam vẫn sẽ thiếu hụt từ 70.000 đến 90.000 nhân sự IT.

Theo báo cáo của TopDev, 5 ngôn ngữ lập trình được trả lương cao nhất chính là Python, .NET, PHP, JAVA và C++, trong đó, C++ vẫn đứng đầu với mức lương lên đến 27.600.000 triệu đồng/tháng ($1,185). Ở những lập trình viên làm việc tại TP.HCM sẽ thường có mức thu nhập cao hơn so với những khu vực khác.

Tính lương chuẩn với công cụ tính lương gross – net tại TopDev

Ngoài ra, khảo sát của TopDev cũng chỉ ra rằng, có đến 33.9% lập trình viên hướng tới việc phát triển những công nghệ chuyên sâu, 25% lập trình viên mong muốn hướng tới cấp quản lý. Trong đó, có đến 53% đang hài lòng với công việc của mình, 59.8% đang không có nhu cầu đổi việc. Vì vậy việc tuyển dụng ở các công ty sẽ trở nên khó khăn hơn trong năm 2019, đặc biệt là ở những vị trí cao cấp như Project Manager, dù mức lương có lên đến gần 40 triệu/tháng ($1,563).

Đặc biệt hơn cả, với xu hướng tăng mạnh của việc ứng dụng trí tuệ doanh nghiệp và ứng dụng AI vào các sản phẩm trong thời gian gần đây tuy nhiên thị trường IT vẫn chưa bắt nhịp kịp và dần trở nên khan hiếm các kỹ sư làm công nghệ này. Dù mức lương “khủng” lên đến 500 triệu/năm ($22.000) nhưng nhiều doanh nghiệp vẫn phải đang loay hoay trong việc tìm kiếm các ứng viên phù hợp. Đa phần họ sẽ phải đào tạo từ chính những nhân viên lâu năm đang làm việc tại các dự án có liên quan đến công nghệ này.

Mặc dù tuyển dụng khó khăn, nhưng nhiều doanh nghiệp vẫn phụ thuộc lớn vào các nguồn tuyển dụng không chính thống và thông qua các mối quan hệ cá nhân của mình. Báo cáo chỉ ra rằng, có đến 58% các nhà tuyển dụng tìm kiếm ứng viên qua các kênh giới thiệu nội bộ (referral), và chỉ có 51% các nhà tuyển dụng chọn đăng tin tìm kiếm qua các kênh chính thống.

Sự phát triển nhanh chóng của nhiều xu hướng công nghệ mới trong năm 2018-2019 mở ra nhiều cơ hội tốt hơn cho các lập trình viên tại Việt Nam, tuy nhiên cũng sẽ gây không ít trở ngại cho nhà tuyển dụng nếu không biết tuyển dụng đúng cách.

Hiện đã có rất nhiều doanh nghiệp đang hướng đến những phương pháp tuyển dụng mới với tầm nhìn dài hạn hơn như làm thương hiệu doanh nghiệp (Employer Branding), nhằm tạo sự ảnh hưởng và lan tỏa hình ảnh của mình của mình đến những ứng viên tốt nhất trong cộng đồng lập trình, thay vì chỉ đăng job tuyển dụng hoặc thông qua các kênh nội bộ như trước đây.

Bên cạnh đó, trong các xu hướng công nghệ năm nay, các chuyên gia đưa ra dự đoán rằng AI sẽ thay thế 16% công việc con người trong thập kỷ tới.

Download toàn bộ báo cáo tại đây

TopDev

Liệu tôi có làm Junior Developer “mãn kiếp”?

Liệu tôi có làm Junior Developer mãn kiếp?

Đừng tự chôn vùi khả năng của bạn

Nghiêm túc mà nói, đừng mãi là một junior developer. Junior developer để chức danh của họ trong CV, email, và LinkedIn … Họ tự tin nói cho cả thế giới biết điều đó. Nhưng nó không đáng tự hào như bạn nghĩ đâu!

Khi bạn làm điều đó, đây là những gì nhà tuyển dụng và các công ty sẽ nghĩ về bạn: ” Xin chào, tôi đang tìm kiếm một công việc với vị trí developer. Tôi vẫn là người mới, nhưng ông có tin tưởng tôi một lần! và tin tưởng rằng tôi sẽ trở thành tài sản chứ không phải là gánh nặng của công ty ông ? Oh, và tôi cũng sẽ cần rất nhiều sự giúp đỡ từ nhân viên của ông trong 6 tháng đầu! “

Nhưng, tôi là một junior developer…! Nếu đúng như vậy, bạn sẽ thành công về lâu về dài hơn nếu bạn tập trung nâng cao kĩ năng để trở thành một intermediate developer. Đến lúc đó, bạn đã có thể bắt đầu nộp đơn xin việc. Hãy dành toàn bộ thời gian của bạn để học các kĩ năng cần thiết. Bằng cách này, bạn sẽ không còn tự gò bó bản thân với chức danh “ junior “ developer. Hãy nhớ rằng, ấn tượng đầu tiên rất quan trọng. Khi được tuyển dụng vào vị trí junior developer, bạn sẽ mất nhiều thời gian hơn để thăng tiến, thay vào đó bạn có thể dành một chút thời gian tự chuẩn bị cho bản thân và tự xem mình là intermediate developer, và bạn có thể sẽ được tuyển dụng vào những vị trí tốt hơn rất nhiều.

  Junior developer là gì? Những quy tắc bất biến giành cho Junior developer

Nhưng khi nào tôi mới biết tôi không còn là một junior developer ? … Bạn sẽ không biết được đâu. Bạn sẽ luôn cảm thấy không bao giờ biết đủ nhiều. Bạn sẽ luôn cảm thấy người khác thông minh hơn bạn. Đây được gọi là hội chứng của bệnh nhân nhồi máu cơ tim. Nó rất bình thường và mọi developer đều có cảm giác đó. Nhưng sau đây là một bài kiểm tra đơn giản dành cho các web developer: Bạn có thể giải thích cho các thành viên trong gia đình bạn cách hoạt động của internet? Một máy tính hoạt động như thế nào ? Trang web hoạt động như thế nào? Bạn có hiểu biết cơ bản về HTML, CSS và Javascript để có thể xây dựng trang web của riêng bạn không? Bạn có biết gì về React không? Bạn đã tự xây dựng một vài dự án trên GitHub lần nào chưa? Và bạn có cảm thấy thoải mái khi đưa trang web và ứng dụng của bạn lên online không ?

Tốt, bạn không còn là một junior developer nữa.

Nhưng bây giờ tôi cần một công việc ngay! … Hãy ngừng suy nghĩ ngắn hạn. Trừ khi bạn có cơ hội làm việc với những người thực sự thông minh mà bạn có thể học hỏi mỗi ngày, hay làm việc với các công nghệ mới ( chỉ có vài vị trí dành cho junior developer cho bạn cơ hội tiếp cận điều này), bạn nên dành nhiều thời gian hơn để học hỏi các kỹ năng, thoát khoải tư duy của một junior. Về lâu về dài, bạn sẽ kiếm được nhiều tiền hơn, có cơ hội làm việc với đội ngũ phát triển giỏi hơn, và bạn sẽ có nhiều khả năng làm việc cho một công ty cho bạn nhiều cơ hội và tiếp xúc với các công nghệ hiện đại hàng đầu hơn. Đừng tiếp tục làm việc với WordPress plugin trong vị trí junior developer của một công ty luật. Điều đó sẽ không có lợi bạn về lâu về dài.

  7 sự thật mình bỏ lỡ khi còn là lập trình viên junior

Nếu bạn nộp đơn cho vị trí junior developer, trường hợp hoàn hảo nhất có thể xảy ra là: Bạn sẽ trở thành một junior developer.

Nếu bạn nộp đơn cho vị trí intermediate developer, trường hợp hoàn hảo nhất có thể xảy ra là: Bạn sẽ trở thành một intermediate developer.

Đừng tự chôn vùi khả năng của bạn

OK, ông nói hay lắm Andrei, nhưng tôi vẫn không biết phải làm gì. Tôi vẫn chỉ là một junior developer …! 

Trước tiên, hãy ngừng xem bản thân là một junior developer. Vẫn giữ suy nghĩ của một junior developer khi học từ người khác, nhưng đừng bao giờ hài lòng ở vị trí junior developer. Nộp đơn vào vị trí bạn chưa đủ điều kiện không có nghĩa là bạn đang “ được voi đòi tiên “. Hãy nhớ rằng: nếu bạn không hỏi, câu trả lời sẽ luôn là không.

Đừng quá đề cao thế giới và đánh giá thấp bản thân. Bạn giỏi hơn bạn nghĩ đấy!

Tìm việc làm junior IT lương cao trên TopDev

WebRTC là gì? Phương thức hoạt động và Ứng dụng

WebRTC là gì? Tại sao WebRTC lại được ứng dụng nhiều trong giới lập trình hiện nay? Là viết tắt của Web Real-Time Communication, ta có thể hiểu được đây là một công cụ hỗ trợ người dùng tương tác, trò chuyện trực tiếp trên website. Để tiếp tục hiểu thêm về WebRTC, cùng TopDev đọc tiếp bài viết dưới đây bạn nhé!

WebRTC là gì?

WebRTC là gì? Phương thức hoạt động và Ứng dụng
WebRTC là gì? Phương thức hoạt động và Ứng dụng

WebRTC (Web Real-Time Communication) là một tập hợp các hàm lập trình (web API) được phát triển bởi World Wide Web Consortium (W3C). Khả năng hỗ trợ trình duyệt giao tiếp với nhau theo thời gian thực bằng video, âm thanh hay truyền tải dữ liệu “Peer-to-Peer” (P2P) mà không cần browser phải cài thêm plugins hay phần mềm hỗ trợ nào từ bên ngoài. WebRTC có thể giúp chúng ta gọi điện video ngay trong trình duyệt mà không cần đăng kí tài khoản, ngoài ra chúng còn được xài để phát triển game chơi trực tiếp trong trình duyệt và rất nhiều loại ứng dụng khác.

Cách webRTC hoạt động

Cách webRTC hoạt động
Cách webRTC hoạt động

Kết nối Peer-to-Peer

Hầu hết các ứng dụng WebRTC dựa trên kiến trúc P2P (peer-to-peer). Trong kết nối P2P, các thành viên truyền dữ liệu trực tiếp với nhau mà không cần trung gian. Ngay cả khi một thành viên rời khỏi cuộc gọi, các thành viên còn lại vẫn có thể tiếp tục chia sẻ dữ liệu. Điều này làm cho WebRTC vượt trội so với các công nghệ truyền thông truyền thống, nơi người dùng không thể tiếp tục nếu mất kết nối với máy chủ. Ngoài ra, các peer thường gần nhau về mặt địa lý, giảm khoảng cách dữ liệu phải truyền tải.

Máy chủ Signaling

Máy chủ signaling giúp thiết lập kết nối ban đầu giữa các peer. Nó theo dõi các sự kiện như người dùng tham gia hoặc rời khỏi cuộc gọi. Máy chủ signaling cần thiết trong giai đoạn khởi tạo cuộc gọi nhưng không cần thiết trong quá trình giao tiếp liên tục. Tuy nhiên, nó có thể được sử dụng để theo dõi các sự kiện như một peer bị ngắt kết nối. Có nhiều cách để triển khai máy chủ signaling, yêu cầu duy nhất là làm cầu nối giữa các peer.

SDP (Session Description Protocol)

SDP giúp các peer trao đổi thông tin và thiết lập kết nối mà không cần biết chi tiết về hệ thống của nhau. SDP cung cấp thông tin về phần mềm, phần cứng và loại phương tiện mà peer muốn trao đổi. Khi khởi tạo kết nối, một peer đưa ra đề nghị (offer) và nhận lại câu trả lời (answer).

  • Offer/Answer: Khi khởi tạo kết nối, một peer đưa ra đề nghị và nhận lại câu trả lời.
  • ICE (Interactive Connectivity Establishment) candidates: Tìm kiếm các phương tiện giao tiếp tốt nhất cho các peer.
  • NAT (Network Address Translation): WebRTC phải vượt qua các lớp NAT để kết nối trực tiếp giữa các peer. WebRTC sử dụng các máy chủ TURN để kết nối các thiết bị qua NAT với internet công cộng, giúp truyền tải dữ liệu media giữa các trình duyệt.

WebRTC được thiết kế để thiết lập kết nối trực tiếp giữa các bên, nhưng lớp NAT có thể làm phức tạp quá trình này. Các ứng dụng WebRTC sử dụng máy chủ TURN để kết nối các máy trên NAT với mạng internet công cộng, đảm bảo truyền tải dữ liệu media giữa các trình duyệt.

Ứng dụng của webRTC

WebRTC (Web Real-Time Communication) là một công nghệ tiên tiến cho phép truyền tải âm thanh, video và dữ liệu trực tiếp giữa các trình duyệt và thiết bị mà không cần các plugin hoặc phần mềm bên ngoài. Dưới đây là các loại ứng dụng mà bạn có thể phát triển bằng WebRTC:

  • Ứng dụng Video Chat: Tạo cuộc gọi video một đối một hoặc nhóm như Skype, Google Meet, Zoom.
  • Ứng dụng Audio Chat: Thực hiện các cuộc gọi âm thanh qua internet như VoIP, Google Voice.
  • Truyền Hình Trực Tiếp: Phát trực tiếp sự kiện, hội nghị trên YouTube, Facebook Live.
  • Chia Sẻ Màn Hình: Hỗ trợ kỹ thuật từ xa, thuyết trình.
  • Ứng Dụng Học Trực Tuyến: Lớp học ảo, dạy kèm trực tuyến với video và âm thanh thời gian thực, chia sẻ tài liệu.
  • Ứng Dụng Chơi Game Nhiều Người Chơi: Truyền tải dữ liệu game giữa các người chơi.
  • Hệ Thống Giám Sát và An Ninh: Camera an ninh, giám sát từ xa.

WebRTC mang lại nhiều cơ hội phát triển các ứng dụng thời gian thực với khả năng truyền tải dữ liệu hiệu quả và bảo mật.

Demo – Viết ứng dụng gọi video giữa 2 người bằng Webrtc và Firebase

Tham khảo nguồn tại đây.

1.Cài đặt Firebase

Firebase là gì: Đó là một dịch vụ cơ sở dữ liệu thời gian thực hoạt động trên nền tảng đám mây được cung cấp bởi Google nhằm giúp các lập trình phát triển nhanh các ứng dụng bằng cách đơn giản hóa các thao tác với cơ sở dữ liệu.

Vào trang Firebase để đăng ký một tài khoản và chọn “Create New Project”. Sau khi tạo được project xong thì chọn “Add Firebase to your web app”, tại đây bạn sẽ có một đoạn mã Javascript có chứa key ứng dung.

<script>
  // Initialize Firebase
  // TODO: Replace with your project's customized code snippet
  var config = {
    apiKey: "<API_KEY>",
    authDomain: "<PROJECT_ID>.firebaseapp.com",
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
    projectId: "<PROJECT_ID>",
    storageBucket: "<BUCKET>.appspot.com",
    messagingSenderId: "<SENDER_ID>",
  };
  firebase.initializeApp(config);
</script>

Trong phần Rules của database thay đổi giá trị .read và .write chuyển sang thành true

 

2.Đến phần Code

Code 1 giao diện html có thêm thẻ <video></video> để show camera:

<html>
     <head>
         <script src="https://www.gstatic.com/firebasejs/5.0.4/firebase.js"></script>
         <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
     </head>
     <body onload="showMyFace()">
         <video id="yourVideo" autoplay muted></video>
         <video id="friendsVideo" autoplay></video>
         <br />
         <button onclick="showFriendsFace()" type="button" class="btn btn-primary btn-lg"><span class="glyphicon glyphicon-facetime-video" aria-hidden="true"></span> Call</button>
     </body>
</html>

css:

video {
 background-color: #ddd;
 border-radius: 7px;
 margin: 10px 0px 0px 10px;
 width: 320px;
 height: 240px;
}
button {
 margin: 5px 0px 0px 10px !important;
 width: 654px;
}

Javascript

    1. Cấp quyền truy cập vào thư mục gốc của cơ sở dữ liệu Firebase
      var database = firebase.database().ref();
    2. Hàm sendMessage để thêm cơ sở dữ liệu vào Firebase: database.on('child_added', readMessage);
    3. Tạo yourId random: var yourId = Math.floor(Math.random()*1000000000);
    4. Khai báo máy chủ sử dụng: Hai máy chủ STUN sử dụng ở đây là của Google và Firefox, bạn cũng có thể thêm nhiều STUN khác tùy thích:
      var servers = {'iceServers': [
          {'urls': 'stun:stun.services.mozilla.com'},
          {'urls': 'stun:stun.l.google.com:19302'}
      ]};

      Note: STUN là gì? STUN (Session Traversal Utilities for NAT) là một giao thức mạng cho phép các máy khách tìm ra địa chỉ công khai của mình, loại NAT mà chúng đang đứng sau và cổng phía Internet được NAT gắn liền với cổng nội bộ nào đó. Thông tin này được sử dụng để thiết lập giao tiếp UDP giữa 2 host mà đều nằm sau NAT router. Giao thức STUN được định nghĩa trong RFC 5389.

    5. Tạo một object PeerConnection var pc = new RTCPeerConnection(servers);
    6. Chờ đợi đối tượng ICE Candidate được tạo trên máy tính của bạn:
      pc.onicecandidate = (event => event.candidate ? sendMessage(yourId, JSON.stringify({'ice': event.candidate})) : console.log('Sent All Ice') );

      Chức năng này sẽ được gọi nhiều lần, một lần cho mỗi ICE Candidate (khó dịch sang tiếng Việt nên để nguyên) được tạo ra. Khi một ICE Candidate được tạo ra thì hàm này sẽ biến object thành một chuỗi. Sau đó, nó gửi chuỗi này cho bạn bè của bạn thông qua Firebase. Máy tính bạn bè của bạn cũng sẽ thực hiện tương tự như trên.

      ICE (Interactive Communication Establishment) nôm na dễ hiểu là một giao thức được cùng để thiết lập phiên media dựa trên UDP đi qua NAT một cách nhanh nhất. ICE sẽ tìm đường tốt nhất để kết nối giữa các peer, nó thử tất cả khả năng có thể kết nối một cách song song và lựa chọn con đường hiệu quả nhất.

    7. Khi bạn và người nhận nhận được một ICE Candidate dưới dạng chuỗi được gửi từ Firebase, thì JSON.stringify sẽ chuyển đổi chuỗi trở lại thành đối tượng ICE Candidate.
    8. Chờ đợi cho các đối tượng Offer, Answer, ICE Candidates được gửi:pc.onaddstream = (event => friendsVideo.srcObject = event.stream);
    9. Event onaddstream được gọi và đặt friendsVideo.srcObject thành object MediaStream. Thao tác này sẽ hiển thị video người kia trên máy tính của bạn và ngược lại. friendsVideo được gọi đến từ HTML.
    10. Thêm dữ liệu vào Firebase bằng hàm sendMessage :
      function sendMessage(senderId, data) {
          var msg = database.push({ sender: senderId, message: data });
          msg.remove();
      }
    11. Thêm hàm show camera của mình showMyFace:
      function showMyFace() {
           navigator.mediaDevices.getUserMedia({audio:true, video:true})
               .then(stream => yourVideo.srcObject = stream)
               .then(stream => pc.addStream(stream));
      }

      Khi gọi hàm getUserMedia, trình duyệt sẽ yêu cầu quyền truy cập camera. Nó sẽ trả về một đối tượng MediaStream cái mà bạn có thể đặt bằng yourVideo.srcObject. Đoạn này có chức năng hiển thị mặt của bạn trên chính máy tính của bạn. Sau đó, ta cần thêm cùng một đối tượng MediaStream vào đối tượng PeerConnection của bạn. Trên máy tính đối phương thực hiện cuộc gọi cũng thực hiện tương tự. Hàm này được gọi ngay khi tải trang, vì vậy bạn sẽ thấy khuôn mặt của mình ngay khi load trang.

    12. Hàm showFriendsFace:
      function showFriendsFace() {
           pc.createOffer()
               .then(offer => pc.setLocalDescription(offer) )
               .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})) );
      }

      Tạo đối tượng Offer bằng cách gọi pc.createOffer(). Đặt local description cho offer này bằng cách gọi pc.setLocalDescription(offer). Cuối cùng gửi đối tượng Offer cho bạn của bạn bằng cách gọi sendMessage.

    13. Hàm readMessage
      function readMessage(data) {
           var msg = JSON.parse(data.val().message);
           var sender = data.val().sender;
           if (sender != yourId) {
               if (msg.ice != undefined) {
                   pc.addIceCandidate(new RTCIceCandidate(msg.ice));
               } else if (msg.sdp.type == "offer") {
                   pc.setRemoteDescription(new RTCSessionDescription(msg.sdp))
                       .then(() => pc.createAnswer())
                       .then(answer => pc.setLocalDescription(answer))
                       .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})));
               } else if (msg.sdp.type == "answer") {
                   pc.setRemoteDescription(new RTCSessionDescription(msg.sdp));
               }
           }
      };

      Người nhận cuộc gọi có thể đọc được tin nhắn thông qua hàm readMessage. Với kiểu tin nhắn là offer thì bạn đã gửi cho người nhận một đối tượng Offer mà bạn đã tạo. Người kia sẽ thiết lập mô tả từ xa (remote decription) của họ cho đối tượng Offer mà bạn đã gửi cho họ bằng cách gọi pc.setRemoteDescription(new RTCSessionDescription(msg.sdp)). Người nhận sẽ tạo một đối tượng Answer bằng cách gọi đến pc.createAnswer(). Hàm này trả về một đối tượng Answer mà bạn sẽ thiết lập ở mô tả local. Người nhận làm được điều này bằng cách gọi đến pc.setLocalDescription(answer). Sau đó, người nhận lấy đối tượng Answer và gửi nó cho bạn bằng cách gọi sendMessage.

      Bởi vì kiểu của tin nhắn bây giờ đã là answer nên đoạn sau sẽ thực hiện pc.setRemoteDescription(new RTCSessionDescription(msg.sdp));

    14.  Toàn bộ code trên:
      var config = {
          apiKey: "<API_KEY>",
          authDomain: "<PROJECT_ID>.firebaseapp.com",
          databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
          projectId: "<PROJECT_ID>",
          storageBucket: "<BUCKET>.appspot.com",
          messagingSenderId: "<SENDER_ID>",
        };
        firebase.initializeApp(config);
      
      var database = firebase.database().ref();
      var yourVideo = document.getElementById("yourVideo");
      var friendsVideo = document.getElementById("friendsVideo");
      var yourId = Math.floor(Math.random()*1000000000);
      var servers = {'iceServers': [
          {'urls': 'stun:stun.services.mozilla.com'},
          {'urls': 'stun:stun.l.google.com:19302'}
      ]};
      var pc = new RTCPeerConnection(servers);
      pc.onicecandidate = (event => event.candidate?sendMessage(yourId, JSON.stringify({'ice': event.candidate})):console.log("Sent All Ice") );
      pc.onaddstream = (event => friendsVideo.srcObject = event.stream);
      
      function sendMessage(senderId, data) {
          var msg = database.push({ sender: senderId, message: data });
          msg.remove();
      }
      
      function readMessage(data) {
           var msg = JSON.parse(data.val().message);
           var sender = data.val().sender;
           if (sender != yourId) {
               if (msg.ice != undefined) {
                   pc.addIceCandidate(new RTCIceCandidate(msg.ice));
               } else if (msg.sdp.type == "offer") {
                   pc.setRemoteDescription(new RTCSessionDescription(msg.sdp))
                       .then(() => pc.createAnswer())
                       .then(answer => pc.setLocalDescription(answer))
                       .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})));
               } else if (msg.sdp.type == "answer") {
                   pc.setRemoteDescription(new RTCSessionDescription(msg.sdp));
               }
           }
      };
      
      database.on('child_added', readMessage);
      
      function showMyFace() {
           navigator.mediaDevices.getUserMedia({audio:true, video:true})
               .then(stream => yourVideo.srcObject = stream)
               .then(stream => pc.addStream(stream));
      }
      
      function showFriendsFace() {
           pc.createOffer()
               .then(offer => pc.setLocalDescription(offer) )
               .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})) );
      }
      

Tổng kết

Nói tóm lại, WebRTC có thể được sử dụng cho nhiều mục đích, từ việc truyền tải video, âm thanh cho đến gửi dữ liệu theo thời gian thực giữa hai hoặc nhiều thiết bị với nhau mà không nhất thiết phải đi qua server trung gian. Điều này giúp giảm độ trễ trong việc truyền tải, giảm độ phức tạp khi phát triển ứng dụng cũng như giảm chi phí vận hành (vì không phải trả tiền thuê server, tiền điện, tiền bảo dưỡng…), kéo theo đó giá bán dịch vụ nếu có thì cũng sẽ thấp hơn.

  Lập trình PHP và những câu hỏi thường gặp khi phỏng vấn

Lập trình PHP và những câu hỏi thường gặp khi phỏng vấn

Câu 1: PHP có mấy cách khai báo? Những cách nào được xem là chính thống và không ảnh hưởng khi các phiên bản update sau này?

PHP có 4 cách khai báo, tuy nhiên chỉ có 2 cách được xem là hợp lệ và thống nhất trên toàn thế giới:

  • <?php…?> → Là cách chính thống.
  • <script language=”PHP”>…</script> → Cũng được xem là cách chính thống không ảnh hướng tới update của các phiên bản PHP sau này.
  • <?…?> → (“Cần phải setting trên hệ thống mới sử dụng được” không nhất thiết phải nói.)
  • <%…%> → (“Cần phải setting trên hệ thống mới sử dụng được” không nhất thiết phải nói.)

Câu 2: Hằng trong PHP khác gì so với biến? Nếu 1 hằng được định nghĩa 2 lần, thì liệu có bị lỗi không?

Hằng và biến trong PHP là khái niệm khác nhau:

  • Đầu tiên khác nhau là cách khai báo:
    • Biến thì chỉ cần dùng ký tự $ để gắn hoặc lấy giá trị.
    • Hằng dùng hàm define() gắn giá trị và dùng constant() để lấy giá trị.
  • Điểm khác biệt lớn nhất là hằng là không thể thay đổi trong suốt quá trình chạy chương trình, biến thì có.

Nêu 1 hằng được định nghĩa 2 lần thì chương trình vẫn chạy được bình thường tuy nhiên hằng chỉ có giá trị của lần định nghĩa đầu tiên.

Xem tin tuyển lập trình viên PHP đãi ngộ tốt trên TopDev

Câu 3: Phân biệt $_POST và $_GET trong php?

Cả $_GET và $_POST đều được dùng để gửi dữ liệu lên server.

  • $_GET: Gửi dữ liệu lên server thông qua URL, nên thông tin dữ liệu hiển thị lên url vì thế bảo mật kém, dữ liệu gửi lên bị giới hạn 1024 ký tự.
  • $_POST: Gửi dữ liệu lên server dưới dạng ẩn thông qua HTTP Header vì thế nó có tính bảo mật cao hơn so với GET, dữ liệu gửi lên không bị giới hạn.
  • Tuy nhiên tốc độ thực thi xử lý của Post chậm hơn Get.

Câu 4: Mảng là gì? Có mấy loại mảng trong PHP?

Mảng là một biến có thể chứa được nhiều phần tử, từ đó ta có thể dễ dàng lưu trữ, xắp xếp, hay xóa bỏ các phần tử trong mảng một cách dễ dàng.
Mảng bao gồm 2 thành phần là KEY và VALUE, key dùng để truy cập vào phần tử của mảng qua đó ta có thể gán giá trị hoặc lấy giá trị của các phần tử trong mảng.
Mảng(array) có 3 loại chính là:

  • Mảng tuần tự: là mảng có key tự động tạo là chữ số tăng dần bắt đầu từ 0.
  • Mảng không tuần tự: là mảng có key mà bạn phải tự định nghĩa bằng các ký tự chữ hoặc số, và key không được sắp xếp bất kỳ thứ tự nào.
  • Mảng đa chiều: là mảng có chứa ít nhất một mảng khác trong nó.

Câu 5: Mảng tuần tự là gì? Khác gì với bất tuần tự? Để duyệt mảng ta dùng vòng lặp nào?

Mảng tuần tự là mảng có key là chữ số bắt đầu từ 0 và tăng dần. Nó khác với mảng bất tuần tự là các phần tử trong nó KEY được sắp xếp tăng dần từ 0 còn mảng bất từ tự thì không.
Để duyệt mảng tả có thể dùng bất cứ vùng lập nào? Tuy nhiên chuẩn nhất là dùng vòng lập foreach, vì vòng lập này được nhà phát triển PHP xây dựng riêng cho việc duyệt mảng, nêu nó dễ sử dụng hơn, tốc độ xử lý của nó nhanh hơn.

Câu 6: Để chuyển mảng thành chuỗi ta dùng hàm gì? Để tách chuỗi thành mảng ta dùng hàm gì?

Trong PHP cung cấp hàm implode(separator,array) dùng để chuyển mảng thành một chuỗi và hàm explode(separator,string,[limit]) dùng để chuyển một chuỗi thành mảng. Ngoài ra ta có hàm join($ky_tu,$array) giống hàm implode

Câu 7: Trong PHP để gộp mảng ta dùng hàm gì? Để tách mảng ta dùng hàm gì?

Trong PHP cung cấp hàm array_merge($array1, $array2, $array3,…) dùng để nối các mảng thành một mảng duy nhất và hàm array_slice(array,start,[length],[preserve]) dùng để tách mảng thành một mảng nhỏ hơn.

Câu 8: Cho biết sự khác nhau giữa serialize và json_encode? Lý giải theo cách bạn hiểu?

json_encode: là phương thức dùng để chuyển đổi một mảng(Array) hoặc Object thành string(chuỗi) dữ liệu JSON để sử dụng khi lưu trữ trong database, và để chuyển đổi ngược lại ta dùng json_decode để chuyển đổi một chuỗi dữ liệu JSON sang dạng mảng(Array) hoặc object để sử dụng trong code PHP.

serialize(array): là phương thức dùng để chuyển một mảng(Array) hoặc Object thành string(chuỗi) dữ liệu theo chuẩn của PHP để ta có thể lưu trữ hoặc truyền tải, khi muốn chuyển nó lại thành lại một mảng hoặc phương thức ta dùng phương thức unserialize().

Câu 9: Cookie và session có gì khác nhau? Người ta nói bản thân của session là cookie là đúng hay sai?

COOKIE là một tập tin nhỏ được server nhúng vào máy tính của người dùng. Nếu lần đầu tiên trình duyệt truy cập vào website nó sẽ gửi một COOKIE đến trình duyệt của người dùng, và mỗi khi người dùng tiếp tục yêu cầu một trang web từ website này thì COOKIE với các thông tin thu nhập từ phía người dùng trên website này sẽ được sẽ gửi trả về server của website.

SESSION được hiểu là khoảng thời gian mà người sử dụng giao tiếp với 1 ứng dụng. SESSION được lưu trữ hoàn toàn trên server, do vậy tính bảo mật cao hơn cookie, các website hiện này thường dùng session để lưu thông tin của người dùng khi họ đăng nhập. Chu kỳ sống của SESSION do webserver qui định, ta có thể điều chỉnh chu kỳ này khi cấu hình webserver, tại server sẽ có 1 PHPSESSID tương ứng được tạo ra, các PHPSESSID sẽ được lưu trong một tập tin văn bản ở tại vị trí được qui định trong file php.ini ở dòng session.save_path.

Người ta nói bản thân của session là cookie, về cơ bản SESSION và COOKIE đều là các tập tin lưu trữ lại thông tin của người dùng website, tuy nhiên dựa trên khái miệm, cách sử dụng, ứng dụng của chúng là khác biệt vì thế tôi cho rằng chúng là khác biệt.

Câu 10: Theo bạn, sự khác nhau của toán tử & và && trong PHP là gì?

Toán từ & và && trong PHP đều là phép toán AND, tuy nhiên toán tử một dấu & áp dụng theo kiểu bit, nói dễ hiểu hơn một dấu & là phép AND thao tác trên các bit ví dụ 1 & 0 thì ra 0. Phép toán hai dấu & thì chỉ áp dụng cho kiểu boolean True và False.

Câu 11: Hãy cho biết $a++ và ++$a khác nhau ở đâu?

Cả hai đều được dùng để tăng thêm một đơn vị cho biết số, tuy nhiên điểm khác biệt ở $a++ được thực sau khi nó được gọi, còn ++$a được thực thi ngay khi nó được gọi, lấy ví a bằng 5, khi dung hàm echo để in nó ra với giá trị a++ thì nó sẽ ra là 5, còn khi dùng echo cho ++a thì giá trị của được in ra sẽ là 6.

Câu 12: Tính nhanh kết quả của đoạn code sau

→ Lỗi không in ra được gì.

Câu 13: Mysql_close() cần thiết như thế nào trong thực tế ?. Vì sao ít thấy người dùng áp dụng nó?

Mysql_close() được dùng để đóng kết nối đến cơ sở dữ liệu đã mở trước đó. Điều này rất cần thiết vì nó giúp giảm tải xử lý của database, hiểu đơn giản thế này một người truy cập tới website của bạn và website của bạn có kết nối database và điều đó đồng nghĩa với việc sẽ có ít nhất một kết nối database được tạo, vậy 100 người sẽ có 100 kết nối, và giả sử dụng trong đó có 99 người không sử dụng nữa nhưng kết nối vẫn còn hiệu lực thì điều này có nghĩa là thay vì database phải xử lý chỉ có 1 kết nối mà nó phải xử lý 100 kết nối.
Vì sao ít người dùng đầu tiên vì hiệu quả mang lại của hàm này rất khó thấy trong các trường hợp thông thường, trên thực tế khi người dùng không còn sử dụng nữa thì sau một khoảng thời gian ngắn kết nối này sẽ tự động đóng, thứ hai vì ít người có thể nhìn thấy được vấn đề nếu không có dịp tiếp xúc hoặc làm việc với lượng dữ liệu lớn thì sẽ thấy việc mở hoặc đóng một conneciton kịp thời và chính xác sẽ tiết kiệm được rất nhiều tài nguyên cho hệ thống cũng như tốc độ xử lý của hệ thống, vì thế hàm này rất cần thiết khi bạn quản lý tài nguyên và tốc độ thực thi của hệ thống hay của website.

Câu 14: Muốn chuẩn hóa dữ liệu về utf-8 trong PHP ta phải làm gì?

Sử dụng encoding utf-8 tại meta charset trong tập tin PHP.
Sử dụng encoding utf-8-unicode-ci trong MySQL.

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

15 chứng chỉ “vàng” đáng giá trong ngành lập trình

15 chứng chỉ

Chứng chỉ và kỹ năng không chỉ có thể giúp tăng lương của bạn mà còn giúp thăng chức và trở nên hấp dẫn hơn trong mắt các nhà tuyển dụng. Một khảo sát từ Global Knowledge cho thấy 83% chuyên gia CNTT ở Mỹ và Canada đều có bằng cấp IT – với mức lương trung bình cho một chuyên gia IT có bằng cấp là trung bình luôn cao hơn khoảng $ 8.400 (hoặc 11,7 phần trăm) cao so với không có các chứng chỉ cần thiết.

Các nhà tuyển dụng cũng tin rằng các chứng chỉ cũng rất có lợi cho người thuê lao động. Trong số những người được khảo sát, 44% nói rằng các nhân viên có bằng cấp thường thực hiện công việc nhanh hơn, 33% cho biết hiệu quả hơn khi triển khai hệ thống và 23% nói rằng nó giúp rất nhiều trong quá trình deploy sản phẩm cũng như hạn chế bớt lỗi do trình độ của các nhân viên đã vững vàng.

Dưới đây là 15 chứng nhận và bằng cấp có giá trị nhất cho dân công nghệ trong năm nay.

Chứng nhận trong quản trị doanh nghiệp CNTT ( Certified in the Governance of Enterprise IT – CGEIT)

Được cung cấp thông qua ISACA, chứng nhận CGEIT thể hiện kiến ​​thức của bạn về quản trị CNTT doanh nghiệp. Nó cho thấy bạn có khả năng áp dụng những nguyên tắc và khái niệm quản trị CNTT trong môi trường chuyên nghiệp. Khóa học vốn được thiết kế cho những người có “vai trò quản lý, tư vấn hoặc các vị trí đảm bảo liên quan đến quản trị CNTT”, bao gồm IS và IT director, chuyên gia tư vấn, giám đốc điều hành, manager, theo ISACA. Chứng nhận CGEIT hiện đang được xếp hạng là một trong những chứng chỉ có giá trị nhất, theo dữ liệu từ Global Knowledge.

Yêu cầu: Năm năm kinh nghiệm quản lý hoặc nhiều hơn, đã từng đảm nhiệm vai trò tư vấn hoặc giám sát hay hỗ trợ các sáng kiến ​​quản trị CNTT trong môi trường doanh nghiệp. Bạn sẽ cần trải nghiệm ở hai hoặc nhiều lĩnh vực CGEIT, bao gồm quản lý chiến lược, phân tích lợi ích, tối ưu hóa rủi ro và tài nguyên.

Mức lương trung bình sau khi có được chứng chỉ CGEIT: $121,363

Chứng nhận AWS cho kiến trúc sư giải pháp (AWS Certified Solutions Architect – Associate)

AWS vẫn là nền tảng đám mây hàng đầu được lựa chọn và AWS Certified Solutions Architect – Associate certification được thiết kế cho những người làm về AWS. Nói cách khác, nó tập trung vào việc chứng minh khả năng của bạn để thiết kế và triển khai các hệ thống (có thể mở rộng) trên AWS, bao gồm cách giữ cho chi phí phát triển hiệu quả mà không phải hy sinh về bảo mật, độ tin cậy và chất lượng.

Yêu cầu: Một năm kinh nghiệm thực hành thiết kế hệ thống trên AWS hoặc nhiều hơn, kiến thức về ít nhất một ngôn ngữ lập trình cấp cao cũng như hiểu biết về các phương pháp hay nhất xung quanh việc phát triển các ứng dụng dựa trên AWS.

Mức lương trung bình sau khi có được chứng chỉ AWS: $121,292

Chứng chỉ Project Management Professional (PMP)

Chứng nhận PMP được cung cấp thông qua PMI và vốn dành cho các chuyên gia quản lý dự án. PMI cho biết một chứng nhận trong PMP sẽ cho phép bạn “làm việc trong bất kỳ ngành công nghiệp nào, với bất kỳ phương pháp luận nào và ở bất kỳ địa điểm nào”. Bạn sẽ cần nắm vững năm giai đoạn chính của vòng đời dự án, bao gồm bắt đầu, lập kế hoạch, thực hiện, giám sát, kiểm soát và ngừng hoạt động.

Yêu cầu: Để tham gia kỳ thi, bạn cần ba năm kinh nghiệm trong quản lý dự án, 4.500 giờ cho các dự án ở vị trí lead và chỉ đạo và 35 giờ học các khóa quản lý dự án. Với bằng cấp thứ hai, bạn sẽ cần 5 năm kinh nghiệm, 7.500 giờ quản lí các dự án và 35 giờ học các khóa quản lý dự án.

Mức lương trung bình sau khi có được chứng chỉ PMP: $114,475

Bằng AWS Certified Developer – Associate

Chứng nhận, từ Amazon, được thiết kế cho các nhà phát triển làm việc với các dịch vụ AWS. Qua đó chứng minh khả năng của bạn để phát triển, triển khai và gỡ lỗi các ứng dụng dựa trên Cloud với AWS. Khi các tổ chức ngày càng khẩn trương áp dụng công nghệ Cloud, internet of things, machine learning và các công nghệ mới nổi khác, chứng nhận AWS Certified Developer certification đã trở nên có giá trị hơn đối với ứng viên.

Yêu cầu: Một hoặc nhiều năm kinh nghiệm thực hành thiết kế và duy trì các ứng dụng dựa trên AWS, kiến thức vững chắc về một hoặc nhiều ngôn ngữ lập trình bậc cao cũng như là sự hiểu biết về các dịch vụ AWS.

Mức lương trung bình sau khi có được chứng chỉ AWS Certified Developer – Associate certification: $114,473

Chứng nhận chuyên gia bảo mật hệ thống thông tin ( Certified Information Systems Security Professional – CISSP)

Chứng nhận CISSP được cung cấp bởi ISC và được công nhận theo ANSI, cũng như với sự chấp thuận của bộ quốc phòng Mỹ và là tiêu chuẩn cho chương trình ISEEP của cơ quan an ninh quốc gia Mỹ. Ngoài ra, nó còn được công nhận bởi toàn thế giới như một khóa huấn luyện để giúp các chuyên gia bảo mật IT thiết lập các phương pháp bảo mật hay nhất.

Yêu cầu: Bạn sẽ cần ít nhất năm năm kinh nghiệm về bảo mật thông tin và ít nhất ba năm kinh nghiệm làm người quản lý bảo mật. Kinh nghiệm phải có được trong vòng 10 năm trước khi bắt đầu kỳ thi, hoặc năm năm sau khi vượt qua nó. Bạn cần phải luôn cập nhật giấy chứng nhận với các bài kiểm tra định kì (CPE) và bạn cần có ít nhất năm năm kinh nghiệm làm việc toàn thời gian trong hai hoặc nhiều chủ đề sẽ được đưa vào bài kiểm tra.

Mức lương trung bình sau khi có được chứng chỉ CISSP certification: $111,475

Chứng nhận trong kiểm soát hệ thống thông tin và rủi ro ( Certified in Risk and Information Systems Control – CRISC)

CRISC là “chứng chỉ duy nhất chuẩn bị và cho phép các chuyên gia CNTT đối đầu với những thách thức về IT và quản lý rủi ro cũng như là biến chúng trở thành những lợi ích chiến lược cho doanh nghiệp”. Chứng nhận bảo mật thông tin này là bằng chứng cho khả năng quản lý rủi ro của bạn với các kĩ năng như đánh giá, ứng phó, giám sát và báo cáo.

Yêu cầu: Để đạt được chứng nhận CRISC, bạn sẽ cần ba năm hoặc nhiều hơn trong ít nhất hai trong bốn chủ đề được đề cập trong kì thi. Bạn cũng sẽ cần thực hiện bài thi mỗi năm để duy trì chứng nhận.

Mức lương trung bình sau khi có được chứng chỉ CRISC certification: $111,049

Chứng nhận quản lí bảo mật thông tin ( Certified Information Security Manager – CISM)

ISACA cũng cung cấp chứng chỉ CISM, vốn tập trung vào bảo mật CNTT ở cấp quản lý. Nó được thiết kế để giúp kiểm chứng sự thành thạo trong xây dựng, thiết kế và quản lý các sáng kiến bảo mật doanh nghiệp. Bài kiểm tra chỉ được cung cấp trong khoảng thời gian 16 tuần – với năm nay, khóa học có sẵn bắt đầu từ ngày 1 tháng 2 đến ngày 1 tháng 6.

Yêu cầu: Để có được chứng nhận CISM, bạn cần ít nhất năm năm kinh nghiệm bảo mật thông tin và phải trong vòng 10 năm kể từ ngày thi hoặc năm năm sau khi vượt qua. Bạn cũng sẽ cần làm bài thi mỗi năm để duy trì chứng nhận.

Mức lương trung bình sau khi có được chứng chỉ CISM certification: $108,043

Chứng nhận ScrumMaster

Scrum Alliance cung cấp chứng nhận ScrumMaster vốn rất nổi tiếng và được tôn trọng trong ngành IT. Trở thành một ScrumMaster tức bạn đã thành thạo về Scrum và cách áp dụng nó tại nơi làm việc. Đó là một chứng nhận đặc biệt hữu ích cho các vị trí quản lý dự án, chương trình, cũng như là các nhà phát triển sản phẩm. Song song đó, bạn cũng sẽ nhận được tư cách là thành viên hai năm với Scrum Alliance, điều này sẽ cho phép bạn truy cập vào các sự kiện dành riêng cho các thành viên.

Yêu cầu: Bạn sẽ cần tham dự khóa học CSM trực tiếp, do một giảng viên Scrum giảng dạy.

Mức lương trung bình sau khi có được chứng chỉ Certified ScrumMaster certification: $106,938

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

Chứng nhận Hacker (Certified Ethical Hacker – CEH)

Được cung cấp bởi EC-Council, chứng chỉ Hacker (CEH) được chứng nhận cho thấy bạn có các kỹ năng và kiến thức để tìm lỗ hổng trong hệ thống máy tính và có khả năng ngăn chặn tấn công. Một “hacker có đạo đức” là người sử dụng cùng một kỹ năng và kiến thức như một hacker mũ đen để phát triển các biện pháp an ninh nhằm ngăn chặn các cuộc tấn công tiềm năng. Thông thường, các doanh nghiệp sẽ yêu cầu bạn phải nghĩ như một hacker để tìm điểm yếu trong hệ thống và mạng máy tính, nhờ đó sẽ dễ dàng hơn trong việc sửa các lỗ hổng bảo mật và ngăn chặn các mối đe dọa tiềm ẩn.

Yêu cầu: Bạn sẽ cần hai năm kinh nghiệm làm việc trong lĩnh vực bảo mật thông tin.

Mức lương trung bình sau khi có được chứng chỉ Certified Ethical Hacker (CEH): $106,375

Bằng đai xanh Six Sigma

Six Sigma là một phương pháp quản lý được sử dụng để đơn giản hóa quản lý chất lượng liên quan đến nhiều cấp độ. Vì vậy mà bạn không thể nhảy vượt các cấp trong chứng chỉ Six Sigma, vì vậy bất kể bạn đang ở đâu trong sự nghiệp của mình thì đều phải bắt đầu với chứng chỉ Green Belt – cấp thấp nhất. Là một đai xanh Six Sigma, bạn sẽ được hướng dẫn bởi một đai đen trong tổ chức của mình, người sẽ cố vấn bạn trong khi bạn học phương pháp luận.

Yêu cầu: Ba năm kinh nghiệm làm full-time tại một hoặc nhiều lĩnh vực của Six Sigma Green Belt.

Mức lương trung bình sau khi có được chứng chỉ Six Sigma Green Belt: $104,099

Chứng chỉ Citrix Certified Professional – Virtualization (CCP-V)

Chứng nhận của CCP-V thể hiện năng lực trong các ứng dụng desktop ảo sử dụng công nghệ Citrix. Trong đó bao gồm cài đặt các công nghệ, định thành phần kỹ thuật và cấu hình thử nghiệm. Trong năm 2014, chứng nhận này cũng đã thay thế chứng chỉ Citrix Certified Enterprise Engineer (CCEE) và tập trung vào các kỹ năng để triển khai, duy trì và xác định giải pháp dựa trên phần mềm XenDesktop của Citrix.

Yêu cầu: Bạn cần phải đạt được chứng nhận cấp associate của mình trước khi có thể chuyển sang CCP-V.

Mức lương trung bình sau khi có được chứng chỉ CCP-V certification: $103,424

Chứng chỉ Microsoft Certified Solutions Expert (MCSE) – Cơ sở hạ tầng máy chủ

Chứng nhận MCSE là đặc biệt nhất trong danh sách này, vì nó không còn được cung cấp thông qua Microsoft – mà được thay thế bằng chứng nhận MCSE: Cloud Platform và Infrastructure. Tuy nhiên, chứng nhận vẫn được góp mặt vào trong danh sách vì nó vẫn hợp lệ nếu bạn nhận được chứng chỉ trước tháng 3 năm 2017.

Chứng nhận này chứng minh khả năng của bạn để chạy một trung tâm dữ liệu hiệu quả cũng như là kiến thức vững vàng trong các lĩnh vực như công nghệ đám mây, ảo hóa, lưu trữ, mạng, hệ thống và quản lý danh tính.

Yêu cầu: Để kiếm được chứng nhận MCSE, trước tiên bạn cần có một trong bốn chứng chỉ MCSA được cung cấp bởi Microsoft.

Mức lương trung bình sau khi có được chứng chỉ Microsoft Certified Solutions Expert (MCSE) – Server Infrastructure: $100,656

Chứng chỉ kiểm toán viên hệ thống thông tin (CISA)

ISACA cho biết chứng chỉ CISA là “chứng nhận được công nhận toàn cầu về kiểm soát IS.” Đã được bắt đầu kể từ khoảng năm 1978 và tập trung vào việc thể hiện khả năng của bạn trong mọi giai đoạn của quá trình kiểm toán, báo cáo về thủ tục cũng như kĩ năng có thể đánh giá như thế nào về lỗ hổng bảo mật.

Yêu cầu: Bạn sẽ cần ít nhất năm năm kinh nghiệm trong việc kiểm tra, kiểm soát hoặc bảo mật IS. Có bài kiểm tra mà bạn sẽ cần vượt qua trước khi chuyển sang kỳ thi CISA. Giống như các chứng chỉ ISACA khác, bạn sẽ cần phải liên tục làm bài thi mỗi năm để duy trì chứng nhận của mình.

Mức lương trung bình sau khi có được chứng chỉ CISA certification: $99,648

Chứng nhận Cisco Certified Network Professional (CCNP) Routing và Switching

Chứng nhận CCNP dành cho các chuyên gia IT đã hoàn thành chứng chỉ CCNA và chuyển sang lớp tiếp theo. Theo giấy chứng nhận CCNP, bạn có thể chọn chuyên về Cloud, trung tâm dữ liệu, định tuyến và chuyển mạch cũng như là bảo mật.

Yêu cầu: Bạn sẽ cần hoàn thành bài kiểm tra CCNA Routing và Switching hoặc bất kỳ bài kiểm tra CCIE nào trước khi chuyển sang kỳ thi chứng nhận CCNP.

Mức lương trung bình sau khi có được chứng chỉ CCNP Routing và Switching certification: $99,402

Chứng chỉ Citrix Certified Associate – Networking (CCA-N)

Chứng chỉ CCA-N tập trung vào việc chứng minh trình độ sử dụng NetScaler Gateway trong môi trường doanh nghiệp. Bài kiểm tra bao gồm các lĩnh vực xung quanh việc sử dụng NetScaler Gateway để truy cập an toàn các máy tính desktop, ứng dụng và dữ liệu từ xa.

Yêu cầu: Không có điều kiện tiên quyết để lấy chứng chỉ CCA-N.

Mức lương trung bình sau khi có được chứng chỉ CCA-N certification: $99,217

TopDev via CIO

Mười điều răn dành cho lập trình viên

Đây là mười điều răn mà tất cả các lập trình viên nên tuân theo, theo Jerry Weinberg – Tâm lý học lập trình:

  1. Hiểu và chấp nhận rằng chúng ta sẽ có lúc phạm sai lầm. Vấn đề là tìm ra chúng sớm, trước khi đưa vào sản xuất. May mắn thay, ngoại trừ vài người trong chúng tôi phát triển phần mềm hướng dẫn tên lửa tại JPL, những sai lầm hiếm khi gây tử vong trong ngành của chúng tôi, vì vậy chúng tôi có thể, và nên học, vui vẻ và tiếp tục công việc.
  2. Bạn không phải là code của bạn. Hãy nhớ rằng bản chất của việc review là tìm ra vấn đề và các vấn đề sẽ được tìm thấy. Đừng khư khư giữ cho riêng mình khi mà vấn đề chưa được tìm ra
  3. Đừng tự cho mình là cao thủ sẽ luôn có người nào đó giỏi hơn bạn: Mỗi người đều có thể là thầy của bạn; có thể dạy bạn một số kiến thức mới nếu bạn hỏi. Tìm kiếm và chấp nhận học hỏi từ những người khác, đặc biệt là ngay cả khi bạn nghĩ rằng nó không cần thiết.
  4. Không viết lại code khi chưa thảo luận với đồng nghiệp: Có một đường thẳng song song giữa “fixing code” và “rewriting code”. Chấp nhận sự khác biệt, và tuân thủ sự thay đổi trong khuôn khổ, đừng tự ý hành động.
  5. Đối xử với những người ít biết về bạn bằng sự tôn trọng, kính nể và kiên nhẫn. Những người không hiểu gì về kỹ thuật, những người thường xuyên làm việc với các nhà phát triển, hầu như giữ quan điểm rằng chúng tôi là những người tự mãn, cô độc, hay than vãn. Đừng củng cố thêm quan niệm này bằng thái độ giận dữ, thiếu kiên nhân
  6. Cách duy nhất để phát triển chính là luôn thay đổi bản thân. Hãy cởi mở và chấp nhận những điều mới. Hãy sẵn lòng xem xét thay đổi đối với yêu cầu, framework hoặc công cụ như một thử thách mới, không phải là một sự bất tiện.
  7. Quyền lực thực sự bắt nguồn từ tri thức, không phải từ vị trí của bạn. Kiến thức tạo ra quyền hạn, và quyền lực tạo ra sự tôn trọng – vì vậy nếu bạn muốn được tôn trọng trong một môi trường, hãy trau dồi kiến thức từ bây giờ.
  8. Chiến đấu cho những gì bạn tin tưởng, nhưng cũng biết chấp nhận thất bại. Hãy hiểu rằng đôi khi ý tưởng của bạn sẽ bị loại bỏ. Ngay cả khi bạn đúng, đừng trả thù hay nói, “Tôi đã nói với bạn như vậy” nhiều hơn một vài lần, và đừng làm cho ý tưởng của bạn trở thành một người tử vì đạo hay khóc.
  9. Đừng là “một coder đơn độc”. Đừng là anh chàng coder suốt ngày ngồi trong phòng: không tiếp xúc với mọi người, không có những thú vui khác, cô lập tại văn phòng làm việc.
  10. Review code thay vì người code – hãy tử tế với người lập trình chứ không phải code của họ. Làm cho tất cả các ý kiến của bạn tích cực và định hướng để cải thiện code càng nhiều càng tốt. Đưa ra những nhận xét gắn với các tiêu chuẩn, giúp tăng hiệu suất,…

TopDev via Techtalk

  Những nguyên tắc, định luật của lập trình mà chúng ta nên có sẵn trong đầu
  Vì miếng ăn mà phá cả nồi cơm – Thực tại đáng lo của nghề lập trình

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Tổng hợp các Module Python “khủng” mà bạn có thể đã bỏ qua

Tác giả: Adam Goldschmidt

Python là một ngôn ngữ lập trình tuyệt vời, và nó chứa nhiều module tích hợp sẵn nhằm giúp chúng ta viết code tốt hơn, code đẹp hơn.

Mục tiêu

Thông qua bài viết này, chúng ta sẽ sử dụng một vài module và phương pháp ít ai biết mà có thể cải thiện được cách code của chúng ta cả về phần nhìn và tính hiệu quả.

NamedTuple

Tôi tin rằng một vài người hẳn đã biết tới câu lệnh phổ biến hơn là namedtuple từ module collections (Nếu chưa biết bạn có thể xem tại đây), nhưng kể từ phiên bản Python 3.6, một loại mới đã có trong module typingNamedTuple. Cả hai đều được thiết kế để giúp bạn nhanh chóng tạo ra những đối tượng bất biến có thể đọc được.

NamedTuple thực ra là một phiên bản viết lại của namedtuple, và theo quan điểm của tôi thì nó dễ đọc hơn nhiều:

In [2]: import typing                                                                                                                                                                                               

In [3]: class BetterLookingArticle(typing.NamedTuple): 
   ...:     title: str 
   ...:     id: int 
   ...:     description: str = "No description given." 
   ...:                                                                                                                                                                                                             

In [4]: BetterLookingArticle(title="Python is cool.", id=1)                                                                                                                                                  
BetterLookingArticle(title='Python is cool.', id=1, description='No description given.')

Còn thay vào đó nếu ta sử dụng namedtuple:

In [6]: import collections                                                                                                                                                                                          

In [7]: Article = collections.namedtuple("Article", ["title", "description", "id"])                                                                                                                                 

In [8]: Article(title="Python is cool.", id=1, description="")                                                                                                                                               
Article(title='Python is cool.', description='', id=1)

array.array

Các mảng giá trị số hiệu quả. Mảng là những loại trình tự hoạt động rất giống như list, ngoại trừ các loại đối tượng được lưu trữ bị hạn chế.

Khi sử dụng module array, chúng ta cần khởi tạo bằng 1 typecode kiểu mã mà trong đó tất cả những element phần tử đều được sử dụng. Hãy so sánh tính hiệu quả về thời gian với một list thông thường, viết nhiều số nguyên trong một file (sử dụng module pickle để viết một list thông thường):

https://gist.github.com/AdamGold/961758c66cdfe92642eabb61d9ce9866

Có thể thấy là nhanh hơn gấp 14 lần bình thường. Tất nhiên là cũng phụ thuộc vào module pickle , nhưng sử dụng mảng vẫn gọn hơn so với sử dụng list. Vậy nên nếu bạn đang dùng những giá trị số đơn giản, bạn nên cân nhắc việc sử dụng module array.

  Lập trình Python trên IntelliJ IDEA (code Python trên IntelliJ)

Việc làm python không yêu cầu kinh nghiệm

itertools.combinations

itertools là một module ấn tượng. Nó có rất nhiều phương thức khác nhau giúp tiết kiệm thời gian, tất cả đều được liệt kê ở đây. Thậm chí còn có cả một kho GitHub viết nhiều hơn về itertools.

Tôi đã sử dụng phương thức combinations trong tuần này và tôi nghĩ là tôi sẽ chia sẻ về nó. Phương thức này lấy một số lặp và một số nguyên làm đối số, và tạo ra một trình bao gồm tất cả các tổ hợp có thể có của phép lặp với một dãy số nguyên dài nhất mà không bị trùng lặp:

In [16]: import itertools                                                                                                                                                                                           
In [17]: list(itertools.combinations([1, 2, 3, 4], 2))                                                                                                                                                       
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

dict.fromkeys

Đây là cách viết một dict cách nhanh chóng và đẹp mắt với giá trị mặc định:

In [18]: dict.fromkeys(["key1", "key2", "key3"], "DEFAULT_VALUE")                                                                                                                                            
{'key1': 'DEFAULT_VALUE', 'key2': 'DEFAULT_VALUE', 'key3': 'DEFAULT_VALUE'}

Cuối cùng nhưng không kém phần quan trọng – Module dis

Module dis hỗ trợ phân tích bytecode CPython bằng cách phân tách nó.

Có thể bạn đã biết hoặc chưa biết, Python dịch mã nguồn thành một tập hợp các chỉ thị gọi là “bytecode”. Module dis giúp chúng ta xử lý những chỉ thị này, và đồng thời nó cũng là một công cụ debug tuyệt vời.

Đây là một ví dụ trong cuốn Fluent Python:

In [22]: t = (1, 2, [3, 4])                                                                                                                                                                                         
In [23]: t[2] += [30, 40]                                                                                                                                                                                           
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-af836a8d44a2> in <module>
----> 1 t[2] += [30, 40]

TypeError: 'tuple' object does not support item assignment

In [24]: t                                                                                                                                                                                                          
Out[24]: (1, 2, [3, 4, 30, 40])

Bị một lỗi nhưng hệ thống vẫn hoạt động. Tại sao lại như vậy? Nếu chúng ta nhìn vào bytecode (Tôi đã thêm chú thích gần những phần quan trọng):

In [25]: dis.dis("t[a] += b")                                                                                                                                                                                       
  1           0 LOAD_NAME                0 (t)
              2 LOAD_NAME                1 (a)
              4 DUP_TOP_TWO
              6 BINARY_SUBSCR
              8 LOAD_NAME                2 (b)
             10 INPLACE_ADD --> (value in t[a]) += b --> succeeds because list is mutable
             12 ROT_THREE
             14 STORE_SUBSCR --> Assign t[a] = our list --> Fails, t[a] is immutable.
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

Trước khi kết thúc… 

<iframe src=”https://giphy.com/embed/l2R0eYcNq9rJUsVAA” width=”480″ height=”288″ frameBorder=”0″ class=”giphy-embed” allowFullScreen></iframe><p><a href=”https://giphy.com/gifs/latelateshow-james-corden-late-show-l2R0eYcNq9rJUsVAA”>via GIPHY</a></p>

Thanks for reading! For more Python related articles and other cool stuff, you can follow me on Medium or GitHub (I star some awesome repos!).

Xin cảm ơn các bạn đã đọc bài viết này! Để đọc nhiều bài viết hơn về Python và những chủ đề hay khác, bạn có thể follow tôi trên Medium hoặc GitHub (….

Nếu bạn thích bài viết này, hãy nhấn giữ nút để những người khác có thể tìm thấy bài viết. Bạn càng giữ lâu, bạn sẽ càng chia sẻ cho nhiều người hơn!

Và đừng ngần ngại chia sẻ thêm nhiều kiến thức bổ ích về Python ở phần bình luận bên dưới nhé!

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

Việc làm IT mới nhất trên TopDev, tham khảo ngay!

Regex là gì? Cú pháp và cách viết Regex chi tiết

regex-la-gi

Bạn thường xuyên viết những đoạn mã dài và lặp đi lặp lại và cần một pattern để tối ưu. Regular Expression (Regex) chính là công cụ sẽ giúp bạn đơn giản hóa công việc này. Vậy chính xác thì Regular Expression, hay còn gọi là Regex, là gì? Hãy cùng TopDev tìm hiểu chi tiết trong bài viết dưới đây!

Regex là gì?

Regex, viết tắt của Regular Expression (biểu thức chính quy), là các mẫu (pattern) dùng để tìm/thay thế (Find/Replace) và thao tác với chuỗi văn bản. Là một công cụ cực mạnh cho xử lí chuỗi trong Php, JavaScript…

Regex còn được viết là RegExp hay RegExr

Ví dụ: Khi kiểm tra tính hợp lệ của email hoặc số điện thoại thì điều bạn nghĩ tới đầu tiên chính là regex.

Để xác định xem một chuỗi có phải là địa chỉ email hợp lệ không, bạn có thể sử dụng Regex để kiểm tra xem chuỗi đó có đúng định dạng email hay không, như là có chứa ký tự @, theo sau là tên miền hợp lệ. Một mẫu Regex đơn giản cho email có thể là: /^[^\s@]+@[^\s@]+\.[^\s@]+$/

Mẫu này kiểm tra rằng chuỗi bắt đầu với một hoặc nhiều ký tự không phải khoảng trắng hoặc @, sau đó là ký tự @, tiếp theo là một hoặc nhiều ký tự không phải khoảng trắng hoặc @, rồi đến dấu . và cuối cùng là một hoặc nhiều ký tự không phải khoảng trắng hoặc @.

Regex còn được viết là RegExp hay RegExr
Tìm hiểu Regex cơ bản

Các cú pháp cơ bản Regular Expression

Nói chung là Regex còn nhiều ứng dụng hữu ích khác, tóm gọn lại một chút là hiểu đơn giản thì regex là một chuỗi các kí tự miêu tả một bộ các chuỗi ki tự khác, theo những quy tắc và cú pháp nhất định.

Dưới đây là bảng tóm tắt các cú pháp cơ bản của Regular Expression (Regex):

Ký hiệu Ý Nghĩa Ví Dụ Giải Thích
. Bất kỳ ký tự nào a.c Tìm các chuỗi như abc, a1c, nhưng không phải ac
\d Chữ số (0-9) \d{3} Tìm ba chữ số liên tiếp, ví dụ: 123
\D Không phải chữ số \D{2} Tìm hai ký tự không phải chữ số
\w Ký tự chữ và số (a-z, A-Z, 0-9, _) \w+ Tìm một hoặc nhiều ký tự chữ và số
\W Ký tự không phải chữ và số \W+ Tìm một hoặc nhiều ký tự không phải chữ và số
\s Ký tự khoảng trắng (space, tab, line break) \s+ Tìm một hoặc nhiều ký tự khoảng trắng
\S Ký tự không phải khoảng trắng \S+ Tìm một hoặc nhiều ký tự không phải khoảng trắng
^ Bắt đầu chuỗi ^abc Tìm chuỗi bắt đầu bằng abc
$ Kết thúc chuỗi abc$ Tìm chuỗi kết thúc bằng abc
* Lặp lại 0 hoặc nhiều lần a* Tìm 0 hoặc nhiều ký tự ‘a’
+ Lặp lại 1 hoặc nhiều lần a+ Tìm 1 hoặc nhiều ký tự ‘a’
? Tùy chọn (0 hoặc 1 lần) a? Tìm 0 hoặc 1 ký tự ‘a’
{n} Lặp lại chính xác n lần a{3} Tìm ba ký tự ‘a’ liên tiếp
{n,} Lặp lại ít nhất n lần a{2,} Tìm ít nhất hai ký tự ‘a’
{n,m} Lặp lại từ n đến m lần a{2,4} Tìm từ hai đến bốn ký tự ‘a’
[] Nhóm ký tự [abc] Tìm một ký tự trong nhóm ‘a’, ‘b’, hoặc ‘c’
[^ ] Ký tự không nằm trong nhóm [^a-c] Tìm ký tự không phải ‘a’, ‘b’, hoặc ‘c’
` ` Hoặc `a
() Nhóm ký tự (abc)+ Tìm nhóm ‘abc’ lặp lại một hoặc nhiều lần
\ Escape ký tự đặc biệt \. Tìm ký tự ‘.’ (giá trị chính xác của dấu chấm)

Các cú pháp này giúp bạn xây dựng các mẫu để tìm kiếm, thay thế và phân tích dữ liệu một cách linh hoạt và hiệu quả.

  Học Regular Expression và cuộc đời bạn sẽ bớt khổ (Updated v2.2)

Ứng dụng Regex

Nhắc lại: Nguyên tắc hoạt động của biểu thức RegEx là so khớp dựa vào mẫu (pattern), mẫu được xây dựng từ các quy tắc căn bản của biểu thức RegEx. Và để các bạn nắm rõ regular expression là gì thì có một hàm xử lý Regular Expression trong php đó là hàm preg_match, sau đó đưa ra một vài ví dụ nhỏ để các bạn thực hành trước khi tìm hiểu các phần nâng cao hơn.

Một số ứng dụng của Regex:

  • Tìm kiếm: Xác định và tìm kiếm các mẫu cụ thể trong văn bản.
  • Thay thế: Thay thế các phần của văn bản dựa trên mẫu.
  • Xác thực: Kiểm tra xem dữ liệu có phù hợp với định dạng yêu cầu không, chẳng hạn như email, số điện thoại.
  • Tách dữ liệu: Phân tích và tách dữ liệu từ văn bản dựa trên mẫu.

Hàm Preg_match trong php

Cú pháp là: preg_match($pattern, $subject, $matches)

  • $pattern là chuỗi Regex Pattern
  • $subject là chuỗi nguồn để chúng ta so khớp với $pattern
  • $matches là danh sách kết quả trả về đúng khi so khớp 2 chuỗi trên

VD 1: kiểm tra mội chuỗi là số

if (preg_match('/^[0-9]+$/', '123', $matches)){
    var_dump($matches);
}

Kết quả:

array
  0 => string '123' (length=3)

VD 2: Kiểm tra một chuỗi là các ký tự thường

if (preg_match('/^[a-z]+$/', 'topdev', $matches)){
    var_dump($matches);
}

Kết quả

array
  0 => string 'topdev' (length=6)

VD 3: Kiểm tra một chuỗi là các ký tự hoa

if (preg_match('/^[A-Z]+$/', 'TOPDEV', $matches)){
    var_dump($matches);
}

Kết quả

array
  0 => string 'TOPDEV' (length=6)

Tạo 1 Regular Expressions trong JS

Trong Javascript thì Regular Expression là một chuỗi nhưng nó không được bao quanh bởi cặp dấu nháy đơn ' hoặc nháy kép " mà nó được bao quanh bởi cặp dấu /. Có 2 cách tạo:

Cú pháp: new RegExp(pattern[, flags])

VD:

var regexConst = new RegExp('abc');

Hoặc sử dụng dấu /

Cú pháp: /pattern/flags

Trong đó:

  • pattern là chuỗi Regular Expression
  • flags là thông số cấu hình cho chuỗi pattern và nó có các giá trị:
    • i : so khớp không quan tâm đến chữ hoa chữ thường
    • g : so khớp toàn bộ chuỗi cần tìm
    • m : so khớp luôn cả các dữ liệu xuống dòng (multiline)

Ví dụ: Pattern kiểm tra chuỗi có tồn tại chữ “topdev” không, không phân biệt chữ hoa chữ thường và tìm toàn bộ tài liệu.

var pattern = /topdev/igm;
  • pattern là topdev
  • flags là igm

Cách viết Regex chi tiết

Trong Regex có vài cái khá là điển hình và được sử dụng rất nhiều bao gồm so khớp chuỗi, tách chuỗi, tìm kiếm trong chuỗi, thay thế chuỗi… Các cách sử dụng chi tiết Regex trong Javascript bạn có thể tham khảo chi tiết tại đây nhé hoặc ở đây.

Ký tự thường

STT Biểu thức Mô tả Ghi chú
01 a|b Khớp với a hoặc b
02 [0-9] Khớp với một trong số từ 0 tới 9
03 [a-z] Khớp với một trong chữ từ a tới z
04 [abc] Có thể khớp với a, b hoặc c
05 [^abc] Khớp với bất kì kí tự nào ngoài a, b và c Nếu ^ xuất hiện đầu tiên sau ngoặc vuông, nó có nghĩa là phủ định
06 \d Số bất kì Thay thế cho [0-9]
07 \D Ký tự không phải là số Thay thế cho [^0-9]
08 \s Kí tự khoảng trắng
09 \S Không phải kí tự khoẳng trắng Thay thế cho [^\s]
10 \S+ Một số kí tự không phải khoẳng trắng Một hoặc một số
11 \w Kí tự chữ Thay thế cho [a-zA-Z0-9]
12 \W Kí tự không phải chữ Thay thế cho [^\w]
13 \b Ký tự thuộc a-z hoặc A-Z hoặc 0-9 hoặc _ Thay thế cho [a-zA-Z0-9_]

Ký tự đặc biệt

TT Biểu thức Mô tả Ghi chú
14 . Khớp với bất kỳ ký tự đơn nào ngoại trừ \
15 ^ Bắt đầu của từ
16 $ Kết thúc của từ
17 / Bắt đầu hoặc kết thúc chuỗi regex
18 Sủ dụng tương đương phép or Hay dùng trong cặp ngoặc tròn
19 \ Biểu diễn một kí tự ngay sau nó từ kí tự đặc biệt thành kí tự thường và ngược lại VD: \b sẽ trở thành như mình nói ở trên, * sẽ trở thành kí tự * chứ không phải số lần lặp nữa

Toán tử và ký hiệu

STT Biểu thức Mô tả Ghi chú
20 * Xuất hiện 0 hoặc nhiều lần viết ngắn gọn cho {0,}
21 + Xuất hiện 1 hoặc nhiều lần viết ngắn gọn cho {1,}
22 ? Xuất hiện 0 hoặc 1 lần viết ngắn gọn cho {0,1}
23 {X} Xuất hiện X lần X không phải số âm
24 {X,Y} Xuất hiện trong khoảng X tới Y lần X,Y không phải số âm
25 ? có nghĩa là xuất hiện 0 hoặc nhiều lần, thêm ? phía sau nghĩa là tìm kiếm khớp nhỏ nhất

Khớp nhóm

STT Biểu thức Mô tả Ghi chú
26 () Khớp với một nhóm các kí tự đồng thời nhớ kết quả khớp Ví dụ (e|g)mail sẽ khớp với email hoặc gmail. /(ab) (cd) \1 \2/ sẽ khớp với “ab cd ab cd”
27 (?:x) Khớp với x nhưng không nhớ kết quả khớp “foo foo” sẽ khớp với /(foo) \1/ chứ không khớp với (?:foo) \1
28 x(?=y) Chỉ khớp x nếu ngay sau x là y “hello” sẽ khớp với /h(?=e)/ nhưng kết quả trả về chỉ có h
29 x(?!y) Chỉ khớp x nếu ngay sau x không phải là y

TopDev

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

Xem thêm việc làm php, việc làm Javascript lương cao tại TopDev!

Củng cố thứ hạng trên Appstore bằng ASO (P1): Tổng quan về ASO và lợi ích

*App Store Optimization (ASO) – tối ưu hóa cửa hàng ứng dụng là tất cả các cách thức khiến app của bạn tăng thứ hạng và lượt tải tự nhiên (organic download) trên các cửa hàng ứng dụng. Tải xuống nhiều hơn có nghĩa là nhiều người dùng hơn và kéo theo đó là cải thiện và tăng trưởng doanh thu. Nghe thì có vẻ đơn giản, nhưng sự thật thì không như thế.

Có lẽ bạn đang tự hỏi ASO hoạt động như thế nào? Nó có đáng để chúng ta tìm hiểu và đầu tư? Ta nên bắt đầu từ đâu đây? Đừng lo lắng nhé! Thông qua bài viết này, bạn sẽ có cái nhìn tổng quan về ASO. Chúng tôi sẽ đề cập đến vấn đề này và nhiều câu hỏi khác liên quan đến ASO trong bài hướng dẫn dưới đây.

Vì vậy, hãy tiếp tục đọc và bắt tay vào việc tăng trưởng kinh doanh trên mobile của bạn ngay bây giờ!

ASO

App Store Optimization (ASO) là gì?

Tối ưu hóa cửa hàng ứng dụng là quá trình cải thiện khả năng hiển thị của ứng dụng của bạn trong một cửa hàng ứng dụng di động (Apple App Store & Google Play). Nguyên tắc cơ bản của ASO, bên cạnh thứ hạng cao trong cửa hàng ứng dụng, là tập trung vào tỷ lệ nhấp (Click-through rate – CTR). Điều này có nghĩa là bạn phải thuyết phục mọi người thực sự click vào ứng dụng của bạn một khi họ tìm thấy nó. Bạn có thể làm như vậy bằng cách tối ưu hóa Tên ứng dụng, Tiêu đề, Logo, Ảnh chụp màn hình và Xếp hạng ứng dụng. Nhưng nó không chỉ có vậy!

Khi mọi người nhấp vào ứng dụng của bạn và trên App Landing Page của bạn, bạn phải đảm bảo họ cũng tải ứng dụng hoặc mua hàng. Phần này của Tối ưu hóa trong cửa hàng ứng dụng còn được gọi là Tối ưu hóa tỷ lệ chuyển đổi (Conversion Rate Optimization – CRO).

  Để lọt vào mắt xanh của Google, Microsoft, Apple, hãy nhớ 4 bí kíp sau!

  Giảm thiểu kích cỡ ứng dụng trong Android

Khác biệt giữa ASO và SEO

ASO thường được gọi là App Store SEO (Search Engine Optimization – Tối ưu hóa công cụ tìm kiếm). Cả hai quá trình đều có chung điểm tương tự như tối ưu hóa từ khóa, liên kết ngược và tối ưu hóa chuyển đổi. Sự khác biệt chính giữa Tối ưu hóa cửa hàng ứng dụng và Tối ưu hóa công cụ tìm kiếm là các yếu tố xếp hạng. Bên cạnh đó, ASO được sử dụng cho các ứng dụng di động trong khi SEO cho các trang web.

Google xem xét hơn 200 khía cạnh và danh sách tiếp tục mở rộng. Danh sách các yếu tố xếp hạng cho ASO ngắn hơn nhiều, tuy nhiên nhiều người vẫn không chắc chắn yếu tố nào đóng vai trò quan trọng hơn và cần thêm thời gian để xác định rõ vấn đề này.

Checklist minh họa dưới đây sẽ cho thấy sự khác biệt và tương đồng chính giữa ASO & SEO.

SEO&ASO

Tại sao tối ưu hóa cửa hàng ứng dụng lại quan trọng

Hơn 2 triệu ứng dụng có sẵn trong iTunes Connect và hơn 3,3 triệu ứng dụng được cung cấp bởi Google Play Store (Nguồn: Statista). Điều đó có nghĩa là, ứng dụng của bạn đang đối mặt với một cuộc cạnh tranh rất khó khăn.

Number of available apps

Mục tiêu chính của Tối ưu hóa cửa hàng ứng dụng là tăng lượt tải xuống và số lượng người dùng. Vì vậy, bước đầu tiên để tối đa hóa số lượt tải app của bạn là phải khiến người dùng tìm được nó. Nhưng làm thế nào bạn có thể làm điều đó?

Để hiểu làm thế nào để thúc đẩy mức tăng trưởng tự nhiên, trước tiên bạn phải hiểu cách mọi người bắt đầu search cho đến khi họ tìm được ứng dụng của bạn.

Làm thế nào người dùng tìm kiếm và tải app?

Mọi người chủ yếu tìm kiếm và “săn lùng” các ứng dụng cụ thể trong các cửa hàng ứng dụng hàng đầu như Google Play Store và Apple App Store (iTunes). Theo một nghiên cứu chi tiết hơn của Tune, 47% ứng dụng iOS được phát hiện thông qua tìm kiếm cửa hàng ứng dụng. Trên Google Play Store, thậm chí 53% lượt tải xuống có được bởi tìm kiếm. Rõ ràng, tìm kiếm cửa hàng ứng dụng là phương pháp phổ biến nhất để khám phá các ứng dụng mới.

how users find apps

Hơn nữa, vị trí xếp hạng của một ứng dụng tương quan trực tiếp với số lượt tải xuống. Ứng dụng của bạn xếp hạng càng cao trong một cửa hàng, nó càng xuất hiện nhiều hơn với người dùng. Các ứng dụng xếp hạng cao hơn cũng nhận được nhiều lượt tải xuống hơn vì người dùng thường không kéo xuống và xem qua tất cả các kết quả tìm kiếm. Nếu như không có ASO, bạn đang bỏ lỡ một phương thức để tiếp thị mạnh nhất, nhanh nhất, lớn nhất cho các ứng dụng và trò chơi. Do đó, học về ASO và đầu tư thời gian vào có thể là vũ khí bí mật mang lại kết quả lâu dài cho bạn. Tò mò về những lợi thế khác của ASO? Chỉ cần tiếp tục đọc và bạn sẽ tìm ra!

  Flutter là gì? Ưu điểm vượt trội và cơ hội việc làm hấp dẫn

Những lợi ích của ASO là gì?

Như bây giờ bạn biết rằng hầu hết người dùng tìm thấy ứng dụng bằng cách tìm kiếm các cửa hàng ứng dụng, bạn có thể nhận ra rằng Tối ưu hóa App Store là điều bắt buộc nếu bạn muốn có được ứng dụng của mình trước người dùng phù hợp. Trên thực tế, nhiều người cho rằng tối ưu hóa ứng dụng của bạn là chiến lược tiếp thị hiệu quả nhất cho các ứng dụng và trò chơi di động. Đây là cách bạn có thể hưởng lợi từ ASO:

  • Cải thiện Độ hiển thị và Sự nổi bật trên App Store

Cho dù ứng dụng hoặc trò chơi của bạn tốt đến đâu, nếu không thể tìm thấy nó trong các cửa hàng thì nó không tốt. Vì vậy, đừng để mọi thứ khó khăn hơn, bắt đầu tối ưu hóa!

  • Giúp người dùng có nhu cầu dễ dàng tìm thấy

ASO sẽ giúp bạn “đúng app đúng người” và trở thành “điểm đến lí tưởng” cho những người dùng thực sự tìm kiếm và cần một ứng dụng như cái bạn đang có.

  • Tăng lượt tải xuống tự nhiên (organic download)

Chiến lược ASO tốt là cách tuyệt vời để tăng lượng download tự nhiên của bạn và đảm bảo kết quả lâu dài. Với việc theo dõi và điều chỉnh thường xuyên, những nỗ lực của bạn chắc chắn sẽ thành công.

  • Cắt giảm chi phí chuyển đổi users

Thay vì chi tiền cho quảng cáo, bạn có thể giảm chi phí chuyển đổi người dùng bằng cách tập trung vào tăng trưởng tự nhiên với ASO. Điều này không chỉ giúp bạn tiết kiệm tiền mà còn đảm bảo sự tăng trưởng ổn định.

  • Tăng doanh thu và tỷ lệ chuyển đổi (CR) của bạn

Quảng cáo, mua trong ứng dụng và các cách tương tự để kiếm tiền từ ứng dụng chỉ là một phần của doanh thu. Nếu người dùng đến trang của bạn thông qua quảng cáo nhưng không tải xuống, bạn sẽ không nhận được gì cả. Đó là lí do tại sao ASO là cần thiết.

  • Mở rộng ứng dụng của bạn trên toàn thế giới

Bằng cách làm cho ứng dụng của bạn tích hợp nhiều ngôn ngữ khác, bạn có thể tìm thấy người dùng từ khắp nơi trên thế giới. ASO có thể giúp bạn đưa ứng dụng của bạn toàn cầu.

Phần 2 bạn sẽ tìm hiểu xem cách thức App Store Optimization hoạt động như thế nào….cùng theo dõi nhé!

Source: appradar.com

Vietnam Mobile Day 2019 – nơi hội tụ những chuyên gia trong lĩnh vực ứng dụng sẽ cùng bạn chinh phục những bảng xếp hạng trên App Store, đừng bỏ lỡ nhiều topic hay tại VMD2019 do TopDev tổ chức năm nay nhé!

Để lọt vào mắt xanh của Google, Microsoft, Apple, hãy nhớ 4 bí kíp sau!


Được nhà tuyển dụng của một công ty công nghệ lớn chú ý không phải là điều dễ dàng gì. Cùng xem các mẹo sau để lọt vào mắt xanh các ông trùm nhé!


Những công ty công nghệ hàng đầu từ Silicon Valley như Google, Microsoft và Apple được xem là môi trường làm việc trong mơ của hàng ngàn lập trình viên. Hàng ngàn nhà phát triển, thiết kế, kỹ sư, nhà khoa học dữ liệu và quản lý giỏi và có tiềm năng nhất sẽ làm bất cứ điều gì để có một suất làm việc ở đây.

Ba công ty này nhiều năm nay đã nhận được vô số hồ sơ ứng tuyển. Trên thực tế, Michael Morell, một chuyên gia tuyển dụng tại Palo Alto, California cho biết: trong một cuộc phỏng vấn với tờ New York Times, năm 2008, Google tiết lộ họ nhận được 20.000 hồ sơ mỗi tuần, nhưng càng về sau, con số này đã lên đến 70.000.

Bạn có thể tưởng tượng được núi hồ sơ Google, Microsoft và Apple nhận được chưa? Đương nhiên, số lượng đơn xin việc tại các công ty này vẫn tiếp tục tăng lên đáng kể.

Đối với ứng viên nộp đơn, tỉ lệ cạnh tranh vô cùng lớn, nhưng đừng vì vậy mà từ bỏ ý định gửi đơn nhé!

Hãy để Techtalk chia sẻ vài bí kíp giúp bạn tăng cơ hội được chọn tại các công ty đáng mơ ước này. Bài viết này đã nghiên cứu kỹ lưỡng về lĩnh vực tuyển dụng thực tế, kỹ năng làm việc và những sai lầm điển hình của ứng cử viên mà bạn chắc chắn có thể học hỏi chút ít.

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

  5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!
  Phân tích 80+ email từ chối ứng tuyển vào vị trí lập trình viên Python và kết quả không ai ngờ đến!

Với số lượng hồ sơ mà Google, Microsoft và Apple nhận được thì việc xem xét kỹ lưỡng từng đơn sẽ tốn nhiều tháng, thậm chí hàng năm! Rõ ràng, các nhà tuyển dụng sẽ không làm điều đó. Họ xem xét càng nhiều ứng viên càng tốt bằng cách giảm thời gian họ dành để xem một hồ sơ.

Theo nghiên cứu của TheLadders, các nhà tuyển dụng chỉ dành 6s để xem xét một hồ sơ cá nhân. Đây là cách duy nhất họ có thể phân tích càng nhiều hồ sơ càng tốt.

Vì vậy, bạn phải tạo ấn tượng tốt, một cách nhanh chóng!

Dưới đây là những gì bạn có thể làm để cho nhà tuyển dụng biết bạn là nhân tố họ đang tìm kiếm:

  • Đính kèm tên của bạn cùng với thư giới thiệu và chứng chỉ, bằng cấp liên quan (MBA, v.v.) với font chữ dễ đọc, rõ ràng nhất
  • Tránh liệt kê quá nhiều nhiều việc làm ngắn hạn
  • Làm nổi bật vai trò của bạn trong từng công việc
  • Không sử dụng font chữ và hình ảnh rườm rà rối mắt
  • Ảnh cá nhân phải chuyên nghiệp

Vượt qua quy luật 6s, chào mừng bạn đến với một bài kiểm tra nghiêm túc hơn. Bạn chỉ có thể vượt qua nếu khéo léo tránh được một số lỗi nhất định. Scott Bacon, một cựu quản lý nhân sự của Google đã đồng ý chia sẻ một số bí mật tuyển dụng của gã công nghệ khổng lồ này trong một cuộc phỏng vấn với công ty Fast Company.

Sau đây là những sai lầm đảm bảo sẽ khiến bạn auto rớt trong bài kiểm tra đánh giá này:

  • Quá nhiều chữ. Bacon khuyên chúng ta nên đặt những thông tin phù hợp nhất gần góc trên cùng bên trái vì đó là nơi các nhà tuyển dụng Google sẽ quét qua đầu tiên.
  • Mục tiêu nghề nghiệp ư, xưa rồi! Tốt hơn là nên soạn một list với tối đa 10 kỹ năng mà bạn có thể thảo luận với nhà tuyển dụng trong cuộc phỏng vấn.
  • Loại trừ những kinh nghiệm không liên quan. Một công ty nghiêm túc như Google, Microsoft hoặc Apple không quan tâm đến kinh nghiệm làm người pha chế của bạn.
  • Điều chỉnh resume cho phù hợp với từng công ty. Một nhà tuyển dụng giàu kinh nghiệm sẽ phát hiện gần như ngay tức khắc nếu bạn có đầu tư cho CV của mình hay không. Đối với họ, những hồ sơ như vậy đồng nghĩa với việc xúc phạm nhà tuyển dụng.
  • Sơ lược những thành tích bạn đạt được. Lời khuyên của Bacon là “1 dòng tóm lược, 2 dòng thành tích”.

Google, Microsoft và Apple đều sẽ muốn nhân viên của mình có nhiều kỹ năng và đa tài. Nhưng những kỹ năng nào sẽ được các ông lớn đánh giá cao? Nghiên cứu của Paysa, một hội đồng quản trị phổ biến, sẽ cho chúng ta câu trả lời.

Các nhà nghiên cứu đã phân tích hồ sơ của những người làm việc tại Microsoft, Apple và Google, và lọc ra một số điểm chung trong các kỹ năng mà họ có.

Đối với người quản lý sản phẩm:

  • Dịch vụ khách hàng
  • Khả năng lãnh đạo
  • Quản lý dự án, chiến lược
  • Điện toán đám mây
  • Tiếp thị sản phẩm

Đối với nhà thiết kế web:

  • Thiết kế web
  • Adobe Photoshop, Adobe Illustrator
  • Thiết kế giao diện người dùng (UI/UX)
  • Thiết kế đồ họa
  • Cấu trúc thông tin

Đối với các nhà khoa học dữ liệu:

  • Quản lý dự án
  • SQL
  • Thích ứng nhanh với máy móc
  • Phân tích và khai thác dữ liệu
  • Python

Đối với kỹ sư:

  • SQL
  • Python
  • Phát triển phần mềm
  • Java
  • JavaScript

Phần này dành cho những ai muốn tìm việc tại Apple. Apple được cho là công ty có văn hóa công ty độc đáo. Để được nhận vào Apple, bạn phải có chiến lược nhất định. Một số việc sau đây có thể giúp bạn thu hút sự chú ý của Apple:

  • Hãy là một thực tập sinh tiềm năng. Apple thường xuyên mở chương trình thực tập sinh, vì vậy nếu bạn làm tốt, họ có thể xem xét tuyển bạn vào làm nhân viên chính thức. Kiểm tra các vị trí thực tập có sẵn tại đây
  • Tích cực trên các diễn đàn của Apple. Từng có trường hợp thành viên chuyên bình luận hoặc chia sẻ trên các diễn đàn của Apple đã trở thành nhân viên chính thức của công ty, ví dụ như Jordan Hubbard. Từ đó trở đi, nhiều nhà phát triển đã tìm cách ghi điểm trên diễn đàn của Apple bằng cách hiển thị kinh nghiệm cá nhân.
  • Phát triển ứng dụng iOS hoặc Mac cho AppStore. Điều này minh chứng cho khả năng mã hóa tuyệt vời của bạn, cũng là yếu tố mà các nhà tuyển dụng tại Apple yêu thích.

Quá trình ứng tuyển tại Apple, Google, và Microsoft đồng nghĩa với việc tham gia vào một cuộc cạnh tranh khốc liệt, nhưng điều đó không có nghĩa là bạn không có cơ hội nào. Note lại những mẹo mà Techtalk chia sẻ để tăng cơ hội việc làm của mình. Và đừng lo lắng nếu bạn không nhận được phản hồi ngay vì nhà tuyển dụng sẽ mất hàng tuần, thậm chí vài tháng để lọc lại tất cả hồ sơ.

Chúc bạn may mắn!

TopDev & Dzone

  Bỏ túi những kinh nghiệm đi thực tập hay dành cho lập trình viên!

Cơ cấu xử lý request trong Laravel như thế nào?

co-cau-xu-ly-request-trong-laravel-nhu-the-nao

1. Giới thiệu

Laravel là một framework theo mô hình MVC (Model – View – Controller). Trong mô hình này, một request sẽ chạy đến Router. Sau đó nó tiếp tục đến Controller(C), Controller sẽ có thể tiếp tục xử lý tại Model (M) và trả dữ liệu ra View (V).

Trong Laravel framework, một request về cơ bản thì sẽ chạy theo cách nói ở trên. Tuy nhiên, bên dưới của nó thực sự có những gì đang diển ra.

2. Nội dung

Khi một request được bắt đầu từ Router thì để có được một response, nó phải trải qua những gì. Mọi thứ sẽ được bắt đầu trong app từ public/index.php.

2.1. Auto Loader

require __DIR__.'/../vendor/autoload.php';

Đầu tiên nó sẽ gọi đến file autoload.php. Nó sẽ tự động load tất cả các package/library được đăng ký bởi Composer trong quá trình sử dụng.

Tham khảo thêm các vị trí tuyển dụng Laravel lương cao hấp dẫn

2.2. Khởi tạo một instance từ Laravel App

$app = require_once __DIR__.'/../bootstrap/app.php';

Line đầu tiên:

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

Bên trong có gì:

public function __construct($basePath = null)
{
    if ($basePath) {
        $this->setBasePath($basePath);
    }

    $this->registerBaseBindings();

    $this->registerBaseServiceProviders();

    $this->registerCoreContainerAliases();
}

Trong __constructor nó nhận vào một cái $basePath = null. Sau đó nó sẽ kiểm tra sự tồn tại của $basePath này và sẽ tạo ra các global path cho các thư mục như base, lang, config, public, storage, database, resources, bootstrap mà chúng ta vẫn sử dụng.
Ví dụ:

$this->instance('path.config', $this->configPath());

public function configPath($path = '')
{
    return $this->basePath.DIRECTORY_SEPARATOR.'config'.($path ? DIRECTORY_SEPARATOR.$path : $path); // define ('DIRECTORY_SEPARATOR', "/");
    
}

Vậy tại sao nói nó tạo ra các global đường dẫn ??? Đã bao giờ các bạn sử dụng các hàm như config_pathpublic_path, ... chưa.
Tất cả các hàm này đều tạo ra một instance với cái tên 'path.name', trùng với các thư mục trong application của bạn. Và chúng được tạo ra bởi các hàm trong file helpers.php.

if (! function_exists('config_path')) {
    /**
     * Get the configuration path.
     *
     * @param  string  $path
     * @return string
     */
    function config_path($path = '')
    {
        return app()->make('path.config').($path ? DIRECTORY_SEPARATOR.$path : $path);
    }
}

Khi bạn gọi config_path(), mặc định Laravel sẽ tạo ra một instance của cái tên path.config. Mà hàm này chính là đường dẫn đến file folder config đã nói ở trên.
Hàm $this->registerBaseBindings(); sẽ tạo một instance của 'app' và một instance của class Container::class bằng chính cái class Illuminate\Foundation\Application.php này.

$this->instance('app', $this);

$this->instance(Container::class, $this);

Mở cái class Container.php kia ra mình có thấy rất nhiều các methods quen thuộc liên quan đến khái niệm về Service Container như bindsingleton.

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

  Nhận diện khuôn mặt trong ứng dụng Laravel sử dụng Google Cloud Vision API

Và cuối cùng là khởi tạo một instance của PackageManifest.
Tiếp theo:

$this->registerBaseServiceProviders();

Laravel sẽ đăng kí các Service Provider cơ bản cho application. Tưởng tượng như project của chúng ta sẽ luôn luôn cần có những cái cơ bản, cái gốc để nó có thể hoạt động được. Chúng ta có thể thấy Laravel đăng ký các provider như Event, Log, Routing:

$this->register(new EventServiceProvider($this));

$this->register(new LogServiceProvider($this));

$this->register(new RoutingServiceProvider($this));

Cuối cùng trong hàm __constructor là:

$this->registerCoreContainerAliases();
public function registerCoreContainerAliases()
{
    foreach ([
        'app'                  => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class,  \Psr\Container\ContainerInterface::class],
        'auth'                 => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
       // ...
    ] as $key => $aliases) {
        foreach ($aliases as $alias) {
            $this->alias($key, $alias);
        }
    }
}

Hàm này có tác dụng đăng ký các tên cho các class trong Laravel Application. Ví dụ như 'app' sẽ được gán cho \Illuminate\Foundation\Application::class\Illuminate\Contracts\Container\Container::class\Psr\Container\ContainerInterface::class].
Ví dụ khi bạn gọi app()->make('hash') thì 'hash' chính là \Illuminate\Hashing\HashManager::class.
Bước tiếp theo, Laravel sẽ đăng kí binding cho class Http\Kernel và Console\Kernelcùng với đó là một class Exception, mục tiêu là để phục vụ cho việc handle Request và handle các lỗi khi xảy ra từ Http và giao diện Console. (Terminal).
Sau khi binding xong , $app này sẽ được trả về.

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

return $app;

2.3. Tạo Http Kernel

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

Ở trên chúng ta thấy Laravel binding class Illuminate\Contracts\Http\Kernel::classbằng một App\Http\Kernel::class. Vậy hàm này sẽ trả về cho chúng ta một instance của Illuminate\Contracts\Http\Kernel::class, chính là App\Http\Kernel.php

2.4. Handle Request

Http Kernel này sẽ xử lý $request và $response là kết quả của quá trình xử lý:

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

Giờ chúng ta cùng tìm hiểu xem Laravel của chúng ta thực sự đã làm những gì để xử lý một request nhé. Chúng ta hãy mở class App\Http\Kernel ra. Trong này có rất nhiều groupMiddleware khác nhau. Nếu để ý bạn có thể thấy có một nhóm globalMiddleware, một middlewareGroup và một routeMiddleware, nhiệm vụ của chúng là dùng để lọc các request chạy đến application của bạn, sau đó xử lý như thế nào tiếp theo sẽ là do phần xử lý bên trong của middleware đó.
Nhóm globalMiddleware là phần mà mỗi request đều phải đi qua nó. Ví dụ như middleware \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class

protected function transform($key, $value)
{
    return is_string($value) && $value === '' ? null : $value;
}

Hàm này chắc các bạn cũng hiểu rồi phải không.
Bạn mở class mà Kernel kế thừa ra tại Illuminate\Foundation\Http\Kernel.
Kéo xuống phần hàm handle($request) ta thấy có đoạn

$response = $this->sendRequestThroughRouter($request);

Mở hàm sendRequestThroughRouter($request) và 2 hàm dưới luôn nhé.

protected function sendRequestThroughRouter($request)
{
    $this->app->instance('request', $request); // Đăng ký request hiện tại với Laravel Service Container với tên `'request'`

    Facade::clearResolvedInstance('request'); // Loại bỏ request facade khác

    $this->bootstrap(); // Load các bootstrapper

    return (new Pipeline($this->app)) //Đẩy request qua các middleware và cuối cùng là đẩy request lên router
                ->send($request)
                ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                ->then($this->dispatchToRouter());
}

public function bootstrap()
{
    if (! $this->app->hasBeenBootstrapped()) {
        $this->app->bootstrapWith($this->bootstrappers());
    }
}

/**
 * Get the route dispatcher callback.
 *
 * @return \Closure
 */
protected function dispatchToRouter()
{
    return function ($request) {
        $this->app->instance('request', $request);

        return $this->router->dispatch($request);
    };
}

Đến đây, gần như quá trình handle một request đã xong. Quay lại hàm handle($request) tại Illuminate\Foundation\Http\Kernel.php, sau khi dispatch request lên router và đã được xử lý, nó sẽ dispatch một event bao để báo rằng request đã được xử lý, hàm này gồm 2 tham số quen thuộc là $request và $response.

$this->app['events']->dispatch(
    new Events\RequestHandled($request, $response)
);

return $response // cuối cùng là phải return cái $response này

2.5. Kết thúc

Sau khi có $response nó sẽ được trả về cho người dùng

$response->send();

Quá trình handle một request được kết thúc, cuối cùng là đóng Kernel và kết thúc.

$kernel->terminate($request, $response);

3. Tổng kết

Vòng đời của một request trong Laravel.

  • Auto Loader.
  • Khởi tạo ứng dụng, đăng ký các global_path, provider cơ bản, các bí danh cho các class.
  • Binding class Kernel, Exception.
  • Tạo Kernel.
  • Đăng ký Service Provider
  • Send request qua middleware => send request tới router
  • Gửi response về cho người dùng
  • Kết thúc

Và thành phần quan trọng nhất trong quá trình handle một request trong Laravel chính là Service Provider.

Tham khảo thêm việc làm laravel không yêu cầu kinh nghiệm cao tại đây

  Tìm hiểu SQL Transaction và cách sử dụng trong Laravel

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

Flutter, React Native hay Xamarin framework nào phù hợp với bạn?

Trong bài viết này, chúng ta sẽ đưa ra những tiêu chí, những nhu cầu của lập trình viên khi chọn một công nghệ nào giữa Flutter, React Native hay Xamarin để phát triển ứng dụng di động cross-platform cho dự án của mình.

So sánh Flutter, React Native và Xamarin

So sánh về độ dễ học

Flutter dễ học nếu bạn biết Dart – ngôn ngữ lập trình hướng đối tượng của Google. Nó không tốn nhiều thời gian để học một ngôn ngữ mới và nếu bạn biết các ngôn ngữ khác như JavaScript, nó sẽ trở nên dễ dàng hơn nữa.

Với React Native, các khái niệm sẽ rất dễ dàng nếu bạn là một developer có kinh nghiệm về JavaScript và bạn có một số kỹ năng React.

Nếu bạn biết Android, việc nắm bắt Xamarin sẽ dễ dàng hơn vì nhiều thứ giống hệt nhau và C # rất giống với Java. Xamarin có thể cho phép bạn tiết kiệm tới 70% công việc phát triển trên nền tảng di động thứ hai bằng cách sử dụng lại mã.

Tham khảo việc làm React Native tại đây

Tốc độ của ứng dụng

Trong khi xây dựng một ứng dụng di động với Flutter, bạn không cần phải quan tâm đến tốc độ vì framework sẽ mang lại cho bạn hiệu suất khiến người dùng hài lòng. Flutter cho phép bạn sử dụng mã gốc và các widget để đạt được hiệu suất tốt hơn và tương tự nhau trên Android và iOS.

React Native mang lại hiệu suất tương tự như các ứng dụng native. Vì vậy, nếu bạn đang xây dựng một ứng dụng di động với framework này, ứng dụng của bạn sẽ cực nhanh. Nó cho phép bạn viết mã bằng các ngôn ngữ native, chẳng hạn như Objective-C, Java hoặc Swift. Bạn thậm chí có thể xây dựng một phần ứng dụng của mình trong React Native trong khi phần còn lại có thể được xây dựng bằng mã gốc.

Các ứng dụng được xây dựng trong Xamarin sẽ cung cấp cho bạn hiệu suất tốt hơn và sẽ liên tục cải tiến để phù hợp với các tiêu chuẩn phát triển ứng dụng native. Với sự trợ giúp của Xamarin, ứng dụng iOS và Android có thể là ứng dụng gốc hoàn toàn bằng cách tận dụng mọi nền tảng. Xamarin Forms 2.0, được giới thiệu là một phần của Xamarin 4, bao gồm một số tính năng như các form, thư viện giao diện người dùng UI đặc biệt và nâng cấp mới để giúp bạn xây dựng các ứng dụng nhanh.

Hiệu năng phát triển

Tính năng “Hot Reload” có sẵn trong Flutter giúp tiết kiệm thời gian của các Developer. Có rất nhiều widget và API trong Flutter cho phép bạn hoàn thành công việc phát triển ứng dụng một cách nhanh chóng. Vì vậy, với sự trợ giúp của framework này, các nhà phát triển có thể làm việc một cách hiệu quả và tiết kiệm rất nhiều thời gian trong khi xây dựng một ứng dụng di động. Nền tảng này khá thuận lợi cho các doanh nghiệp.

Với React Native, bạn sẽ linh hoạt làm việc trên bất kỳ trình soạn thảo văn bản / IDE nào mà bạn thích. Vì vậy, bạn có thể chọn một trình soạn thảo văn bản có thể tiết kiệm cả thời gian và tiền bạc. Nó cung cấp cho bạn một tính năng được xây dựng trước có tên “Hot Reload”, giúp hoàn thành dự án của bạn nhanh hơn. Với sự trợ giúp của tính năng này, người ta có thể tải lại ứng dụng của mình mà không cần biên dịch lại ứng dụng, cho phép kết quả hơn nữa trong việc nâng cao năng suất của nhà phát triển.

Trong Xamarin, Tải lại “Live Reload”  trao quyền cho các developer triển khai các cải tiến cho XAML và xem chúng được phản ánh trực tiếp mà không cần bất kỳ quá trình biên dịch và triển khai nào. Vì ứng dụng của bạn được biên dịch trong khi sử dụng “Live Reload”, nên nó hoạt động với tất cả các thư viện và điều khiển của bên thứ ba. “Live Reload” hoạt động trên tất cả các nền tảng Xamarin. Các hình thức hỗ trợ, bao gồm iOS, Android, UWP và WPF và hoạt động ở tất cả các mục tiêu triển khai hợp pháp, bao gồm giả lập, giả lập, cũng như các thiết bị vật lý.

Tìm kiếm việc làm Flutter tại đây bạn nhé!

Kiến trúc

Kiến trúc của Flutter rất dễ hiểu và ngay cả các developer mới, những người bắt đầu với mã App hiện có, có thể theo framework  một cách dễ dàng. Kiến trúc của Flutter giúp làm việc nhóm dễ dàng hơn. Nó hỗ trợ cách tiếp cận Reactive UI của Flutter và nó không bao giờ làm tổn hại đến hiệu năng của Flutter. Một thư viện kiến trúc ứng dụng Dart với luồng dữ liệu đơn hướng được điều chỉnh bởi RefluxJS và Facebook ED Flux.

Kiến trúc ứng dụng React bản địa được gọi là Flux. Facebook sử dụng Flux để xây dựng các ứng dụng web phía khách hàng. Mọi khung công tác thường tuân theo khung MVC. Luồng dữ liệu đơn hướng là ý tưởng cơ bản của Flux.

Kiến trúc Xamarin bao gồm một nền tảng thiết kế trực quan để xây dựng native như ứng dụng, bộ thử nghiệm, hỗ trợ thư viện riêng và cửa hàng thành phần kiểu nugget. Thiết kế hình ảnh iOS đã được cung cấp thông qua IDE của họ để giúp các nhà phát triển mở X-Code.

Cộng đồng hỗ trợ

Flutter được biết đến với sự hỗ trợ cộng đồng tốt. Trên GitHub, Flutter có 33.248 ngôi sao và 223 người đóng góp giúp nó ngày một tốt hơn. Họ làm việc trong các lĩnh vực khác nhau của Flutter để cung cấp cho bạn trải nghiệm phát triển tốt nhất. Các nhà phát triển Flutter thậm chí còn hoạt động trên các trang web QA cũng như các diễn đàn.

Flutter, React Native hay Xamarin?

React Native cũng có một cộng đồng hỡ trợ mạnh mẽ. Trên GitHub, React Native có 66.693 sao và 1.692 người đóng góp React Native để nâng cao nó. Framework có một cộng đồng lớn các nhà phát triển trên toàn cầu và họ có thể hỗ trợ bạn trả lời các truy vấn của bạn trên các trang web và diễn đàn QA.

Đối với Xamarin, cộng đồng hỗ trợ rất hạn chế. Diễn đàn và hỗ trợ trợ giúp không có sẵn ngay lập tức cho người dùng Xamarin trên Internet.

Các ứng dụng nổi bật

Các ứng dụng nổi bật của flutter

Flutter: AppTree, Alibaba, Topline, Google AdWords, Google Greentea, Reflectly, Hamilton Musical, OfflinePal, Hookle, Birch Finance, BetaBub,….

Các ứng dụng nổi bật của React Native

React Native:  Facebook, Facebook Analytics, Facebook Ads Manager, Instagram, Skype, Tesla, Walmart, Pinterest, Uber, Artsy, Bloomberg, Chop, SoundCloud Pulse, F8, Discord, Vogue, ….

Xamarin: Storyo, The World Bank, Just Giving, Olo, Skulls of the Shogun, APX, Insightly, FreshDirect, SuperGiant Games, Thermo Fisher Scientific, …

Việc làm Xamarin hot tại TopDev

Flutter, React Native hay Xamarin?

  • Chọn Flutter: Nếu bạn cần một framework có hiệu suất cao và cung cấp giao diện người dùng nhất quán trên cả iOS và Android với cùng một mã nguồn. Flutter là lựa chọn lý tưởng cho các ứng dụng cần giao diện phức tạp, hoạt ảnh mượt mà và hiệu suất cao.
  • Chọn React Native: Nếu bạn đã có kinh nghiệm với JavaScript và muốn phát triển ứng dụng di động với hiệu suất tốt và tận dụng được sự phong phú của thư viện bên thứ ba. React Native là lựa chọn tốt cho các ứng dụng có yêu cầu đa nền tảng, cần sự linh hoạt và tốc độ phát triển nhanh.
  • Chọn Xamarin: Nếu bạn làm việc trong môi trường Microsoft và muốn tích hợp sâu với các công nghệ .NET. Xamarin là lựa chọn phù hợp cho các ứng dụng doanh nghiệp hoặc các hệ thống yêu cầu tính năng phức tạp và truy cập sâu vào các API của hệ điều hành.

Source: netsolutions.com

Việc làm IT lương cao update mới nhất tại TopDev

Bài viết liên quan:

Vì miếng ăn mà phá cả nồi cơm – Thực tại đáng lo của nghề lập trình

Thực tại đáng lo của nghề lập trình

Việt Nam được đánh giá là một thị trường rất tiềm năng về IT. Không những thế nghề lập trình viên luôn được đánh giá nằm trong top các nghề được nhiều bạn sinh viên lựa chọn. Tuy nhiên thực trạng nghề lập trình cho thấy, do tâm lí theo đám đông xen lẫn chưa hiểu rõ về IT khiến một số lượng không nhỏ người theo nghề lập trình chỉ đơn giản vì thu nhập khủng. Kết quả là đầu ra luôn có chất lượng không đồng đều. Điều này cũng phản ánh rõ ràng với thực trạng thiếu nguồn nhân lực với tay nghề cao. Vậy thì những lập trình viên với khả năng còn thấp này làm cách nào để có thể kiếm tiền nhanh?

Xin thưa, đó là họ chấp nhận làm các dự án với giá cực kì thấp có thể gọi là “phá giá”. Vô hình chung chính hành động này khiến cho việc phát triển IT bị kiềm hãm, khi các công ty về công nghệ cũng như những lập trình viên chân chính cũng phải điều chỉnh hoặc là hạ theo để không bị mất khách. Đọc đến đây bạn hẳn ngờ ngợ rằng chuyện này khá quen thuộc. Quả là đúng như vậy, cách đây vài năm, nghề thiết kế – design trở thành một những lựa chọn đình đám và thế là, dẫn đến việc có quá nhiều người theo học chỉ vì mộng làm giàu, rồi cũng nhanh chóng lụi tàn và quyết định “phá giá” để kiếm miếng ăn. Khiến cho giá một bức hình, một bản thiết kế mà chỉ có giá vài chục đến vài trăm ngàn.

Vì thế mà không có gì ngạc nhiên khi có rất nhiều lập trình viên tỏ ra bức xúc khi thấy nhiều “con sâu làm rầu nồi canh”, bán nghề với một cái giá rẻ mạt. Một member của fanpage Lập Trình Viên Confession chia sẽ nỗi lòng của mình về vấn đề này.

“Từ giờ tôi nghe đứa nào đi đồn thổi “học IT giàu lắm” “lương cao chót vót” “chục triệu”,… là tôi bẻ cụp mỏ nhé.

Không phải những điều nói trên là sai, nhưng nói ra vậy để làm chi? Kéo thêm nhiều người vào ngành thì càng có nhiều đối thủ, càng xâu xé khắc nghiệt hơn, tính đi lại vết xe đổ của ngành kinh tế à? Khoảng chục năm trước bỗng rộ lên học kinh tế là giàu lắm thế là người người, nhà nhà đổ xô học kinh tế. Đại học cũng có cao đẳng cũng đầy, cứ 100 người là có 1 người học kinh tế như 99 đứa còn lại. Rồi giờ sao, đầy đứa thất nghiệp ất ơ luôn hoặc toàn làm mấy việc không liên quan. Cái gì tràn lan thường không quý, ít mà chất đi. Cái chuyện bức xúc dẫn tui phải viết cfs này là vì thấy nhiều dev bán web giá rẽ mạc.

Nó phá giá đấy ạ. Kiểu là giờ ai cũng xô đi học và có tool làm web tận răng nhiều khi d** cần biết code cũng làm được, xong bán với giá dưới hầm mộ. Giống hệt kiểu lao động nước mình qua làm lao động giá rẻ cho Mỹ để đá nồi cơm của người lao động Mỹ gốc í. Hỏi lao động Mỹ nó có ưa nổi lao động nhập cư không, tôi thì là tôi không ưa nổi rồi.

Trong ngành này tồn tại 1 dòng chảy rất khó ưa mà thường bắt đầu từ mấy dev chập chững vào ngành, đó là: nghe người ta đồn ngành này giàu -> bu nhau đi học -> mơ có tiền nhanh -> học sơ xài lấy tool làm đại 1 cái web để kiếm tiền sớm như kì vọng họ hàng -> phá giá để hút khách -> hại cả lũ đồng nghiệp bị hạ giá theo.

Cái trò này designer cũng dính nhiều rồi, nhưng thực chất thì ngành nào cũng vậy, cứ đại trà lên là sẽ có mấy con phá giá xuất hiện. Tóm lại mấy dev nào lương chục củ thì im lặng mà tận hưởng đi, đừng đem khoe khoang khổ cho mấy lứa sau. Đấy tôi hơi cọc tính với cũng chả giỏi văn nên chỉ viết được thế thôi.”

Tuy lời nói có chút nóng giận nhưng ta cũng thấy rõ sự chạnh lòng của một lập trình viên khi nói về viễn cảnh “phá giá” trong nghề IT. Thiết nghĩ nếu họ có tâm và chịu khó bám trụ, nâng cao bản thân thì có lẽ nghề cũng sẽ nuôi và trả cho công sức của mình bỏ ra. Tiếc rằng suy nghĩ như vậy không phải ai cũng có và đôi khi vì lòng tham, họ sẵn sàng bỏ dài lấy ngắn, vì miếng ăn mà phá cả nồi cơm.

TopDev

Top 11 tài liệu tự học lập trình Java chọn lọc

JVM là gì? Định nghĩa JVM

Java vẫn là một trong những ngôn ngữ lập trình phổ biến nhất hiện nay. Phần lớn là nhờ vào lịch sử lâu đời và danh tiếng của nó: dễ học nhưng khó thành thạo. Sau khi bạn đã hiểu rõ hơn về lập trình Java, việc tìm hiểu để tiến xa hơn có thể sẽ trở nên khó khăn. Bài viết này nhằm mục đích giúp các Java developer vượt qua các rào cản đấy  thông qua việc cung cấp mười tài liệu hữu ích về Java.

Tài liệu học lập trình Java từ cơ bản đến nâng cao

  1. Tài liệu học lập trình Java căn bản khá hay bằng tiếng Việt bạn nên thử học qua.
  2. Java Core (Tiếng Việt)
    Java Core (Tiếng Việt) được websites USD (updatesofts.com) tổng hợp lại với 10 chương chi tiết, văn phong dễ hiểu, chắc chắn sẽ phù hợp với những bạn tìm hiểu lập trình Java.
  3. Tổng hợp tài liệu JAVA (Tiếng Việt)

Bộ Tài liệu lập trình Java Tiếng Việt Căn Bản Tổng Hợp này, sẽ mang đến cho bạn những tài liệu hay ho bằng Tiếng Việt về lập trình Java biên soạn bởi 2 trường ĐH lớn của Việt Nam là Bách Khoa Đà Nẵng và Hà Nội. Bên cạnh đó còn 2 cuốn ebook Java tiếng Việt khác đang chờ đón bạn. Bộ tổng hợp nhỏ này bao gồm: Java Core – ĐH Bách Khoa Đà Nẵng Lập trình Java Tiếng Việt Slide Lập trình Jave – Phạm Quang Dũng Tài liệu lập trình Java – ĐH Bách Khoa Hà Nội.

  1. Head First Java, 2nd Edition
    Head First Java mang đến trải nghiệm học tập đa phương tiện, tương tác cao, cho phép các lập trình viên mới tiếp nhận các nguyên tắc cơ bản của ngôn ngữ Java một cách nhanh chóng. Thông qua các bài tập kéo dàI, các phép loại suy đáng nhớ, hình ảnh hài hước và ngôn ngữ thông thường, Head First Java khuyến khích người đọc suy nghĩ như một lập trình viên Java. Với cách trình bày độc đáo, phong cách sinh động, câu đố, hình ảnh trực quan… Head First Java không chỉ hay cho bất cứ ai mới học về Java mà còn tốt cho những bạn đã có trình độ cao.
  2.  Java Performance
    James Gosling từng chia sẻ suy nghĩ của ông rằng: “Nếu bạn yêu thích từng chi tiết nhỏ nhất về performance của các ứng dụng Java thì đây là quyển sách dành cho bạn.”
    Cuốn này phù hợp nếu bạn đã khá tốt về Java. Kiến thức trong sách giúp những chương trình của bạn đạt được tối đa hiệu quả và giá trị, dù nó có độ phức tạp ra sao, đang chạy trên nền tảng nào, hoặc đã được viết bao lâu. Tác giả: Scoat Oaks
  3. Java Concurrency in Practice Java Concurrency in Practice được viết bởi Brian Goetz là cuốn sách bao quát toàn diện và chuyên sâu Concurrency trong lập trình Java. Mỗi trang là những vấn đề từ cơ bản đến phức tạp (kèm theo giải pháp) bạn gặp hàng ngày. Nội dung trình bày rất chi tiết và khéo léo theo cách rõ ràng, súc tích, được viết cẩn thận, dễ bám sát, mạnh về áp dụng thực tế.
  4. Java Puzzlers : Traps, Pitfalls, And Corner Cases
    Được biết bởi các tác giả Joshua Bloch, Neal Gafter, quyển sách sẽ đưa bạn trải qua những cảm xúc “kinh ngạc”, “sáng mắt”, “nhũn não”… Nó cho bạn thấy những điểm “lừa tình” trong ngôn ngữ Java theo cách mà bạn không thể ngờ tới. Thậm chí nếu bạn là một lập trình viên lão luyện, những thử thách trong sách vẫn thật sự thú vị vì mỗi câu đố đều có độ khó được viết theo phong cách lôi cuốn và hài hước, luôn tỏ vẻ cho bạn cơ hội dễ dàng suy luận, giải quyết vấn đề và rồi, bạn lại thấy mình sai.
  5. THE JavaTM Programming Language
    Trực tiếp từ những người sáng tạo ngôn ngữ lập trình Java ™, tái bản thứ tư được sửa đổi hoàn toàn của THE JavaTM Programming Language là một tài nguyên không thể thiếu đối với người mới làm quen và lập trình viên cao cấp. Các nhà phát triển trên toàn thế giới đã sử dụng các ấn bản trước để nhanh chóng có được sự hiểu biết sâu sắc về ngôn ngữ lập trình Java, mục tiêu thiết kế và cách sử dụng nó hiệu quả nhất trong phát triển thực tế.
  6. Optimizing Java
    Điều chỉnh hiệu suất là một công việc thử nghiệm, nhưng điều đó không có nghĩa là các kỹ sư nên ngồi một chỗ để phỏng đoán và mong đợi công việc hoàn thành. Với cuốn sách thực tế này, các lập trình viên Java từ trung cấp đến cao cấp sẽ học cách làm việc với các công nghệ sắp xếp phức tạp và học cách điều chỉnh hiệu suất các ứng dụng Java bằng cách sử dụng phương pháp định lượng, có thể kiểm chứng được.
  7. Modern Java Recipes
    Việc giới thiệu các khái niệm lập trình chức năng trong Java SE 8 là một sự thay đổi mạnh mẽ cho ngôn ngữ hướng đối tượng này. Các biểu thức Lambda, các tham chiếu phương thức và các luồng cơ bản đã thay đổi thành ngữ của ngôn ngữ và nhiều nhà phát triển đã cố bắt kịp từ đó. Tài liệu này sẽ giúp ích. Với hơn 70 công thức chi tiết, tác giả Ken Kousen cho thấy cách sử dụng các tính năng mới nhất của Java để giải quyết một loạt các vấn đề.
  8. Modern Java EE Design Patterns
    Được viết bởi Markus Eisele, quyển sách này sẽ giúp bạn hiểu ngắn gọn về cách phát triển phần mềm ngày nay cho Enterprise và cũng với lịch sử được tiếp tục từ bản phát hành Java Enterprise Edition đầu tiên cho đến ngày nay. Điều này khiến người đọc hiểu tại sao một số phương pháp kiến ​​trúc nhất định được áp dụng trong những năm qua và tại sao nó lại không thịnh hành. Không gian mở này để hiểu khoảnh khắc mà chúng ta đang sống bây giờ và chủ đề của cuốn sách: DevOps, microservice, Cloud, v.v.

Tìm hiểu các vị trí việc làm Java hấp dẫn tại TopDev.

Phần 4: Top 10 câu hỏi phỏng vấn Java thường gặp >>

<< Phần 2: 10 lý do cho thấy tại sao bạn nên tự học lập trình Java

6 sự thật phũ phàng không phải ai trong ngành lập trình cũng biết

6 sự thật phũ phàng không phải ai trong ngành lập trình

IT đang mất dần quyền kiểm soát

Năm năm trước, một trong những vấn đề đau đầu lớn nhất mà các nhà quản lý IT phải đối mặt là sự xuất hiện của BYOD: Bring Your Own Device, chúng tôi xin được tạm hiểu là: sử dụng smartphone của mình trong công việc. Nói cách khác chiếc điện thoại của họ vô tình chứa toàn bộ dữ liệu của công ty.

“BYOD đã trở thành BYOIT”, Mike Meikle, Giám đốc điều hành của secureHIM, một công ty bảo hiểm và an ninh mạng, từng nói “Nhân viên có thể nhanh chóng truy cập các nền tảng vốn được bảo mật từ thiết bị di động của họ”.

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

  Con đường trở thành thực tập sinh tại Google
  5 lỗi phổ biến khi sử dụng Architecture Components

Theo lời của Bobby Cameron, phó chủ tịch của Forrester Research, thuật ngữ “shadow IT” được sử dụng để ám chỉ việc các đội kỹ thuật sử dụng một server chỉ để chạy những việc riêng của mình vốn không liên quan tới công việc. Tuy vậy, bây giờ nó còn ám chỉ cả sales và marketing team đăng nhập và sử dụng một dịch vụ phần mềm hoặc up dữ liệu lên máy chủ trên AWS mà không thông qua bất kì sự cho phép nào.

“Nhưng bạn sẽ không thể làm gì!”, Cameron nói. “CNTT giờ đã thay đổi và những việc như vậy dần được chấp nhận bởi sự linh hoạt cũng như cần thiết trong chia sẻ và tìm hiểu về khách hàng”

Công việc của người quản lý CNTT cũng đã chuyển từ kiểm soát những sản phẩm nhân viên công nghệ sử dụng thành cung cấp hướng dẫn về các dịch vụ mà các thành viên nên dùng qua, Steven A. Lowe, chuyên gia tư vấn chính cho ThoughtWorks, nói.

“Vấn đề không phải là kiểm soát”, ông lập luận. “CNTT đã mất khả năng kiểm soát nhiều năm trước và sẽ không thể lấy lại nó. Giờ đây bạn phải sử dụng kiến ​​thức CNTT của mình để giúp doanh nghiệp đưa ra quyết định tốt hơn về các ứng dụng và dịch vụ của bên thứ ba”.

Cloud không phải là giải pháp tối ưu cho mọi thứ

Sáu năm trước, hơn 40% các CIO, được khảo sát bởi Gartner, tin rằng họ sẽ chạy hầu hết các hoạt động CNTT của họ trên đám mây điện tử. Trong khi thực tế thì việc thay đổi hoàn toàn này vẫn còn chưa phổ biến.

Thay vào đó, Gartner dự đoán rằng 90% các tổ chức sẽ áp dụng cơ sở hạ tầng hybrid vào năm 2020, giữ một số tài nguyên CNTT trong phần cứng tại công ty và sử dụng dịch vụ outsourcing từ các nhà cung cấp đám mây công cộng hoặc tư nhân.

Không thể chối cãi rằng Cloud đã có một tác động đáng kể đến các hoạt động CNTT, nhưng nó không to lớn tới mức như tin tức đã thổi phồng. Một cuộc khảo sát vào tháng 6 năm 2017 với hơn 300 chuyên gia CNTT đã phát hiện ra rằng 80% tin rằng công nghệ đám mây sẽ không đáp ứng được kỳ vọng của họ do các vấn đề về an ninh, luật, sự phức tạp và chi phí.

Nói cách khác việc di chuyển một dịch vụ quan trọng lên Cloud không tự động làm cho dịch vụ trở nên đáng tin cậy hoặc có khả năng mở rộng hơn. Mặt khác, các công ty sẽ luôn tìm thấy một số ứng dụng mà họ không thể nhờ tới dịch vụ của cloud. Giống như một chương trình đã 25 tuổi và công ty tạo ra nó đã biến mất từ 15 năm trước. Bạn có thể sẽ không bao giờ loại bỏ hoàn toàn các ứng dụng độc quyền cũ mà công ty sử dụng hàng ngày.

Hệ thống của bạn có thể đã bị hack

Trong thực tế, vi phạm dữ liệu đã tăng 40% trong năm 2016, theo Identity Theft Resource Center.

Câu hỏi được đặt ra là liệu bạn có thể làm gì với nó? Nhiều doanh nghiệp trả lời bằng cách đầu tư vào các thiết bị an ninh mạng. Nhưng đó là cách tiếp cận sai lầm, theo Meikle.

“Mọi người đều muốn các hệ thống dễ quản lý và khó vi phạm” – ông nói – “Nhưng họ thường chọn các thiết bị an ninh cồng kềnh khó quản lý chứa dữ liệu nhạy cảm mà vẫn không được bảo vệ. Một cách tiếp cận thông minh hơn là thiết kế kế hoạch bảo mật của bạn xung quanh viễn cảnh cho rằng mình đã bị hack”.

Thay vì cố gắng bảo vệ các mạng và thiết bị, các tổ chức CNTT nên tập trung vào việc bảo vệ dữ liệu của công ty trên những thiết bị đầu cuối đó, theo Mainelli.

An ninh đã trở nên tồi tệ hơn một phần vì có nhiều thiết bị và dữ liệu hơn để bảo vệ, Cameron nói. Nhưng các công nghệ như các container dựa trên Docker cho dữ liệu đám mây và AI-driven automated breach detection đang giúp giảm thiểu vấn đề.

Các software của bạn luôn unpatched và thiếu bảo mật

Phần mềm chưa được patch là một nguy cơ bảo mật rất lớn. Tuy nhiên, theo khảo sát của Febera vào tháng 2 năm 2017, 10% người dùng ở Mỹ đang chạy các phiên bản Windows chưa được patch.

James Lee, phó chủ tịch điều hành và CMO của Waratek – một công ty bảo mật ứng dụng, cho biết: “Chúng tôi đã nhìn thấy nhiều khách hàng không update thường xuyên các patch. Điều này được kết hợp với các ứng dụng cũ không thể được cập nhật càng làm trầm trọng vấn đề hơn”

Tệ hơn nữa là việc bảo mật thường ít được ưu tiên bởi các nhà phát triển phần mềm, do đó mà kết quả là phần mềm ngày càng dễ bị tấn công.

Vấn đề bắt nguồn từ sự thất bại trong việc đảm bảo chất lượng phần mềm, theo lời Mark S. Kadrich, CISO tạm thời cho bệnh viện Martin Luther King Jr. ở Los Angeles – “Tám mươi phần trăm của phần mềm là rác, trong khi 20 phần trăm của nó thì dở tệ. Chỉ có rất ít là có thể được coi là thiết kế tốt.”

Bạn sẽ không bao giờ có đủ băng thông

Đó là điều không thể tránh khỏi, nhờ vào các thiết bị di động và IoT, lượng dữ liệu được truyền qua các mạng kinh doanh, được dự kiến ​​sẽ tăng gấp đôi vào năm 2021, theo Cisco.

Tin tốt là các công ty đang ngày càng giỏi quản lý vấn đề tắc nghẽn mạng thông minh, Jones nói thêm.

IT vẫn sẽ đóng vai trò quan trọng nhưng nó cần biết cách tự thích ứng

Bất chấp sự bùng nổ về các dịch vụ CNTT, chuyên môn kỹ thuật vẫn được đánh giá cao trong các tổ chức. Nhưng các chuyên gia công nghệ sẽ cần phải update chính bản thân họ thông qua việc trau dồi kỹ năng mới và sẵn sàng chấp nhận một số trợ giúp từ rô bốt.

Một vài năm trước, các chuyên gia CNTT đã nói về quản lý và phát triển dữ liệu; bây giờ họ lại bàn về IoTdevops. Các chủ đề có thể thay đổi, Agarwal nói, nhưng các kỹ năng cần thiết thì không.

Isabelle Dumont, VP tại Lacework, một công ty bảo mật điện toán đám mây cho biết, tự động hóa theo định hướng AI sẽ thay đổi phân phối công nghệ theo những cách đáng kể – loại bỏ các công việc ở mức độ thấp trong khi nâng cao khả năng phân tích kết quả từ các dữ liệu.

“Bảo mật điện toán đám mây là một ví dụ điển hình cho việc machine learning có thể làm tăng khả năng của CNTT”, cô nói “Từ phát hiện vi phạm đến phân tích điều tra, ML có thể compile và phân tích hàng tỷ sự kiện nhanh hơn bất kỳ con người nào, để các nhóm CNTT có thể tập trung vào những thứ quan trọng nhất. ”

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

Tất tần tật về ASYNC/AWAIT trong JavaScript

Tất tần tật về ASYNC/AWAIT trong JavaScript

Trước khi có bản cập nhật ES7, chúng ta thường sử dung callback và promise xử lý các dòng code bất đồng bộ, tuy nhiên sau đó, JavaScript cho ra mắt Async/Await, việc viết code bất đồng bộ trở nên dễ dàng hơn. Vậy Async/Await là gì?

Async/Await là gì?

Async/Await là gì?

Async/Await được giới thiệu trong ES2017 (ES8) và được xây dựng trên nền tảng của Promise và tương thích với tất cả các Promise dựa trên API để làm việc với các hàm bất đồng bộ một cách nhanh chóng và dễ hiểu hơn. Trong đó:

  • Async (Asynchronous) dùng để khai báo hàm bất đồng bộ và biến nó thành một Promise, và các hàm này sẽ luôn phải trả về một giá trị, dễ hiểu là Promise sẽ trả lại kết quả như một “lời hứa”, nếu không trả kết quả thì JS sẽ tự động kết thúc Promise đó.
  • Await chỉ có thể được sử dụng bên trong một hàm async. Nó tạm dừng việc thực thi của hàm cho đến khi Promise được giải quyết (resolved) hoặc bị từ chối (rejected). Thay vì sử dụng .then() để xử lý kết quả của một Promise, bạn có thể sử dụng await để “đợi” kết quả và xử lý nó như một giá trị đồng bộ.

Cú pháp Async/Await trong JavaScript

Để sử dụng Async/Await, bạn phải khai báo hàm với từ khóa async. Khi đó bên trong hàm bạn có thể dùng await.

Cú pháp Async/Await

Khai báo một hàm bất đồng bộ (async)

Để sử dụng await, trước tiên cần khai báo hàm là bất đồng bộ bằng cách sử dụng từ khóa async. Khi một hàm được khai báo với async, nó sẽ luôn trả về một Promise.

async function myFunction() {
    // logic bất đồng bộ bên trong
}

Sử dụng await để đợi Promise

Từ khóa await chỉ có thể được sử dụng bên trong một hàm khai báo bằng async. Nó tạm dừng việc thực thi của hàm cho đến khi Promise được giải quyết (resolved) hoặc bị từ chối (rejected). Kết quả sẽ được trả về dưới dạng giá trị.

let result = await somePromise();

Cú pháp này giúp tránh việc lồng nhiều .then(), giúp mã dễ đọc và tuần tự hơn.

Ví dụ cơ bản về Async/Await

Ví dụ dưới đây minh họa cách sử dụng asyncawait để lấy dữ liệu từ một API và xử lý nó một cách tuần tự.

async function fetchData() {
    try {
        let response = await fetch('https://api.example.com/data'); // Đợi Promise từ fetch() được resolved
        let data = await response.json(); // Đợi Promise của response.json() được resolved
        console.log(data); // Xử lý dữ liệu sau khi nhận được
    } catch (error) {
        console.error('Lỗi:', error); // Xử lý lỗi nếu xảy ra
    }
}

fetchData();

Promise trả về trong hàm async

Một hàm async luôn trả về một Promise, bất kể bên trong có return một giá trị bình thường hay không.

  • Nếu hàm trả về một giá trị, giá trị đó sẽ được bọc trong một Promise đã được giải quyết (resolved).
  • Nếu hàm không trả về giá trị nào, nó sẽ trả về một Promise đã resolved với giá trị undefined.

Ví dụ:

async function hello() {
    return "Hello World";
}

hello().then(console.log);  // Output: "Hello World"

Xử lý lỗi trong Async/Await

Bạn có thể sử dụng khối try...catch để bắt lỗi trong async/await. Bất kỳ Promise nào bị từ chối (rejected) sẽ được chuyển đến phần catch để xử lý lỗi.

async function fetchData() {
    try {
        let response = await fetch('https://api.example.com/data');
        let data = await response.json();
        console.log(data);
    } catch (error) {
        console.error('Đã xảy ra lỗi:', error);
    }
}

fetchData();

Trong ví dụ trên, nếu việc gọi API không thành công hoặc gặp lỗi, chương trình sẽ chuyển vào khối catch và in ra lỗi.

Chạy nhiều tác vụ bất đồng bộ song song

Đôi khi bạn cần chạy nhiều Promise cùng lúc thay vì đợi từng cái hoàn thành tuần tự. Trong trường hợp này, bạn có thể sử dụng Promise.all() để thực hiện các tác vụ song song.

Ví dụ:

async function getData() {
    let [data1, data2] = await Promise.all([
        fetch('https://api.example.com/data1'),
        fetch('https://api.example.com/data2')
    ]);
    console.log(data1, data2);
}

Ở đây, Promise.all() chạy cả hai yêu cầu API song song và đợi cho đến khi cả hai đều hoàn thành, giúp tiết kiệm thời gian.

Căn bản về cú pháp async/await là vậy. Hiện nay, bạn đã có thể sử dụng async/await ở tất cả các trình duyệt hiện đại (trừ IE11 ra nhé, bạn vẫn cần polyfill cho nó).

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

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

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

Error handling

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

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

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

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

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

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

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

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

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

Giá trị intermediate

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

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

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

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

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

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

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

Error Stack

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

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

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

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

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

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

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

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

Debug

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

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

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

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

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

Async/await – mảnh ghép còn thiếu của Promise?

Để tạo ra một Promise, chúng ta sử dung cú pháp new Promise, nhưng với async/await, đơn giản chỉ cần khai báo một hàm async.

async function fn(x) {
  if (x % 2 === 0) {
    return true;
  } else {
    throw new Error('x is not even');
  }
}

Trong khi Promise sử dụng then để xử lý kết quả trả về tại một thời điểm nào đó trong tương lai, thì với async/await chỉ đơn giản là sử dụng await.

const result = await fetch('https://example.com');
const resultJSON = await result.json();

Kể từ phiên bản Node.js 14.8, chúng ta có tính năng top-level await, tức là việc gọi await không bị giới hạn trong một hàm async nữa, mà có thể gọi được ở bên ngoài. Trước đó, để sử dụng await bắt buộc phải ở trong một hàm async.

async function getData() {
    const result = await fetch('https://example.com');
    const resultJSON = await result.json();
}

Trong khi Promise có .catch để xử lý lỗi, async/await bắt lỗi bằng try…catch.

async function getData() {
    try {
        const result = await fetch('https://example.com');
        const resultJSON = await result.json();
    } catch (err) {
        console.log(err);
    }
}

Có thể thấy async/await giúp chúng ta viết mã bất đồng bộ như đồng bộ, không có callback, cũng không cần then, chỉ cần chờ kết quả bằng await.

Tuy vậy, điều này cũng gây ra một số nhầm lẫn tai hại như quên từ quá await để chờ kết quả của hành vi bất đồng bộ hoặc “ngỡ” hàm bất đồng bộ là hàm đồng bộ.

async function getData() {
    try {
        const result = await fetch('https://example.com');
        const resultJSON = await result.json();
        return resultJSON;
    } catch (err) {
        console.log(err);
    }
}

function main() {
    const data = getData();
    console.log(data);
}

Về bản chất, getData trả về một Promise, cho nên chương trình trên sẽ hoạt động không chính xác nếu mục đích là lấy giá trị từ một cuộc gọi API. Để khắc phục, chúng ta cần sửa lại.

async function main() {
    const data = await getData();
    console.log(data);
}

Bạn có thể thấy Promise và async/await không hoàn toàn thay thế mà hỗ trợ lẫn nhau. Mặc dù chúng ta có thể dùng async/await ở đa số các trường hợp, Promise vẫn là nền tảng cần thiết khi thực thi các tác vụ bất đồng bộ trong JavaScript. Do đó bạn nên xem xét và lựa chọn giải pháp phù hợp, tùy vào tình hình thực tế nhá.

Async/Await giúp viết mã bất đồng bộ trở nên dễ hiểu hơn và giảm thiểu sự phụ thuộc vào callback hoặc .then(). Tuy nhiên, để sử dụng hiệu quả, lập trình viên cần hiểu rõ cách hoạt động của chúng, hi vọng qua bài viết này của TopDev, bạn đã nắm được khái niệm cũng như cú pháp sử dụng Async/Await.

Các vị trí tuyển dụng lập trình viên Javascript lương cao cho bạn

Nguồn bài viết tham khảo ehkoo.com