Home Blog Page 88

Học Haskell không phải trầm trồ – theo cách Pymi.vn

Học Haskell không phải trầm trồ - theo cách Pymi.vn

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

  • Cảnh báo: rất giống Python
  • Chú ý: không cần biết Python

Haskell (/ˈhæskəl/) – visub: ha-s-kồ – 1990 (lớn hơn Python 1 tuổi) Trang chủ: https://www.haskell.org/

Haskell

Haskell là ngôn ngữ functional (lập trình hàm), thuộc nhóm “pure” blah blah blah có thể bỏ qua và gõ cho đến cuối bài, work first, talk is cheap, later.

  Fix Lỗi "RDP Authentication Error Has Occurred – The Function Requested Is Not Supported"
  So sánh tốc độ List collection và HashSet collection trong C#

Cài đặt

Hướng dẫn trang chủ, hỗ trợ cả Windows

curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

enter enter enter … rồi mở terminal mới, gõ ghci.

ghci --version
The Glorious Glasgow Haskell Compilation System, version 8.10.5

Trên Ubuntu có thể dùng:

sudo apt-get update && sudo apt-get install -y haskell-stack

REPL

REPL – Read Eval Print Loop, là chương trình nhận code người dùng nhập vào (Read), chạy code đó (Eval), in kết quả ra màn hình (Print), và cứ tiếp tục vậy (Loop).

Khái niệm này bắt nguồn từ ngôn ngữ lập trình cổ thứ 2 thế giới: LISP.

Việc viết code khi dùng các ngôn ngữ có REPL thường theo các bước:

  • bật REPL lên
  • gõ code thử cho tới khi thu được kết quả mong muốn
  • copy code đó vào editor/IDE

Câu lệnh bật REPL của Haskell có tên ghci.

$ ghci
GHCi, version 8.10.5: https://www.haskell.org/ghc/  :? for help
Prelude> 1 + 1
2
Prelude> 2 * 1024
2048

Prelude> :quit
Leaving GHCi.

Haskell Hello world

Prelude> print "Hello Pymier!"
"Hello Pymier!"

Integer

cộng + trừ - nhân * mũ/lũy thừa ^

Prelude> 54 + 5 * (2 + 1)
69
Prelude> 2 ^ 1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Float

Prelude> 4 / 2
2.0
Prelude> 5 / 2
2.5
Prelude> 5 / 2.5
2.0
Prelude> 0.1 + 0.1 + 0.1
0.30000000000000004

Prelude> 0.1 + 0.1 + 0.1 == 0.3
False
Prelude> 0.1 + 0.1 + 0.1 /= 0.3
True

Tại sao 0.1 + 0.1 + 0.1 /= 0.3

Boolean

Prelude> 2 < 5
True
Prelude> 2 > 5
False
Prelude> 1 + 1 == 2
True
Prelude> 2 - 1 /= 0
True
Prelude> 2 <= 2
True
Prelude> 1/0
Infinity

and

Prelude> True && True
True
Prelude> True && False
False
Prelude> False && True
False
Prelude> False && False
False

or

Prelude> True || True
True
Prelude> True || False
True
Prelude> False || True
True
Prelude> False || False
False

not

Prelude> not True
False
Prelude> not False
True

Haskell boolean có tính short-circuit – dừng lại ngay khi có thể kết luận kết quả biểu thức boolean.

Prelude> error "huhu"
*** Exception: huhu
CallStack (from HasCallStack):
  error, called at <interactive>:2:1 in interactive:Ghci2
Prelude> True || error "huhu"
True
Prelude> False && error "huhu"
False

hay nói cụ thể:

  • || sẽ dừng lại và trả về kết quả ngay khi gặp True
  • && sẽ dừng lại và trả về kết quả ngay khi gặp False

Với các ngôn ngữ khác, boolean có short-circuit hay không thì tùy từng ngôn ngữ quyết định, nhưng với một tính năng nổi bật của Haskell: Lazy, short-circuit là chuyện đương nhiên.

type

Các câu lệnh trong ghci

  • :help
  • :info
Prelude> :info mod
type Integral :: * -> Constraint
class (Real a, Enum a) => Integral a where
  ...
  mod :: a -> a -> a
  ...
    -- Defined in GHC.Real
infixl 7 `mod`

Prelude> :info (+)
type Num :: * -> Constraint
class Num a where
  (+) :: a -> a -> a
  ...
    -- Defined in GHC.Num
infixl 6 +

Hiển thị type:

Prelude> :set +t

Prelude> 1
1
it :: Num p => p

Prelude> 0.1
0.1
it :: Fractional p => p

số nguyên 1 có kiểu Num, số float 0.1 có kiểu Fractional

Prelude> True
True
it :: Bool

giá trị boolean True có kiểu Bool

Prelude> "con mèo trèo"
"con m\232o tr\232o"
it :: [Char]
Prelude> length "con mèo trèo"
12
it :: Int

string là 1 list của các Char (character – ký tự)

Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
it :: (Num a, Enum a) => [a]

kiểu list được biểu diễn bởi dấu []

it là biểu thức/kết quả cuối cùng bạn đã gõ. Tương tự _ trong Python interpreter.

Prelude> 1
1
Prelude> it + 2
3

ProjectEuler problem 1

https://projecteuler.net/problem=1

Chú ý: theo chương trình học của Pymi.vn, phần này được học ở buổi số 4. Bạn đọc cần biết Python để hiểu phần này hoặc chỉ cần gõ theo. Có thể đọc thêm tại đây.

Tạo list các số từ 1 đến 5

Prelude> [1..5]
[1,2,3,4,5]

Haskell không dùng % cho phép chia lấy phần dư (modulo/remainder), code Python 10 % 3 tương đương với viết Haskell mod 10 3 hoặc rem 10 3

Haskell dùng || && thay Python or and

Python 2.0 MƯỢN list comprehension từ Haskell

>>> sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0])
233168

Haskell dùng | thay chữ for, dùng <- thay chữ in, dùng , thay chữ if so với Python

Prelude> sum [i | i <- [1..999], mod i 3 == 0 || mod i 5 == 0]
233168

Bonus: bài PE16:

Prelude> sum [read [i] :: Integer | i <- show (2^1000)]
1366

Các đặc tính nổi bật của Haskell

Theo wiki Haskell

  • polymorphically statically typed
  • lazy
  • purely functional

hoặc xem phần features trên https://www.haskell.org/

lập trình hàm là gì

Haskell là ngôn ngữ thuộc nhóm functional (lập trình hàm).

Trên lý thuyết, có nghĩa nó dựa trên “lambda calculus”, một mô hình/hệ thống tính toán dùng các function (hàm toán học), khác với mô hình Turing Machine mà các ngôn ngữ lập trình C, Java, Python, Go… dựa trên. Hai mô hình này được chứng minh về mặt toán học là có khả năng như nhau.

Về mặt thực hành, code với 1 ngôn ngữ functional thường có nghĩa là:

  • không dùng vòng lặp for/while mà dùng các function có sẵn để làm việc tương tự (vd: map, filter, fold, reduce,…) hoặc viết các recursive function để thu được kết quả tương ứng.
  • Các kiểu dữ liệu thường là immutable, khi thay đổi 1 list, Haskell sẽ tạo ra 1 list mới với những thay đổi đã thực hiện (và bỏ list cũ đi).
  • First class function: quen với việc dùng function này làm đầu vào cho function khác. Ví dụ map map (\x -> x * 2) [1..5] nhận function \x -> x * 2 và 1 list để thực hiện function đó trên tất cả các phần tử trong list.

Haskell purely functional là gì

pure function là một function không có “side effect”, giống hàm toán học, kết quả đầu ra chỉ phụ thuộc đầu vào.

f(x) = 2x + 1
f(30) luôn luôn bng 61

Side effect là việc function thực hiện 1 thay đổi nào đó (thay đổi phần tử 1 list, đọc ghi 1 file, in ra màn hình, kết nối internet, sleep chương trình, …) hay phụ thuộc vào yếu tố khác với đầu vào (một chương trình phụ thuộc vào thời gian lúc nó chạy) nghe hơi vô lý khi một ngôn ngữ mà không tương tác với thế giới bên ngoài thì… chỉ để học toán. Nhưng Haskell sẽ dựa trên 1 khái niệm/cơ chế hoàn toàn khác để thực hiện các việc nói trên.

Haskell lazy là gì

lazy là chỉ thực hiện tính toán khi thực sự cần tới giá trị. Ví dụ có thể viết code tạo ra list từ 1 tới vô cùng, nhưng vì Haskell lazy, nó chỉ lấy ra phần tử nó cần, chứ không tạo list từ 1 tới vô cùng từ đầu.

Prelude> take 10 [1..]
[1,2,3,4,5,6,7,8,9,10]
Prelude> take 20 [1..]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

Trong Python, khái niệm gần nhất với lazy là generator

Để Haskell bắt buộc phải tính list [1..] tới vô cùng, ta dùng 1 function cần phải duyệt đến phần tử cuối cùng của list – như tính độ dài : length

Prelude> length [1..]
^CInterrupted.

code này sẽ chạy mãi cho tới khi người dùng tắt chương trình hoặc bấm Ctrl-C.

Kết luận

Ngày đầu của Haskell không hề khó hơn ngày đầu học Python. Đừng vì “cộng đồng mạng” nói khó mà chưa thử đã tin!

Tham khảo

  • https://pymi.vn/tutorial/python-integer/
  • https://pymi.vn/tutorial/python-calculation-2/
  • RealWorldHaskell

What next?

Loạt bài viết dự kiến có 6-8 bài, ứng với 6-8 buổi học Python tại pymi.vn

Ủng hộ tác giả viết phần tiếp theo

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

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

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

Kinh nghiệm làm framework cho IOS

Kinh nghiệm làm framework cho IOS

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

Đây là 1 số kinh nghiệm cho anh em nào định viết framework hỗ trợ IOS, để anh em đỡ mất thời gian nghiên cứu.

  10 Frameworks tốt nhất hiện nay cho PHP
  .NET core vs ASP.NET core: Phân biệt .NET Framework, .NET Core và Mono

Xem thêm nhiều việc làm iOS lương cao trên TopDev

Giải pháp mình đúc rút ra như sau:

  1. Framework thì nên viết bằng Objective-C:
    – Lý do chọn objective-C là vì nó đã không thay đổi gì nữa, chạy ổn định. Hiện tại mỗi năm Apple lại cho ra đời 1 phiên bản swift mới nên nếu dùng swift để viết thì đau thương lắm, mỗi lần lên là bạn phải update cho cả project đang dùng swift mới. Đây cũng là lý do vì sao mà bạn thấy FireBase hay FacebookCore đều dùng Objective-C để viết framework cho họ. Mặc dù mình biết nhiều người code swift chưa hẳn đã biết Objective-C, cú pháp khó hơn. Nhưng cuộc sống mà, bạn muốn làm Framework thì trình bạn cũng cao, nghĩa là bạn nên biết cả 2 ngôn ngữ.

2. Khi làm framework, thì bạn phải support cả simulator và device. Do vậy bạn phải có script để build cho chúng. Cụ thể là xcframework.

3. Bạn nên tạo 1 cái project demo tách biệt với project framework. Làm như vậy thì việc test chuẩn hơn, đôi khi phát hiện được lỗi dễ hơn.

Tôi sẽ tiến hành tạo 1 framework cho bạn hiểu.

Mở Xcode tạo mới Framework như hình.

Đặt tên là CodeToanBug(hoặc theo ý bạn).

Chỉnh lại version support càng thấp càng tốt, ví dụ mình chọn 9.0:

Tiến hành tạo workspace bằng cách File -> New -> Workspace. Đặt tên là CodeToanBug hoặc tùy ý.

Sau đó tắt project đang mở, nhưng vẫn mở Workspace nhé. Sau đó thì kéo file CodeToanBug.xcodeproj vào Workspace được như hình:

Sau khi kéo thả

Mục đích là để tý mình tạo thêm 1 project demo ở trong Workspace luôn.

Tiếp tục chọn target CodeToanBug rồi vào Organization thêm codetoanbug để định danh bản quyền, và Class Prefix CTB(viết tắt codetoanbug) để nó tự thêm prefix khi tạo mới file.

Bây giờ thêm 1 hàm cộng 2 số để framework có tính năng. Thêm file tên là CTBMath.h như hình:

Viết hàm trong file .h:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface CTBMath : NSObject

- (int)addTwoNumbers:(int)number1 secondnumber:(int)number2;

@end

NS_ASSUME_NONNULL_END

Trong file .m:

#import "CTBMath.h"

@implementation CTBMath

/// Add two numbers
/// @param number1 number1 need add
/// @param number2 number2 need add
- (int)addTwoNumbers:(int)number1 secondnumber:(int)number2 {
    return number1 + number2;
}
@end

Sau đó bấm vào file CTBMath.h rồi chọn như hình:

Hoặc biết kéo thả thì vào target CodeToanBug rồi chọn Build phases thêm file public để cho thằng nào dùng framework này cũng đọc được:

OK vậy là xong framework.

Bước tiếp theo là làm sao để build cho device và simulator.

Tạo universal framework như sau:

Chọn File -> New target -> Other -> Aggregate:

Đặt tên CodeToanBugFramework hoặc tùy ý.

Bây giờ nó xuất hiện thêm target này thì bạn chọn vào nó và chọn Build Phases và chọn New Run Script Phase:

Tiếp theo thêm mã này vào:


# Universal Script

set -e

FRAMEWORK_NAME="CodeToanBug"
IOS_SCHEME_NAME="CodeToanBug"

if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi

SIMULATOR_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphonesimulator.xcarchive"
DEVICE_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphoneos.xcarchive"

OUTPUT_DIR="${SRCROOT}/framework_out_universal/"

# Simulator xcarchieve
xcodebuild archive \
  -scheme ${IOS_SCHEME_NAME} \
  -archivePath ${SIMULATOR_ARCHIVE_PATH} \
  -configuration Release \
  -sdk iphonesimulator \
  SKIP_INSTALL=NO

# Device xcarchieve
xcodebuild archive \
  -scheme ${IOS_SCHEME_NAME} \
  -archivePath ${DEVICE_ARCHIVE_PATH} \
  -sdk iphoneos \
  -configuration Release \
  SKIP_INSTALL=NO

# Clean up old output directory
rm -rf "${OUTPUT_DIR}"

# Create xcframwork combine of all frameworks
xcodebuild -create-xcframework \
  -framework ${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
  -framework ${DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
  -output ${OUTPUT_DIR}/${FRAMEWORK_NAME}.xcframework

# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi

Chọn như hình rồi bấm run:

Run thành công thì mở thư mục code lên bạn sẽ thấy cái này:

Đây chính là xcframework mà bạn có thể build cho cả 2.

Tạo 1 project demo trong Workspace này bằng cách File -> New -> Target -> App như hình:

Đặt tên là DemoSwift. Nhớ chọn Language là swift.

Sau đó sửa code ở file ViewController.swift như sau:

import UIKit
import CodeToanBug

class ViewController: UIViewController {
    let math = CTBMath()

    override func viewDidLoad() {
        super.viewDidLoad()
        print(math.addTwoNumbers(12, secondnumber: 12))
    }
}

Nhưng muốn nó hiểu thì phải add CodeToanBug.framework vào như hình:

Nếu bạn build app mà nó lên 24 là đã chạy được.

Bây giờ tiến hành test với 1 project độc lập.

Tạo mới 1 project độc lập có tên là TestFramework bằng swift. Sau đó mở thư mục framework_out_universal rồi tiến hành kéo thả CodeToanBug.xcframework như hình(nhớ chọn copy if need):

Và chỉnh Embed & Sign(nếu không sẽ không build được máy thật – lỗi Reason: image not found):

Sau đó lại code như sau:

Nếu chạy app mà ra 25 là Framework đã hoạt động.

Đây là code bạn có thể tải về tham khảo:

https://github.com/codetoanbug/CodeToanBug-IOS

Nếu có góp ý gì xin comment ở dưới. Thank for reading.

Code ví dụ spring boot h2 database (khởi tạo database)

Code ví dụ spring boot h2 database (khởi tạo database)

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Code ví dụ spring boot h2 database (khởi tạo database)

Trong bài này mình sẽ làm một ví dụ nhúng hệ quản trị cơ sở dữ liệu H2 vào project spring boot.

Việc này đặc biệt hữu ích trong quá trình làm các demo, với H2 chúng ta không cần phải cài các cơ sở dữ liệu phức tạp như MySQL, MSSQL… mà vẫn có thể thực thi các câu lệnh sql với database bình thường với H2.

Với H2 ta có thể nhúng sẵn 1 database, các data cần thiết và khởi tạo nó lúc chạy project.

  "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 thao tác cơ bản với Database SQL Server (tạo mới database, table,...)

1. Code ví dụ spring boot h2 database (khởi tạo database)

Tạo project Spring Boot: File > New > Module

code ví dụ spring boot h2 database (khởi tạo database) code ví dụ spring boot h2 database (khởi tạo database)

Các thư viện sử dụng gồm Spring WebSpring Data JPAH2 Database

code ví dụ spring boot h2 database (khởi tạo database) code ví dụ spring boot h2 database (khởi tạo database)

Cấu trúc project sau khi hoàn thành:

code ví dụ spring boot h2 database (khởi tạo database)

File Application: (giống hệt các project spring boot thông thường)

package stackjava.com.sbh2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootH2Application {

public static void main(String[] args) {
 SpringApplication.run(SpringBootH2Application.class, args);
}

}

File application.properties

#spring.datasource.url=jdbc:h2:file:E:/stackjava/testdb
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

# Enabling H2 Console
spring.h2.console.enabled=true
# Custom H2 Console URL
spring.h2.console.path=/h2
  • spring.datasource.url: url của database, jdbc:h2:mem database sẽ được tạo ở bộ nhớ đệm, sẽ bị mất sau khi project bị tắt. Nếu bạn muốn lưu lại thì có thể lưu database ở file với jdbc:h2:file
  • spring.datasource.username và spring.datasource.password là thông tin xác thực cho database
  • spring.h2.console.enabled=true tức là cho phép truy cập database h2 qua giao diện
  • spring.h2.console.path=/h2 đường dẫn truy cập database h2 qua giao diện là /h2

File schema.sql

DROP TABLE IF EXISTS tbl_user;

CREATE TABLE tbl_user (
 id INT AUTO_INCREMENT PRIMARY KEY,
 username VARCHAR(250) NOT NULL,
password VARCHAR(250) NOT NULL
);

Khi start project, hệ thống sẽ đọc file này để tạo database. (ở đây mình tạo bảng tbl_user với 3 column là id, username, password)

File data.sql

INSERT INTO 
tbl_user (username, password)
VALUES
('stackjava', 'stackjava'),
('admin', 'admin1234'),
('root', 'root');

Sau khi đọc file schema.sql hệ thống sẽ đọc file data.sql để xử lý data (ở đây mình thực hiện insert 3 bản ghi vào bảng t_user)

Demo

Start project và truy cập vào địa chỉ http://localhost:8080/h2

code ví dụ spring boot h2 database (khởi tạo database)

Connect để xem thông tin của database vừa tạo.

code ví dụ spring boot h2 database (khởi tạo database)

Với database này chúng ta có thể dễ dàng demo các ví dụ về spring data jpa, hibernate… có thể chạy thử dễ dàng, ko cần phải cài đặt các database phức tạp.

Okay, Done!

Download code ví dụ trên tại đây hoặc tại https://github.com/stackjava/spring-boot-h2

References: https://docs.spring.io/spring-boot/…/howto-database-initialization.html

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

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

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

Những Câu Hỏi Phỏng Vấn Tiếng Anh Thường Gặp Trong Các Buổi Phỏng Vấn

những câu hỏi phỏng vấn tiếng anh thường gặp
Những Câu Hỏi Phỏng Vấn Tiếng Anh Thường Gặp Trong Các Buổi Phỏng Vấn

Ngày nay, việc dùng tiếng Anh làm ngôn ngữ chính trong buổi phỏng vấn trở nên khá phổ biến do sự cần thiết của ngoại ngữ trong công việc. Để có thể tự tin trả lời những câu hỏi bằng tiếng Anh, việc có sự chuẩn bị trước để sắp xếp ý tưởng và logic cho câu trả lời của mình là yếu tố khá quan trọng mà bất cứ ứng viên nào cũng cần để tâm đến. Do đó, những câu hỏi phỏng vấn tiếng anh thường gặp được chia sẻ trong bài viết này sẽ giúp người đọc có sự chuẩn bị tốt hơn cho bản thân.

những câu hỏi phỏng vấn tiếng anh thường gặp
Một số câu hỏi phỏng vấn bằng tiếng Anh thường gặp

1. Can you introduce yourself? Tell me about yourself (Hãy giới thiệu về bản thân bạn)

Đối với câu hỏi này, người phỏng vấn chủ yếu muốn ứng viên khái quát một cách tổng quan những thông tin cơ bản của bản thân và thể hiện được mong muốn của mình với công việc. Về cơ bản cách trả lời câu hỏi này cũng tương tự như cách bạn trả lời trong buổi phỏng vấn bằng tiếng Việt. Tuy nhiên, với những ứng viên đã có kinh nghiệm làm việc, ứng viên có thể bổ sung thêm những kinh nghiệm mình đã có và cách bạn có thể áp dụng những điều ấy cho vị trí mà mình đang ứng tuyển.

Chẳng hạn với vị trí ứng tuyển liên quan đến Content Marketing, bạn có thể tham khảo mẫu câu trả lời như sau:

  6 Điều Cần Tránh Khi Phỏng Vấn Để Tăng Cơ Hội Thành Công
  8 câu hỏi phỏng vấn dành cho các lập trình viên Mobile app

2. What are your strengths and weaknesses? (Điểm mạnh và điểm yếu của bạn là gì?)

Câu hỏi này gần như luôn xuất hiện trong tất cả các buổi phỏng vấn. Mục đích của việc đặt câu hỏi điểm mạnh và điểm yếu là để người phỏng vấn có thể xem xét khả năng tự đánh giá về bản thân của ứng viên như thế nào. Bạn có đủ tự tin với những điểm mạnh của mình không cũng như có dám tiết lộ một cách chân thật điểm yếu của mình không?

Tham khảo:

I have the ability to adapt very quickly to work and withstand pressure well. Due to the characteristics of working in the IT industry, I often work overtime to solve my assignments, but this has never been a thing that makes me feel depressed.

However, I am still not really satisfied with my professional knowledge. That’s also the reason I signed up for more external courses to upgrade my coding skills.

Xem thêm Những Kinh Nghiệm Phỏng Vấn Hữu Ích Cho Junior Developers

3. Why do you want to apply for this position? (Tại sao bạn lại muốn ứng tuyển vào vị trí này?)

Nếu như ở câu hỏi điểm mạnh, bạn có thể kể một cách thoải mái những điều ưu tú nhất của bản thân, thì với câu hỏi này, ứng viên nên đi sâu vào khai thác điểm mạnh ấy. Với những điểm mạnh ấy, bạn có thể đóng góp được gì cho công việc này. Đó là cách để ứng viên có thể thuyết phục nhà tuyển dụng rằng bạn phù hợp với vị trí này.

Tham khảo:

phỏng vấn tiếng anh

4. What are your short term goals in your career path? (Các mục tiêu ngắn hạn của bạn trong lộ trình sự nghiệp của bạn?)

So với mục tiêu dài hạn, mục tiêu ngắn hạn sẽ cụ thể và thực tế hơn rất nhiều. Nhà tuyển dụng nhờ thế cũng có thể đánh giá ứng viên một cách chính xác hơn, do đó họ thích đặt câu hỏi này hơn so với mục tiêu dài hạn. Vậy nên kể cả khi câu hỏi không nêu cụ thể mục tiêu ngắn hạn hay dài hạn, ứng viên vẫn nên ưu tiên các mục tiêu ngắn hạn để gây ấn tượng với nhà tuyển dụng cũng như có tính thuyết phục cao hơn.

Tham khảo:

I want to develop to a higher position and improve my knowledge of software programming with Python language. My specialty is computer sciences, I also have knowledge of SQL server databases, Postgres, knowledge of Linux centos operating system, Ubuntu, Odoo Framework and Python programming language. I want to continue to explore new languages ​​at work.

Xem thêm Kỹ Năng Giao Tiếp Trong Tuyển Dụng Và Cách Cải Thiện

5. What is your expected salary? (Bạn mong đợi mức lương bao nhiêu?)

Đây là câu hỏi mang tính chủ quan từ phía ứng viên do đó tốt hơn hết ứng viên nên có sự chuẩn bị trước với những câu hỏi như thế này. Bạn nên tham khảo mức lương thị trường với vị trí này để biết năng lực của mình đang ở đâu và có thể thương lượng được mức lương như ý nhất.

Tham khảo:

My salary expectations are commensurate with my experience and qualifications. In addition, I have also searched about the market salary for this position as well as the jobs that I can do, so I would like to receive a salary in the range from 12.000.000 VNĐ to 15.000.000 VNĐ.

Hi vọng một số câu hỏi tiếng Anh thường gặp trên đây sẽ giúp ứng viên trang bị thêm cho mình một số kiến thức để chuẩn bị cho những cuộc phỏng vấn quan trọng sắp tới. Đón đọc thêm các bài viết hữu ích khác về công nghệ và nhân sự tại TopDev nhé!

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

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

ISTQB Advanced Level: Một vài thông tin cần biết và tổng quan về cấu trúc bài thi

ISTQB Advanced Level

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

Nhân một sự kiện đáng nhớ của mình đã diễn ra hơn nửa năm về trước, đã khá là lâu rồi mà đến bây giờ mới có được chút sức mạnh để đánh bay cơn trì hoãn và cái sự lười đã bén rễ bên trong cơ thể này, để viết về một chủ đề quen thuộc đối với nhiều người theo con đường tester đó là chứng chỉ ISTQB (International Software Testing Qualifications Board).

À thì cái sự kiện đáng nhớ trên của mình ấy mà, thực ra cũng không có gì to tát đâu và đâu đó bạn sẽ phát hiện ra sau khi đọc xong bài viết này nhé! 😀

  15 chứng chỉ "vàng" đáng giá trong ngành lập trình
  7 điểm chung của những người phụ nữ “cân cả thế giới”

Quay lại chủ đề liên quan đến mục đích của bài viết này, mình sẽ tổng hợp một số thông tin liên quan đến việc thi lấy chứng chỉ ISTQB, mình nghĩ là thông tin này sẽ khá là hữu ích dành cho bạn nào đang có ý định tìm hiểu và thi lấy chứng chỉ này đó. Bên cạnh những thông tin đưa ra dưới đây, các bạn có thắc mắc hay ý kiến đóng góp gì thì cũng cứ thoải mái để lại bình luận cho mình ở phần bình luận phía dưới nhé.

Bài viết của mình tập trung vào phần CORE của ISTQB Advanced level bao gồm các Module: TM (Test Management), TA (Test Analyst), TTA (Technical Test Analyst).

1. Nội dung kiến thức trong bài thi

Câu hỏi trong bài thi Advanced level sẽ dựa vào kiến thức có trong các Syllabus tương ứng. Theo thông tin từ trên trang chủ của istqb thì:

  • Với bài thi TA và TTA thì sẽ tham khảo Syllabus TATTA 2019 – có các thông tin được cập nhật, chỉnh sửa.

Ngoài ra còn có một số tài liệu khác nữa có thể tìm kiếm qua Google, hoặc nếu bạn thực sự cần để ôn luyện thì có thể liên hệ cho mình 😀

Để có thể làm tốt được bài thi thì tất nhiên phải nắm được, hiểu được và vận dụng được kiến thức đã được tóm lược trong tài liệu đó để trả lời các câu hỏi trong bài thi. Bài thi bao gồm các câu hỏi bao hàm lượng kiến thức từ nhiều chương kết hợp. Đây là mức độ nâng cao nên tất nhiên câu hỏi sẽ không thể ở mức quá đơn giản được, đúng không nào. Hehe, có một cách khác đó là cày đề và học thuộc đáp án nha các bạn :v nhưng mà đề ở đâu để cày mới là vấn đề =)) thế là lại phải tốn thêm ít chi phí để đi học trung tâm. Hehehe.

Nếu xác định đi lên bằng thực lực thì chính bạn phải biết cách chắt lọc và nắm bắt nội dung kiến thức một cách đầy đủ và khoa học. Vấn đề là làm thế nào, câu trả lời đầu tiên đó là phải chăm chỉ cái đã. ;))

Một thông tin khác, không liên quan đến kiến thức trong bài thi, nhưng mình cũng bổ sung thêm ở đây để các bạn có thể cân nhắc thêm, đó là kinh phí dành cho bài thi này (Lưu ý: chi phí này mình tham khảo năm 10/2020, đơn vị được ủy quyền tổ chức thi là QRS):

  1. Phí đăng ký hồ sơ thi: 3,000,000 VND (Ba triệu đồng). Hồ sơ này đóng 1 lần bao gồm: bằng đại học, chứng chỉ ISTQB Foundation (nếu chưa có thì bạn phải thi để có cái này trước đã nhé), một giấy xác nhận đã làm trong ngành CNTT được tối thiểu 3 năm – đối với người tốt nghiệp đúng chuyên ngành CNTT, và 5 năm đối với người tốt nghiệp ở ngành nghề khác). – Bạn sẽ được hỗ trợ thông tin khi đăng ký thi ở đơn vị được ủy quyền tổ chức thi nhé.
  2. Lệ phí thi cho từng Module, mỗi Module là 4,500,000 VND (Bố triệu rưỡi đồng), nếu bạn thi cả 3 Module thì là 3×4,500,000. Phí này bao gồm việc xuất hóa đơn đỏ nếu bạn có nhu cầu.
  3. Vì thi ở đơn vị ủy quyền nên trung tâm có một loại phí khác nữa là phí chuyển đề thi – phí này là 4,000,000/lần thi cho tất cả những người tham gia thi lần đó, do vậy sẽ tùy vào số người thi mà bạn sẽ cần phải đóng lượng phí tương ứng. Khoản số 3 này mình không chắc ở các đơn vị tổ chức ủy quyền thi khác có giống nhau đâu nhé! 😀

2. Cấu trúc chung của các bài thi

Mỗi module sẽ bao gồm một bộ các câu hỏi theo các chương của Syllabi. Số lượng câu hỏi và độ khó (K-level) sẽ được lựa chọn và phân phối tương ứng dựa theo chương đó. Các câu hỏi có thể có một đáp án hoặc nhiều đáp án đúng. Theo như mình biết được thì hiện giờ các câu hỏi nếu có nhiều hơn 1 đáp án đúng, thì nó sẽ nói rõ yêu cầu là mình cần chọn 2 đáp án hoặc 3 đáp án đúng luôn, khác với trước đây là mình sẽ phải tự xác định số lượng đáp án đúng cho câu hỏi đó.

Điểm số cho một câu hỏi phản ánh độ khó của câu hỏi đó. Một câu hỏi K2 tương ứng với 1 điểm, thông thường thì K3 là 2 điểm và K4 là 3 điểm. Tuy nhiên, một câu hỏi K3 cũng có thể tương ứng với 1, 2 hoặc 3 điểm, một câu hỏi K4 cũng có thể tương ứng với 2 hoặc 3 điểm, tùy thuộc vào sự đánh giá của người ra đề.

Một câu hỏi khó yêu cầu người làm bài phải có sự hiểu biết sâu rộng, đa chiều nhất định, tức là bạn phải biết vận dụng kiến thức lý thuyết để suy luận, xử lý tốt một tình huống cụ thể nào đó chẳng hạn, mà không chỉ đơn thuần hỏi định nghĩa hay những cái có thể tra cứu trong tài liệu được. Và ngược lại với một câu hỏi dễ thì sẽ dễ dàng tìm được câu trả lời hơn.

Thông thường, trung bình một câu hỏi K2 sẽ cần khoảng 2 phút để đọc và trả lời, K3 thì 3 phút và K4 là 4 phút. Và vì đó là con số trung bình theo lý thuyết thế nên có thể có câu hỏi cần nhiều hơn hoặc ít hơn thời gian mong đợi trên kia.

Thời gian cho mỗi bài thi sẽ dựa vào số lượng câu hỏi và K-level của module đó. Nếu người thi không sử dụng ngôn ngữ của bài thi là ngôn ngữ chính thì thời gian đc tăng thêm 25%. Ơ nhưng mà mình đã thi 3 bài thì thời gian vẫn là 180p cho TM và TA và 120p cho TTA. Các bạn yên tâm, nhiều người cùng phòng thi với mình chưa dùng hết nửa thời gian kia đã nộp bài đi về rồi ấy nhé hehe.

Lười kẻ lại bảng nên chụp lại luôn từ file gốc -.-

3. Phân phối câu hỏi trong các bài thi

Với mỗi chương (Chapter), sẽ có các nội dung bài học cụ thể cần phải nắm được trong chương đó gọi là Learning Objective (viết tắt là LO) – mình hiểu nôm na thì đây là phần kiến thức lõi của chương đó – hay mục tiêu bài học cần đạt được của chương, phần này được tóm tắt ở mỗi đầu Chapter (Tham khảo hình phía dưới). Mỗi LO cũng được đánh dấu độ K tương ứng [K1, K2, K3…]. Các câu hỏi trong bài thi sẽ bám sát vào các LO của mỗi chương này:

Một chương sẽ truyền tải tương đối nhiều nội dung kiến thức cần phải nắm được (Lười quá nên cũng chụp lại từ Syllabus cho tiện)

Ví dụ ở Chapter 2 (hình bên trên), có 21 LO, số lượng câu hỏi cho chapter này có tối thiểu 24 câu và tối đa là 25 câu, ta có thể hiểu rằng trong 21 LO này sẽ có LO nào đó có 2 câu hỏi, LO có 1 câu hỏi và có thể có thể có LO không có câu hỏi nào. J Những LO nào mà có dấu (*) có nghĩa là nó thuộc dạng tùy chọn rằng nó mang tính ngẫu nhiên do người ra đề sắp xếp, do đó có thể xuất hiện ở bài thi hoặc không. Miễn sao đảm bảo số câu hỏi tối thiểu và tối đa của chương đó. Có hơi loằng ngoằng một chút nhỉ, nhưng các bạn có thể xem minh họa ở hình dưới đây:

Lại một pha lười nữa nên các bạn chịu khó xem hình mà không có Vietsub nhé!

Chi tiết và đầy đủ hơn các bạn xem hướng dẫn tại đường dẫn hướng dẫn trực tiếp của ISTQB TM 2012 nhé.

Tóm tắt nhanh số lượng câu hỏi theo Chương cho từng Module sẽ như sau:

Bài thi TM:

Tổng điểm của bài thi TM là 115 điểm, điểm đỗ là 75 điểm trở lên.

Chapter Số lượng câu hỏi
Chapter 1 Tối thiểu 13 câu, Tối đa 14 câu.
Chapter 2 Tối thiểu 24 câu, Tối đa 25 câu.
Chapter 3 6 câu hỏi
Chapter 4 4 Câu hỏi
Chapter 5 Tối thiểu 3 câu
Chapter 6 Tối thiểu 3 câu, Tối đa 4 câu.
Chapter 7 Tối thiểu 7 câu hỏi
Tổng số câu hỏi trong bài thi TM 65 câu

Bài thi TA:

Tổng điểm của bài thi TA là 120 điểm, điểm đỗ là 78 điểm trở lên.

Chapter Số lượng câu hỏi
Chapter 1 Tối thiểu 9 câu.
Chapter 2 Tối thiểu 3 câu.
Chapter 3 Tối thiểu 31 câu
Chapter 4 Tối thiểu 4 câu
Chapter 5 Tối thiểu 4 câu, Tối đa 5 câu
Chapter 6 Tối thiểu 4 câu.
Chapter 7 Tối thiểu 1 câu (Có thể có hoặc ko)
Tổng số câu hỏi trong bài thi TA 60 câu

Bài thi TTA:

Tổng điểm của bài thi TTA là 80 điểm, điểm đỗ là 52 điểm trở lên.

Chapter Số lượng câu hỏi
Chapter 1 2 câu hỏi.
Chapter 2 9 câu hỏi.
Chapter 3 7 câu hỏi.
Chapter 4 12 câu hỏi.
Chapter 5 5 câu hỏi.
Chapter 6 10 câu hỏi..
Tổng số câu hỏi trong bài thi TTA 45 câu

Trên đây là cấu trúc bài thi theo tài liệu hướng dẫn 2012. Tuy nhiên, theo cập nhật trên trang chủ ISTQB đã có thay đổi cho cấu trúc bài thi của TA và TTA phiên bản 2019, ở Việt Nam có vẻ như là chưa áp dụng cấu trúc mới này, tại vì hồi mình thi hồi tháng 10/2020 thì đề vẫn theo cấu trúc cũ.

Theo hướng dẫn mới 2019 thì TA sẽ có 40 câu hỏi – với 120 phút làm bài tiêu chuẩn (+25% thời gian với người thi ko sử dụng ngôn ngữ bài thi là ngôn ngữ chính), TTA sẽ có 45 câu hỏi và 120 phút (hoặc +25%) làm bài tiêu chuẩn:

Các bạn có thể xem đầy đủ và chi tiết thông tin bảng phân phối câu hỏi theo Chapter và LO phiên bản 2019 tại đây.

Hoặc xem mình tóm tắt ở hai bảng dưới này cũng được:

Bài thi TA (2019):

Tổng điểm cho bài thi TA này là 80 điểm, điểm đỗ là 52 điểm trở lên

Chapter Số lượng câu hỏi
Chapter 1 6 câu hỏi.
Chapter 2 1 câu hỏi.
Chapter 3 17 câu hỏi.
Chapter 4 11 câu hỏi.
Chapter 5 3 câu hỏi.
Chapter 6 2 câu hỏi..
Tổng số câu hỏi trong bài thi TA 40 câu

Bài thi TTA (2019):

Tổng điểm cho bài thi TTA này là 76 điểm, điểm đỗ là 49 điểm trở lên.

Chapter Số lượng câu hỏi
Chapter 1 2 câu hỏi.
Chapter 2 8 câu hỏi.
Chapter 3 7 câu hỏi.
Chapter 4 13 câu hỏi.
Chapter 5 5 câu hỏi.
Chapter 6 10 câu hỏi.
Tổng số câu hỏi trong bài thi TTA 45 câu

Tóm lại là việc thông tin các câu hỏi được phân bổ trong các chương khá là chi tiết như vậy sẽ giúp cho quá trình ôn tập kiến thức và lên chiến lược học tập của chúng ta được phù hợp hơn. Ví dụ như việc tập trung nỗ lực vào chương có phân phối nhiều câu hỏi nhất để có thể trả lời được đúng nhiều nhất chẳng hạn. Việc rèn luyện thực hành cũng giúp chúng ta khi đọc câu hỏi có thể suy luận ra được rằng câu này thuộc kiến thức của chương nào để vận dụng tương ứng.

4. Thông tin bên lề khác

Thông tin bên lề này là thông tin dựa theo kinh nghiệm và những trải nghiệm của mình trong quá trình ôn luyện và đi thi, xin phép được chia sẻ thêm với các bạn.

Thông thường sẽ có hai hướng chiến lược cho người xác định thi lấy chứng chỉ. Một là tự ộn tập và sau đó đăng ký thi. Hai là đăng ký học một khóa học tại trung tâm ôn luyện nào đó rồi mới thi.

Vậy thì tự ôn tập thì có khả năng thi đỗ được hay không?

Câu trả lời đơn giản lắm, chỉ cần bạn chăm chỉ ôn luyện là được. Hehe. Nói thế ai mà chả nói được. Tuy nhiên, mình lại xin phép chia sẻ ý kiến của mình đó là bạn nên tập hợp được một nhóm những người cùng mục tiêu và ý chí, ngồi lại và ôn tập cùng với nhau sẽ hiệu quả hơn nhiều. Có thể các bạn cùng công ty, hoặc khác công ty. ISTQB Advanced không chỉ có lý thuyết mà còn là những bài tình huống để bạn vận dụng những kiến thức lý thuyết đó để xử lý, trừ trường hợp bạn quá giỏi, quá nhiều kinh nghiệm thực tế rồi thì mình không đề cập ở đây, nhưng trong một nhóm sẽ có nhiều người với những góc nhìn khác nhau sẽ giúp chúng ta có cái nhìn đa chiều hơn đối với một vấn đề hoặc tình huống nào đó, điều này sẽ giúp ích cho quá trình ôn luyện rất nhiều.

Tất nhiên sẽ có lợi thế hơn nhiều nếu bạn có thể thu thập được một ngân hàng câu hỏi ôn tập nào đó, nhưng kiếm ở đâu ra được, đành phải nhờ vào kỹ năng tìm kiếm sử dụng Google và đặc biệt là các mối quan hệ. hehe.

Cách đơn giản hơn là đăng ký đi học trung tâm ôn luyện, họ đã soạn sẵn bài giảng, giáo trình, có người hướng dẫn, người học từ nhiều công ty khác nhau, trình độ và kinh nghiệm khác nhau cũng là một trải nghiệm vô vùng thú vị đấy các bạn, nhiều trung tâm còn cam kết cho bạn học đến khi nào đỗ thì thôi, chỉ có điều lại tốn xèng một chút thôi. 😀

Ôn tập bao nhiêu lâu thì có thể đăng ký thi được một Module?

Điều này tùy thuộc vào khả năng học tập của bạn, bạn mất ít thời gian ôn luyện thì bạn có thể đăng ký thi sớm, tuy nhiên với trường hợp vừa đi làm vừa ôn luyện thì chắc cũng phải cần bỏ ra 2-3 tháng đó. Không nên để thời gian học quá lâu vì có thể nó sẽ rơi vãi đâu đó mất nếu bạn không thường xuyên ôn luyện lại kiến thức.

Có nên thi cùng lúc nhiều Module?

Cái này cũng còn tùy thuộc vào mục đích, định hướng nghề nghiệp và nhu cầu của từng người. Có người chỉ thi TM, có người thì TM, TA, cũng có những người thi cả ba TM, TA, TTA. 😀

Nhưng câu hỏi là có nên hay không cơ mà nhỉ. Mình chia sẻ một số ý kiến liên quan, còn nên hay không thì do bạn tự quyết định nhé. Ở nội dung kiến thức TM và TA có một vài điểm chung theo đánh giá thì khoảng 60-65% là giống nhau, phần khác nhau là do đặc thù của từng mảng 1 cái là Management (Quản lý), một cái là Analyst (Chuyên môn), thế nên nếu mà bạn xác định chỉ thi TM thì bạn chỉ học chuyên kiến thức của TM, và nếu bạn có dự định thi cả TA thì bạn chỉ cần ôn luyện thêm phần khác của TA tức là khoảng 35-40% lượng kiến thức còn lại thuộc về TA thôi ;)) thế nên nhiều người thường nghĩ là thôi mất công học rồi thì học luôn một thể. Không thi, nhỡ đâu sau này cần lại phải học lại từ đầu thì lại tiếc =)), đấy nhiều người hay nghĩ thế.

Còn TTA, số lượng câu hỏi ít hơn hẳn so với 2 Module trên kia mà lại còn là Technical, nên nhiều người nghĩ là nó sẽ khó hơn và mất thời gian ôn tập hơn, rồi nghĩ là có 2 cái trên kia là ổn rồi. Với lại bỏ ra thêm tận 4 triệu rưỡi nữa thì tốn quá nhỉ, thế là thôi. ;))

Mình thì mình nghĩ mất công học rồi thì học luôn, vất vả luôn một lần cho xong. Có trong tay một lúc 3 cái liền chả vui hơn à. Hehehe, nhưng mà lúc học ôn cũng vất hơn đấy nhé à cả lúc chuyển tiền lệ phí thi cũng buốt ví, lại nhưng nữa là lúc nhận điểm đỗ cả 3 thì thấy nó cũng xứng đáng đấy chứ. >.*

Hi vọng là bài tổng hợp ngắn này có thể giúp các bạn có một cái nhìn tổng quan về bài thi Advanced này. Theo mình thấy thì hầu như mọi người khi đi học thì ko ai tìm hiểu cái này mấy, cũng có thể là do nó không có trong bài thi nên không cần quan tâm =)) tự tìm hiểu làm chi cho mất thời gian. Ơ hơ buồn thế, mất công viết cả bài dài thế này rồi cơ mà, thân dành cho những những bạn nào mà mới nung nấu ý định thi thôi thì có thể tham khảo bài viết này của mình để hiểu được sơ bộ và sau đó lên kế hoạch học tập cũng sẽ tiết kiệm được chút thời gian đó.

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

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

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

Những cách CÀI ĐẶT DRIVER cho MÁY TÍNH hiệu quả hiện nay!

Những cách CÀI ĐẶT DRIVER cho MÁY TÍNH hiệu quả hiện nay !

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

Sự khác biệt giữa việc cài đặt Driver hoặc nâng cấp Driver thông qua Windows Update, phần mềm bên thứ 3 và các trang Driver của chính các hãng máy tính hoặc Laptop là gì?

Nếu bạn thuộc thế hệ 8x, 9x đời đầu thì bạn sẽ hiểu rất rõ điều này 😀

Đối với phiên bản Windows 7, Windows XP hoặc các phiên bản thấp hơn nữa thì việc cài đặt driver sau khi cài Windows là điều bắt buộc phải làm để có thể sử dụng được loa, kết nối mạng Internet và nhiều thứ khác.

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  Download, Export file tự động với Selenium Webdriver

Việc cài đặt driver chuẩn cho máy tính sẽ giúp các thành phần phần cứng trên máy hoạt động được đúng cách, đồng thời giúp máy tính hoạt động được ổn định và mượt mà hơn.

su-khac-nhau-giua-cac-kieu-cai-dat-va-nang-cap-driver-may-tinh (1)

Tuy nhiên, kể từ phiên bản Windows 8 trở lại đây, nhất là trên các phiên bản Windows 10 hay Windows 11 hiện tại, bạn gần như không phải làm gì sau khi cài đặt Windows nữa.

Tuy nhiên, trong quá trình sử dụng, nếu bạn có gặp lỗi gì, hoặc đơn giản là bạn muốn nâng cấp driver cho máy thì bạn sẽ làm theo cách nào?

Bạn sẽ nâng cấp driver thông qua Windows Update, sử dụng phần mềm cài đặt driver của bên thứ 3, hay là lên trang chủ của hãng máy tính mà bạn đang sử dụng để tải và cài đặt?

Vâng, trong bài viết này chúng ta hãy cùng xem ưu và nhược điểm của những cách làm này nhé 😀

#1. Cài đặt Driver thông qua việc Update Windows

Cách này là sử dụng Windows Update hoặc Device Manager để cài đặt và nâng cấp Driver. Nếu bạn chưa biết cách làm thì xem phần #1 trong bài hướng dẫn này nhé !

su-khac-nhau-giua-cac-kieu-cai-dat-va-nang-cap-driver-may-tinh (2)

Ưu điểm:

  • Được tự động cập nhật nếu Driver đó có sẵn trong Windows Update.
  • Nhanh chóng, dễ dàng.
  • Dễ sử dụng cho hầu hết mọi người vì không cần các thao tác phức tạp.

Nhược điểm:

    • Các Driver đôi khi không được ổn định, đôi khi bị lỗi.
    • Đã có trường hợp sử dụng Windows Update để cài Driver và đã gây ra lỗi Win. Trường hợp này là có nhưng không nhiều.
    • Không được da dạng và đầy đủ Driver, không hỗ trợ Driver các đời máy quá cũ.
  • Không thể sử dụng được cách này nếu máy không có mạng.

Lời khuyên:

Đây là các gói driver được Microsoft tích hợp sẵn hoặc update thông qua các bản vá và bản cập nhật. Vậy nên, nếu bạn không có nhiều kinh nghiệm trong việc chọn lựa driver chuẩn thì sử dụng cũng OK, không vấn đề gì cả.

#2. Cài đặt Driver bằng các phần mềm thứ 3 như Driver Easy, Driver Booster,…

Cách này ngày trước rất được ưa chuộng do nó nhanh, đỡ phức tạp hơn so với những cách làm khác. Một vài phần mềm cài đặt driver online rất phổ biến lúc đó như Driver Easy, Driver Booster, Snappy Drive Install

Các phần mềm cài driver online này thì yêu cầu máy tính bạn phải có kết nối Internet thì mới có thể cài được.

Còn một số gói driver cài OFFLINE rất nổi tiếng như WanDriver, DriverPack Solutio….. Đây có thể có 2 bộ driver huyền thoại của những người hay cài Win 🙂

su-khac-nhau-giua-cac-kieu-cai-dat-va-nang-cap-driver-may-tinh (3)

Ưu điểm:

  • Driver đa dạng, hỗ trợ hầu hết các đời máy.
  • Cách sử dụng đơn giản, chỉ cần vài click chuột là đầy đủ Driver.
  • Dành cho những người dùng có chút kiến thức về máy tính.
  • Đối với WanDriver và DriverPack Solutio thì bạn thậm chí không cần mạng để sử dụng, có thể lưu trữ cho những lần cài đặt sau.

Nhược điểm:

  • Nếu là phần mềm tốt (driver online) thi hầu hết là phần mềm trả phí, nếu có điều kiện thì bạn có thể mua để sử dụng, tuyệt đối không dùng hàng c.r.a.c.k cho việc này nhé, vì nó không đáng để làm như vậy (xem lý do).
  • Trong vài trường hợp Driver được cài không tương thích với máy gây ra lỗi Windows.
  • Không thể sử dụng nếu máy không có mạng (đối với các phần mềm cài driver online).
  • Còn đối với các bộ cài đặt driver offline như WanDriver, mặc dù không cần mạng nhưng khá nặng để tải về, thường từ 2.5GB trở lên.

Lời khuyên: Để so sánh giữa việc sử dụng theo Cách 1 và Cách 2 thì mình sẽ chọn Cách 1. Điều kiện mà mình đang nói tới là trên các phiên bản Windows mới như Windows 10 và Windows 11 nha các bạn !

#3. Lên Google tìm kiếm Driver máy tính của bạn

Vâng, cách làm này thì hên xui. Đôi khi bạn sẽ tìm được driver ngon lành trên những trang web uy tín luôn. Còn ngược lại thì bạn biết rồi đó.

Để tìm kiếm Driver theo cách này thì bạn hãy làm theo mục #3 trong phần II của bài viết này nhé các bạn !

su-khac-nhau-giua-cac-kieu-cai-dat-va-nang-cap-driver-may-tinh (4)

Ưu điểm:

  • Tìm được hầu hết tất cả Driver, kể cả là các máy đời cũ từ đời nhà Tống :D. Bởi việc tìm kiếm trên Google là không giới hạn mà 😀
  • Khả năng tương thích sẽ tùy thuộc vào trình độ tìm kiếm của bạn, nếu biết cách tìm kiếm thì sẽ rất hiệu quả và tốn ít thời gian hơn so với các cách khác.

Nhược điểm:

  • Tốn thời gian để tìm kiếm và cài đặt Driver với những người dùng phổ thông.
  • Cần phải biết cách tìm Driver, cài đặt Driver thông qua Device Manager.
  • Dễ dính phải virus nếu tải ở các nguồn chưa qua kiểm duyệt, các nguồn không uy tín.

#4. Vào trang chủ của phần cứng hoặc Laptop/ PC đó để tải Driver của hãng

Đây là cách mà bạn sẽ phải lên trang chủ của phần cứng, tải và cài đặt Driver của phần cứng đó. Đây là cách tuyệt vời nhất và mình cũng khuyên bạn nên làm theo.

Tuy hơi mất thời gian một chút nhưng đổi lại hiệu suất máy tính sẽ được cải thiện đáng kể: Tất cả những gì cần làm thì Admin đã chia sẻ với các bạn trong bài viết này rồi: Cách CÀI ĐẶT DRIVER chuẩn nhất cho LAPTOP và PC

su-khac-nhau-giua-cac-kieu-cai-dat-va-nang-cap-driver-may-tinh (5)

Ưu điểm:

  • Do nguồn tải về chính chủ. Chính vì vậy, độ tương thích và ổn định gần như là 100%.
  • Khá đơn giản để cài đặt dành cho các máy tính đồng bộ hoặc Laptop.

Nhược điểm:

  • Dành cho những người hiểu biết về máy tính một chút.
  • Sẽ khó khăn hơn trong quá trình cài đặt nếu đó là máy tính dô bạn tự build, bởi mỗi phần cứng đều cần Driver ở trang chủ riêng dành cho phần cứng đó.

Lời khuyên:

Đây chính là cách mà mình khuyên các bạn nên sử dụng nhất do tính ổn định và tương thích cao, gần như không bị lỗi vặt khi sử dụng.

#5. Lời kết

Trên đây là những cách cài đặt driver cho máy tính phổ biến nhất hiện nay. Mỗi cách đều có những ưu và nhược điểm riêng, tùy từng trường hợp mà bạn áp dụng cho phù hợp với nhu cầu sử dụng của bạn.

Hi vọng là bài viết này sẽ hữu ích với bạn, chúc các bạn thành công và đừng quên comment những cách mà bạn đang áp dụng để anh em cùng thảo luận thêm nhé !

CTV: Hoàng Tuấn – Bài viết gốc tại blogchiasekienthuc.com

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

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

Cách tự học lập trình tốt nhất

Cách tự học lập trình tốt nhất

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

Lập trình là một trong những kỹ năng có giá trị nhất mà bạn có thể học trong thời hiện đại này, cho dù mục đích của bạn là phát triển sự nghiệp hoặc thử thách trí tuệ hay để tạo ra một sản phẩm tuyệt vời nào đó. Nếu bạn vừa mới bắt đầu chuyến hành trình của mình vào thế giới lập trình, thì đây là danh sách 10 bí quyết và tài nguyên giúp bạn học lập trình một cách hiệu quả nhất.

1. Nhận ra lý do tại sao bạn muốn học lập trình

Hướng đi của bạn sẽ phụ thuộc phần lớn vào lý do tại sao bạn muốn học lập trình và bao nhiêu thời gian bạn có thể chuyên tâm dành cho việc học. Nếu bạn muốn trở thành một lập trình viên chuyên nghiệp thì việc đăng ký các khóa học tại các trường đại học có thể là lựa chọn tốt nhất dành cho bạn. (Google có một danh sách những kỹ năng và khóa học đề nghị đối với những người muốn trở thành kỹ sư phần mềm.) Nếu bạn muốn xây dựng các trang web hoặc các trò game cho vui (và có thể sinh lợi) trong thời gian rỗi, thì các tutorial dạng tương tác có thể là một lựa chọn tốt hơn.

2. Lựa chọn đúng ngôn ngữ lập trình

Không có ngôn ngữ lập trình nào là “tốt nhất” cả, và khi bạn đã học được một ngôn ngữ thì rất dễ để học sang ngôn ngữ khác, vì vậy đừng phân vân quá nhiều trong việc chọn ngôn ngữ đầu tiên của mình. Tuy nhiên có một số ngôn ngữ thân thiện với người mới bắt đầu hơn những ngôn ngữ khác. Ngôn ngữ bạn chọn để bắt đầu có thể phụ thuộc vào mục đích của bạn. (Ví dụ, nếu bạn muốn viết một ứng dụng iOS, bạn sẽ cần học Swift hoặc Objective-C). Nếu bạn muốn học lập trình một cách nghiêm túc thì hãy bắt đầu với C, mặc dù có những ngôn ngữ bậc cao hơn như Python khá là dễ học.

3. Bắt đầu nhỏ (và phải kiên nhẫn)

Không quan trọng việc bạn chọn ngôn ngữ lập trình hoặc phương thức nào để học, bạn nên bắt đầu ở mức cơ bản nhất. Ví dụ, khi David Sinsky tự học lập trình trong 8 tuần, anh ta đã dành ra một ngày cuối tuần để nắm kiến thức giới thiệu về Python và một ngày để hiểu sơ bộ về framework Django – thực hành theo những tutorial, sau đó xóa tất cả các code mẫu của tutorial, và tự làm lại thông qua trí nhớ. Bắt đầu với những thứ cơ bản và hãy kiên nhẫn với bản thân trong quá trình học tập. Để cho dự án lập trình đầu tiên của mình được hoàn thành, hãy chia nhỏ dự án đó thành nhiều bước đơn giản. Và nếu một phương thức học tập nào đó không mang lại hiệu quả cho bạn thì hãy thử những cách thức khác trước khi bỏ cuộc.

4. Thử một ứng dụng dành cho trẻ em

Ngày nay thậm chí những đứa trẻ mới tập đi cũng đã bắt đầu học lập trình rồi. Đó thực sự là một điều tuyệt vời cho tất cả chúng ta. Mặc dù nhiều chương trình được thiết kế để dạy trẻ em lập trình rất đơn giản, nhưng có nhiều phần mềm như Scratch phù hợp cho mọi lứa tuổi. Không quan trọng bạn bao nhiêu tuổi; thậm chí những ứng dụng hiệu ứng động dành cho trẻ em có thể giúp bạn bắt đầu với những kiến thức cơ bản trong lập trình (edX có một khóa học mới là Lập trình bằng phần mềm Scratch).

5. Sử dụng các trang web dạy lập trình trực tuyến miễn phí

Các trang web dạy học trực tuyến miễn phí như ucode.vn có thể giúp bạn viết chương trình máy tính đầu tiên của mình. Các tutorial từ những trang như KhanAcademy, Codecademy, Code.org, và nhiều tổ chức khác sẽ giới thiệu tới bạn những kiến thức lập trình cơ bản – trong khi tạo ra một trò game mới, một trang web, hoặc dự án khác. Tìm những tài nguyên cần thiết về những ngôn ngữ mà bạn đang học. Đây là những điểm bắt đầu rất tốt, nhưng bạn sẽ cần tiếp tục học xa hơn sau những phần sơ lược này.

6. Tham gia một khóa học lập trình

Bạn có thể tham gia các khóa học tại chính trường đại học của các bạn hoặc bây giờ có rất nhiêu các khóa học lập trình online về tất cả các ngôn ngữ. Các khóa học lập trình sẽ trang bị cho bạn một nền tảng vững chắc về một lĩnh vực nào đó trong ngành lập trình nói chung, từ đó bạn sẽ dễ dàng phát triển khả năng của mình trong lĩnh vực này.

7. Đọc sách lập trình miễn phí

Khi bạn bị mắc kẹt trong một vấn đề hoặc cần tìm kiếm một điều gì đó, thì những cuốn sách tham khảo là rất tiện dụng. Có một tuyển tập đồ sộ của trên 500 cuốn sách lập trình miễn phí được đăng trên GitHub, và tuyển tập ebook chứa nội dung về 24 ngôn ngữ lập trình khác nhau.

8. Chơi các trò game về lập trình

Thường thì cách tốt nhất để học là thông qua các trò chơi. Trong khi có rất nhiều các tutorial lập trình hướng dẫn bạn tự xây dựng các trò game từ đơn giản đến phức tạp, một số trang dạy học cũng chính là những trò game: Code Combat và CodinGame là 2 trang mang lại nhiều niềm vui khi học ở đó.

9. Tìm một người hướng dẫn (hoặc dạy một người nào đó)

Cộng đồng lập trình có rất nhiều người rất sẵn lòng giúp đỡ để tạo ra thế hệ lập trình viên tiếp theo. Hack.pledge() là một trang sẽ kết nối bạn với một người gia sư, hoặc bạn cũng có thể đăng ký trở thành gia sư của một ai đó. Thậm chí chỉ là lên kế hoạch để dạy những điều mà bạn đã học được, điều đó cũng giúp bạn ghi nhớ thông tin được tốt hơn.

10. Hack code của người khác

Khi bạn đọc code của một người khác, kiểm thử mỗi dòng để xem cách nó làm việc ra sao, bạn sẽ có được sự hiểu biết tốt hơn về toàn bộ bức tranh tổng thể. Nhờ rất nhiều dự án mã nguồn mở, bạn có thể học được về hầu hết mọi thứ – và luôn học hỏi để tiến bộ thêm từng ngày. Chỉ nên nhớ là hãy chia sẻ code của bạn tới cộng đồng nếu bạn đã cải tiến được một chương trình nào đó.

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

Sự khác biệt giữa List.of và Arrays.asList là gì?

Sự khác biệt giữa List.of và Arrays.asList là gì?

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

Arrays.asListtrả về một danh sách có thể thay đổi trong khi danh sách được trả về List.oflà không thay đổi :

List<Integer> list = Arrays.asList(1, 2, null);list.set(1, 10); // OK List<Integer> list = List.of(1, 2, 3);list.set(1, 10); // Fails with UnsupportedOperationException
  4 ứng dụng của Array.from
  Cấu trúc dữ liệu List trong Python và các thao tác cơ bản

Arrays.asListcho phép các phần tử null trong khi List.ofkhông:

List<Integer> list = Arrays.asList(1, 2, null); // OKList<Integer> list = List.of(1, 2, null); // Fails with NullPointerException

contains cư xử khác với null

List<Integer> list = Arrays.asList(1, 2, 3);list.contains(null); // Returns false List<Integer> list = List.of(1, 2, 3);list.contains(null); // Fails with NullPointerException

Arrays.asListtrả về một khung nhìn của mảng đã qua, vì vậy những thay đổi đối với mảng cũng sẽ được phản ánh trong danh sách. Đối với List.ofđiều này là không đúng sự thật:

Integer[] array = {1,2,3};List<Integer> list = Arrays.asList(array);array[1] = 10;System.out.println(list); // Prints [1, 10, 3] Integer[] array = {1,2,3};List<Integer> list = List.of(array);array[1] = 10;System.out.println(list); // Prints [1, 2, 3]
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:

Khám phá cơ hội mới dành cho tài năng IT Việt Nam với sự xuất hiện của 5 công ty IT Hàn Quốc trong kỳ này

Trong những năm qua, Việt Nam là đối tác hợp tác kinh tế hàng đầu trong Chính sách hướng Nam mới và là một trong những đối tác kinh tế lớn nhất của Hàn Quốc tại khu vực ASEAN. Không chỉ có các doanh nghiệp lớn, tập đoàn đang từng bước xây dựng các chuỗi cung ứng chiến lược tại Việt Nam mà các doanh nghiệp nhỏ và vừa của Hàn Quốc cũng tăng cường xúc tiến đầu tư tại đây. 

Tiếp nối thành công của dự án hợp tác 2020, KICC HCMC cùng TopDev tiếp tục mang đến chương trình hợp tác năm 2021 với thông điệp “Make Your IT Career Outstanding – Khởi sắc sự nghiệp IT của bạn”. Theo đó là những hoạt động phối hợp với mục đích kết nối các việc làm ngành CNTT tại các doanh nghiệp IT Hàn Quốc với đối tượng Lập Trình Viên Việt Nam. Từ đó hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các công ty Hàn Quốc và tạo thêm nhiều cơ hội để các tài năng IT Việt Nam sở hữu những tấm vé gia nhập vào các doanh nghiệp công nghệ hàng đầu của Hàn Quốc hiện đang có mặt tại Việt Nam. 

Vậy cơ hội nào đang rộng mở cho các tài năng lập trình viên Việt Nam trong kỳ này? Hãy cùng TopDev khám phá ngay nhé:

KHÁM PHÁ CƠ HỘI MỚI DÀNH CHO TÀI NĂNG IT VIỆT NAM VỚI SỰ XUẤT HIỆN CỦA 5 CÔNG TY IT HÀN QUỐC TRONG KỲ NÀY

1. Cyberlogitec Vietnam

CyberLogitec Vietnam là một Offshore Development Center chuyên cung cấp các dịch vụ và giải pháp Công nghệ thông tin cho các doanh nghiệp thuộc lĩnh vực logistics business: vận tải biển, bến bãi, kho bãi, vận tải đường bộ và giao nhận. Với hơn 10 năm kinh nghiệm trong ngành, công ty tự hào đã mở rộng quy mô hoạt động tại hơn nhiều quốc gia trên thế giới: Hàn Quốc, Mỹ, Thái Lan, Trung Quốc, Ả Rập Xê Út, Thổ Nhĩ Kỳ, UAE, Malaysia, Ấn Độ, Nhật Bản, Brazil và Singapore.

Đến với CyberLogitec, bạn sẽ được hòa nhập vào môi trường quốc tế và được thử thách năng lực của bản thân khi chinh chiến với các dự án quốc tế. Ngoài ra, đây chính là cơ hội giúp bạn tiếp thu thêm nhiều kiến thức mới về Logistics và hệ thống quản lý chuyên nghiệp thông qua quá trình thực hiện dự án.

>>> Bùng nổ năng lực tại CyberLogitec ngay hôm nay tại vị trí Java Developer 

2. Space T

Space T là nền tảng thương mại điện tử về nội thất, tập trung vào 3 danh mục: Nội thất, trang trí nhà và sinh hoạt. Space T tự hào là nơi bạn có thể tìm thấy mọi thứ  mình cần với mọi mức giá đồng thời phù hợp với thiết kế về không gian sống của bạn.

⇒ Bạn mong muốn được thử sức trong lĩnh vực thương mại điện tử? Đây chính là cơ hội tốt để bạn trổ tài! Khám phá ngay các vị trí đang tuyển tại Space T:

3. BrickMate Group

BrickMate Group (BMG) là cơ quan phát triển CNTT toàn cầu có trụ sở chính tại Seoul, Hàn Quốc, với các văn phòng vệ tinh và liên minh tại Thành phố Hồ Chí Minh, Việt Nam. Công ty hiện đối tác phát triển web/ app với một số doanh nghiệp nổi tiếng như Kyobo, Samsung, LG, Megazone,…

Với đà phát triển nhanh chóng, hiện công ty đang gấp rút tìm kiếm các ứng viên tài năng gia nhập. Và nếu bạn mong muốn theo đuổi đam mê công nghệ tại môi trường làm việc chuyên nghiệp, quốc tế nhưng không kém phần năng động cùng đội ngũ trẻ tài năng, hãy tham gia BrickMate Group ngay hôm nay!

⇒ Khám phá các vị trí đang tìm kiếm nhân tài IT Việt Nam tại BrickMate Group:

4. Daokiwoom Innovation

DaouKiwoom là một trong những tập đoàn hàng đầu trong lĩnh vực CNTT và dịch vụ tài chính tại Hàn Quốc. HIện tập đoàn đang hoạt động tại nhiều quốc gia khác trên thế giới: Nhật Bản, Trung Quốc, Pháp, Indonesia và Việt Nam.

DaouKiwoom Innovation được thành lập vào năm 2018, với mục tiêu phát triển các hoạt động kinh doanh đa dạng tại Việt Nam bằng những trải nghiệm tuyệt vời và năng lực của dịch vụ CNTT tốt nhất của Hàn Quốc.

Cơ hội làm việc toàn cầu cùng hàng loạt đãi ngộ xuất sắc tại DaouKiwoom Innovation đang trao đến tay các tài năng:

⇒ Đâu sẽ là vị trí phù hợp với bạn? Nhanh chóng click ngay link để khám phá nhé!

5. Tourpik Vina

Tourpik Vina có trụ sở chính tại Hàn Quốc, chuyên cung cấp các dịch vụ CNTT liên quan đến du lịch trên toàn thế giới. Có mặt tại Việt Nam, Tourpik Vina mong muốn quảng bá du lịch, phát triển các địa điểm du lịch mới và các tuyến du lịch độc đáo cũng như cung cấp những thông tin hữu ích này cho tất cả các bạn để có một chuyến đi tự do, dễ dàng và thoải mái tại Việt Nam.

Hiện Tourpik Vina đang tìm kiếm Product Owner tài năng cùng chinh phục mục tiêu lớn của công ty tại Việt Nam. Nếu đó là bạn, hãy nhanh chóng gửi CV ngay hôm nay nhé! 

Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của các công ty công nghệ Hàn Quốc trong kỳ này, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê công nghệ.

⇒ Và đừng quên KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!

Thông tin chi tiết về dự án vui lòng truy cập tại đây

Về KICC HCMC và NIPA:

Được thành lập vào ngày 23 tháng 5 năm 2019, KICC HCMC (KICC Hồ Chí Minh) là văn phòng thứ 6 trên toàn cầu và thứ 2 tại Việt Nam. KICC là văn phòng quốc tế trực thuộc Bộ Khoa học – Công nghệ Thông tin Hàn Quốc (MSIT) và Cơ quan Xúc tiến Công nghệ Thông tin – Truyền thông (NIPA) với mục đích giúp đỡ việc kinh doanh quốc tế của những công ty về Công nghệ Thông tin (CNTT) của Hàn Quốc. KICC có 06 văn phòng ở Thung lũng Silicon (Mỹ), Tokyo (Nhật), Bắc Kinh (Trung Quốc), Singapore, Hà Nội (Việt Nam) và Hồ Chí Minh (Việt Nam).

NIPA là tổ chức phi lợi nhuận từ Chính phủ Hàn Quốc và là thành viên của Bộ Khoa học – Công nghệ Thông tin Hàn Quốc, chịu trách nhiệm trong việc hỗ trợ các công ty và các chuyên gia CNTT. NIPA hiện dẫn đầu trong kiến thức về cơ sở hạ tầng kinh tế xã hội và phát triển kinh tế quốc gia bằng việc xúc tiến khả năng cạnh tranh của toàn ngành công nghiệp thông qua sự tiến bộ kỹ thuật CNTT và công nghiệp.

Thông tin liên hệ:

  • Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)
  • E-mail: HCMC@nipa.kr
  • Địa chỉ: 135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

Về TopDev – nền tảng tuyển dụng IT

Với hơn 300.000 profile lập trình viên đồng thời sở hữu Cộng đồng Lập trình viên lớn nhất Việt Nam, TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam.  Ngoài ra, TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam, giúp xây dựng và phát triển thương hiệu tuyển dụng – Employer Brand cho hàng trăm công ty công nghệ trong và ngoài nước. Đây còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo quý, năm về thị trường và nhân lực IT tại Việt Nam. (Báo cáo thị trường IT tại đây)

Python free variable

Python free variable

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

Python có 2 loại variable (biến): local, global, và free (đếm từ 0, tất nhiên).

free

Xem thêm nhiều việc làm Python hấp dẫn trên TopDev

binding

x = 42 trong Python đọc là bind name x tới object 42. Tham khảo thêm tại bài Python call by gì?

3 loại variable trong Python

global variable

Đoạn code sau

print(x)
x = 42

x viết sát lề, gọi là global variable. Chạy đoạn code trên sẽ hiện ra exception:

NameError: name 'x' is not defined

do code dùng x trước khi x được bind tới object 42.

local variable

Đoạn code tiếp theo, chạy sẽ thấy gì? Gợi ý: không phải NameError:

def foo():
    print(x)
    x = 42

foo()

x = 42 nằm trong 1 block (trong thân function hay class), gọi là local variable. Trong 1 block, dùng 1 variable/name trước khi bind nó (tức là có bind, nhưng bind sau khi dùng), exception sẽ xảy ra là

UnboundLocalError: local variable 'x' referenced before assignment

free variable

def foo():
    print(x)

foo()

Xóa x = 42 trong ví dụ phần local, ta chạy đoạn code này, lại thấy NameError.

NameError: name 'x' is not defined

Lần này không xảy ra UnboundLocalError, do đoạn code không bind x = 42 trong thân function (block). x ở đây là một free variable.

Free variable hoạt động theo cách … rất tự do. Khi không tìm thấy x trong foo, Python sẽ đi tìm x ở global (bên ngoài function foo).

x = 42
def foo():
    print(x)

x = 96
foo()
x = 100

Màn hình sẽ hiện ra 42100 hay 96?

Việc tính toán tên x có giá trị gì, được thực hiện khi function CHẠY. Khi gọi foo() ở trên, x đã có giá trị là 96.

  Python: Top 18 module hữu ích nhất

Static analysis

Việc dùng các công cụ (phần mềm/chương trình) để phân tích/tìm lỗi code bằng cách đọc code (text) – mà không cần chạy code, gọi là static analysis. Trong Python phổ biến các công cụ như pep8flake8pylintmypy cũng có thể tính luôn, hay các tính năng tích hợp sẵn của IDE như Pycharm.

flake8 cơ bản giống pep8 (tên mới là pycodestyle), thêm tính năng phát hiện thư viện không dùng tới/ hay biến không tồn tại.

import math
def foo():
    print(x)
    x = 42
foo()

khi chạy flake8 với file code, flake8 sẽ phát hiện ra thư viện math được import nhưng không dùng, tên x chưa được định nghĩa.

$ flake8 scope.py
scope.py:1:1: F401 'math' imported but unused
scope.py:5:11: F821 undefined name 'x'
scope.py:6:5: F841 local variable 'x' is assigned to but never used

flake8 rất hữu ích khi dễ dàng phát hiện các lỗi đơn giản như gõ nhầm tên biến hay dùng biến không tồn tại như trên. Nhưng khi x là free variable, không công cụ nào của Python có thể phát hiện ra lỗi này cho tới khi chạy mới thấy exception:

def n_pymi_vn() -> int:
    s = x + 1
    return s

r = n_pymi_vn()
x = 10
print(r)

Do x là free variable, các công cụ phải quét hết cả file code để tìm x, và nó tìm thấy, nên tin rằng x có tồn tại, nhưng đã quá muộn rồi. Một ví dụ vô lý hơn nữa, để thấy sự bất lực của các công cụ static analysis:

def n_pymi_vn() -> int:
    s = x + 1
    return s

if 1 > 10:
    x = 10
r = n_pymi_vn()
print(r)
  Điều khiển luồng trong Python

Hành động của chúng ta

Hạn chế hết mức việc sử dụng global variable, free variable, cần biến gì thì đưa argument vào function biến đó, code “sát tường” cho hết vào 1 function main và gọi main() nếu cần chạy.

def n_pymi_vn() -> int:
    s = x + 1
    return s


def main():
    r = n_pymi_vn()
    x = 10
    print(r)

main()

flake8 sẽ làm tốt nhiệm vụ phát hiện ra x chưa được định nghĩa trong ví dụ trên: F821 undefined name 'x', và đoạn code này có thể viết lại để không còn dùng global/free variable nữa:

def n_pymi_vn(x) -> int:
    s = x + 1
    return s


def main():
    x = 10
    r = n_pymi_vn(x)
    print(r)

main()

Kết luận

Tính dynamic của Python khiến các công cụ khó có thể xử lý mọi trường hợp, công cụ sẽ chỉ giúp một phần, phần còn lại là sự cẩn thận của lập trình viên.

Tự do phải chăng cần trong khuôn khổ?

Tham khảo

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

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

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

Hướng dẫn học CSS Grid toàn tập phần 1

Hướng dẫn học CSS Grid toàn tập phần 1

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

Sau loạt bài về css flexbox toàn tập chắc hẳn các bạn cũng nắm được kiến thức khá tốt về tạo layout. Tuy nhiên ứng dụng web ngày nay giao diện ngày càng phức tạp nên việc chỉ sử dụng flexbox thực sự vẫn chưa tối ưu, cần nhiều giải pháp hơn để tạo ra layout một cách nhanh nhất , đẹp mà lại không tiêu tốn nhiều sức.

Vì thế mà CSS Grid được sinh ra để giải quyết vấn đề này. Việc tạo layout không còn khó khăn nữa với CSS Grid ta có thể làm được nhiều layout phức tạp một cách dễ dàng, nhanh chóng tuy nhiên nó cũng chưa được nhiều trình duyệt hỗ trợ như flexbox nên việc sử dụng vẫn còn chưa rộng rãi.

  3 điều bạn có thể không biết về biến trong CSS
  9 CSS animation mới "mãn nhãn" cho các project

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

Trong series CSS Grid này, mình sẽ tập trung chia sẻ rõ ràng về các thuộc tính trong CSS Grid, cách sử dụng hiệu quả và xử lý khi trình duyệt không hỗ trợ cũng như kèm theo một bài demo kèm giải thích để các bạn dễ hiểu hơn trong khi đọc.

# CSS Grid

Để dễ hình dung trong việc đọc hiểu và học tập mình vẫn sẽ làm trên Codepen cho các bạn tiện xem demo và có thể sửa trên nó cho mau hiểu. Mình sẽ giải thích rõ các thuộc tính và công dụng của chúng thông qua ví dụ dưới đây xuyên suốt bài viết các bạn chú ý nha.

Đầu tiên mình tạo layout HTML như sau:

<div class="container">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>

Và kèm theo đó là CSS

.container {
background-image: linear-gradient(to right bottom, #ffa400, #e74c3c);
height: auto;
padding: 50px;
display: grid;
grid-template-columns: 500px 200px;
}
.item {
color: black;
font-weight: bold;
font-size: 2rem;
text-align: center;
padding: 10px;
background-color: #fff;
border-radius: 4px;
border: 2px solid orange;
}

Chúng ta sẽ được kết quả

Để sử dụng Grid thì đơn giản chúng ta dùng thuộc tính display: grid; thế là chúng ta đã dùng grid rồi giống như flexbox display: flex; vậy. Đơn giản quá nhỉ keke. Giờ chúng ta đi sâu vào từng thuộc tính một khác của CSS Grid nhá.

# grid tracks

Grid tracks hiểu nôm na là các đường được đánh dấu theo thứ tự theo các cột và các hàng để thiết lập vị trí cho các phần tử một cách dễ dàng hơn. Mình khuyến khích các bạn mở Firefox lên để Inspect Code(F12) của demo Codepen ở trên để thấy các grid tracks một cách rõ ràng nhất nha

Các đường đánh dấu theo hàng và cột tương ứng từ trên cùng hoặc ngoài cùng bên trái. Cách để nhớ đơn giản là cứ lấy số cột + 1 sẽ ra tổng tracks theo cột và số hàng + 1 sẽ ra tổng tracks theo hàng. Các bạn thấy đó có 2 cột thì có 3 tracks line cột đánh dấu 1 2 3, còn 5 hàng thì 6 tracks line hàng. -1 là cuối cùng.

Ở đây các bạn chỉ cần hiểu nó là các đường như hình trên là được. Ở bài sau mình sẽ nói chi tiết về công dụng rất quan trọng của nó trong việc tạo layout như thế nào. Do CSS Grid khá nhiều thuộc tính nên mình không gom vào một bài được.

# grid-template-columns

Columns đúng như tên gọi là cột, khi sử dụng thuộc tính này grid container sẽ chia cột cho các phần tử bên trong nó. Ở đây các bạn có thể chia bao nhiêu cột tùy các bạn, thường dựa vào design thiết kế là 12 cột bằng nhau, có khi 8….

Ví dụ ở đây mình có 10 phần tử, mình muốn chia mỗi cột có 2 phần tử thì mình sẽ chia cho 5 cột. Đơn vị ở đây các bạn có thể dùng px, %, em rem, auto hay gì tùy các bạn. Tuy nhiên ở đây có một giá trị mới chỉ dùng trong css grid đó là fr(fractional unit). Giá trị này mình sẽ giải thích ở một phần sau nha.

.container {
grid-template-columns: 20% 20% 20% 20% 20%;
}

.container {
grid-template-columns: 200px 300px 100px 50px auto;
}

.container {
grid-template-columns: 1fr 2fr 1fr 1fr 3fr;
}

Các bạn muốn chia bao nhiêu cột thì cứ điền vô thêm như thế này grid-template-columns: ct1 ct2 ct3.... ctN tương ứng grid-template-columns: 10px 100px 1fr auto... Đấy các bạn nên áp dụng thử xem để mau hiểu hơn nha, dùng cái Codepen của mình ở trên có note sẵn cho các bạn để điền vào thử rồi á chớ đọc không mà không làm là mù màu với nó đấy.

# fraction-unit

Đây là một giá trị mới và dùng trong CSS Grid nha các bạn. Giá trị này sẽ chiếm khoảng trống lớn nhất có thể để mình giải thích cho các bạn dễ hiểu nà. Giả sử container có độ rộng là 100% và lúc này grid-template-columns: 1fr thì sẽ tạo ra một cột là 100%. Nên các phần tử sẽ nằm cùng một cột như dưới đây

Tuy nhiên nếu mình thêm vài đơn v fr vào nữa lúc này sẽ là grid-template-columns: 1fr 2fr 1fr chẳng hạn thì layout nó sẽ tạo ra 3 cột với cột giữa là 2fr sẽ gấp đôi 2 cột còn lại. Nghĩa là container 100% sẽ chia cho 4 và cột đầu tiên và cột cuối cùng sẽ chiếm 25% còn 50% còn lại là cột ở giữa.

.container {
grid-template-columns: 1fr 2fr 1fr;
}

Các bạn có thấy nó quen quen không, khá là giống cái thuộc tính flex-grow trong css flexbox mình nói ở phần 3 của series css flexbox toàn tập ý. Khác cái là đây nó áp dụng cho grid và để chia cột nhá nên đừng hiểu nhầm nha.

# grid-template-rows

Cũng tương tự như grid-template-columns nhưng thuộc tính này là chia hàng(row). Các bạn có thể chia container thành nhiều hàng tùy vào thiết kế hoặc có thể không cần set, để tự động(auto) cũng được.

Các bạn thấy nó cũng khá đơn giản chứ nhỉ. Các bạn có thể tạo bao nhiêu hàng tùy ý và có thể dùng các đơn vị như ở thuộc tính grid-template-columns mà mình đã nói ở trên. Ở đây mình có 10 phần tử thì mình muốn chia thành 3 cột và 3 hàng thì nó sẽ như thế này

Tuy nhiên còn một phần tử cuối cùng nó không còn chỗ vì chia 3 cột 3 hàng thì được 9 phần tử thôi nên nó sẽ tự động rớt xuống tạo nên đường Implicit Tracks. Trong grid có 2 khái niệm về tracks đó là Implicit và Explicit, vậy nó là gì ? Các bạn kéo xuống dưới đọc để hiểu nha.

# grid implicit và explicit tracks

Hai đường này hơi lằng nhằng chút nhưng cũng dễ hiểu thôi thường khi làm mình không để ý lắm, nhưng viết bài thì mình phải nói rõ cho các bạn biết thêm. Như phần trên mình nói do có 10 phần tử, mà mình chỉ tạo 3 cột 3 hàng thì phần tử cuối sẽ rớt xuống tạo thành 1 hàng mới.

Các bạn mở giúp mình cái Codepen ở phần grid-template-rows lên bằng Firefox rồi F12 mở layout Grid lên được như hình trên. Các bạn zoom trình duyệt lên cho thấy rõ là có 1 đường đen ở trên cùng và những đường có dấu gạch ngang – cho tới một đường đen ở hàng số 4 đây chính là Explicit Tracks.

Còn một đường dấu … ở hàng số 5 đó là do container không đủ chỗ chứa cho phần tử số 10 nên nó rớt xuống tạo nên 1 hàng mới và tạo nên đường dấu… chứ không phải đen hay gạch ngang – như ở Explicit Tracks đây chính là Implicit Tracks.

Hai đường này giúp chúng ta nhận biết được vị trí của các phần tử để hiển thị cho đúng nha anh em. Để việc chia cột hay hàng trong layout được hiển thị chính xác nà.

# grid-auto-flow

Như ở trường hợp trên khi có một hoặc nhiều phần tử bị dư do không đủ cột hay hàng thì nó sẽ rớt xuống tạo nên hàng mới. Thì mình muốn set cho các phần tử bị rớt ra tạo nên Implicit Tracks có chiều cao nhất định nào đó. Chúng ta sẽ dùng thuộc tính grid-auto-flow: row kết hợp với thuộc tính grid-auto-rows để set cho các phần tử đó

Ở đây mình muốn cho phần tử số 10 khi rớt xuống tạo nên hàng mới có chiều cao là 100px thì mình set grid-auto-rows: 100px. Các bạn xem demo Codepen là sẽ hiểu ngay thôi.

Còn nếu các bạn muốn các cột đều nằm trên một hàng và tạo thành nhiều cột khác cho dù ban đầu bạn chỉ set có 2 cột mà thôi thì cũng tương tự chúng ta sử dụng thuộc tính grid-auto-flow: column nhưng giá trị là column.

Mình muốn các cột được tạo thêm đều bằng nhau và có giá trị là 250px thì mình sẽ code như thế này

.container {
grid-template-columns: 100px 200px; 
grid-auto-flow: column;
grid-auto-columns: 250px;
}

Nếu các bạn bỏ thuộc tính grid-template-columns ra thì nó cũng sẽ tự động tạo ra các cột tương ứng với số phần tử và độ rộng các cột là 250px.

# grid-gap

Thuộc tính này giúp chúng ta tạo khoảng cách giữa các phần tử với nhau theo cột và hàng. Thuộc tính này bao gồm thuộc tính grid-row-gap và grid-column-gap được viết như sau grid-gap: grid-row-gap grid-column-gap.

Các bạn có thể thấy hình minh họa dưới đây mình cho grid-gap: 20px. Nó sẽ tạo khoảng cách giữa các phần tử 20px theo cột và hàng luôn rất đều và đẹp

# Tạm kết

Phù!!! Bài viết tạm đến đây thôi. CSS Grid hại não lắm nên mình viết thành nhiều phần, đây mới chỉ là bước dạo đầu thôi các bạn ah. Đó mình học mãi mới hiểu được nó giờ thì hiểu tàm tạm rồi nên viết để chia sẻ cho các bạn.

Mình biết là nó hơi khó hiểu, các bạn chịu khó đọc và làm theo nha. Nếu không hiểu thì cứ comment hoặc inbox hỏi mình nhé. Nếu có góp ý hay gì thì comment cho mình phát để có động lực viết bài nha. Xin cám ơn và chúc các bạn một ngày tốt lành..

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

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

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

Hướng dẫn cài đặt docker registry server (private registry server)

Hướng dẫn cài đặt docker registry server (private registry server)

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Hướng dẫn cài đặt docker registry server (private registry server)

Registry là một server cho phép lưu trữ và phân phối các image docker. Registry là một phần mềm mã nguồn mở, có thể cài đặt qua docker.

  20 trường hợp sử dụng lệnh Docker cho developer
  Cách tạo một Docker đơn giản cho Node.JS

1. Cài đặt docker registry server

Chạy một docker container từ image registry:2

docker run -d --name registry -p 5000:5000 -v /data/registry:/var/lib/registry registry:2

Với câu lệnh trên mình thực hiện expose port 5000 trên container với port 5000 trên host; mapping folder /data/registry trên host với folder /var/lib/registry (các images được push lên server registry sẽ lưu tại folder này)

Hướng dẫn cài đặt docker registry server (private registry server)

Trên máy mình đang có một images ubuntu:18.04, Nếu chưa có thì bạn có thể pull về bằng lệnh:

docker pull ubuntu:18.04

Bây giờ mình sẽ đánh tag lại để push lên server registry vừa chạy.

docker image tag ubuntu:18.04 localhost:5000/ubuntu:18.04

trong đó localhost:5000 là địa chỉ registry server, ubuntu:18.04 là tên và tag mới của image (phần này các bạn đặt tùy ý)

Hướng dẫn cài đặt docker registry server (private registry server)

Thực hiện push image localhost:5000/ubuntu:18.04 lên server registry

Hướng dẫn cài đặt docker registry server (private registry server)

Để kiểm tra các image được lưu trên server registry ta truy cập vào url localhost:5000/v2/_catalog

Hướng dẫn cài đặt docker registry server (private registry server)

Bây giờ muốn sử dụng image trên server registry ta pull về như bình thường:

docker pull localhost:5000/ubuntu:18.04

Khi đó, hệ thông sẽ connect tới server registry ở địa chỉ localhost:5000 để lấy image chứ không lấy image từ docker repository.

Okay, Done!

References:

https://docs.docker.com/registry/
https://docs.docker.com/registry/deploying/
https://docs.docker.com/registry/spec/api/

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

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

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

jQuery là gì? Ứng dụng jQuery và ưu điểm nổi bật

jQuery là gì? Ứng dụng jQuery và các thư viện jQuery phổ biến nhất hiện nay ra sao?

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

Hầu hết các website đều không thể thiếu Javascript vì đây là thành phần quan trọng giúp tạo hiệu ứng riêng cho từng trang. Tuy nhiên, sự kết hợp giữa Javascript và CSS với những đoạn code dài dòng, phức tạp đã gây không ít rắc rối cho người dùng. Và jQuery được ra đời như một phương thức mới giúp đơn giản hóa mọi thao tác trên website. Vậy jQuery là gì? Ứng dụng jQuery và các thư viện jQuery phổ biến nhất hiện nay ra sao? Hãy cùng tìm hiểu ngay sau đây nhé.

  15 thư viện slider jquery miễn phí cho dự án website của bạn
  Hướng dẫn và sử dụng jquery plugin typing để giả hiệu ứng gõ văn bản

Xem thêm nhiều việc làm JQuery hấp dẫn trên TopDev

 jQuery là gì?

jQuery là một thuật ngữ được dùng rất nhiều trong thời đại công nghệ hiện nay. Kể từ khi phát triển 2.0, cụm từ này đã được dùng khá phổ biến. Vậy jQuery thật sự là gì? Nói một cách dễ hiểu, jQuery là một thư viện được xây dựng trên Javascript. Chúng được tạo ra mới mục đích hỗ trợ các lập trình viên giải quyết các khó khăn khi sử dụng Javascript. jQuery được tích hợp từ nhiều module chuyên biệt, bao gồm cả module hiệu ứng đến module truy vấn selector.

jQuery với phương châm ưu việt “ viết ít làm nhiều” đang rất phổ biến hiện nay

Đồng thời cũng có thể hiểu jQuery là một thư viện Javascript đa tính năng, nhanh chóng, tiện dụng. Thư viện này được tạo ra bởi John Resig vào năm 2006 với phương châm hoạt động vô cùng ưu việt: viết ít hơn – năng suất hơn. jQuery  đơn giản hóa các thao tác duyệt tài liệu HTML, tăng cường tương tác Ajax để có thể nâng cao tối đa hiệu quả phát triển website. Hiện nay công cụ hỗ trợ này được sử dụng vô cùng rộng rãi. Theo thống kê, có đến 99% các website trên thế giới sử dụng thư viện này, trừ những trang dùng JS Framework.

jQuery – một số tính năng quan trọng

  • Thao tác DOM: jQuery cho phép người dùng đơn giản hóa việc lựa chọn các phần tử DOM để duyệt như khi dùng CSS. Cùng với đó, người dùng cũng có thể sử dụng phương tiện selector mã nguồn mở để chỉnh sửa nội dung của chúng.
  • Xử lý sự kiện: thư viện jQuery xử lý các sự kiện một cách nhanh chóng chính xác và hiệu quả mà không làm HTML code rối với các Event Handler. Nhờ đó nâng cao khả năng tương tác với người dùng một cách tối đa.
  • Hỗ trợ AJAX: bằng việc sử dụng công nghệ AJAX, jQuery cho phép lập trình viên phát triển website với đa dạng các tính năng và phản hồi tích cực hơn.
  • Tạo hiệu ứng động: jQuery cho phép cung cấp đa dạng các hiệu ứng động đẹp mắt, độc đáo cho website, giúp trang trở nên sinh động và chuyên nghiệp hơn
  • Kích thước cực kỳ gọn nhẹ: thư viện này vô cùng gọn nhẹ, vì vậy chạy rất mượt và nhanh. jQuery chỉ có 19KB
  • Được hỗ trợ cho hầu hết các trình duyệt hiện nay: ứng dụng này làm việc cực tốt trên IE 6.0+, FF 2.0+, Safari 3.0+, Chrome và Opera 9.0+ và hầu như được hỗ trợ ở tất cả các trình duyệt khác.
  • Cập nhật và hỗ trợ các ứng dụng mới nhất: hỗ trợ CSS3 Selector và cú pháp XPath cơ bản giúp lập trình viên có thể tiếp cận với những công nghệ tân tiến nhất của thời đại khoa học – máy tính 4.0

Những cách sử dụng jQuery hiện nay

Có hai cách sử dụng jQuery phổ biến nhất hiện nay chính là cài đặt cục bộ và sử dụng từ CDN:

  • Cài đặt cục bộ: bạn có thể thư viện jQuery từ máy chủ và đưa vào hệ thống HTML. Lập trình theo cú pháp sau để có thể đưa jQuery vào HTML file:
<html> 
<head> 
<title>The jQuery Example</title> 
<script type="text/javascript" src="../jquery/jquery-2.1.3.min.js"></script> 
<script type="text/javascript">
  $(document).ready(function(){ 
     document.write("Xin chào bạn!"); 
  }); 
</script> 
</head> 
   <body> 
     <h1>Hello</h1> 
   </body> 
</html>
  • Sử dụng CDN: người dùng có thể tự thêm jQuery vào trong HTML code trực tiếp từ Content Delivery Network (CDN) một cách vô cùng đơn giản. Google và Microsoft đều cung cấp những phiên bản mới nhất để mang đến những tính năng đột phá. Chỉ cần nhập lệnh sau khi sử dụng CDN Google:
<html> 
<head> 
    <title>The jQuery Example</title> 
    <script type="text/javascript"    src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> 
    </script> 
    <script type="text/javascript">        $(document).ready(function(){ document.write("Xin chào bạn!"); }); 
    </script> 
</head> 
<body> 
    <h1>Hello</h1> 
</body> 
</html>

Với hai cách sử dụng trên, kết quả trả ra đều sẽ là “Xin chào bạn”

Cách để gọi một hàm thư viện jQuery

Trước khi sử dụng các đoạn code của jQuery để chỉnh sửa hoặc đọc DOM, cần đảm bảo thêm vào các sự kiện khi DOM đã sẵn sàng. Điều kiện sử dụng này cũng tương tự như JavaScript. Và để một sự kiện hoạt động tốt trên website, lập trình viên cần gọi tên chúng trong Hàm $(document).ready(). Các dữ liệu bên trong sẽ được tải lên trước khi nội dung trang được tải và khi DOM sẵn sàng

Những lý do lập trình viên nên sử dụng thư viện jQuery

Không phải ngẫu nhiên mà jQuery lại được sử dụng trong hầu hết các website trên thế giới. Thư viện lập trình này cho phép người dùng nâng cao tối đa khả năng tương tác và hoạt động của trang nhờ sở hữu những tính năng ưu việt:

  • jQuery rất nhanh và có khả năng mở rộng
  • Đơn giản hóa việc viết code. Giúp người dùng có thể viết các mã chức năng liên quan đến giao diện một cách dễ dàng
  • Cho phép các ứng dụng web tương thích với trình duyệt cùng phát triển.
  • Sử dụng hầu hết các tính năng hiện đại của các trình duyệt mới
  • Hỗ trợ trên hầu hết các trình duyệt

Trên đây là những kiến thức lập trình liên quan đến jQuery. Hy vọng các chia sẻ này có thể cung cấp đến quý bạn đọc những thông tin bổ ích.

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

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

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

MyBatis – Chim nhỏ nhưng làm được lâu!

MyBatis – Chim nhỏ nhưng làm được lâu!

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

1. MyBatis là gì?. Con chim ngáo ngơ này là gì?.

Nhìn logo thôi cũng thấy con chim này nóng tính vcl. Bé tẹo tèo teo nhưng thực ra võ nghệ đầy mình.

MyBatis là một persistence framework mã nguồn mở. Được tạo ra nhằm đơn giản hóa việc kết nối đến CSDL của JDBC. Ngoài ra nó còn cung cấp các API để giúp việc thao tác với Database được dễ dàng hơn.

Tất nhiên, để hiểu được về MyBatis, các bạn cần có một chút kiến thức về JDBC (Java Database Conectivity), hãy tham khảo bài viết này.

  Mybatis separator – tiện lợi và nguy hiểm
  Cài đặt MySQL Community Server trên macOS

2. Những ưu điểm nổi bật.

2.1 Viết code JDBC ít đi.

Thật sự đây là một trong những điểm mình thích nhất ở MyBatis. Nhớ trước đây làm 3 dựa án convert từ Database từ Oracle sang Postgres. Mở đống source sử dụng JDBC toàn cộng chuỗi String bằng “+”, nhìn vào thôi là chả muốn cơm nước gì nữa. Dự án như là cực hình, phải thật cố gắng mới kết thúc dự án được (rất may không lỗ).

JDBC-cong-chuoi-stringSử dụng “+” để tạo chuỗi String query, nỗi ám ảnh một thời của lập trình viên.

Trớ trêu thay, việc Concat String kiểu này lại chỉ là nỗi ám ảnh cho người maintanance code, chứ người phát triển dự án từ đâu lại không có vấn đề gì =))).

2.2 Dễ hiểu, dễ sử dụng.

Một khi đã nắm chắc kiến thức về SQL và Java, rất dễ dàng để sử dụng MyBatis. Ngoài một lượng lớn document, chỉ có một số ít kiến thức mới cần phải học thêm.

Có rất nhiều tài liệu viết về MyBatis rất dễ đọc.

2.3 Dễ tích hợp cho Spring và Guice framework

Mặc dù các dự án Spring thường được “đính kèm” sử dụng với Hibernate. Tuy nhiên, cả Eclipse và IntelliJ đều hỗ trợ cài đặt con chim ngáo ngơ như là một plugin. Không jar, không file download, rất tiện. Ngoài ra, việc thay đổi giữa các phiên bản cũng không quá khó khăn.

MyBatis install trên IntelliJ tương đối dễ dàng.Cài đặt MyBatis trên IntelliJ cũng như Eclipse tương đối dễ dàng.

2.4 Hiệu năng truy vấn cao (High perfomance)

Với cơ chế cache và polling connectionMyBatis cho hiệu năng truy vấn cao hơn hẳn so với JDBC. Tuy nhiên, khi thực hiện Select ở lần đầu tiên, JDBC vẫn chưa hề tìm ra đối thủ, nó chỉ hụt hơn do lần nào SELECT cũng phải gọi tới Database, tất nhiên không thể bằng lấy kết quả từ cache.

“Con chim của chúng ta” xem ra thực sự vượt trội khi thực hiện update và delete nhiều record.

Hiệu năng chính là vấn đề chính chúng ta tìm hiểu ở bài viết này. Có 3 yếu tố làm tăng perfomance, chi tiết sẽ có ngày sâu đây.

3. Performance (hiệu năng).

Vậy tại sao sử dụng mybatis lại làm tăng hiệu suất của hệ thống?. Có 3 yếu tố ảnh hưởng trực tiếp:

3.1 Hỗ trợ connection polling.

Đối với các biện chưa biết về polling có thể tham khảo thêm bài viết về http polling và connection pool. Bình thường mỗi request yêu cầu mở kết nối tới database sẽ được tạo connection riêng. Khi sử dụng Mybatis, với cơ chế polling (sau khi một kết nối được tạo và sử dụng xong nó sẽ không đóng lại mà sẽ duy trì trong connection pool để dùng lại cho lần sau và chỉ thực sự bị đóng khi hết thời gian timeout). Chính việc sử dụng polling đã giảm bớt đáng kể chi phí khởi tạo connection, qua đó tăng perfomance của application.

mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.Mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.
<environments default = "development">
<environment id = "development">
<transactionManager type = "JDBC"/> 
<dataSource type = "POOLED">
<property name = "driver" value = "com.mysql.jdbc.Driver"/>
<property name = "url" value = "jdbc:mysql://localhost:3306/details"/>
<property name = "username" value = "root"/>
<property name = "password" value = "password"/>
</dataSource> 
</environment>
</environments>

Cấu hình polling trong MyBatis tương đối đơn giản. Kiểu của dataSource chỉ cần thiết lập type = “POOLED”.

3.2 Sử dụng cache cho query trùng lặp.

Cùng xem xét ví dụ sau đây:

public static void main(String[] args) throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User firstSelectWithCache = mapper.selectByIdWithCache(216);
System.out.println("first query with cache:" + firstSelectWithCache.getUserName());
User secondSelectWithCache = mapper.selectByIdWithCache(216);
System.out.println("second query with cache:" + secondSelectWithCache.getUserName());
sqlSession.commit();
} catch (PersistenceException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}

Khi thực hiện, Mybatis sẽ chỉ thực hiện firstSelectWithCache. Tuy nhiên, khi gặp câu SQL thứ 2 giống hệt SQL1 và trong cùng sqlsession, nó sẽ lấy kết quả trực tiếp từ cache. Việc này tuy nhỏ, nhưng đối với những ứng dụng cần query dữ liệu nhiều lần, trùng lặp từ database, sử dụng Mybatis giúp tăng hiệu năng lên đáng kể.

  • The results of all queries are stored in the cache. Tất cả kết quả của queries đều được lưu vào cache.
  • End a transaction (or at the end of a query configured with autoCommit = true). Cache chỉ được xóa khi kết thúc transaction (hoặc khi query được thiết lập autoCommit = true).
  • Whenever an insert / update / delete query is made. Khi thực hiện các câu insert/ update/ delete.

Chi tiết hơn, Mybatis hỗ trợ 2 tầng cache. Thứ nhất là session cache, hai là global cache. Vấn đề này sẽ được tìm hiểu sâu hơn ở bài viết tiếp theo.

3.3 Không sử dụng proxy.

4. Kết luận.

Nếu câu query cần sử dụng nhiều điều kiện if else, hoặc cần for loop một dãy giá trị IN. Hiển nhiên MyBatis là lựa chọn tốt nhất.

5. Tham khảo.

  1. MyBatis cache.
  2. Connection Pool.
  3. MyBatis in Practice.
  4. Java Persistence with MyBatis 3.

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

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

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

Đọc, ghi, xóa, sửa dữ liệu MongoDB

Đọc, ghi, xóa, sửa dữ liệu MongoDB

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

Hệ quản trị CSDL MongoDB lưu trữ dữ liệu theo cấu trúc phân cấp:
database > collection >  document > field:value

1. Cặp field:value, có 4 ví dụ minh họa:
fullname: “Hoàng Thị Hồng Nhung”
birth_year: “1990”
email: “nhunghth@smartJob.vn”
group: [“van_phong”, “nhan_su”]

  MongoDB là gì? Cơ sở dữ liệu phi quan hệ
  MongoDB là gì? Định nghĩa đầy đủ và chi tiết nhất về MongoDB

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

2. document tuân thủ định dạng BSON (gần giống JSON), một document gồm một hay nhiều cặp field:value như đã trình bày ở trên.

Chúng ta bắt đầu các thao tác với dữ liệu:
Gõ Windows + R, gọi tiện ích Run.
Gõ cmd, gọi tiện ích dòng lệnh (command line).
Cần 2 cửa sổ cmd, một để khởi chạy MongoDB bằng lệnh

mongod

một cửa sổ cmd khác để khởi chạy MongoDB client bằng lệnh

mongo

CSDL test mặc định được gọi ra (sau khi cài đặt MongoDB thì đã có sẵn CSDL này).

Mẹo: Các thao tác thực hành sẽ sử dụng dòng lệnh nhiều, khi câu lệnh dài, khó nhớ, bạn bấm phím Tab để có gợi ý câu lệnh, có thể bấm phím Tab nhiều lần để xuất hiện câu lệnh mong muốn.

Hiển thị các database hiện có:

show dbs

Có nhiều database trong MongoDB, để sử dụng thao tác với database nào thì cần khai báo bằng lệnh

use tên_database  ví dụ

Để xóa database restaurants, gõ lệnh

db.dropDatabase()

TẠO MỚI CƠ SỞ DỮ LIỆU

Để tạo một Cơ sở dữ liệu hoàn toàn mới, bạn sử dụng câu lệnh insert vào một database chưa sẵn có:

use smartJob

Để chèn collection employee (collection này có một document) đầu tiên cho CSDL smartJob, sử dụng câu lệnh:

Chúng ta đã tạo mới CSDL smartJob có một collection đầu tiên, collection đầu tiên có một document. Kiểm tra bằng cách gõ lệnh

show dbs

Chúng ta sẽ thêm mới 2 document mới vào collection có tên employee (thuộc về CSDL smartJob)

Để xem dữ liệu nằm trong collection employee của CSDL smartJob, gõ lệnh

db.employee.find();

hoặc

db.employee.find().pretty();

phương thức pretty() sẽ giúp nội dung dễ đọc hơn do đã được tự động định dạng

Để cập nhật năm sinh cho nhân viên “Nguyen Thi La”, từ năm 1987 thành 1970, ta sử dụng câu lệnh:

Kiểm tra lại collection employee bằng câu lệnh

db.employee.find().pretty();

để thấy rằng năm sinh của nhân viên “Nguyen Thi La” đã được cập nhật thành 1970.

Đỗ Như Vý – Bài viết gốc được đăng tải tại smartjob.vn

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

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

Sự khác nhau giữa OpenID Connect và OAuth 2.0

Sự khác nhau giữa OpenID Connect và OAuth 2.0

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

Mình đã giới thiệu với các bạn về OAuth 2.0 và OAuth 2.0 chỉ là một framework liên quan đến Authorization, nghĩa là nó chỉ định nghĩa những resources nào mà một Client Application có thể sử dụng trong access token, để khi request tới Resource Server, Resource Server sẽ căn cứ vào access token để quyết định có cho phép Client Application access tới resource hay là không?

  Authorization Code grant type với Proof Key for Code Exchange (PKCE) trong OAuth 2.1
  Building Microservices Application - Phần 3: Xác thực API bằng Oauth 2.0

Thế nhưng nói về security, các bạn có thể biết, chúng ta còn có cả authentication và OpenID Connect là một extension của OAuth 2.0 được giới thiệu để bổ sung phần authentication này. Sử dụng OpenId Connect thì nội dung của access token mà Client Application sử dụng để request tới Resource Server sẽ bao gồm cả thông tin user đang grant quyền truy cập tới những resources này.

Trong OpenID Connect thì Authorization Server được gọi là Identity Provider. Identity Provider sẽ đảm nhận chức năng authentication và authorization.

Access token được issue bởi một Identity Provider như mình đã nói, sẽ chứa thông tin của authenticated user, những thông tin này gọi là Idenitity Token hay gọi tắt là ID token.

Dưới đây là nội dung của một access token mà mình đã decode sử dụng trang web https://jwt.io/:

{
"exp": 1625973312,
"iat": 1625973012,
"jti": "57e9401f-c98b-43a3-9b5e-eb7bff182a5f",
"iss": "http://localhost:8080/auth/realms/huongdanjava",
"aud": "account",
"sub": "8a5092fa-d815-4620-92ab-4ac87542685c",
"typ": "Bearer",
"azp": "angular-test",
"session_state": "0e044481-02e3-4962-adaa-0683c2c26fbf",
"acr": "1",
"realm_access": {
"roles": [
"offline_access",
"uma_authorization",
"default-roles-huongdanjava"
]
},
"resource_access": {
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
},
"scope": "email profile",
"email_verified": false,
"name": "Khanh Nguyen",
"preferred_username": "huongdanjava",
"locale": "en",
"given_name": "Khanh",
"family_name": "Nguyen",
"email": "huongdanjava.com@gmail.com"
}

Phần nội dung phía dưới claim ‘scope’, mà mình đánh dấu trong access token ở trên, chính là nội dung của ID token đó các bạn. Các bạn có thể thấy đây là những thông tin về user đã đăng nhập và grant access cho Client Application. Các bạn có thể xem thông tin những standard claims của ID token tại đây.

Các open source Identity and Access Management hiện nay ví dụ như Keycloak đều hiện thực OpenID Connect luôn chứ không chỉ OAuth 2.0.

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 IT hấp dẫn trên TopDev

Tìm hiểu về tiến trình Superfetch (Sysmain) trên Windows

Tìm hiểu về tiến trình Superfetch (Sysmain) trên Windows

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

Ngoài có sự thay đổi gần như hoàn toàn về giao diện người dùng so với Windows 7 thì Windows 10 cũng nhận được rất nhiều cải tiến về tính năng, hiệu năng và sự ổn định của toàn hệ thống trong suốt quá trình sử dụng và làm việc của người dùng chúng ta.

Nhưng đó là trên những chiếc máy tính với cấu hình tầm trung và có sử dụng ổ cứng SSD, còn với số còn lại, cụ thể là những máy tính cấu hình thấp, sử dụng ổ cứng HHD thì thực sự, Windows 10 đúng là một cơn ác mộng ◔◡◔

  Giải mã bí ẩn "system load" trên Linux
  Giới thiệu về Java Module System

Những chiếc máy tính cũ sử dụng hệ điều hành Windows 7 khi nâng cấp lên Windows 10 thì hiệu năng sẽ bị giảm sút rõ rệt, thường xuyên bị treo, đơ và Full disk 100% trong quá trình sử dụng. Thậm chí tình trạng này còn xảy ra ngay cả khi vừa mới khởi động vào hệ thống.

Để khắc phục được điều này, các bạn phải áp dụng rất nhiều thủ thuật để tối ưu hiệu năng Windows 10, và trên Blog thì admin cũng đã chia sẻ với chúng ta một bài viết rất hay, bạn có thể tham khảo lại tại đây nhé !

tim-hieu-ve-tien-trinh-he-thong-superfetch-tren-windows (1)

Nguyên nhân gây ra vấn đề này thì có rất nhiều, nhưng phổ biến và được các bạn biết đến nhiều nhất có lẽ là dịch vụ Superfetch.

Vậy Superfetch là gì? và tại sao nó lại gây ra tình trạng giật lag và treo máy đối với các máy tính đời cũ có sử dụng hệ điều hành Windows 10?

Câu hỏi đó cũng chính là nội dung mà mình muốn chia sẻ với các bạn ngày hôm nay. Vâng, bài viết này chúng ta sẽ cùng tìm hiểu kỹ hơn về tiến trình Superfetch trên hệ điều hành Windows.

#1. Tiến trình Superfetch trên Windows là gì ?

Superfetch thực tế đã xuất hiện từ lâu, mình nhớ không nhầm thì có từ phiên bản Windows Vista nhưng mãi tới phiên bản Windows 10 thì nó mới được chú ý…

Đơn giản vì nó là một trong những nguyên nhân gây ra lỗi Full Disk 100% cho các máy tính sử dụng ổ cứng HDD truyền thống.

Theo như Microsoft, Superfetch có tác dụng duy trì và cải thiện hiệu năng của hệ thống theo thời gian sử dụng nên khó có thể thấy được hiệu năng thực sự của nó trong thực tế.

Thay vào đó, chúng ta thường có thói quen tắt hẳn dịch vụ này đi ngay sau khi cài đặt Windows 10.

Kể từ phiên bản cập nhật Windows 10 version 1803 trở đi, có lẽ tiến trình này bị người dùng tắt nhiều quá nên Superfetch đã được Microsoft đổi tên thành Sysmain để người dùng không tìm thấy Superfetch mà tắt nữa 😛

Bố ông kễnh Microsoft 🙂

Superfetch khi hoạt động sẽ luôn chạy nền (chạy ngầm) trong suốt quá trình bạn sử dụng máy tính và từ từ phân tích dữ liệu sử dụng RAM và các ứng dụng bạn thường xuyên sử dụng nhất.

Qua nhiều lần phân tích, các ứng dụng đó sẽ được phân loại thành “thường xuyên sử dụng” và được ưu tiên tải trước dữ liệu vào bộ nhớ RAM để cải thiện hiệu năng.

Từ đó, mỗi khi bạn khởi động những ứng dụng này, nó sẽ load nhanh hơn rất nhiều vì tất cả dữ liệu cần thiết đã được tải sẵn vào bộ nhớ RAM, mà tốc độ của RAM nhanh cỡ nào thì bạn biết rồi đó 😀

tim-hieu-ve-tien-trinh-he-thong-superfetch-tren-windows (2)

Mặc định thì Superfetch sẽ có xu hướng chiếm hết những phần bộ nhớ còn trống mà Windows chưa sử dụng đến để lưu dữ liệu ứng dụng.

Nhưng ngay khi hệ thống cần, chẳng hạn như để tải dữ liệu của ứng dụng khác thì tất cả dung lượng bộ nhớ RAM mà Superfetch đang chiếm sẽ được nó giải phóng ngay nếu cần.

Trên Windows cũng có một tính năng tương tự như Superfetch có tên là Prefetch và có thể coi Superfetch là một sự kế thừa của Prefetch.

Khác biệt là ở chỗ, Prefetch không thực hiện phân tích dữ liệu sử dụng theo thời gian và điều chỉnh các thông số tải trước dữ liệu một cách hợp lý mà thôi.

#2. Superfetch có thực sự cần thiết với PC Windows?

Đa số chúng ta đều sẽ tắt dịch vụ Superfetch đi vì cho rằng nó là nguyên nhân chính gây ra lỗi Full Disk cực kỳ khó chịu cho các máy tính sử dụng ổ cứng HDD. Nhưng trong thực tế, Superfetch thực sự rất hữu dụng đối với quá trình hoạt động của Windows 10.

Và như bạn có thể thấy ở hình bên trên, nếu bạn có một chiếc máy tính với cấu hình tầm trung hay cùi cùi giống mình cũng được, và có sử dụng ổ cứng SSD thì Superfetch hoạt động cực kỳ trơn tru mà đến nỗi bạn cũng chẳng nhận ra sự tồn tại của nó nữa.

Ở trạng thái bình thường, nó chỉ sử dụng 1.1 MB RAM và hầu như không động chạm đến các tài nguyên khác của hệ thống như CPU, ổ cứng, mạng và GPU.

tim-hieu-ve-tien-trinh-he-thong-superfetch-tren-windows (3)

Tuy nhiên, vẫn có một vài vấn đề mà bạn sẽ gặp phải khi Superfetch được kích hoạt trên Windows 10:

1/ Vì Superfetch luôn chạy nền nên thỉnh thoảng nó sẽ ngốn rất nhiều RAM và tài nguyên hệ thống gây giật lag trong quá trình sử dụng, tất nhiên điều này rất ít khi xảy ra với ổ SSD và dung lượng RAM >4GB.

2/ Việc tải trước một lượng lớn dữ liệu ứng dụng từ ổ cứng HDD vào RAM cũng sẽ khiến cho quá trình khởi động bị chậm đi đáng kể, vì tốc độ của ổ HDD rất chậm.

Và đồng thời, đây cũng chính là nguyên nhân gây ra lỗi Full Disk 100% làm cho máy tính bị đơ trong một thời gian ngắn sau khi khởi động xong, vậy nên cách khắc phục mà đa số mọi người chọn lựa sẽ là tắt hẳn Superfetch đi như các bạn đã biết rồi.

3/ Thêm vào đó, nếu bạn đang sử dụng Windows 10 với ổ cứng SSD thì gần như sẽ không nhận thấy được những sự khác biệt về hiệu năng mà Superfetch mang lại, vì tốc độ của SSD đã rất nhanh rồi, việc tải trước dữ liệu là điều không cần thiết nữa.

Ngoài ra, Superfetch cũng có thể gây ra tình trạng giật lag khi chúng ta chiến game, đặc biệt là với các máy tính chỉ có 4GB hoặc ít hơn.

Lý do thì đến hiện tại vẫn chưa được tìm ra vì không phải tất cả chúng đều gặp hiện tượng này, nhưng tình trạng này có liên quan tới các game “ngốn RAM” vì các tựa game này liên tục yêu cầu thêm RAM khiến dịch vụ Superfetch phải tải rồi lại giải phóng dữ liệu khỏi RAM liên tục và liên tục.

Vậy tóm lại, Superfetch có ích như vậy thì tắt nó đi có làm sao không ? Có ảnh hưởng gì không ? Câu trả lời là: Không, sẽ không có ảnh hưởng gì tới Windows 10 của bạn nếu Superfetch bị tắt.

Trong trường hợp máy tính hoạt động trơn tru và không gặp những vấn đề mà mình kể trên thì cứ để như vậy, không cần phải tắt Superfetch đâu nha các bạn.

Nếu bạn vẫn thường xuyên gặp tình trạng Full Disk 100%, chiếm rất nhiều bộ nhớ RAM và hiệu năng tổng thể bị giảm khi chạy các tác vụ cần nhiều RAM thì việc tắt Superfetch sẽ giúp khắc phục được phần nào. Còn không hãy bật lại dịch vụ này trên Windows 10.

#3. Lời kết

Như vậy là mình và các bạn đã vừa tìm hiểu xong về dịch vụ Superfetch hay còn gọi là Sysmain trong các phiên bản cập nhật mới của Windows 10, một dịch vụ hệ thống mà có lẽ đã quá quen thuộc với nhiều bạn trên Blog Chia Sẻ Kiến Thức rồi 🙂

Hy vọng là qua bài viết này các bạn sẽ hiểu hơn về tiến trình Superfetch (Sysmain), cũng như là ý nghĩa thực sự của Superfetch và có nên tắt dịch vụ Superfetch (Sysmain) hay không?

Nếu thấy bài viết này hay và hữu ích thì đừng quên chia sẻ nó để ủng hộ cho Blog nha các bạn. Chúc các bạn thành công !

CTV: Nguyễn Thanh Tùng – Bài viết gốc tại blogchiasekienthuc.com

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

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

Những điểm mới của Java 8 (phần 4: DateTime API)

Những điểm mới của Java 8 (phần 4: DateTime API)

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

Trước khi phát hành Java 8, lập trình viên Java phàn nàn nhiều về API xử lý thời gian. Nhiều class, method DateTime API cũ đã được đánh dấu bằng annotation @Deprecated (“Bị phản đối”). Các class, method xử lý thời gian cũ vẫn dùng được (để đảm bảo tính tương thích ngược của JDK) tuy nhiên không khuyến khích sử dụng.

Tuyển dụng Java lương cao cho bạn

  Các trường hợp kiểm thử cho trường nhập Ngày tháng năm (Date field)
  Date & Time trong Python

Trước Java 8, lập trình viên Java xử lý các bài toán thời gian phức tạp, cần sự chính xác thì dùng thư viện nào? Dùng thư viện Joda-time [2]. Hiện nay, với JDK 8 [3], DateTime API mới mang đến sự đơn giản và mạnh mẽ.

Các class mới trong package java.time.*

java.time.Clock: Đồng hồ xử lý thời gian, ngày, giờ có xét đến múi giờ (time-zone)
java.time.Duration: Xử lý dựa trên thời lượng của thời gian (ví dụ: Thời lượng 42.3 giây)
java.time.Instant: Điểm thời gian trên Lịch biểu
LocalDate: Thời gian địa phương (tính theo múi giờ), tuân theo hệ thống lịch quy chuẩn ISO-8601, ví dụ: 2016-02-02
v.v..

Ví dụ minh họa tính linh hoạt, dễ dùng của DateTime API mới

Nguyên nhân gây ra giây nhuận (leap second) là do Trái Đất quay với tốc độ không đều dẫn đến lệch giờ đồng hồ đo chuẩn của con người và giờ tính theo bóng nắng mặt trời. Các nhà khoa học sử dụng “giây nhuận” để đồng bộ và chính xác hóa thời gian ( https://en.wikipedia.org/wiki/Leap_second#Slowing_rotation_of_the_Earth ). Sự chính xác của thời gian là quan trọng, sự cố Y2K (Year 2000) từng xảy ra là do vấn đề thời gian trong các hệ thống máy tính.

Liên kết nhắc đến trong bài viết

[1] https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html
https://blogs.oracle.com/java-platform-group/entry/the_2015_leap_second_s
[2] http://www.joda.org/joda-time/
[3] https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

Tải về mã nguồn sử dụng trong bài viết: DateTimeAPI
hoặc clone/fork từ Github: https://github.com/SmartJobVN/java8

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

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

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

Todo List: Tạo bản ghi trong database thông qua Laravel Model

Todo List: Tạo bản ghi trong database thông qua Laravel Model

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

Có vẻ chúng ta thực hiện hơi ngược quy trình viết code cho ứng dung Todo List, nếu chúng ta thực hiện việc tạo từng bản ghi Todo trước thì không cần đến tạo dữ liệu mẫu cho hiển thị danh sách Todo và chi tiết từng Todo. Bố cục chương trình Khóa học Laravel cơ bản qua ứng dụng Todo List muốn nhắm đến các khái niệm cơ bản về Laravel, do đó theo bố cục này bạn sẽ được học nhiều hơn. Thứ hai, viết code như chúng ta làm từ đầu đến giờ giống với các bước mà người dùng sẽ sử dụng ứng dụng hơn.

  "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"
  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Hiển thị form tạo bản ghi mới trong database

Các bước thực hiện rất đơn giản, nhưng trước khi thực hiện code, bạn hãy cùng tôi đúc kết ra quy trình tạo một chức năng mới trong ứng dụng Todo List. Đa số trong chúng ta đều muốn nhanh chóng đi đến đích, nhưng đó không phải là cách nhanh nhất. Đôi khi dừng lại, đúc kết kinh nghiệm để lần sau khi gặp lại có thể tăng tốc độ gấp đôi, gấp ba mới là cách hiệu quả.

Các bước tạo ra một chức năng mới trong Todo List

  1. URL: Nghĩ ra định dạng đường dẫn đến trang mới (chức năng mới), đăng ký với Laravel Route (routes/web.php).
  2. Xử lý nghiệp vụ: Trong bước đăng ký ở trên, để xử lý đường dẫn này sẽ là một phương thức nào đó trong TodosController. Tạo phương thức này và viết code xử lý nghiệp vụ như tương tác với database, thực hiện một hành động…
  3. Hành động kết thúc: Hành động kết thúc có thể là trả về một view, chuyển hướng đến một trang… Nếu View không tồn tại, chúng ta cần tạo ra view này.

Chúng ta đã áp dụng quy trình 3 bước này với việc tạo ra trang danh sách công việc (view index) và cả với trang thông tin chi tiết công việc (view show). Hôm nay, chúng ta sẽ áp dụng để xây dựng trang tạo ra công việc mới trong database, dự định đường dẫn sẽ là http://localhost:8000/new-todos.

Bước 1: Đăng ký URL vào Route

Mở file routes/web.php thêm vào định nghĩa cho URL mới.

Route::get('new-todos', 'TodosController@create');

Bước 2: Xử lý nghiệp vụ trong Controller

Thực hiện tạo ra phương thức create() trong TodosController (nằm trong thư mục app/Http/Controllers).

public function create()
{

}

Ở tình huống này chúng ta chưa cần xử lý gì nên để trống.

Bước 3: Xây dựng View

Phương thức create() sẽ trả về một View hiển thị form nhập liệu cho công việc cần làm (Todo).

public function create()
{
    return view('todos.create');
}

View ‘todos.create’ chưa có nên thực hiện tạo ra resources/views/todos/create.blade.php:

@extends('layouts.app')

@section('content')
    <h1 class="text-center my-5">Create Todos</h1>

    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card card-default">
                <div class="card-header">Create new todo</div>
                <div class="card-body">
                    <form action="/store-todos" method="POST">
                        @csrf
                        <div class="form-group">
                            <input type="text" class="form-control" placeholder="Name" name="name">
                        </div>
                        <div class="form-group">
                            <textarea name="description" placeholder="Description" cols="5" rows="5" class="form-control"></textarea>
                        </div>
                        <div class="form-group text-center">
                            <button type="submit" class="btn btn-success">Create Todo</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
@endsection

Đầu tiên, thực hiện “kế thừa” bố cục chung ứng dụng bằng câu lệnh @extends(‘layouts.app’). Tiếp theo chúng ta có một form để nhập liệu Todo. Form này có phương thức gửi dữ liệu là POST và gửi về đường dẫn /store-todos (đầy đủ là http://localhost:8000/store-todos). Trong form này có một câu lệnh @csrf, nó để phục vụ cho việc gì, nếu không có nó được không?

CSRF viết tắt của Cross-Site Request Forgery là một dạng tấn công tiềm ẩn nhiều nguy hại. Hacker có thể lợi dụng kiểu tấn công này để thực hiện các hành động trong Form nhập liệu với một người dùng đã xác thực, do vậy để ngăn chặn người ta sử dụng một token (một chuỗi mã) giữa máy chủ và trình duyệt để đảm bảo chỉ có form nhập liệu nào chứa token này mới là do máy chủ web sinh ra và an toàn.

Laravel giúp phòng chống tấn công CSRF dễ dàng, nó tự động sinh ra một token cho mỗi session người dùng và được quản lý bởi ứng dụng. Token này giúp kiểm tra xem người dùng được xác thực và có thể tạo ra các yêu cầu đến ứng dụng. Khi viết code form nhập liệu chúng ta chỉ cần sử dụng câu lệnh Blade @csrf là nó tự động sinh ra trường token cho chúng ta.

Thử thực hiện đường dẫn http://localhost:8000/new-todos trên trình duyệt chúng ta có một form nhập liệu Todo mới.

Màn hình tạo Todo mới

Xử lý dữ liệu từ form nhập liệu

Phần trên đây, chúng ta đã hoàn thành được 1/2 công việc của tạo bản ghi mới, phần còn lại chúng ta cần xử lý dữ liệu gửi từ form và lưu vào CSDL. Vậy tại sao có Quy trình 3 bước tạo một chức năng ở trên, nó sử dụng để tạo ra một chức năng vậy tại sao chưa hoàn thành. Câu trả lời là quy trình này áp dụng cho một chu trình khép kín từ user -> server -> user.

Thật vậy, user thực hiện đường dẫn /news-todos -> server xử lý -> trả về trang (view) tạo todo cho user. Như vậy với 1/2 công việc còn lại chúng ta sẽ lại áp dụng tiếp Quy trình 3 bước.

Bước 1: Đăng ký URL

Form nhập liệu ở phần trên gửi dữ liệu đến đường dẫn /store-todos với phương thức gửi là POST. Việc gửi dữ liệu này cũng bắt nguồn từ user. Chúng ta đăng ký URL này vào routes/web.php:

Route::post('/store-todos', 'TodosController@store');

Do phương thức yêu cầu là POST nên chúng ta sử dụng static function post() trên class Route. Cú pháp bên trong vẫn giống như chúng ta đăng ký URL trước đây.

Bước 2: Xử lý nghiệp vụ trong Controller

Trong TodosController chúng ta sẽ tạo ra phương thức store() với nội dung:

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store()
{
    $data = request()->all();

    $todo = new Todo();
    $todo->name = $data['name'];
    $todo->description = $data['description'];
    $todo->completed = false;

    $todo->save();

    return redirect('/todos');
}

Trong phương thức store ở trên, đầu tiên thực hiện lấy tất cả dữ liệu được gửi đến từ form thông qua Laravel Request với phương thức all(). Tiếp đó, tạo một Model Todo và thiết lập dữ liệu có được từ form nhập liệu, lưu trữ xuống database. Cuối cùng là chuyển hướng người dùng về trang danh sách todos.

Bước 3: Hành động kết thúc

Ở đây sau khi lưu dữ liệu xong chúng ta chuyển hướng người dùng về trang danh sách todos cũng giống như trả về view index, tuy nhiên nếu trả về view chúng ta phải thực hiện thêm việc lấy danh sách view mà công việc này đã làm trong trang danh sách todos do đó chúng ta chuyển hướng về trang này.

Kết luận

Qua bài học hôm nay, chúng ta đã đúc kết được cách tạo một chức năng mới trong ứng dụng thông qua một Quy trình 3 bước. Các bạn hãy thực hiện lại các đoạn code trong bài học để nắm vững và hiểu rõ hơn các khái niệm, hẹn gặp lại trong bài học tiếp theo.

Source code: Bài 11 – Tạo bản ghi trong database

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

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

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

Kiến trúc Model-View-Presenter

kiến trúc Model-View-Controller

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

Trong bài viết trước, chúng ta đã khảo sát mô hình kiến trúc Model-View-Controller, Kiến trúc MVP chúng ta sẽ bàn dưới đây cũng dựa trên tư tưởng cơ bản của MVC nhưng với cách tiếp cận khác nhằm mục đích khắc phục các khuyết điểm đã có.

  ASP.NET MVC5 #3: Thêm mới View
  Database migration sử dụng Liquibase với Spring MVC

1. MẪU KIẾN TRÚC DOLPHIN SMALLTALK MODEL-VIEW-PRESENTER

TỔNG QUAN

Mẫu kiến trúc Dolphin Smalltalk Model-View-Presenter chia ứng dụng thành các phần dữ liệu (data), trình bày (presentation) và các xử lý logic thuộc phần trình bày (presentation logic) thành những thành phần riêng biệt.

LỊCH SỬ

Phiên bản Dolphin Smalltalk Model-View-Presenter (gọi tắt là Dolphin MVP) là phiên bản của MVP được xây dựng dựa trên phiên bản Taligent MVP xuất hiện trước đó. Dolphin MVP được xây dựng về cơ bản bên ngoài tương tự như MVC cổ điển nhưng khác nhau ở vai trò của Controller và Presenter.

CẤU TRÚC

CÁC THÀNH PHẦN

Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic).

View là thành phần đảm nhận trình bày từ những dữ liệu của Model. View bao gồm những gì thể hiện trên màn hình như các control, form, widget,…

Presenter là thành phần đảm nhận các xử lý về trình bày mà nó cần đến sự tương tác trên dữ liệu.

PHỐI HỢP CÁC THÀNH PHẦN

Trong khi vai trò của Model không thay đổi so với MVC cổ điển. Thành phần View của Dolphin MVP cũng thực hiện việc trình bày từ nội dung của Model và gắn kết với Model thông qua Observer Pattern. Tuy nhiên, nó thực hiện bắt các sự kiện xảy ra ngay bên trong nó. Một vài trường hợp đơn giản như TextView, dữ liệu nhập được xử lý trực tiếp và cập nhật thay đổi trực tiếp vào Model còn hầu hết các trường hợp khác, việc xử lý được chuyển giao cho Presenter đảm trách khi cần thao tác đến Model.

Trong khi View đảm nhận trình bày thì Presenter đảm trách cách Model được thao tác và thay đổi như thế nào bởi giao diện người dùng. Presenter là nơi chứa các xử lý đặc trưng của ứng dụng (application logic so với business logic của Model). Một điểm đáng chú ý khác là Presenter có khả năng thao tác trực tiếp lên View mà nó gắn kết, điều này khác biệt với phiên bản Taligent MVP xuất hiện trước đó.

SO SÁNH DOLPHIN MVP VÀ MVC CỔ ĐIỂN

Điểm khác biệt cơ bản của Dolphin MVP và MVC cổ điển là sự khác nhau về vai trò của Presenter và Controller, nó cũng dẫn đến sự khác nhau về vai trò giữa hai thành phần View. Trong Dolphin MVP, sự hiện diện của Controller bị loại bỏ, thay vào đó, việc xử lý các dữ liệu input được View đảm nhận và được chuyển cho Presenter khi có yêu cầu tương tác đến Model.

MẪU KIẾN TRÚC MVP CỦA MARTIN FOWLER

TÓM TẮT

Martin Fowler là một trong những người đâu tiên đi sâu và nghiên cứu về các phiên bản của MVP. Vào năm 2006, Fowler tuyên bố sự kết thúc của các kiến trúc MVP cổ điển và tự chia MVP thành hai phiên bản mới là Passive View và Supervising Controller.

Martin Fowler dùng thuật ngữ Controller thay vì Presenter trong mẫu của mình

Trong mẫu Passive View, thành phần View được loại bỏ hoàn toàn các xử lý logic và tương tác đến Model. Thay vì vậy, nó chuyển giao các xử lý cho Controller đảm trách. Controller đảm nhận tương tác đến Model và cập nhật View khi có thay đổi từ Model. Controller là thành phần trung gian liên lạc giữa View và Model.

Trong mẫu Supervising Controller, View đầu tiên bắt lấy các sự kiện và sau đó chuyển giao cho controller xử lý. Để cập nhật thay đổi từ Model, View dùng data-binding và Observer pattern cho các xử lý đơn giản còn đối với các xử lý phức tạp sẽ nhờ đến Controller đảm nhận.

So với Supervising Controller chứa View đảm nhận xử lý sự kiện đơn giản thì với Passive View, thành phần View được tách rời hoàn toàn khỏi các xử lý, kể cả các xử lý cơ bản ở mức giao diện cũng được giao hoàn toàn cho Presenter xử lý. Điều này tạo thuận lợi hơn cho việc testing vì khi đó các thành phần Model và Presenter có thể được kiểm tra một cách độc lập mà không phụ thuộc vào giao diện. Phiên bản MVP của Microsoft đầu tiên được xây dựng dựa trên Passive View sau đó mẫu Supervising Controller cũng được hỗ trợ với một số điều chỉnh.

PHIÊN BẢN MVP CỦA MICROSOFT

LỊCH SỬ

Khởi đầu từ các framework Smart Client Software Factory and Web Client Software Factory dựa trên kiến trúc MVP được các nhóm nghiên cứu về pattern của Microsoft tạo ra từ năm 2006, Microsoft sau đó bắt đầu đưa MVP vào các tài liệu hướng dẫn và ví dụ về lập trình giao diện trong .NET framework. Mô tả dưới đây dựa trên phiên bản MVP được mô tả trong tạp chí MSDN vào năm 2006 (tham khảo 2) và có thể xem là kiến trúc cơ bản cho các framework trên. Ngoài ra, còn có một số framework MVP khác cũng được phát triển trên nền tảng .NET như MVC# hay NMVP.

Xin lưu ý là phiên bản cũ của Web Client Software Factory ban đầu được tổ chức dựa trên Passive View (cấu trúc bên dưới) nhưng với phiên bản hiện tại thì cấu trúc dựa trên Supervising Controller cũng được hỗ trợ.

CẤU TRÚC

CÁC THÀNH PHẦN

Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic).

View là thành phần đảm nhận trình bày từ những dữ liệu của Model và là tổng hợp của các form, control được sử dụng.

Presenter là thành phần đảm nhận các xử lý về trình bày cũng như tương tác đến dữ liệu bên dưới và có thể tương tác để thay đổi View trong quá trình xử lý.

PHỐI HỢP CÁC THÀNH PHẦN

Mẫu kiến trúc MVP của Microsoft tương tự như Passive View nhưng nó bổ sung thêm ràng buộc là các Presenter chỉ có thể truy cập đến View thông qua các interface IView. Điều này giúp Presenter không phụ thuộc đến cài đặt cụ thể của View và có thể dễ dàng test Presenter một cách độc lập. Điều này đạt được do sử dụng IView, chúng ta có thể dùng kĩ thuật “Mock” để thay thế các xử lý cụ thể của View khi test Presenter. Ngoài ra, mối quan hệ giữa Presenter và Model là quan hệ một chiều (chiều còn lại là gián tiếp). Hệ quả của các liên kết là chúng ta có một mô hình đa lớp (multi-layer) như cấu trúc ở trên theo ý nghĩa các thành phần ở một layer chỉ phụ thuộc và sử dụng các thành phần ở layer ngay bên dưới nó.

Theo mẫu Microsoft MVP, khi một View gắn liền với một interface IView. Khi View được tạo ra, nó tạo ra một đối tượng private Presenter và gắn nó vào đối tượng này thông qua IView. Khi một sự kiện xảy ra, View bắt lấy và sau đó kích hoạt một phương thức của Presenter mà sau đó, nó có thể tương tác với Model. Một số sự kiện như bắt đầu hiển thị và đóng của View cũng được gửi tới để Presenter kích hoạt một số phương thức tương ứng, điều này giúp cho một số công việc như khởi tạo và giải phóng dữ liệu cho View được dễ dàng hơn.

Model theo Microsoft MVP cũng thường được tổ chức bổ sung một lớp Service nằm bên trên để tương tác với Presenter, qua đó giảm bớt sự phụ thuộc đến các xử lý data nằm sâu bên dưới. Ngoài ra, để điều khiển việc liên lạc giữa các View hay các Presenter, một thành phần thường được bổ sung gọi là Application Controller. Trong một ứng dụng có thể có nhiều Application Controller để quản lý các nhóm MVP. Ngoài ra, thay vì sử dụng Presenter để tương tác với Model, một cách là giao tất cả các thao tác này cho Application Controller đảm trách.

MỘT VÍ DỤ MINH HỌA ĐƠN GIẢN

Để minh họa mẫu Microsoft MVP, chúng ta sẽ cùng khảo sát một ví dụ đơn giản: tạo một form hiển thị danh sách sinh viên cùng chức năng thêm mới trên danh sách sinh viên đó. Với mục tiêu là minh họa cách tổ chức và liên kết giữa các thành phần là chủ yếu, chúng ta không đi sâu vào cài đặt cụ thể (bạn có thể tham khảo source code đi kèm bài viết, source code được tổ chức ở dạng project của VS 2008).

Ứng dụng được tổ chức thành 5 project: View, Presenter, DataService, Model và DataTransferObject. Trong đó, View là application còn các project khác là library. Các project phụ thuộc lẫn nhau theo thứ tự project phía trước sử dụng trực tiếp project phía sau, ngoại trừ DataTransferObject chức các loại dữ liệu được dùng chung cho 3 project View, Preseneter và DataService. Model là project chứa các tương tác trực tiếp đến dữ liệu và không phụ thuộc vào bất cứ thành phần nào khác.

GIẢI THÍCH CÁC PROJECT:

  • Model: chứa dữ liệu giả lập (StudentData.xml), schema (StudentDataSet.xsd) và lớp tiện ích được xây dựng bên trên (DataAccess.cs).
  • DataTransferObject: chứa đối tượng dữ liệu được dùng chung cho các project ở mức cao hơn (Student.cs).
  • DataService: được xây dựng bên trên Model, chuyển đổi dữ liệu từ Model sang DataTransferObject và xây dựng các tiện ích bên trên đối tượng transfer này (Service.cs).
  • Presenter: chứa interface của View dùng cho Presenter truy cập (IViewForm) và lớp Presenter (StudentPresenter).
  • View: chứa form view (ViewForm.cs) và Program.cs.

Trong bài viết khác, chúng ta sẽ tìm hiểu phương pháp TDD (Test-driven development) và ứng dụng nó để phát triển ứng dụng theo mẫu Microsoft MVP trong môi trường .NET.

TÀI LIỆU THAM KHẢO:

  1. Martin Fowler, GUI Architectures
  2. Jean-Paul Boodhoo , Design Patterns: Model-View-Presenter
  3. Buschmann F., Meunier R., Rohnert H. & Sommerlad P. & Stal M. (1996). Pattern-Oriented Software Architecture: A System of Patterns.
  4. Martin Fowler , Patterns of Enterprise Application Architecture.
  5. http://en.wikipedia.org/wiki/Model_View_Presenter
  6. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
  7. Derek Greer, Interactive application architecture patterns
  8. Views Testability Guidance
  9. Dolphin MVP paper

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:

http://aptech.fpt.edu.vn/chitiet.php?id=2631

Tổng hợp bởi edwardthienhoang

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

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

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