Home Blog Page 116

Cách sử dụng properties trong tập tin cấu hình của Spring

Cách sử dụng properties trong tập tin cấu hình của Spring

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

Trong những bài viết trước mình đã giới thiệu với các bạn về cách đọc properties files trong Spring sử dụng đối tượng PropertyPlaceholderConfigure, namespace util hay namespace context. Vậy làm thế nào để sử dụng những properties này trong tập tin cấu hình của Spring? Trong bài viết này, mình sẽ hướng dẫn các bạn làm điều đó!

  Lập trình theo kiểu Aspect Oriented Programming (AOP) sử dụng Spring Framework
  Tạo hiệu ứng trong react với React Spring

Trước tiên, mình sẽ tạo một Maven project mới để làm ví dụ:

Cách sử dụng properties trong tập tin cấu hình của Spring

  • Spring framework dependency:
<dependency
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>
  • HelloWorld class:
  • Application class:
  • configuration.properties
  • spring.xml

Ở đây, mình đã khai báo sử dụng namespace context để đọc file configuration.properties.

Để sử dụng các properties trong tập tin cấu hình của Spring, chúng ta cần khai báo các properties này với cú pháp như sau:

Với khai báo này, Spring sẽ tự động ingest giá trị của property vào trong các bean mà chúng ta khai báo trong tập tin cấu hình của Spring.

Ví dụ bây giờ, mình sẽ khai báo bean cho đối tượng HelloWorld trong tập tin cấu hình của Spring với thuộc tính name của đối tượng này lấy từ property name trong tập tin configuration.properties, như sau:

Kết quả:

Cách sử dụng properties trong tập tin cấu hình của Spring

Các bạn hãy chú ý là: nếu một property được khai báo trong nhiều tập tin properties thì giá trị cuối cùng của property đó sẽ là giá trị nằm trong tập tin properties được khai báo sau cùng nhất.

Giả sử bây giờ mình thêm một tập tin properties nữa tên là configuration-override.properties

Cách sử dụng properties trong tập tin cấu hình của Spring

với nội dung như sau:

và khai báo sử dụng tập tin này trong namespace context:

thì khi chạy, kết quả sẽ như sau:

Cách sử dụng properties trong tập tin cấu hình của Spring

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

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

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

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Mọi thứ bạn nên biết về Memory Leaks trong IOS(phần 2)

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Memory Leaks trong Closure

Nếu bạn chưa xem phần 1, vui lòng xem ở đây:

Khi chúng ta tạo giá trị 1 closure nó cần giữ 1 tham chiếu mạnh tới các biến mà nó cần thuộc controller.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Chúng ta tạo 1 hàm biến optional closure có kiểu () -> Int và gán trong ViewDidLoad. Closure cần a và b để chạy nó. a và b được capture bởi nó và thuộc ViewDidLoad – bên ngoài nó.

  Promise Memoization
  useMemo là gì? Hướng dẫn sử dụng React useMemo Hook
var someClosure: (() -> Int)?

Đầu tiên, chúng ta nói self.someClosure là 1 tham chiếu mạnh.

someClosure = { return self.a + self.b }

Cả ViewController và Closure đều tăng RC = 1.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Khi Controller này push vào navigation controller, nó sẽ tạo 1 tham chiếu mạnh RC = 1 tới controller này. Và đồng thời closure cần a và b để capture cho nên class fererences này có RC = 2.

Khi bạn pop ViewController này thì nó bị xóa bởi navigation, đồng thời RC = 1.

Lý tưởng là khi đó ViewController sẽ bị hủy tuy nhiên chúng ta tạo ra 1 retain cycle.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

ARC thấy RC của cả 2 đều là 1 nên không thể giải phóng được.

Giải pháp

Tạo ra 1 tham chiếu yếu thay thế tham chiếu mạnh.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Như hình trên closure capturing 1 giá trị yếu. Do đó lúc này a, b là kiểu optional cho nên chúng ta cần guard để unwrap 2 giá trị này lại.

var someClosure: (() -> Int)?
self.someClosure = { [weak self] in guard let `self` = self else { return 0 return self.a + self.b}
Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Khi tạo SecondViewController thì RC của nó = 1. Closure có capture weak cho nên RC vẫn là 1.

  1. Khi navigation remove ViewController này thì RC là 0
  2. ARC kiểm tra thấy và xóa ViewController này ra ngoài
  3. closure có RC = 0 nên cũng bị xóa luôn

Sự khác nhau giữa weak và unowned

Unowned

Giống như 1 tham chiếu yếu, 1 Unowned không giữ tham chiếu mạnh tới nó, và sẽ gỡ được ratain cycle.

Tuy nhiên 1 Unowned được sử dụng khi các references tới chính nó có thời gian sống bằng hay lớn hơn nó.

Ví dụ, chúng ta chắc chắn là quá trình đóng ViewController sống lâu hơn quá trình chạy closure, nếu không thì ứng dụng sập. hoặc là self có thời gian sống hơn closure.

Tải ứng dụng này về.

Chạy ứng dụng, nso thấy 1 màn hình với 1 nút. Bấm vào nút sẽ đẩy SecondViewController lên.

Trong hàm ViewDidLoad, nó chạy someMethodThatTakeClosure mất 4s. Giả sử chúng ta bấm đóng Controller này trước 4s đó, ứng dụng sẽ sập(crash)!

Cách fix

Sử dụng weak self thay thế.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Quy tắc dùng weak và unowned

Sử dụng weak khi bạn không chắc chắn self hay closure có thời gian sống lâu hơn trong mọi trường hợp.

Sử dụng unowned khi bán chắc chắn self sẽ chắc chắn luôn tồn tại khi closure được thực thi.

Luật 2

Khi bạn muốn truy cập thứ gì bên trong closure thì hãy biến nó thành self weak/ unowned

Trường hợp không xảy ra leak 1

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Khi someMethod chạy, newSomeClosure cũng chạy và sau đó mới gọi tới hàm TakeClosure thì trong trường hợp này sẽ không xảy ra.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)
  1. Naviagation CV giư tham chiếu tới SecondViewController có RC = 1
  2. Closure capture 1 giá trị trong nó nên RC = 2
  3. newSomeClosure tham chiếu mạnh tới Closure nên có RC = 1

Khi pop ViewControoler này ra:

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)
  1. SecondViewController có RC = 1
  2. Khi closure chạy, closure sẽ có RC = 0
  3. Khi đó SecondViewController có RC = 0 nên nó bị xóa ra khỏi bộ nhớ

Trường hợp không xảy ra leak 2

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Một static method capture thì không tạo ra memory leak. Như hình trên self không static class nhưng static class closure capturing self bằng liên kết mạnh.

Static Class → Closure → Self (không thể xảy ra memory leaks)

Memory Leak

Quy tắc:

Khi bạn truy cập vào Singleton/ Static class và giữ 1 closure trong class đó, thời gian mà nó giữ closure sẽ leaks trong thời gian này.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Chúng ta có 1 singleton class, giữ 1 closure someSingletonMethod, chạy sau khi thực thi closure, method này sẽ kết thúc và closure sẽ giải phóng bộ nhớ khi mà biến local nó nắm giữ tham chiếu mạnh bị xóa:

SingletonClass.shared.someSingletonMethod(self.a) { (value) in
self.execute()
}
Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Chúng ta có 1 singleton class giữ 1 hàm closure someSingletonMemoryLeakMethod, và hàm này tham chiếu mạnh tới 1 biến trong lớp này, và sau khi closure thực thi, nó sẽ. không được giải phóng vì lớp Singleton luôn nằm trong bộ nhớ và closure tạo ra 1 leak memory. Trong trường hợp này tạo ra memory leak:

Memory Leak = SingletonClass → Closure → Self

Khi Singleton Class vẫn trong bộ nhớ, self(ViewController) vẫn nằm trong bộ nhớ.

Khi pop controller này ra thì nó vẫn giữ tham chiếu mạnh được giữ trong Singleton class:

SingletonClass.shared.someSingletonMemoryLeakMethod(self.a) { (value) in
self.execute()
}
Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Giải pháp

Sử dụng weak self:

No Memory Leak = SingletonClass → Closure

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Kịch bản trên luôn áp dụng cho các lớp static.

Xác định rò rỉ bộ nhớ bằng Memory Graph Debugger

Tải project này về:

https://github.com/aliakhtar49/MemoryLeaks

Mở project lên và bấm vào button, nó sẽ mở 1 màn hình khác. Nhấp cho đến khi bạn thấy màn hình có tiêu đề “Third View Controller Title”.

Bây giờ bấm back, đến màn hình có title “Second View Controller”. Bấm debug bằng memory graph debugger, chúng ta thấy leak như sau:

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Chúng ta có code như sau:

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

sửa lại như sau:

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Và như vậy sẽ không còn leak nữa!

Chạy ứng dụng và tới ThirdViewController và tap Button 1. Chúng ta tạo leak memory.

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)
Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Ngắn gọn:

Để tìm memory leak bạn cần phải chạy mọi luồng của controller của bạn và kiểm tra memory graph debugger.

Bài viết lấy từ nguồn:

https://medium.com/flawless-app-stories/all-about-memory-leaks-in-ios-cdd450d0cc34

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

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

Xem thêm tuyển lập trình ios hấp dẫn trên TopDev

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

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

Xin chào các bạn, như các bạn đã biết Instagram là phương tiện tuyệt vời để chia sẻ hình ảnh trực tuyến. Nó cung cấp những bộ lọc tuyệt vời và các công cụ để “Retouch” hình ảnh. Hôm nay mình xin chia sẻ 10 tài khoản Instagram nổi tiếng về design, các bạn có thể theo dõi để có cảm hứng cũng như lấy ý tưởng thiết kế.

  Instagram ra mắt tính năng Checkout khiến shopping dễ dàng hơn bao giờ hết
  10 PHP Instagram Scripts & Widgets tốt nhất

1. @SamLarson

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

Sam Larson là 1 nghệ sĩ tự do, có trụ sở tại Portland, Oregon, Mỹ. Tài khoản cá nhân của anh hiện tại có hơn 1500 tác phẩm và hơn 450k người theo dõi.

2. @alexmdc

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

Alex Solis là một nhà thiết kế và vẽ tranh minh họa. Tài khoản có hơn 1950 tác phẩm biểu tượng tuyệt đẹp và nghệ thuật, và hơn 224k người theo dõi 😀

3. @dschwen

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế
Dschwen LLC sản xuất hình ảnh và video cho các thương hiệu để kết nối mọi người. Hiện tại có 1470 tác phẩm và 143k người theo dõi tài khoản này!

4. @creaturebox

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế
CreatureBox Comics chuyên thiết kế nhân vật và phim hoạt hình. Tài khoản này đang có hơn 680 tác phẩm, và có 192k người theo dõi.

5. @s_harrington

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

Steven Harrington là 1 nghệ sĩ sống ở  Los Angeles, tài khoản này có gần 400 tác phẩm và hiện có gần 120k người theo dõi.

6. @rylsee

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

7. @seanwes

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

8. @mrseaves101

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

9. @mdemilan

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

10. @emotionslive

10 tài khoản Instagram bạn nên theo dõi để lấy ý tưởng thiết kế

Trên đây là 10 tài khoản Instagram về lĩnh vực design, mỗi người 1 phong cách đẹp và lạ, hy vọng bài viết này sẽ giúp các bạn có cảm hứng và có ý tưởng thiết kế.  Một số tài khoản phía dưới mình không ghi thông tin, các bạn có thể tự tìm hiểu. Nếu biết những tài khoản instagram thú vị các bạn có thể chia sẽ bên dưới!.

Chào các bạn!

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

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

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

Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server?

cài đặt sql server

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Hi mọi người, mình trở lại rồi đây. Hôm nay mình chia sẻ 1 trick siêu siêu nhỏ nhưng lại vô cùng hữu ích nhất là khi chúng ta chẳng may gặp phải tình huống này nhé. Chả là đôi khi chúng ta cần fix 1 cái gì đó, install thêm cái nọ cái kia mà sau khi hỏi bác Gu Gồ, anh em đồng đảng bảo cần bật SQL SERVER INSTALLATION CENTER lên rồi làm abc, xyz… Nhưng ô hay, bật nó lên ở đâu nhỉ????

Sau khi mày mò đủ kiểu và tìm đủ mọi nơi, cuối cùng cũng tìm được chỗ ẩn náu của nó anh em ạ. Mọi người chỉ cần truy cập đường dẫn bên dưới và khởi chạy SQL SERVER INSTALLATION CENTER thủ công nhé.

C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\SQLServer2012
Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server?

Hi vọng giúp đỡ được cho những ai đang tìm kiếm. 🙂

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

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

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

Làm tính năng Theme trong React?

Làm tính năng Theme trong React?

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

Để hỗ trợ tính năng Theme, cho phép người dùng lựa chọn kiểu giao diện mà họ thích, trong React, bạn sẽ có thể tiếp cận 1 trong 2 cách dùng CSS-in-JS hoặc dùng CSS variable (tất nhiên không có hỗ trợ với IE)

Nếu dùng CSS-in-JS bạn sẽ có thể làm được nhiều thứ hơn, bạn có một bộ công cụ đủ các đạo cụ để mua mai trong JS. Bài viết này sẽ chỉ ra tại sao bạn nên dùng CSS variable cho nhu cầu làm theme

Tuyển dụng it react không yêu cầu kinh nghiệm

Nếu dùng CSS-in-JS, trong React bạn sẽ tổ chức một ThemeProvider bằng React Context, dùng hook useTheme để lấy giá trị trong ThemeProvider, sẽ như thế này

import * as React from 'react'
import styled from '@emotion/styled'
import {ThemeProvider} from 'emotion-theming'

const themes = {
  light: {
    colors: {
      primary: 'deeppink',
      background: 'white',
    },
  },
  dark: {
    colors: {
      primary: 'lightpink',
      background: 'black',
    },
  },
}

const PrimaryText = styled.div(({theme}) => ({
  padding: 20,
  color: theme.colors.primary,
  backgroundColor: theme.colors.background,
}))

function ThemeToggler({theme, onClick}) {
  const nextTheme = theme === 'light' ? 'dark' : 'light'
  return (
    <button onClick={() => onClick(nextTheme)}>
      Change to {nextTheme} mode
    </button>
  )
}

function App() {
  const [theme, setTheme] = React.useState('light')
  return (
    <ThemeProvider theme={themes[theme]}>
      <PrimaryText>This text is the primary color</PrimaryText>
      <ThemeToggler
        theme={theme}
        onClick={(nextTheme) => setTheme(nextTheme)}
      />
    </ThemeProvider>
  )
}

export default App

Nếu dùng CSS variable, chúng ta khai bao một bộ các biến cần dùng, rồi chèn thêm data-theme cho thẻ body

CSS

body[data-theme='light'] {
  --colors-primary: deeppink;
  --colors-background: white;
}
body[data-theme='dark'] {
  --colors-primary: lightpink;
  --colors-background: black;
}

Phần implement của React component lúc này sửa lại

import * as React from 'react'
import './css-vars.css'
import styled from '@emotion/styled'

const PrimaryText = styled.div({
  padding: 20,
  color: 'var(--colors-primary)',
  backgroundColor: 'var(--colors-background)',
})

function ThemeToggler() {
  const [theme, setTheme] = React.useState('light')
  const nextTheme = theme === 'light' ? 'dark' : 'light'
  React.useEffect(() => {
    document.body.dataset.theme = theme
  }, [theme])
  return (
    <button onClick={() => setTheme(nextTheme)}>
      Change to {nextTheme} mode
    </button>
  )
}

function App() {
  return (
    <div>
      <PrimaryText>This text is the primary color</PrimaryText>
      <ThemeToggler />
    </div>
  )
}

export default App

Thẳng thắn mà nói, cả 2 cách làm này đều cho kết quả như nhau về mặt trãi nghiệm sử dụng, dùng CSS-in-JS sẽ có chút cảm giác hơi quá đà kỹ thuật, từ chuyên ngành là over-engineering.

Về hiệu năng thì sao?

ThemeProvider

Làm tính năng Theme trong React?

CSS variable

Làm tính năng Theme trong React?

Cũng không nhất thiết phải nhìn vào con số mili giây phải tốn cho việc render, vì simple này khá là bé. Bạn cứ hình dùng nếu một cây React Component với hàng trăm component con lồng ghép nhau, khi thay đổi giá trị trong ThemeProvider, tất cả những component đều bị render lại thì sẽ như thế nào? Việc dùng CSS variable sẽ mang lại hiệu quả hơn nhiều vì trình duyệt không phải làm quá nhiều thứ như cách 1.

  Những theme cho VS Code tốt nhất

Có một lý do mà mình cho là hơi ngụy biện khi khăng khăng đòi dùng JS-in-CSS theo mình đoán là các bạn thật sự chưa đủ tự tin cũng như “trình” để viết CSS hiện đại, bạn chuyên tâm nâng tầm JS của mình mà quên mất việc nâng tầm CSS, vón đã phát triển rất xa từ cái thời bạn dùng float

Use CSS Variables instead of React Context

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

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

Xem thêm tuyển dụng nhân viên it hấp dẫn trên TopDev

Làm thế nào để tìm được những “nhân tài” DevOps phù hợp nhất?

tuyển dụng devops
Làm thế nào để tuyển được những nhân tài DevOps phù hợp nhất?

Khác với suy nghĩ của nhiều người về công việc của DevOps, đây là vị trí không hoàn toàn giống như là một người vận hành. Khi tuyển dụng DevOps, nhà tuyển dụng đương nhiên cũng hiểu được các kỹ sư DevOps sẽ không giống như một nhà phát triển phần mềm hoặc một kỹ sư QA. Thay vào đó, các chuyên gia DevOps là sự kết hợp của ba mức độ trong hoạt động để giải quyết các thách thức về quy trình làm việc và hiệu quả chất lượng trong một nhóm kỹ thuật.

Về vị trí DevOps

Các chuyên gia DevOps giúp quản lý và tối ưu hóa kết quả đầu ra của nhóm phát triển, từ việc hợp tác hóa hợp lý, đến thực hiện QA, tự động hóa các quy trình quan trọng,… Nói cách khác: chúng giúp các nhóm phát triển vận hành công việc có mức yêu cầu chất lượng cao một cách nhất quán và nhanh chóng hơn.

DevOps là gì
DevOps là gì?

Các chuyên gia DevOps hay còn được biết đến với những cái tên như là Kiến trúc sư DevOps, Kỹ sư DevOps, Kỹ sư cơ sở hạ tầng hoặc thậm chí là Kỹ sư vận hành. Tên gọi như thế nào tùy thuộc vào người bạn yêu cầu đến từ một nhóm các nhà phát triển đa dạng có cả nền tảng phần mềm và hệ thống. Họ sẽ chịu trách nhiệm cho những công việc nào, đó cũng là cách để quyết định xem bạn nên gọi họ bằng cái tên nào. Theo nghĩa đó, việc tuyển dụng một DevOps phù hợp sẽ phụ thuộc vào nhu cầu của công ty, cấu trúc của nhóm cũng như các dự án mà họ đang làm việc.

Không có cái gọi là một tiêu chuẩn phù hợp với tất cả cho vị trí này và không phải tất cả các điểm dưới đây đều có thể áp dụng cho tất cả các vị trí DevOps. Những đặc điểm được đưa ra ở đây sẽ giúp ích phần nào đó cho công việc tuyển dụng một DevOps. Bạn nên trao đổi với người quản lý công việc tuyển dụng để họ có thể đưa ra các tiêu chuẩn ưu tiên nên có ở một ứng viên mà thôi.

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

Nếu đang tìm kiếm các Mid-level DevOps, bạn nên lưu tâm đến các đặc điểm sau!

Chuyên môn

  • Có kinh nghiệm trong lĩnh vực kỹ thuật công nghệ liên quan (ví dụ: phát triển phần mềm, kỹ thuật mạng hoặc vận hành).
  • Theo dõi hồ sơ về việc duy trì giám sát hệ thống thường xuyên và báo cáo cho cấp trên.
  • Nắm chắc các phương pháp vận hành tốt nhất trong quá trình phát triển phần mềm (liên quan đến bảo mật, sao chép và dự phòng dữ liệu, mở rộng quy mô,…).
  • Sẵn sàng học hỏi các công nghệ mới một cách nhanh chóng.
  • Áp dụng thái độ “làm việc thông minh hơn, không chăm chỉ hơn” trong công việc, tập trung vào việc tối đa hóa hiệu quả.
  • Thoải mái giám sát việc bảo trì dữ liệu lớn.
  DevOps trend - 8 dự đoán trong nhiều năm tới

Khả năng làm việc nhóm

  • Quen thuộc với phương pháp phát triển sản phẩm của cả team. Sẵn sàng học hỏi và chấp nhận những yêu cầu có tính ảnh hưởng lâu dài đến dự án. 
  • Hợp tác và định hướng theo nhóm: Có thể làm việc cùng với đồng đội để giải quyết các khó khăn trong quá trình làm việc.
  • Sắp xếp công việc rõ ràng, cụ thể theo các tình huống thực tế.
  • Có khả năng lãnh đạo là một điểm cộng để phối hợp với các bên liên quan cùng giải quyết vấn đề.
  Cloud Devops quan trọng như thế nào?
tuyển dụng devops
DevOps có kỹ năng tốt sẽ giúp công việc trôi chảy hơn

Kỹ năng mềm

  • Tự định hướng: Có khả năng tổ chức, sắp xếp kịp thời và chủ động trong công việc.
  • Sẵn sàng làm việc “bên ngoài ánh đèn sân khấu và tập trung” vào khía cạnh “hậu trường” của việc phát triển sản phẩm.
  • Kỹ năng giao tiếp: Có thể làm việc với đồng đội ở nhiều vai trò khác nhau để loại bỏ những trở ngại và khó khăn.
  • Tư duy chiến lược: Nhất quán trong việc đưa ra các quyết định, biết cân nhắc cả nhu cầu dài hạn và ngắn hạn.

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

Vậy đâu là giải pháp tốt nhất để tìm kiếm một DevOps phù hợp?

Một DevOps đôi khi phải đảm nhận nhiều nhiệm vụ khác nhau cho cùng một công việc và có thể đến từ một nhóm nền tảng có tính chuyên nghiệp cao. Do đó, việc ứng viên phải có khả năng đồng bộ hóa – thích ứng với nhu cầu của nhóm là điều bắt buộc. 

Và cách tốt nhất để bạn đánh giá một ứng viên có phù hợp hay không là hãy kiểm tra họ qua các tiêu chuẩn đã được đưa ra như trên. Bên cạnh đó, có thể cân nhắc thêm với tình hình công việc hiện tại của công ty bạn để đưa ra các yêu cầu tuyển dụng phù hợp nhất.

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

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

Proxy là gì? Phân loại, tính năng và cách cài đặt đơn giản

Proxy là gì? Phân loại, tính năng và cách cài đặt
Proxy là gì? Phân loại, tính năng và cách cài đặt

Với đời sống phát triển và phụ thuộc vào công nghệ như hiện nay, hàng ngày ta truy cập vào internet mà đã quên đi tính an toàn khi sử dụng. Proxy ra đời để đảm bảo quá trình truy cập mạng diễn ra mượt mà và bảo mật. Cùng TopDev tìm hiểu Proxy là gì, các tính chất cũng như cách sử dụng Proxy như thế nào.

Proxy là gì?

Proxy (còn được gọi là Proxy server) là máy chủ trung gian, đóng vai trò như một cổng kết nối giữa người dùng và internet. Proxy có chức năng tương tự như một bức tường lửa (firewall) hay một bộ lọc truy cập trang web, đảm bảo các kết nối được an toàn khi sử dụng.

Proxy là gì?

Cách hoạt động của Proxy

Khi một người dùng gửi yêu cầu truy cập tài nguyên từ một trang web, yêu cầu đó sẽ được gửi đến máy chủ proxy trước, thay vì trực tiếp đến trang web đích. Sau đó, máy chủ proxy sẽ gửi yêu cầu đến trang web, nhận phản hồi và chuyển đáp án về cho người dùng. Như hình minh họa dưới đây:

Proxy là gì?

Phân loại Proxy Server chính

Proxy có thể được phân loại theo nhiều tiêu chí khác nhau. Dưới đây là một số phân loại phổ biến

Phân loại Proxy theo loại kết nối

Forward proxy

Forward Proxy đại diện cho các máy clients. Nó đại diện cho clients gửi request tới các webserver, sau đó nó nhận dữ liệu mà các target site trả về và chuyển tới clients nếu hợp lệ.

Forward proxy

Chúng ta xem xét ví dụ sau:

  • Chúng ta có 3 máy tính: X, Y, Z.
    • X: là clients
    • Y: proxy server
    • Z: target site
  • Bình thường, sẽ có kết nối trực tiếp từ X –> Z. Trong thực tế, tốt hơn nên để kết nối có dạng Y –> Z, ở đây Y đại diện cho X. Kết nối đầy đủ sẽ là X –> Y –> Z. Trong trường hợp này, Z có thể biết hoặc không biết X là ai tùy vào loại proxy của Y.
  • Forward Proxy chia thành 2 loại
    • Anonymous proxy: sẽ che giấu thông tin của các requester bằng cách ẩn IP trước khi gửi request tới target server. Tuy nhiên, địa chỉ IP của các proxy này thường có trong backlist công khai vì vậy khi dùng anonymous proxy bạn sẽ bị giới hạn một số chức năng (bản chất là bị một số target site nó block).
    • High Anonymity Proxy (Elite Proxy): nó có chức năng của anonymous proxy nhưng ẩn danh còn tốt hơn cả anonymous proxy. Bản thân anonymous proxy bị ảnh hưởng nhiều bởi blacklist, còn high anonymous proxy thậm chí không xuất hiện trong blacklist này. Nó có cơ chế che giấu thông tin định danh của chính mình, nghĩa là nó không cho ai biết mình là một proxy.
    • Transparent proxy: public thông tin của các requester với target site trong khi truy cập tới chúng.
    • Distorting Proxy: là loại proxy sẽ thay đổi IP gốc của các requester khi đẩy request tới target server.
  • Tại sao chúng ta phải dùng Forward Proxy
    • Admin của X không muốn X truy cập tới những trang web gây hại cho tổ chức của họ.
      • Các công ty sẽ muốn chặn trang familypostcards2008.com vì ở đó có virus
      • Ví dụ khác, một số công ty sẽ chặn facebook.com để nhân viên yên tâm công tác =))
      • Trường cấp 1 thì chặn playboy.com :”>
      • Chính phủ thì chặn các trang mạng chứa thông tin không hay về họ
    • Admin của Z muốn block X
      • Admin của Z nhận ra X có giấu hiệu hacking, vì vậy anh ta đã block địa chỉ IP của X.
      • Z là một forum website, X là một spammer thì Z cũng block X.

Reverse proxy

Reverse proxy

Chúng ta xem xét ví dụ sau:

  • Chúng ta có 3 máy tính: X, Y, Z.
    • X: là clients
    • Y: proxy server
    • Z: target site
  • Bình thường, kết nối sẽ là X –> Z. Trong thực tế, admin của Z không cho phép những truy cập trực tiếp tới Z mà phải thông qua Y trước. Trong góc nhìn của X, kết nối sẽ là X –> Y nhưng thực tế là X –> Y –> Z bởi vì X không thể nhìn thấy Z. Y ở đây đóng vai trò che giấu thông tin của các target server.
  • Tại sao chúng ta phải dùng Reverse Proxy?
    • Z muốn tất cả request tới mình phải thông qua Y trước
      • Z muốn dùng Y để cân bằng tải, đưa request tới target server đang rảnh hơn những cái khác.
      • Z muốn tối ưu thời gian phản hồi của mình thông qua Y, Y sẽ chuyển request tới CDN gần với X nhất.
      • Tạo cơ chế cache để giảm thời gian phản hồi các request.
    • Thực hiện những authentication tasks. Z lo lắng về những dữ liệu mình đang chứa và không cho phép các truy cập trực tiếp. Thông qua Y, Z có thể block những request gây hại cho mình và cho phép những request hợp lệ đi qua.

Phân loại Proxy theo mức độ ẩn danh

Có 4 loại proxy chính phân biệt theo mức độ ẩn danh, bao gồm:

Transparent Proxy (Proxy trong suốt)

Transparent Proxy không ẩn địa chỉ IP thực của người dùng, thường được sử dụng trong các mạng nội bộ.

Ví dụ: Proxy được sử dụng trong các công ty, trường học để kiểm soát và giám sát truy cập internet của nhân viên/học sinh.

Anonymous Proxy (Proxy ẩn danh)

Anonymous Proxy sẽ giấu địa chỉ IP thực của người dùng, nhưng vẫn có thể bị phát hiện bởi một số trang web thông qua các kỹ thuật phát hiện proxy.

Ví dụ: Các proxy như HideMyAss, Kproxy, Proxysite.com, … Người dùng có thể truy cập internet mà không bị lộ địa chỉ IP thực, nhưng vẫn có thể bị một số trang web phát hiện ra đang sử dụng proxy.

Distorting proxy (Proxy mạo danh)

Proxy mạo danh thực hiện chức năng giống với máy chủ ẩn danh nhưng bằng cách gửi sai địa chỉ IP cho máy chủ web, nghĩa là ta sẽ truy cập web với một địa chỉ IP mạo danh mà không bị phát hiện.

High Anonymity Proxy (Proxy Ẩn Danh Cao)

High Anonymity Proxy sẽ thay đổi địa chỉ IP liên tục giúp địa chỉ IP của người dùng hoàn toàn được bảo mật, rất khó để phát hiện ra người dùng đang sử dụng proxy.

Ví dụ: Các proxy như Tor, I2P, Freenet, … Đây là những proxy có khả năng ẩn danh rất cao, cung cấp lớp bảo vệ bổ sung để che giấu thông tin về địa chỉ IP và định danh của người dùng.

Tính năng của máy chủ Proxy

Firewall và Filtering

Proxy Server hoạt động tại Tầng thứ 7 của mô hình OSI – Application layer, nó có khả năng lọc ứng dụng một cách độc lập. Khi được thiết lập chính xác, Proxy có thể nâng cao đáng kể tính an toàn, chặn truy cập vào các trang web hoặc nội dung không phù hợp, dựa trên các tiêu chí như địa chỉ IP, tên miền, giao thức,… So với các hệ thống tường lửa truyền thống Proxy mang lại những chức năng vượt trội hơn mà chúng không thể nào có được.

Chia sẻ kết nối Internet

Proxy Server là giải pháp chia sẻ truy cập Internet hiệu quả, bằng cách cho phép nhiều người dùng cùng chia sẻ một kết nối internet, giúp tiết kiệm băng thông và chi phí.

Khi nhiều người truy cập cùng một trang web, proxy server có thể lưu trữ bản sao trang web trong bộ nhớ cache, tăng tốc độ truy cập sau này.

Proxy và Caching

  • Proxy server có thể lưu trữ bản sao (cache) của các trang web, tệp tin mà người dùng truy cập.
  • Khi người dùng truy cập lại các nội dung đã được lưu trong cache, proxy server sẽ cung cấp nội dung từ cache thay vì tải lại từ nguồn gốc, giúp tăng tốc độ truy cập.
  • Caching giúp giảm tải lên máy chủ gốc, tiết kiệm băng thông và cải thiện hiệu suất.

Ngoài những tính năng trên, proxy server còn có thể được sử dụng để ẩn danh tính, kiểm soát truy cập, ghi nhật ký hoạt động và nhiều tính năng khác tùy thuộc cấu hình.

Lợi ích của Proxy Server

  • Bảo mật và ẩn danh: Proxy có khả năng ẩn danh địa chỉ IP thực của người dùng, giúp bảo vệ thông tin cá nhân và giảm rủi ro bị theo dõi.
  • Đảm bảo quyền riêng tư khi lướt web: Sử dụng các Proxy khác nhau giúp bạn tránh bị ngập trong quảng cáo không mong muốn hoặc bị thu thập dữ liệu theo địa chỉ IP. Với một proxy, việc duyệt web của bạn sẽ được bảo vệ tốt và không thể bị theo dõi.
  • Kiểm soát truy cập: Doanh nghiệp có thể sử dụng proxy để kiểm soát truy cập Internet của nhân viên, chặn các trang web không phù hợp và giám sát hoạt động trực tuyến.
  • Caching và tăng tốc độ: Proxy server có khả năng lưu trữ các nội dung truy cập thường xuyên (caching), giúp tăng tốc độ truy cập và giảm tải băng thông.
  • Truy cập nội dung bị chặn ở một số khu vực: Proxy có thể cho phép người dùng truy cập vào các dịch vụ hoặc nội dung bị hạn chế theo khu vực địa lý bằng cách thay đổi địa chỉ IP.
  • Quản lý và giám sát: Proxy giúp ghi lại các hoạt động trực tuyến và phát hiện các hành vi đáng ngờ, hỗ trợ trong việc bảo trì và bảo mật hệ thống. Hơn thế nữa, proxy có thể chặn truy cập vào các trang web thường gây phân tâm cho nhân viên như Facebook, Instagram,…

Rủi ro khi dùng Proxy Server

  • Rủi ro bảo mật: Nếu proxy không được cấu hình đúng cách hoặc không đáng tin cậy, dữ liệu của người dùng có thể bị rò rỉ hoặc bị xem lén.
  • Tốc độ kết nối: Sử dụng proxy có thể làm giảm tốc độ kết nối Internet, đặc biệt nếu máy chủ proxy đang bị quá tải.
  • Pháp lý và đạo đức: Việc sử dụng proxy để truy cập nội dung bị hạn chế có thể vi phạm chính sách của một số dịch vụ hoặc luật pháp địa phương.
  • Rủi ro từ Proxy miễn phí: Không phải tất cả các proxy đều đáng tin cậy. Nhiều dịch vụ proxy miễn phí không đảm bảo về bảo mật và có thể thu thập thông tin cá nhân của người dùng để bán cho bên thứ ba.
  • Phụ thuộc vào Proxy Server: Người dùng có thể gặp sự cố không thể truy cập dịch vụ mạng hoặc các tài nguyên mạng nếu Proxy xảy ra vấn đề.

Hướng dẫn cách cài đặt Proxy cho trình duyệt Chrome

Bước 1: Thao tác trên Chrome

  • Mở Chrome và click vào biểu tượng dấu ba chấm
  • Vào Setting
  • Chọn System
  • Chọn mục Open your computer’s proxy settings

Hướng dẫn cách cài đặt Proxy cho trình duyệt Chrome

Bước 2: Thay đổi Proxy

Sau bước 1, cửa sổ cài đặt của hệ thống sẽ hiện ra, thao tác lần lượt như sau (trên Windows 11):

  • Tại mục Manual proxy setup, ở thẻ Use a proxy server bấm Set up 

Thay đổi Proxy

  • Bật ON và nhập địa chỉ proxy vào ô Proxy IP address sau đó Save.

Thay đổi Proxy

Trên đây là bài viết tổng quan của mình về Proxy và các loại Proxy. Bên cạnh đó TopDev cũng đã hướng dẫn cách set up Proxy trên Chrome. Chúc bạn thành công!

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

Bài viết liên quan: HAPROXY là gì, setup 1 load balancer đơn giản

Module trong Python

Module trong Python

Bài viết được sự cho phép của tác giả Nguyễn Chí Thức

Module được sử dụng để phân loại code thành các phần nhỏ hơn liên quan với nhau. Hay nói cách khác, Module giúp bạn tổ chức Python code một cách logic để giúp bạn dễ dàng hiểu và sử dụng code đó hơn. Trong Python, Module là một đối tượng với các thuộc tính mà bạn có thể đặt tên tùy ý và bạn có thể gắn kết và tham chiếu.

Việc làm python hấp dẫn cho bạn

Về cơ bản, một Module là một file, trong đó các lớp, hàm và biến được định nghĩa. Tất nhiên, một Module cũng có thể bao gồm code có thể chạy.

Bạn theo dõi qua ví dụ sau: Nếu nội dung của một quyển sách không được lập chỉ mục hoặc phân loại thành các chương riêng, thì quyển sách này có thể trở nên nhàm chán và gây khó khăn cho độc giả khi đọc và hiểu nó. Tương tự, Module trong Python là các file mà có các code tương tự nhau, hay có liên quan với nhau. Chúng có lợi thế sau:

Khả năng tái sử dụng: Module có thể được sử dụng ở trong phần Python code khác, do đó làm tăng tính tái sử dụng code.

Khả năng phân loại: Các kiểu thuộc tính tương tự nhau có thể được đặt trong một Module.

Để import một Module, bạn có thể sử dụng một trong ba cách dưới đây:

Sử dụng lệnh import trong Python

Bạn có thể sử dụng bất cứ source file nào dưới dạng như một Module bằng việc thực thi một lệnh import trong source file khác. Cú pháp của lệnh import là:

import module1[, module2[,... moduleN]

Giả sử mình có đoạn code sau:

def add(a,b):
    c=a+b
    print c
    return

Lưu file dưới tên là addition.py. Lệnh import được sử dụng như sau với file này:

import addition
addition.add(10,20)
addition.add(30,40)

Ở đây, trong addition.add() thì addition là tên file và add() là phương thức đã được định nghĩa trong addion.py. Do đó, bạn có thể sử dụng phương thức đã được định nghĩa trong Module bằng cách là ten_file.phuong_thuc(). Code trên sẽ cho kết quả:

>>> 
30
70
>>>

Ghi chú: Bạn có thể truy cập bất cứ hàm nào bên trong một Module theo phương thức như trên.

Để import nhiều Module, bạn sử dụng cách như trong ví dụ sau:

1, msg.py

def msg_method():
    print "Hom nay troi mua"
    return

2, display.py

def display_method():
    print "Thoi tiet kha am uot"
    return

3, multiimport.py

import msg,display
msg.msg_method()
display.display_method()

Kết quả là:

>>> 
Hom nay troi mua
Thoi tiet kha am uot
>>>    
  Python cơ bản cho ứng dụng trong công việc

Sử dụng lệnh from…import trong Python

Lệnh from…import được sử dụng để import thuộc tính cụ thể từ một Module. Trong trường hợp mà bạn không muốn import toàn bộ Module nào đó thì bạn có thể sử dụng lệnh này. Cú pháp của lệnh from…import là:

from modname import name1[, name2[, ... nameN]]

Dưới đây là ví dụ:

1, area.py

def circle(r):
    print 3.14*r*r
    return

def square(l):
    print l*l
    return

def rectangle(l,b):
    print l*b
    return

def triangle(b,h):
    print 0.5*b*h
    return

2, area1.py

from area import square,rectangle
square(10)
rectangle(2,5)

Kết quả là:

>>> 
100
10
>>> 

Sử dụng lệnh from…import* trong Python

Sử dụng lệnh này, bạn có thể import toàn bộ Module. Do đó bạn có thể truy cập các thuộc tính trong Module này. Cú pháp của lệnh là:

from modname import *

Ví dụ dưới đây chúng ta sẽ import area.py ở trên:

2, area1.py

from area import *
square(10)
rectangle(2,5)
circle(5)
triangle(10,20)

Kết quả là:

>>> 
100
10
78.5
100.0
>>>
  Làm app giao diện đồ hoạ với Python

Built-in Module trong Python

Phần trên, bạn đã tìm hiểu cách tạo ra Module cho riêng mình và cách import chúng. Phần này sẽ giới thiệu các Module đã được xây dựng sẵn trong Python. Đó là math, random, threading, collections, os, mailbox, string, time, … Mỗi Module này đã định nghĩa sẵn rất nhiều hàm để bạn có thể sử dụng để thực hiện các tính năng khác nhau. Bạn theo dõi một số ví dụ với hai Module là math và random mà có các hàm đã được giới thiệu trong các chương trước.

Ví dụ sử dụng math Module:

import math
a=4.6
print math.ceil(a)
print math.floor(a)
b=9
print math.sqrt(b)
print math.exp(3.0)
print math.log(2.0)
print math.pow(2.0,3.0)
print math.sin(0)
print math.cos(0)
print math.tan(45)

Ví dụ sử dụng random Module:

import random

print random.random()
print random.randint(2,8)

Package trong Python

Về cơ bản, một Package là một tập hợp các Module, sub-package, … tương tự nhau. Đó là một cấu trúc có thứ bậc của thư mục và file.

Dưới đây là các bước để tạo và import một Package:

Bước 1: Tạo một thư mục, có tên là vietjack chẳng hạn.

Bước 2: Đặt các module khác nhau bên trong thư mục vietjack này. Chúng ta đặt ba Module là msg1.py, msg2.py, và msg3.py và đặt tương ứng code trên vào các Module tương ứng. Bạn đặt hàm msg1() trong msg1.py, hàm msg2() trong msg2.py và hàm msg3() trong msg3.py.

Bước 3: Tạo một init.py file để xác định các thuộc tính trong mỗi Module.

Bước 4: Cuối cùng bạn import package này và sử dụng các thuộc tính đó bởi sử dụng package.

Bạn theo dõi ví dụ sau:

1, Tạo thư mục

import os
os.mkdir("Info")

2, Đặt các module khác nhau trong package:
msg1.py

def msg1():
    print "Day la msg1"

msg2.py

def msg2():
    print "Day la msg2"

msg3.py

def msg3():
    print "Day la msg3"

3, Tạo một init.py file.

from msg1 import msg1
from msg2 import msg2
from msg3 import msg3

4, Import package này và sử dụng các thuộc tính.

import Info
Info.msg1()
Info.msg2()
Info.msg3()

Kết quả là:

>>> 
Day la msg1
Day la msg2
Day la msg3
>>>

Câu hỏi: init.py file là gì?

Nó đơn giản là một file được sử dụng để xem xét các thư mục trên disk dưới dạng package của Python. Về cơ bản, file này được sử dụng để khởi tạo các Package trong Python.

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

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

Xem thêm tuyển it job hấp dẫn trên TopDev

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

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

Chào các bạn, hiện nay có rất nhiều công cụ hỗ trợ việc lập trình rất tốt. Tiêu biểu trong số đó phải kể đến các sản phẩm của JetBrains với những tính năng ưu việt. Nhưng không vì thế mà các công cụ miễn phí mất đi vị trí của nó.

Việc kết nối đến cơ sở dữ liệu trong IntelliJ Idea (một sản phẩm của JetBrains) như trong bài viết trước mình đã hướng dẫn là tính năng chỉ có ở phiên bản trả phí (phiên bản Ultimate).

Chính vì vậy mà trong bài viết này, mình sẽ hướng dẫn với các bạn cách kết nối đến database MySQL trong Eclipse – một công cụ hoàn toàn miễn phí để có thể làm việc tương tự mà các bạn không phải trả phí như với IntelliJ.

Xem thêm Việc làm database, việc làm mysql hấp dẫn trên TopDev

Làm thế nào để kết nối đến Database MySQL trong Eclipse?

+ Bước 1: Đầu tiên các bạn hãy mở Eclipse lên, ở đây mình dùng phiên bản Eclipse 2019 JavaEE nha. Sau đó chúng ta sẽ phải mở Database Development Perspective lên như sau:

Window => chọn Perspective => chọn Open Perspective => chọn Other (tương ứng với các bước 1 -> 2 -> 3 -> 4) như hình bên dưới. Hoặc bấm vào biểu tượng ở vị trí số 5 như trong hình.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 2: Sau khi mở Perspective các bạn chọn Database Development như hình bên dưới. Sau đó bấm Open để tiếp tục.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 3: Đây chính là khung làm việc của Database Development trong Eclipse.

  • (1) Data Source Exploer: Hiển thị các thông tin liên quan đến việc kết nối đến database (Tạo kết nối mới, xem thông tin database sau kết nối…)
  • (2) Biểu tượng cho thấy chúng ta đang ở Database Development Perspective.
  • (3) Khu vực chúng ta có thể viết câu query hoặc xem kết quả của các câu query và các thông tin liên quan.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 4: Bây giờ chúng ta sẽ tạo một kết nối mới đến một cơ sở dữ liệu có sẵn với hệ quản trị cơ sở dữ liệu MySQL Server.

Các bạn chuột phải vào Database Connection ở tab Data Source Explorer => và chọn New như hình bên dưới.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 5: Một hộp thoại Connection Profile sẽ mở lên như sau:

  • (1) Các bạn chọn hệ quản trị cơ sở dữ liệu tương ứng, ở đây mình chọn MySQL
  • (2) Các bạn điền thông tin tên kết nối (bắt buộc) và mô tả (không bắt buộc)
  • (3) Bấm Next để tiếp tục.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 5: Ở bước này chúng ta sẽ đi vào chi tiết các thông tin cho việc kết nối hệ quản trị cơ sở dữ liệu.

Các bạn bấm vào biểu tượng dấu (+) như hình bên dưới để thêm driver (là một thư viện hỗ trợ việc kết nối đến database)

Note: Ở đây mình dùng Java và MySQL Server phiên bản 8.0.15 nên mình phải download phiên bản phù hợp. Các bạn có thể download phiên bản phù hợp của thư viện với MySQL Server tại đây:

https://mvnrepository.com/artifact/mysql/mysql-connector-java

+ Bước 6: Sau khi download file thư viện về, ở bước này các bạn vào tab JAR list => Add Jar/zip vào trỏ đến file vừa download về.

=> Sau đó bấm OK để hoàn tất việc thêm MySQL Driver.

  "Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code"
  Các công cụ hữu ích hỗ trợ bạn trong việc tạo testdata

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

  • (1) Ở bước này các bạn bấm vào mũi tên xuống để chọn MySQL JDBC Driver vừa cài đặt ở bước trước.
  • (2) Là các thông tin về cơ sở dữ liệu mà bạn muốn kết nối.
    • (2.1) Tên Database
    • (2.2) URL để kết nối đến database theo format: jdbc:mysql://<hostname>:<port>/<database name>
    • (2.3) Username khi bạn cài MySQL Server
    • (2.4) Password tương ứng với username bên trên.

Các bạn có thể bấm vào lưu mật khẩu để lần sau không phải nhập mật khẩu.

  • (3) Bấm vào Test Connection để kiểm tra kết nối đến database.
  • (4) Nếu thông báo là Ping Succeeded! là kết nối thành công.
  • (5) Bấm Finish để hoàn tất việc kết nối.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 7: Ở đây sau khi kết nối giả sử mình muốn xem dữ liệu của bảng tbl_user mình có thể chuột phải vào bảng: Data => Edit.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Và đây chính là dữ liệu trong bảng tbl_user. Các bạn có thể tìm hiểu thêm các thao tác với bảng, cơ sở dữ liệu nhé.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Lời Kết

Trên đây là các bước giúp bạn kết nối đến Database MySQL trong Eclipse, cũng khá đơn giản phải không nào!

Vậy là trong bài viết này mình đã hướng dẫn với các bạn cách kết nối đến hệ quản trị cơ sở dữ liệu MySQL Server để chúng ta có thể thao tác với dữ liệu trực tiếp trên IDE thay vì sử dụng thêm công cụ MySQL Workbench rồi ha.

Thực tế việc thao tác với cơ sở trực tiếp trên các IDE như thế này sẽ có một số hạn chế so với các công cụ chuyên dụng. Song, nó sẽ giúp chúng ta thuận tiện hơn trong nhiều trường hợp. Cảm ơn và hẹn gặp lại các bạn trong bài viết tiếp theo nha.!

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

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

Một chút vui vẻ với Go

Một chút vui vẻ với Go

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

Hế nhô các bạn, sau một thời gian làm việc với NodeJS thì mình biết đến go một cách tình cờ qua một lần đi phỏng vấn. Và bây giờ mình đã đến với Go bằng tất cả tâm tư, cũng như những kinh nghiệm khi mình đã làm việc với NodeJS

  10 Add-on Google Sheets phải có dành cho các Recruiters

  10 Công cụ Go-To Tech dành riêng cho các Software Developer

Ngày Đầu học Go, đọc đâu cũng thấy Go Channel is awesome, Go is concurrency, the modern programming language…, thật là thú vị, google vài vòng mình cx nhanh chóng nhận ra một điểm mà Go làm tốt hơn NodeJS là create Worker process, channel và goroutine là nguyên nhân khiến việc kiểm soát Worker dễ hơn NodeJS rất nhiều, ví dụ để giới hạn n Worker cùng nhau chạy đồng thời chúng ta chỉ cần tạo cho nó một buffered channel sau đó chạy n Worker trong n goroutine.

// create a buffered channel
var UploadPool chan WorkerMessage

// worker subcribe to channel and do something with it Sleep for example
func Worker(UploadPool chan WorkerMessage){
  for {
	workerMessage := <- UploadPool
   	time.Sleep(time.Second)		
  }
}
// init function to run n worker in goroutine
func InitWorker(numWorker int, UploadPool chan WorkerMessage){
	for i:=1;i<=numWorker;i++{
		go Worker(UploadPool)
	}
}

Và tiếp theo đây, nhân dịp mình đang dùng NodeJS để xử lí upload ảnh, và resize ảnh nên mình sẽ làm điều tương tự với GoLang để xem chúng nó có gì hay.

Follow Chart

Một chút vui vẻ với Go

Nào cùng bắt đầu với Follow 1: Lắng nghe form-data request từ front end và save file to local. Mình sẽ sử dụng Gin Framework, một web framework nhiều sao nhất trên github.

func HandleUploadForm(c *gin.Context) {
	form,_ := c.MultipartForm()
	files := form.File["files"]
	var fileNames []string
	for _, file := range files {
		fileName :=fmt.Sprintf("%v",uuid.New()) + file.Filename
		fileNames = append(fileNames,fileName)
		c.SaveUploadedFile(file, "storage/image/"+fileName)
	}
	c.JSON(200, utils.ApiResponse{
		Ok:      true,
		Message: "Uploaded successfully.....",
		Data:    fileNames,
	})
	for _,fileName := range fileNames{
    // loop and push WorkerMessage to UploadPool for Worker.
		UploadPool <- WorkerMessage{FileName: fileName,Resize:true}
	}
}

Như trong đoạn code đầu chúng ta đã có n Worker chạy concurrency và đang trong trang thái chờ nhận file để upload lên GCloud. Thêm cho nó 1 function để nó có thể upload lên GCloud nào. Thêm channel finished cho mỗi goroutine để có thể hứng được kết quả của mỗi task upload, tuỳ vào kết quả và theo logic của mỗi người mà chúng ta sẽ xử lí tiếp.

func uploadToGCloudStorage(fileName string, finished chan bool) {
	f, err := os.Open("storage/image/" + fileName)
	if err != nil {
		utils.Logger("error", err)
		return
	}
	defer f.Close()
	object := Bucket.Object(fileName)
	wc := object.NewWriter(context.Background())
	if _, err = io.Copy(wc, f); err != nil {
		utils.Logger("error", err)
		return
	}
	if err := wc.Close(); err != nil {
		utils.Logger("error", err)
		return
	}
	fmt.Println(utils.ApplyStyle("bold", "yellow", "Upload to Cloud successfully...."))
	object.ACL().Set(context.Background(),storage.AllUsers,storage.RoleReader)
	objectAddress := ObjectAddress{
		ID:primitive.NewObjectID(),
		FileName: fileName,
	}
	_,err = database.Models.Object.InsertOne(context.Background(),objectAddress)
	if err != nil {
		utils.Logger("error",err)
	}
	finished <- true
}


func UploadImageTaskConsumer(UploadPool chan WorkerMessage){
	for {
		workerMessage := <- UploadPool
		finished := make(chan bool)
		if workerMessage.Resize == true {
			go ImageAnalysis(ObjectAddress{
				FileName: workerMessage.FileName,
			})
		}
		go uploadToGCloudStorage(workerMessage.FileName,finished)
		<- finished
	}
}

Vậy là xong vụ upload file, so sánh với NodeJS thì thay vì phải quản lí Worker rất vất vả nodejs thì giờ đây, chúng ta có thể làm điều đó dễ dàng với Go Channel.

Các bạn có thể xem responstory của mình tại đây, mình mong được các bạn góp ý để cải thiện bản thân, trở nên tốt hơn.

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

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

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

Kết nối Database động với PHP, Dynamic Database Connection!

database connection

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Hôm nay mình cùng trở lai với PHP nhé. Chắc hẳn chúng ta đều đã biết hầu hết các hệ thống/ứng dụng đều sử dụng ít nhất 1 hệ quản trị Cơ sở dữ liệu để lưu trữ dữ liệu cho ứng dụng của mình. Thông thường các hệ thống đó có thể sử dụng một hoặc nhiều Database. Tuy nhiên phần lớn chúng đều được khai báo cố định trước trong các file config. Một ngày đẹp trời, chúng ta cần xây dựng một hệ thống mà cần quản lý, kết nối tới nhiều Database khác nhau nhưng lại không được khai báo và xác đinh trước. Vậy chúng ta sẽ xử lý ra sao? Bài viết hôm nay mình sẽ chia sẻ phương án giải quyết cho việc kết nối động tới Database (dynamic database connection). Cụ thể mình sẽ minh họa đối với PHP CodeIgniter.

Kết nối Database động với PHP, Dynamic Database Connection!
Dynamic Database Connection

Giải pháp

Các bước thực hiện như sau:

  • Tạo helper xử lý việc trả về cấu hình chuẩn để kết nối Database
  • Load dữ liệu thông tin Database trước khi cần kết nối
  • Sử dụng helper để render dữ liệu config với Database trên
  • Load model với config Database mới

Việc làm database lương cao

Tạo Helper

Tạo 1 file helper, đặt tên là db_dinamic_helper.php trong folder application/helpers

Kết nối Database động với PHP, Dynamic Database Connection!
Code Helper demo

Sau khi tạo helper chúng ta cùng thêm function để render cấu trúc config PHP. Trên hình là code mình sử dụng với CodeIgniter. Một điệu đặc biệt quan trọng là thêm helper trên vào Autoload.

Xem thêm Việc làm php hấp dẫn

Load thông tin kết nối Database

Ở bước này, các bạn load thông tin kết nối của Database bạn đang muốn kết nối tới. Dữ liệu này có thể nhập liệu từ trên hệ thống, hoặc đi theo thông tin của khách hàng, hoặc đến từ bất kỳ nguồn nào. Miễn sao đảm bảo đủ các thông tin bắt buộc sau:

  • Host: IP Database server / localhost
  • Username+Password: Tài khoản có quyền truy cập Database
  • Database Name: Tên của Database
  • DB Driver: Phương thức kết nối tới Database (mysqli, sqlsrv….)
  "Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code"
  Chạy database migration khi deploy, nên hay không?

Kết nối model với Database mới

Sau khi đã có thông tin config để kết nối với Database mới, việc tiếp theo cần làm là sử dụng helper để render ra dữ liệu config chuẩn của DB sau đó load model với config đó.

Dưới đây là ví dụ: trabajador.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Trabajador extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        $this->load->driver('cache');
        $this->load->helper(array('form', 'url','otros_helper','fechas_helper','imagen_helper','config_helper','permisos_helper'));
        $this->abbost_hotel = @$this->session->userdata('sess_abbost_hotel_'.substr(base_url(),-8,7));
        if(!@$this->abbost_hotel->usuario_id) redirect ('acceso');

            $nombre_bd = $this->abbost_hotel->nombre_bd;
            $config_app = switch_db_dinamico($nombre_bd);
            $this->load->model(array('model_producto','model_trabajadores','model_habitacion','model_tareas','model_notif'));
            $this->model_trabajadores->app_db = $this->load->database($config_app,TRUE);
            $this->model_habitacion->app_db = $this->load->database($config_app,TRUE);
            $this->model_producto->app_db = $this->load->database($config_app,TRUE);
            $this->model_tareas->app_db = $this->load->database($config_app,TRUE);
            $this->model_notif->app_db = $this->load->database($config_app,TRUE);
         date_default_timezone_set("America/Lima");
        //if(!@$this->user) redirect ('inicio/login');
        //$permisos = cargar_permisos_del_usuario($this->user->idusuario);
    }
    public function index()
    {
        //...
    }

Và ở model cần chỉnh sửa như sau: Chúng ta cần khai báo $app_db và tất cả các hoạt động truy vấn dữ liệu tới Database đều sử dụng qua biến này.

<?php
class Model_tareas extends CI_Model {
    public $app_db;
    public function __construct()
    {
        parent::__construct();
    }
    public function m_cargar_tareas_activas()
    {
        $estado = 1;
        $this->app_db->select("tarea_id, prioridad");
        $this->app_db->from('tarea');
        $query = $this->app_db->get();
        return $query->result_array();
    }
}

Như vậy ở controller, sau khi load được config của Database cần kết nối, chúng ta sẽ load model theo config đó và thao tác dữ liệu với Database mới đó. Hệ thống lúc này có thể kết nối linh động tới nhiều Database mà không cần khai báo trước. Mọi người có góp ý thì cùng trao đổi dưới comment nhé.

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

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

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

Lợi ích của việc học lập trình

Lợi ích của việc học lập trình

Bài viết được sự cho phép của tác giả Nguyễn Chí Thức

Kỹ năng coding không chỉ sẽ mở ra cánh cửa cho một nghề nghiệp vô cùng tuyệt vời và linh hoạt trong công nghệ, mà còn dẫn dắt bạn tạo ra những thay đổi mạnh mẽ đến thế giới. Và đây là những lợi ích bạn sẽ nhận được từ việc học lập trình.

  "Ngành IT này học rất dễ, tài liệu ko bao giờ thiếu. Quan trọng là phải có đam mê và chịu cày"
  2 nhận định sai lầm về việc bắt đầu học lập trình

1. Công nghệ ở mọi nơi

Những ngày này, ngành công nghệ cao không còn chỉ đơn thuần là ngành công nghiệp công nghệ. Máy tính và code có ở khắp mọi nơi. Trường học, bệnh viện, văn phòng chính phủ — tất cả đều dựa vào cơ sở hạ tầng kỹ thuật số — và điều đó có nghĩa là cơ hội việc làm cho các lập trình viên sẽ ngày càng tăng cao.

Tech là một lĩnh vực cực kì đa dạng và linh hoạt, vì vậy, bạn sẽ không bao giờ biết nó có thể đưa mình đến đâu. Tuy vậy, bạn sẽ cần có công cụ trong chuyến hành trình đó và việc học coding chính là chiếc chìa khóa mà bạn đang tìm kiếm.

2. Tính linh hoạt

Trong thế giới công nghệ ngày nay, càng nhiều kỹ năng thì bạn càng có giá trị. Giả sử nếu bạn là một chuyên gia về Photoshop và Illustrator, nhưng bạn cũng quen thuộc với WordPress và PHP (Hoặc HTML và CSS).

Mỗi kỹ năng này sẽ khiến bạn trở nên hấp dẫn hơn trong mắt khách hàng và người tuyển dụng. Bạn càng có nhiều kỹ năng, càng hiểu rõ về code thì bạn càng có nhiều cơ hội thăng tiến trong sự nghiệp.

3. Không lo thất nghiệp

Theo burning-glass.com, các công việc lập trình đang tăng nhanh hơn 50% so với thị trường việc làm nói chung và nhanh hơn 12% so với mức trung bình của thị trường. Do đó, nếu được trang bị những kỹ năng này, bạn sẽ không lo việc bị thất nghiệp.

Mặt khác, bạn cũng sẽ có được các đặc quyền như khả năng làm việc từ xa, lịch công việc linh hoạt và mức lương cao hơn hẳn nhiều người.

4. Kiếm thêm tiền

Tiền không phải là tất cả. Nhưng ai cũng muốn kiếm nhiều tiền hơn, đúng không? Với một nghiên cứu trong năm 2014 đã cho thấy các vị trí bắt đầu trong IT tại một số công ty dao động từ 88.500 đô la ~ đến 128.000 đô la.

Nói cách khác, cuộc sống của bạn sẽ được cải thiện đáng kể khi mức chi tiêu trở nên thoải mái hơn cũng như việc bớt phải bận tâm về gánh nặng tiền bạc.

5. Bạn có thể làm gần như mọi thứ!

Kỹ năng mã hóa cho phép xây dựng các trang web và ứng dụng bạn cần để hoàn thành công việc mà không cần phải dựa vào những người khác. Trong một thế giới kinh doanh nơi các trang web và ứng dụng là cực kì quan trọng thì khả năng để làm những việc này cho chính bạn sẽ giúp tăng năng suất và hiệu quả trong công việc.

Bạn có thể tự tạo nội dung của riêng mình trong HTML để mọi thứ đều theo đúng như ý muốn. Và bạn cũng sẽ không phải chờ hỗ trợ kỹ thuật để giúp điều hành blog hoặc trang web hay email. Mọi thứ sẽ được tạo từ bởi chính bạn.

6. Tư duy sáng tạo

Tư duy sáng tạo là một kỹ năng quan trọng đối với bất kỳ nghề nào, đặc biệt là trong lĩnh vực công nghệ. Code chính là ngôn ngữ của sự sáng tạo của chính bạn. Vì vậy, việc học cách viết code sẽ không chỉ mang lại những lợi ích liên quan trực tiếp đến kỹ năng lập trình mà nó còn giúp bạn trau dồi tư duy logic và đưa bạn đến một cấp độ giải quyết vấn đề hoàn toàn mới.

7. Làm chủ robot

Khi automation tiếp tục phát triển và thay thế dần cho lực lượng lao động, nhiều công việc cũng sẽ bắt đầu… tuyển robot vào làm. Một điều chắc chắn là con người vẫn sẽ cần thiết để lập trình và giám sát các hệ thống tự động.

Nói cách khác, vị trí của bạn sẽ được cải thiện và nhảy vọt từ những người làm công thành những nhà quản lí cấp cao.

Vậy thì còn chần chừ gì nữa, hãy học lập trình ngay hôm nay!

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

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

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

Rate Limiting with Go and Redis

Rate Limiting with Go and Redis

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

Hế nhô các bạn, hôm nay mình xin được trình bày một giải pháp đơn giản để hạn chế spam connection tới server khiến server mất tài nguyên để xử lí.

Mình sẽ dùng Redis để cache số request mà client đã thực hiện đến server, và dựa vào IP để xác minh client. Xác minh theo IP thì sẽ dẫn dến 1 hậu quả là sẽ vô tình từ chối connection đến từ các client khác sử dụng chung một network với client đó.
Việc chọn thứ gì để phân biệt client thì đó là do các bạn lựa chọn nhưng trong bài này mình sẽ dựa vào IP để phân biệt người dùng 😀

  Generate fake UUID cực kì đơn giản

  Áp dụng Rate Limiting vào hệ thống như thế nào?

Trước hết Redis là một loại dữ diệu được lưu trữ có cấu trúc được lưu trong ram, nó được lưu trong Ram nên các thao tác đọc/ghi sẽ rất nhanh, ngoài ra nó có hỗ trợ back up xuống/ restore từ ổ cứng.

Để chạy Redis thì mình sẽ chạy Redis trong docker container vì việc này rất đơn giản chỉ với hai command bạn đã có server redis. Rất nhanh để test.

  • RUN docker pull redis
  • RUN sudo docker run --name my-redis -p 6379:6379 -d redis

Vậy là chúng ta đã có 1 server Redis đang lắng nghe trên cổng : 6379

Mình thường dùng Gin Framework để viết Web App trong Go, lí do thì vì mình thấy hỗ trợ khá tốt những thứ mình cần như, BindQuery, Parse Form Data hỗ trợ MiddleWare và cú pháp rất thân thiện

Rate Limiting with Go and Redis

Hình trên mình có 1 middleware tên là “useRateLimit” nhận vào 2 tham số là “rateLimit” và “second” ở đây mình muốn trong “second” seconds thì giới nhận chỉ nhận “rateLimit” request và nếu số request vượt sẽ bị từ chối xử lí.

Với Redis mình sử dụng package này “github.com/go-redis/redis” được khá nhiều sao và hỗ trợ gần như đầy đủ.

Ở phần khởi tạo redisClient mình set giá trị cho field “PoolTimeOut” = 60s là để giới hạn khoảng thời gian từ lúc redisClient khởi chạy lệnh tới redis-server nếu trong 60s đó nếu lệnh chưa thực hiện được thì sẽ được huỷ. Các bạn có thể set sao cho phù hợp.

Xem MiddleWare có gì nào ^-^

Rate Limiting with Go and Redis

Ở đây useRateLimit sẽ trả một một “gin.HandlerFunc” ở function handler chúng ta sẽ lấy địa chỉ IP của client và tiến hành thực hiện function “incRequestCount” để ghi nhận request của client.

Chúng ta sẽ làm như Follow chart dưới đây.

Rate Limiting with Go and Redis

Rate limiting Follow Chart

Mình sử dụng Lệnh “SetNX” , “Incr” và dùng trong một Transaction để bảo đảm tính sẽ chỉ có duy nhất một bộ thao tác thay đổi gía trị với một key tại một thời điểm và mọi bộ thao tác với giá trị của key sẽ được thực thi sau thời điểm đó.

Rate Limiting with Go and Redis

Function sẽ bắt dầu một Transaction bằng cách theo giõi biến Key nếu không có bất cứ thao tác nào khác với biến thì nó sẽ lock tạm thời không cho các Transaction khác thao tác với biến cho đến khi function thực hiện xong.

Lệnh “SetNX” , set một giá trị cho một biến đó nếu nó chưa có sẵn trong database, và sẽ hết hạn trong EX second (không bắt buộc)

Lệnh “Incr” sẽ tăng giá trị biến đó lên 1 đơn vị

Áp dụng cả hai thì chúng ta sẽ đếm được số request liên tục và tăng giá trị cho tới khi nào gía trị đó hết hạn và được khởi tạo lại.

Sau khi tăng số lần client request nếu giá trị đó vượt qua “rateLimit” đã được quy ước thì fucntion sẽ trả về một lỗi vượt quá giới hạn request nếu không thì sẽ không trả về lỗi.

Ở function “useRateLimit” chúng ta nhận được kết qủa mà quá trình tăng số request trả về, và giá trị là lỗi thì chúng ta sẽ từ chối kết nối bằng Status 403 và nếu không thì ta sẽ cho server tiếp tục xử lí Request.

Vậy là xong rồi chỉ với vài dòng code đơn giản ta đã có thể chặn được số lượng lớn spam request. Để cải tiến thì sẽ cần phải làm nhiều, ví dụ như là BLock luôn IP trong khoảng bao lâu đó, hay để không block oan uổng ngừời cùng chung network thì sẽ phải tìm thêm cách để phân biệt client, nhưng trong khuổn khổ bài viết mình sẽ dừng lại ở đây.

Source code các ban có thể có thể xem và góp ý giúp mình tại đây

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

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

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

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

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

Bạn có thể gặp Authentication popup này khi thực hiện truy cập vào một trang ứng dụng hay địa chỉ nào đó, ở đây bạn cần phải nhập tên đăng nhập và mật khẩu đúng để có thể thực hiện tiếp các thao tác, tác vụ tiếp theo trên trang đó. Loại popup này không phải là popup thông thường được sinh ra từ java-script của ứng dụng đó, mà là một loại hộp thoại của trình duyệt, do đó mà Selenium không thể thực hiện với cách mà chúng ta vẫn làm là sử dụng sendKey() được.

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Để giải quyết vấn đề này, chúng ta có hai cách như dưới đây là những cách mà mình tổng hợp được, các bạn có thể tham khảo và nếu có thêm cách nào khác thì vui lòng chia sẻ cho mình và các bạn khác nữa nhé! 😀

  JavaScript Executor trong Selenium Webdriver
  Selenium là gì? Giới thiệu chi tiết về Selenium Automation Testing

1. Sử dụng Selenium webdriver

Cách đơn giản nhất là truyền trực tiếp username và password cùng với đường dẫn trang web yêu cầu theo cú pháp:

http://Username:Password@SiteURL

Mình có ví dụ:

http://msanh:12121221@www.thichanbanhcuon.com.vn

Trong đó:

msanh là username của mình

12121221 là mật khẩu

Và trang web đăng nhập của mình ở đây là http://www.thichanbanhcuon.com.vn

Code thì sẽ như thế này:

String URL = "http://" + msanh + ":" + 12121221 + "@" + www.thichanbanhcuon.com.vn;
driver.get(URL);
Alert alert = driver.switchTo().alert();
alert.accept();

2. Sử dụng AutoIT

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Bằng cách sử dụng AutoIT ta cũng có thể xử lý được với trường hợp popup này như sau.

Nếu bạn chưa cài đặt AutoIT thì tham khảo qua các bước mình đã đề cập ở bài viết này nhé!

Nếu đã sẵn sàng rồi, thì chúng ta bắt đầu tạo một AutoIT script có nội dung cú pháp như dưới đây:

; To pass user name and password
WinWaitActive("Windows Security")
Send("admin")
Send("{TAB}")
Send("admin")
Send("{ENTER}")

Hoặc có thể viết gộp như này cũng được:

WinWaitActivate("Authentication Required","")
Send("rajkumar{TAB}myPassword{ENTER}")

Lưu lại và sau đó compile AutoIT script file này thành 1 file exe, lấy đường dẫn của file exe này rồi đưa vào code thôi:

public static void login(String email, String password) throws Exception{
driver.get(URL);

//Passing the AutoIt Script here
Runtime.getRuntime().exec("D:\\Selenium\\AutoItFiles\\ExecutableFiles\\HandleAuth.exe");
driver.findElement
loginpage.setEmail(email);
loginpage.setPassword(password);
loginpage.clickOnLogin();
}

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

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

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

Ý nghĩa đằng sau công cụ Insights Tool của Ahamove

dữ liệu khách hàng
Dữ liệu khách hàng phục vụ như thế nào cho việc tăng doanh thu của merchants?

Tổng hợp dữ liệu khách hàng và phát triển một Insights Tool có vai trò quan trọng như thế nào đối với khách hàng (merchants) và đối với doanh nghiệp B2B như Ahamove? Cùng tìm hiểu về ý nghĩa của công cụ / công nghệ này đối với mục tiêu kinh doanh qua topic “How We Get Powerful Insights From Aggregating Consumer Data”, trình bày bởi anh Phó Hoàng Hướng – Head of Business Intelligence @Ahamove.

dữ liệu khách hàng
Consumer data và các insights tools

Về Ahamove

Ahamove là công ty hoạt động trong lĩnh vực giao hàng, một on-demand platform on logistics service. Một user có nhu cầu giao hàng sẽ truy cập vào app Ahamove để tạo giao dịch. Từ đây sẽ phát sinh một demand, tài xế đóng vai trò là supply sẽ đến vị trí user lấy hàng và giao đến người nhận cuối cùng.

Câu hỏi đặt ra là customer của mình hiện tại là ai và họ đang có nhu cầu gì? Để từ đó, công ty có những hướng sử dụng data phù hợp hơn trong việc phục vụ họ.

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết
  5 nguyên nhân chính vì sao các nhà khoa học dữ liệu rời bỏ công việc của mình

Khách hàng của Ahamove là ai?

Có 80% khách hàng của Ahamove hiện tại là các merchants – những hộ kinh doanh vừa và nhỏ. Do đó, các mặt hàng kinh doanh của họ thường là thức ăn nhanh, mỹ phẩm, quần áo,… Vậy nên, vấn đề cần giải quyết của Ahamove là bên cạnh việc tìm kiếm một đối tác giao hàng còn phải làm sao để đáp ứng được mong muốn của các merchants.

Để làm được điều đó, chúng tôi sẽ tiến hành các dự án, nghiên cứu, research để mang đến cho các merchants những thông tin bổ ích và phù hợp nhất mà họ có thể tham khảo và sử dụng.

Vậy merchant cần những gì? Mình sẽ phải tìm ra xem người tiêu thụ của họ đang ở đâu? Nhìn chung, các merchant sẽ mong muốn tìm kiếm người tiêu dùng ở khắp mọi nơi vậy nên họ sẵn sàng chi rất nhiều tiền để tìm được các khách hàng thực thụ của mình. Điển hình là ở lĩnh vực Digital Marketing, họ sẵn sàng đầu tư tiền bạc để quảng cáo trên Facebook, Google, Youtube. Hoặc trong ngành F&B, merchants sẵn sàng lấy số tiền lời của mình để cho các app giao hàng nhằm có được nhiều đơn hàng hơn từ các nguồn này.

Làm thế nào để tổng hợp những data hiện tại và đưa ra các insights tool?

Ahamove sẽ kết hợp với các data public để đưa ra các insights cho merchant của mình, giúp giải quyết nhu cầu về việc muốn tìm hiểu xem, khách hàng của merchant đang ở đâu. Để làm được điều này, chúng tôi thường chia thành 2 hướng chính:

  1. Thứ nhất là tập trung vào mặt hàng họ đang kinh doanh.
  2. Thứ hai là tập trung vào vị trí khách hàng của merchant và những gì mà họ đang tiêu thụ.
dữ liệu khách hàng
Tập trung vào sản phẩm và mục đích tiêu thụ giúp giải quyết được vấn đề

Trending

Thông qua trending, chúng ta có thể thấy được xu hướng cũng như sự thay đổi của các mặt hàng: xem nó đang tăng, giảm hay giữ ở mức trung bình, thông qua các ngày, tuần, tháng như thế nào. Khi phân tích, mình có thể nhận ra một số insights khá bổ ích như trong khoảng thời gian từ tháng 8 đến tháng 9, những mặt hàng về đồng hồ, thời trang, giày dép,… có xu hướng tăng, khác hoàn toàn so với những năm trước.

Khi phân tích cụ thể vấn đề, mình nhận ra là do nó chịu ảnh hưởng từ nghị định 98 của chính phủ, quy định sẽ phạt những hộ kinh doanh kinh doanh các mặt hàng không chính ngạch. Lúc này các merchant nhập hàng thông qua đường tiểu ngạch bắt đầu xả kho, bán nhiều hơn vô tình tạo ra nhu cầu cao hơn vì giá rẻ.

Category Analyst

Khi chọn một mặt hàng, chúng ta sẽ xem được các heat map của consumer đang tập trung ở đâu. Một merchant có thể bán cross-sale nhiều mặt hàng khác nhau, họ có thể quan sát một cách tổng quan hơn xem khách hàng đang ở đâu.

Một điểm nữa là nếu chúng ta chọn quá nhiều mặt hàng overlap với nhau thì kết quả sẽ cho ra một thị trường khá phân tán, không thể cho thấy một kết quả mang tính tổng hợp, phản ánh được bản chất vấn đề.

Khi nghiên cứu, mình phát hiện ra một vấn đề, đó là chúng ta hay mặc định một merchant sẽ chỉ bán một ngành hàng, chẳng hạn như F&B thì chỉ bán thiên về các sản phẩm thuộc ngành F&B nhưng hoàn toàn không phải vậy.

Các merchant thường khá nhạy cảm với thị trường và luôn biết cách nắm bắt các trends. Họ có thể bán rất nhiều các mặt hàng không liên quan đến nhau miễn là nó đáp ứng được nhu cầu thị trường. Nhờ việc tận dụng tính năng category analyst này, họ có thể tối ưu hóa lợi nhuận và tận dụng nguồn dữ liệu khách hàng của họ để kinh doanh tốt hơn.

Xem thêm Big Data là gì? Tất tần tật về Big Data

Location Analyst

Khi chọn một vị trí, insights tool sẽ đưa ra thông tin ngành hàng nào đang chiếm ưu thế hơn so với ngành hàng khác ở cùng vị trí đó. Qua đó các merchant có thể tìm được những địa điểm kinh doanh thích hợp hơn. Họ có thể tối ưu hóa lợi nhuận bằng cách chuyển đến những vị trí gần hơn chẳng hạn.

Một điểm khá hay nữa là chúng ta có thể phân tích được sự khác nhau giữa hai địa điểm, phân tích xem ở khu vực nào người tiêu dùng sẽ mua nhiều mặt hàng gì.

Từ những thông tin và dữ liệu khách hàng đang có, chúng ta có thể tổng hợp và đưa ra các insights khá quan trọng, để từ đó phân tích xem đâu là vấn đề mà người dùng của merchant đang cần và họ nên làm gì để tối ưu hóa lợi nhuận của mình.

Bài viết được trích dẫn từ phần trình bày của anh Phó Hoàng Hướng tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức


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

Xem thêm các việc làm Developer hấp dẫn tại TopDev

DNS là gì? Tại sao chúng ta lại bị nhà mạng chặn khi vào web không lành mạnh?

DNS là gì ? tại sao chúng ta lại bị nhà mạng chặn khi vào web không lành mạnh.

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

Hế nhô các bạn, hôm nay mình vừa tìm hiểu về DNS và muốn chia sẻ với các bạn những điều mình vừa mới biết.

Chắc hẳn các bạn ai cũng đã từng sử dụng trình duyệt, nhập địa chỉ trên thanh địa chỉ, cuối cùng nhấn enter rồi cả một thế giới mới hiện trước mắt chúng ta. Rồi chắc các bạn đã nhìn thấy ai đó gõ một cụm 4 số cách nhau bởi dấu “.” xong enter cái bụp rồi cũng hiện ta những gì bạn đã làm với những con chữ kia chứ 😀

  System Design Cơ Bản: Domain Name System (DNS)

  3 cách xóa phần tử bị duplicate trong mảng

Khi bạn vào một trang Web thì thực chất bạn đang nhờ trình tuyệt tìm địa chỉ của website đó, cái mà có 4 số cách nhau bởi dấu “.” ý. Trình duyệt sẽ làm những việc gì đó để tìm ra cái địa chỉ 4 số đó. Và cái 4 chữ số đó người ta gọi là IP còn cụm chữ kia người ta gọi là Tên Miền (Domain trong tiếng anh)

IP và Domain luôn song hành với nhau, việc nhớ Domain sẽ rất dễ so với việc nhớ mấy con số kia, từ IP bạn sẽ truy cập vào được tài nguyên của máy chủ nhưng khi bạn có trong tay Domain thì chưa chắc bạn có thể tìm được máy chủ nhà người ta.

Mỗi Domain được một cấp bởi một tổ chức quản lí Domain và tổ chức đó có sẵn công cụ để giúp ta tìm được địa chỉ IP máy chủ ứng với tên miền đó. Cái đó được gọi là DNS viết đầy đủ là Domain Name System dịch ra tiếng việt là Hệ thống phân giải tên miền.

Khi bạn truy cập vào một Domain, việc đầu tiên trình duyệt sẽ làm là nhờ các DNS server tìm kiếm địa chỉ IP ứng với tên miền đó. Mặc định nếu bạn không chỉ định DSN server thì bạn sẽ dùng DSN server của Nhà cung cấp dịch vụ mạng cho bạn, cái tổ chức mà hàng tháng cứ đến cuối tháng là thu tiền mạng, hay phải goị điện thoại chửi mỗi khi nó bóp băng thông khiến mạng như rùa ý haha.

Chính vì việc bạn sử dụng DNS server của nhà mạng nên họ sẽ ngăn chặn việc bạn truy cập vào các trang Web không lành mạnh. Họ đơn giản chỉ cần không trả về cái địa chỉ IP đó.

Vậy để muốn truy cập các trang web đó bạn cần phải sử dụng DNS server khác, của Google chẳng hạn, google sẽ không chặn bạn đâu.

Và để sử dụng DNS server của ai đó các bạn hãy xem qua bài viết này .

Vậy nếu có nhiều DNS server và nhiều nhà cung cấp Domain thì làm sao để biết Domain nào là của tổ chức nào là làm sao để các tổ chức có thể trao đổi thông tin cho nhau.

Để giải quyết vấn đề này sẽ có một tổ chức đứng chịu trách nhiệm điều hành, tổ chức đó có tên là “Internet Corporation for Assigned Names and Numbers”

Họ sẽ điều hành hệ thống “Root Domain”, chia tên miền thành các kiểu có dạng “.com, .vn, .net, .org”. Cái đó gọi hệ thống “Top Domain” và cứ như vậy sẽ dựa từ phân cấp ra thành nhiều bậc thấp hơn.

Vậy khi bạn mua một tên mình của một nhà cung cấp nào đó. Nếu bạn cung cấp địa chỉ IP ứng với tên miền đó, nhà cung cấp sẽ đồng bộ nó lên hệ thống Root Domain và vì thế các DSN server khác sẽ dễ dàng tìm được địa chỉ IP đó.

Đến đây là hết rồi, để tìm hiểu sâu hơn các bạn có thể vào đây để tham khảo.

Bye bye. ^_^

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

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

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

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

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

Chào các bạn, chúng ta đều biết rằng việc học lập trình vốn không phải là dễ dàng và không phải ai cũng có đủ kiên trì để học và học tốt được.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

Với các bạn sinh viên học lập trình nói riêng và những người học lập trình nói chung thì chắc hẳn đều đã nghe đến khái niệm “Cấu trúc dữ liệu và giải thuật”.

Và chúng ta cũng được khuyên là nên học, nên tìm hiểu về những kiến thức này. Vậy tại sao lập trình viên lại nên học cấu trúc dữ liệu và giải thuật thì mình sẽ cùng các bạn điểm qua một vài lý do trong bài viết này.

  Seminar môn Cấu trúc dữ liệu và giải thuật

  12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024

#1. Đó là kiến thức nền

Chắc hẳn các bạn ở đây từng được nhiều người khuyên là học gì thì học, nhưng phải nắm chắc kiến thức nền, kiến thức cơ bản rồi phải không ạ !

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Cấu trúc dữ liệu và giải thuật là kiến thức nền rất quan trọng

Vậy như thế nào là kiến thức nền, kiến thức cơ bản? Và tại sao chúng lại quan trọng đến vậy?

Thứ nhất, đối với việc học lập trình nói chung thì kiến thức cơ bản là các kiến thức liên quan đến kiểu dữ liệu, câu lệnh điều khiển, câu lệnh điều kiện… Những kiến thức này không của riêng ngôn ngữ lập trình nào cả.

Cấu trúc dữ liệu và giải thuật cũng vậy. Đó là các kiến thức liên quan đến cách tổ chức giữa dữ liệu và các giải thuật trên từng tổ chức dữ liệu đó. Nó là chung cho các ngôn ngữ lập trình.

Vậy còn câu hỏi tại sao nó lại quan trọng thì sao? Vâng, các bạn biết đó, một chương trình máy tính muốn chạy được phải có dữ liệu và các thuật toán.

Việc đảm bảo được dữ liệu tổ chức theo cấu trúc phù hợp và được thực thi với một thuật toán hợp lý sẽ tăng hiệu suất lên rất nhiều.

#2. Giúp rèn luyện khả năng tư duy

Như mình đã từng đề cập nhiều lần trong các bài viết trước về khái niệm tư duy trong học lập trình – đó là tư duy giải quyết vấn đề.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Cấu trúc dữ liệu và giải thuật là công cụ hữu hiệu trong việc rèn tư duy

Các vấn đề càng mới, càng khó thì càng mang tính rèn luyện cao. Với môn học cấu trúc dữ liệu và giải thuật, chúng ta sẽ vận dụng những kiến thức về cấu trúc dữ liệu (mảng, ngăn xếp, hàng đợi…) và các thuật toán (quy nạp, quay lui, tìm kiếm, sắp xếp, quy hoạch động…) để giải quyết các vấn đề đó sao cho tối ưu nhất.

Không chỉ tối ưu về mặt thời gian mà khi chương trình viết ra phải tối ưu cả về bộ nhớ và không gian lưu trữ. Đó chính là cái khó của môn học này.

Đôi khi cùng một vấn đề nhưng lại có nhiều cách giải quyết khác nhau, bạn buộc phải tìm xem đâu là cách giải quyết tối ưu nhất.

#3. Là một công cụ đánh giá hiệu quả

Theo như mình biết thì đây là một trong những môn học mà số lượng sinh viên có tỷ lệ bị trượt nhiều nhất.

Hồi học môn này, mình may mắn không bị trượt nhưng điểm số cũng không quá cao mặc dù mình đã rất chăm chỉ.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Các sinh viên nhận giải trong kỳ thi lập trình giải thuật

Vậy tại sao nó lại là một công cụ đánh giá hiệu quả? Đơn giản vì nó khó, không phải bạn cứ chăm chỉ là được, cũng không phải cứ may mắn là được, lại càng không phải lười học cũng qua.

Nhiều trường đại học chọn môn này là một trong những môn học mũi nhọn trong chương trình đào tạo. Với phương châm đào tạo ra các kỹ sư giỏi có khả năng giải quyết vấn đề tốt và nhanh thì đây chính là một công cụ rất hữu ích.

Chắc hẳn bạn từng nghe về các kỳ thi lập trình như ACM, ICPC… và thấy được các bạn có giải cao thường được các tập đoàn lớn trao học bổng hoặc tuyển thẳng vào làm.

Có thể nói kiến thức về cấu trúc dữ liệu và giải thuật là một trong những kiến thức nền, nó mang tính đánh giá khá cao.

#4. Có nhiều ứng dụng trong thực tế

Hồi mới học môn này mình thấy nó khó quá, lại nghe mấy ông anh review là học ra cũng chẳng dùng đến nên cũng không quá đào sâu.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Nhiều thuật toán tìm kiếm ứng dụng trong việc tìm đường đi mê cung

Sau một thời gian đi làm thì mấy thấy họ nói đúng nhưng chưa đủ. Đúng là ở chỗ các kiến thức này ít khi được áp dụng một cách trực tiếp, nhưng chưa đúng ở chỗ là họ bảo chẳng bao giờ áp dụng.

Mình lấy ví dụ hơi chuyên môn một chút đó là: Hồi mới đi làm mình hay code 2 vòng for lồng nhau dẫn đến nhiều trường hợp số lượng bản ghi lớn => chương trình sẽ bị chậm.

Sau này mình biết đến việc dùng Map (một cấu trúc dữ liệu dạng key-value) thay cho vòng for bên trong sẽ giảm mức độ phức tạp và tiết kiệm thời gian hơn rất nhiều, hơn nữa nó cũng làm tăng hiệu năng của ứng dụng nữa.

Ngoài ra, khi bạn làm thực tế nhiều khi bạn chỉ việc gọi hàm (API) và truyền tham số mà không để ý bên trong hàm đó hoạt động như thế nào.

Ví dụ về hàm binarySearch() trong Java chẳng hạn, nếu bạn không học về thuật toán tìm kiếm nhị phân thì bạn làm sao mà hiểu được ý nghĩa bên trong hàm này. Có đúng không ạ!

Đôi khi bạn không nhận ra ứng dụng của môn học cấu trúc dữ liệu này, nhưng thực ra là bạn vẫn đang làm việc với chúng hàng ngày đó.

#5. Kết luận

Vậy là trong bài viết này mình đã cùng với các bạn điểm qua một vài lý do để các bạn lập trình viên “nên” học môn cấu trúc dữ liệu và giải thuật để phục vụ cho công việc của các bạn sau này.

Đây thực sự là một môn học nền tảng giúp bạn rèn luyện tư duy, có thể không cần phải quá giỏi nhưng mình khuyên các bạn đã, đang và sắp học lập trình thì nên học môn này nhé. Đặc biệt là các bạn “tay ngang” có ý định chuyển qua học lập trình.

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

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

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

Các chức năng cần tìm hiểu khi lựa chọn công cụ tự động cho kiểm thử di động

Các chức năng cần tìm hiểu khi lựa chọn công cụ tự động cho kiểm thử di động

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

Hiện nay, với sự phát triển chóng mặt của công nghệ di động, kéo theo sự phát triển mạnh mẽ của ngành kiểm thử di động. Từ đó, trên thị trường xuất hiện ngày càng nhiều công cụ hỗ trợ cho kỹ sư kiểm thử trong lĩnh vực kiểm thử tự động. Lựa chọn chính xác công cụ hỗ trợ tốt nhất cho kiểm thử ứng dụng sẽ giúp chúng ta tiết kiệm được nhiều thời gian, công sức và cả tiền bạc. Dưới đây là vài chức năng mà mình, theo kinh nghiệm cá nhân, nghĩ là cần được xem xét khi lựa chọn công cụ tự động cho kiểm thử di động.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  7 lãng phí trong kiểm thử phần mềm

Hệ điều hành: Hiện tại, có khá nhiều hệ điều hành trong nền công nghiệp di động, từ iOS đến Android, rồi Windows Phone hay BlackBerry/Firefox… Vậy nên, nếu ứng dụng cần kiểm thử của chúng ta được chạy trên nhiều hệ điều hành, hay trong tương lai sẽ hỗ trợ nhiều hệ điều hành khác nhau thì việc lựa chọn một công cụ kiểm thử tự động có khả năng hoạt động trên nhiều nền tảng sẽ giúp tiết kiệm nhiều công sức và tiền bạc.

Loại chương trình: Về lý thuyết, ứng dụng di động được chia làm ba loại – Native, Web và Hybrid. Đôi khi, công cụ kiểm thử không hỗ trợ thực thi kiểm thử trên ứng dụng Native. Do đó, chúng ta cần xác định rõ ứng dụng của chúng ta là dạng nào để có thể lựa chọn công cụ kiểm thử một cách chính xác.

Ngôn ngữ lập trình: Nếu nhóm chúng ta chuyên về Java thì không thể lựa chọn một công cụ chỉ hỗ trợ C#, phải không 🙂

Yêu cầu mã nguồn của chương trình: Một số công cụ kiểm thử yêu cầu được quyền truy cập mã nguồn của ứng dụng để xác định được các đối tượng UI. Một số khác thì không cần. Khi làm outsource, khả năng tiếp cận mã nguồn của đội ngũ kiểm thử sẽ bị hạn chế, vậy nên đây cũng là một chức năng mà chúng ta cần phải quan tâm khi lựa chọn.

Khả năng Record/Playback: Mặc dù sử dụng Record/Playback sẽ cho chúng ta một đoạn mã không tốt như tự viết code. Nhưng, trong trường hợp mới làm quen với công cụ hoặc chúng ta cần nhiều đoạn mã kiểm thử một cách nhanh chóng thì Record/Playback là một chức năng rất mạnh mà công cụ kiềm thử tự động mang đến.

Thiết bị thật hay giả lập: Nếu công cụ chỉ cho phép thực thi kiểm thử trên thiết bị thật thì sẽ làm tăng chi phí kiểm thử lên rất nhiều. Nhưng nếu công cụ chỉ cho phép chạy trên môi trường giả lập, chúng ta không thể mô phỏng một số trường hợp đặc biệt mà chỉ có thể làm với thiết bị thật.

Thiết bị thật trên Cloud: Hiện nay, vì chi phí để có thiết bị thật khá cao, nên thị trường xuất hiện một dạng cho thuê thiết bị thật và chúng ta có thể truy cập thông qua hệ thống mạng Internet. Sử dụng phương pháp này, chúng ta có thể giảm bớt chi phí để có thể kiểm thử ứng dụng di động trên thiết bị thật.

Đa chạm và dấu hiệu: Khác với các ứng dụng Windows, trên di động, hệ thống đa chạm và dấu hiệu (gesture) là một chức năng không thể thiếu. Do đó, yêu cầu công cụ kiểm thử có khả năng giả lập được hành động này của người dùng là một yêu cầu không có gì quá đáng.

Xác nhận đối tượng: Trong kiểm thử tự động, khả năng xác nhận các đối tượng UI là một thành phần quan trọng bậc nhất. Nếu có thể xác định các đối tượng UI một cách chính xác thông qua các thuộc tính duy nhất và ổn định thì chúng ta sẽ giảm bớt thời gian chỉnh sửa các đoạn mã giữa những lần thay đổi/nâng cấp ứng dụng.

Tương tác với bên thứ ba: Trong quá trình kiểm thử, tự động không phải là tất cả. Chúng ta còn cần phải quan tâm đến việc lưu trữ mã nguồn, kết quả thực thi, hệ thống kịch bản kiểm thử và cả hệ thống quản lý bug nữa. Và hầu hết các vấn đề này đều được cung cấp từ một hệ thống thứ ba. Sẽ thật tuyệt nếu công cụ kiểm thử mà chúng ta lựa chọn có thể tương tác với các hệ thống như vậy.

Báo cáo và nhật ký: Thông thường, chúng ta quá chú ý vào việc viết mã nguồn cho các kịch bản kiểm thử, thực thi các đoạn mã nhưng lại không quan tâm đầy đủ đến một bước cực kỳ quan trọng trong kiểm thử tự động, phân tích kết quả thực thi. Một công cụ mà bản báo cáo/nhật ký thực thi quá phức tạp hoặc thiếu chi tiết để có thể phân tích kết quả thực thi thì không phải là một công cụ kiểm thử tự động tốt.

Mã nguồn mở hay bản thương mại: Cuối cùng, quan trọng nhất – Tiền bạc 🙂 Vấn đề này mình xin phép không bàn sâu nha!

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

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

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

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Hôm nay mình thấy một team nói với nhau về Progressive web app mà không phân biệt nó khác Single page app đến mức nào? Và công nghệ chạy background ra sao! Chỉ biết là nó dùng ajax, javascript thư viện của thằng này thằng kia nên nó là Progressive web app đó, chứ hỏng có hiểu là cơ chế hoạt động nó ra sao hết thấy tội mà thôi cũng kệ… luôn chứ sao 😀

  3 bước tối ưu hiệu năng React App bằng các API mới của React
  5 app dù bị đánh giá thấp nhưng không nên bỏ qua

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Như hình mô tả bên trên của mình thì chắc cũng hiểu sơ sơ tốc độ load của từng loại khái niệm về web app, single page app, progressive web app!

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Web app

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Cái này chắc mọi người ai cũng từng nghe web động (dynamic web app) cơ chế hoạt động của web app từ thời sơ khai cho đến nay cũng không thay đổi nhiều với phương thức truyền dữ liệu là Post form hoặc reload trang để Get param từ url.

  • Browser (Client site):
    • Yêu cầu hỗ trợ technique không cần nhiều!
    • Hoạt động: mỗi lần gửi request thì browser phải đợi response, load lại rất nhiều thông tin từ server site như gói dữ liệu html, hình ảnh, css, js,…
  • Web server (Server site): 
    • Mỗi lần nhận response thì Server phải xử lý rất nhiều từ data, bussiness logic và cuối cùng tạo ra view và gửi string html rất nặng về client site.

Bất lợi khá nhiều:

  1. Tổng lại là thời gian load để xử lý từ 2 phía client và server rất nhiều!
  2. Server site xử lý khá nhiều vì phải generate view cho client.
  3. Việc develop tốn nhiều công sức đồi hỏi client site và server site phải có sự liên kết!

Single Page App (SPA)

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Vì sự bất lợi của Web app, Single page app ra đời để cải thiện các điểm bất lợi còn tồn động và single page app xử lý dựa trên nền các library, framework java script và phương thức truyền dữ liệu chính là dùng ajax. Ai dùng Angular (Framework) hay React (Library) sẽ hiểu về nó 😛

  • Browser (Client site):
    • Yêu cầu technique: phải hỗ trợ java script, các library java script dùng ajax là chính.
    • Hoạt động: mỗi lần load page lần đầu khá lâu, vì load master page và khởi tạo các Object model (lưu trữ data vào object java script). Nhưng sẽ không tốn thời gian load lại khi chuyển sang các page khác vì mọi thứ đều được các library hoặc framework sẽ render thành view, còn data sẽ được truyền thông qua ajax và được lưu vào các object!
  • Web server (Server site): 
    • Mỗi lần nhận response thì Server chỉ xử lý data, bussiness logic và gửi data theo kiểu json object dữ liệu rất nhẹ về client site.

Thuận lợi:

  1. Tổng lại là thời gian load để xử lý từ 2 phía client và server giảm rất nhiều!
  2. Server site xử lý và trả về gói dự liệu nhẹ hơn nhiều.
  3. Việc develop client site và server site có thể tách rời riêng biệt rõ ràng hơn!
  4. Việc chuyển trang trên single page và không reload page nên thấy rất nhanh.

Bất lợi:

  1. Developer phải có kiến thức về java script và các library java script render (React, Angular,…) thật kỹ để phát triển front end.
  2. Browser phải hỗ trợ các version java script mới để các library hay framework java script vận hành tốt.
  3. Khi reload page thời gian khởi tạo từ phía client vẫn tốn nhiều thời gian.

Progressive Web App (PWA)

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Để tối ưu hơn tốc độ load từ Single page app, Progressive web app ra đời để tận dụng các technique từ Browser đã hỗ trợ Java script, Cache, DB local và phương thức truyền dữ liệu chính là Service Worker (Plugin của browser, device dùng thông qua java script và là trái tim của PWA).

  • Browser (Client site):
    • Yêu cầu technique: phải hỗ trợ Java script, Cache, DB local và Service Worker là phương thức chính để nhận data, lưu trữ vào cache hoặc DB.
    • Hoạt động: Mỗi lần đầu load page thời gian load master page và khởi tạo Service Worker không nhiều như SPA. Theo SPA mất 10 giây thì PWA chỉ mất 1 giây. Những lân load page lại thì SPA vẫn tốn 5-10 giây để load thì Service Worker chỉ tốn chưa đến 1 giây.
  • Web server (Server site): 
    • Mỗi lần nhận response thì Server chỉ xử lý data, bussiness logic và gửi data theo kiểu json object object, dữ liệu rất nhẹ.

Thuận lợi:

  1. Tổng lại là thời gian load để xử lý từ 2 phía client và server giảm rất nhiều!
  2. Server site xử lý và trả về gói dự liệu nhẹ hơn nhiều.
  3. Việc develop client site và server site có thể tách rời riêng biệt rõ ràng hơn!
  4. Việc reload trang không còn là vấn đề như SPA.
  5. Trang đã load lần đầu thì các lần sau có thể chạy offline vì mọi thứ đều store dưới local của browser.

Bất lợi:

  1. Developer phải có kiến thức về java script và các library java script render (React, Vue,…) thật kỹ để phát triển front end.
  2. Browser phải dùng version mới để hỗ trợ các version java script để các library hay framework java script sử dụng service worker.
  3. Domain phải dùng HTTPS để bảo mật khi truyền dữ liệu.

Trong tương lai mình thấy được Accelerated Mobile Pages (AMP) sẽ kết hợp với PWA để tạo ra đột phá về trải nghiệm người dùng tốt hơn về thời gian load có thể là tốn zero giây cho first load 😀

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Sự kiện trực tuyến: “Tuần lễ Số” Digital Weeks Southeast Asia sẽ có mặt tại Việt Nam trong tháng 2/2021

Sự kiện online miễn phí dành cho tín đồ đam mê cloud và IT/ công nghệ Digital Week Southeast Asia 2021!

[English below]

W.Media đang tập hợp những người sáng giá nhất và nổi bật thuộc cộng đồng ASEAN trong một Hội nghị trực tuyến (Virtual Conference) kéo dài 4 ngày, bao gồm mọi thứ từ triển khai trung tâm dữ liệu đến ngân hàng kỹ thuật số. Từ ngày 23-26/2, mạng lưới với hơn 3.000 nhà lãnh đạo cấp cao về IT trên khắp các khu vực Philippines, Malaysia, Indonesia, Singapore, Việt Nam và Thái Lan sẽ được kết nối tại Digital Week Southeast Asia.

Digital week digital transformation

Tuần lễ kỹ thuật số (Digital Week) là điểm dừng chân đáng cân nhắc nhất của bạn để có cơ hội lắng nghe các chuyên gia chia sẻ từ khía cạnh Datacenter Deployment to Digital Banking. Các sessions đặc biệt nhất tại Việt Nam diễn ra vào ngày 26/2/2021 sẽ có sự góp mặt của các diễn giả tên tuổi đến từ Viettel, Đại học Quốc gia Hà Nội, Infinity Blockchain, Fortinet…

  Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

digital week: speakers and agenda

Nền tảng trực tuyến của W.Media là một trung tâm cộng đồng rộng lớn để bạn truy cập nhiều nội dung, kết nối và tương tác hiệu quả hơn bao giờ hết:

  • Phòng trò chuyện tương tác trong ngành
  • Trực tuyến – Live các phiên hỏi đáp diễn giả
  • Gọi video 1:1 giữa người tham dự
  • Giải thưởng và cuộc thi toàn hội nghị

Nhanh tay đăng ký ngay hôm nay: https://topdev.vn/s/XXsOSg3b.

digital week agenda day 4
Agenda sự kiện day 4 Vietnam

Calling all Cloud & IT enthusiasts!

Data is transforming Southeast Asia. With the rise of mobile technologies, increasing cloud migration and storage demands at an all-time high, it’s essential to stay up to date on the market’s latest developments and technologies.

W.Media is gathering ASEAN’s best and brightest for a 4-day virtual conference to cover everything from datacenter deployment to digital banking. From 23-26 February, network with 3000+ Senior IT Leaders across the Philippines, Malaysia, Indonesia, Singapore, Vietnam, and Thailand markets.

Digital Week is your one-stop shop to hear experts speak on everything from datacenter deployment to digital banking. Our special Vietnam session on 26th February 2021 will feature international keynote speakers from Viettel, Hanoi National University, Infinity Blockchain, Fortinet, and many more!

For a full list of our 50+ speakers, keep your slot here: https://topdev.vn/s/XXsOSg3b
Our virtual platform is a community hub for you to access more content and engagement than ever:

  • Interactive industry chat rooms
  • Live speaker Q&A sessions
  • 1-on-1 video calls between attendees
  • Conference-wide prizes and competitions