Python – Fullstack Station https://fullstackstation.com Hướng dẫn lập trình, thiết kế, lập trình web, thiết kế web, lập trình javascript, lập trình fullstack từ cơ bản đến nâng cao Sun, 05 May 2024 01:08:00 +0000 vi hourly 1 https://wordpress.org/?v=6.4.5 https://fullstackstation.com/wp-content/uploads/2019/08/favicon.ico Python – Fullstack Station https://fullstackstation.com 32 32 Python: Sự cần thiết của MyPy https://fullstackstation.com/gioi-thieu-mypy-python/ https://fullstackstation.com/gioi-thieu-mypy-python/#respond Wed, 24 Apr 2024 08:24:43 +0000 https://fullstackstation.com/?p=1948 Nhân việc người tạo ra Python, ông Guido van Rossum giới thiệu về MyPy, mình sẽ nói kỹ thêm về sự hữu dụng và sự cần thiết của MyPy trong lập trình Python. Bạn có thể tải về slide của ông Guido van Rossum ở cuối bài. Mình đã giới thiệu MyPy trong bài viết […]

The post Python: Sự cần thiết của MyPy appeared first on Fullstack Station.

]]>
Nhân việc người tạo ra Python, ông Guido van Rossum giới thiệu về MyPy, mình sẽ nói kỹ thêm về sự hữu dụng và sự cần thiết của MyPy trong lập trình Python. Bạn có thể tải về slide của ông Guido van Rossum ở cuối bài.

Mình đã giới thiệu MyPy trong bài viết “Giới thiệu một số công cụ hỗ trợ lập trình Python“, bài này sẽ đề cập chi tiết hơn về MyPy. Bất kỳ ngôn ngữ nào cũng phải trải qua quá trình dài để phát triển. Việc thiếu một vài tính năng ngay từ đầu cũng không có gì lạ, vì nguyên tắc thiết kế của Python là đặt sự đơn giản lên hàng đầu.

The Zen of Python (import this):

  • Beautiful is better than ugly.
  • Explicit is better than implicit.
  • Simple is better than complex.
  • Complex is better than complicated.
  • Flat is better than nested.
  • Sparse is better than dense.
  • Readability counts.
  • Special cases aren’t special enough to break the rules.
  • Although practicality beats purity.
  • Errors should never pass silently.
  • Unless explicitly silenced.
  • In the face of ambiguity, refuse the temptation to guess.
  • There should be one– and preferably only one –obvious way to do it.
  • Although that way may not be obvious at first unless you’re Dutch.
  • Now is better than never.
  • Although never is often better than right now.
  • If the implementation is hard to explain, it’s a bad idea.
  • If the implementation is easy to explain, it may be a good idea.
  • Namespaces are one honking great idea — let’s do more of those!

Tuy nhiên, sự cần thiết của kiểm tra kiểu dữ liệu là rất quan trọng, dù nó đã không được hỗ trợ ngay từ lúc ban đầu. Hoặc cũng không là bắt buộc ở hiện tại. Không biết ông Guido hối hận gì không vì đã không đưa type-checking vào Python trước đây :D.

MyPy là gì

Ngày nay, nhiều công cụ để kiểm tra kiểu dữ liệu, nhưng MyPy trước đây được tạo ra bởi anh JukkaL, thì bây giờ đã được đưa chính thức vào chung với Python: https://github.com/python/mypy. Đó là một sự thừa nhận sự phát triển và trưởng thành của MyPy.

Type Annotation

Type checking (kiểm tra kiểu dữ liệu) là xác định rõ kiểu dữ liệu của biến, giúp phát hiện lỗi sớm hơn trong quá trình phát triển. MyPy là công cụ được sử dụng để kiểm tra các lỗi liên quan đến loại dữ liệu dựa trên type annotations.

Ví dụ:

def add(x, y):    
    return x + y

add("hai", "ba")
=> "haiba" # Kiểu string
add(2, 3)
=> 5 # Kiểu integer

add("hai", 3)
hoặc 
add(2, "ba")
=> chúng ta sẽ bị lỗi `TypeError` lúc Runtime

Vậy thì với cách viết thêm kiểu dữ liệu như dưới đây:

def add(x: int, y: int) -> int:    
    return x + y

Khi dùng MyPy để kiểm tra, thì chúng ta sẽ phát hiện ngay được lỗi trong lúc lập trình mà không sợ sẽ bị lỗi lúc runtime nữa. Python khá dễ viết nếu mã nguồn đơn giản, ngắn gọn và còn mới. Nhưng khi mã nguồn dự án trải qua thời gian dài, và lượng code phình to ra thì nếu không có xác định, kiểm tra loại dữ liệu thì sẽ gặp rất nhiều khó khăn khi debug hoặc khó hiểu khi đọc code.

Type T

Sử dụng với các kiểu dữ liệu

Kiểu dữ liệu cơ bản

Bạn có thể dùng tất cả các kiểu dữ liệu cơ bản để diễn giải kiểu dữ liệu như int, float, str, dict, tuple, set, list…, hoặc kết hợp như Tuple[int, str], Iterator[int]…

def gcd(a: int, b: int) -> int:
    while a:
        a, b = b % a, a
    return b

Ở đây mình dùng VSCode, đưa trỏ chuột vào b sẽ biết b có kiểu dữ liệu gì

Hay với ví dụ của trang chủ mypy:

from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

Loại biến gọi hàm (Callable)

from typing import Callable

def twice(i: int, next: Callable[[int], int]) -> int:    
    return next(next(i))

def add(i: int) -> int:
    return i + 1

print(twice(3, add))  # 5

Với ví dụ trên, bạn có thể xác định biến đưa vào có thể gọi hàm, rất tường minh.

Kiểu dữ liệu nâng cao

Sử dụng MyPy tuy dễ nhưng cũng cần thời gian để thành thạo, bạn có thể cải thiện Type-Annotation từng bước nhỏ một. Không nhất thiết phải làm 1 lúc cho toàn bộ mã nguồn của dự án. Như vậy sẽ không bị ngán và lười.

Tuy nhiên với dự án mới thì hãy sử dụng Type-Annotation càng nhiều càng tốt. Vừa lập trình vừa có trợ lý MyPy thật là sướng biết bao.

https://mypy.readthedocs.io/en/latest/

MyPy cho Django: https://github.com/machinalis/mypy-django

The post Python: Sự cần thiết của MyPy appeared first on Fullstack Station.

]]>
https://fullstackstation.com/gioi-thieu-mypy-python/feed/ 0
Bắt kịp xu hướng AI với serverless AI https://fullstackstation.com/serverless-ai-la-gi/ https://fullstackstation.com/serverless-ai-la-gi/#respond Mon, 22 Apr 2024 11:07:40 +0000 https://fullstackstation.com/?p=8108 Cách đây vài năm khi xu hướng serverless chỉ mới chớm thì giờ đây đã trưởng thành và có nhiều nền tảng sử dụng serverless như là cơ sở hạ tầng chính. Và càng quan trọng hơn khi AI nổi lên khiến cho giá GPU ngày càng trở nên đắt đỏ, thì serverless AI lại […]

The post Bắt kịp xu hướng AI với serverless AI appeared first on Fullstack Station.

]]>
Cách đây vài năm khi xu hướng serverless chỉ mới chớm thì giờ đây đã trưởng thành và có nhiều nền tảng sử dụng serverless như là cơ sở hạ tầng chính. Và càng quan trọng hơn khi AI nổi lên khiến cho giá GPU ngày càng trở nên đắt đỏ, thì serverless AI lại trở thành mối quan tâm mới. Bài viết này sẽ giúp cho bạn bước vào thế giới AI một cách dễ dàng hơn.

Khái niệm Serverless AI

Serverless là gì

Nếu bạn là người mới về Serverless thì có thể đọc thêm bài Serverless là gì để hiểu rõ thêm. Nói đơn giản, Serverless giống như môi trường thực thi một tác vụ nào đó, ví dụ như API, mà bạn chỉ cần triển khai xong là có thể sử dụng được. Bạn không cần quan tâm đến các hạ tầng, cấu hình mạng, bộ nhớ…

Điểm mạnh của Serverless là giúp cho bạn tập trung vào giải quyết vấn đề, hơn là dành thời gian cho những tác vụ không mấy vui vẻ như cập nhật hệ thống, kiểm tra khả năng lưu trữ server, kiểm tra nhật ký hệ thống (log) xem có ai tấn công không…Quan trọng hơn hết là chỉ trả tiền cho những khi mình sử dụng!

Serverless AI là gì

Serverless AI là hạ tầng máy chủ có bộ xử lý đồ họa GPU mạnh mẽ, có thể tích hợp sẵn các model AI (Llama2, Llama3, GPT3, ResNes, StableDiffusion, Whisper…)

Tại sao Serverless AI rất quan trọng cho những người nghiên cứu AI

Chi phí, chính xác là điều chúng ta quan tâm nhất đối với serverless AI. Để đầu tư một hệ thống GPU mạnh mẽ thường sẽ tốn khá nhiều chi phí ban đầu, cũng như chi phí vận hành thường xuyên. Hoặc nếu dùng cloud, bạn cũng sẽ tốn nhiều chi phí khác để vận hành, và mất thêm thời gian để quản lý. Với serverless AI, bạn có thể chỉ trả tiền cho những lúc chúng ta gọi API.

Về cơ bản thì serverless AI cũng là API được sử dụng như API để tương tác với OpenAI chẳng hạn, và OpenAI thì đã tích hợp sẵn một số model như GPT-3, GPT-4

Một số nhà cung cấp

Cloudflare

Website: https://ai.cloudflare.com/

Danh sách các model

Text Generation @cf/meta/llama-3-8b-instruct

Text Generation @cf/mistral/mistral-7b-instruct-v0.1

Text to Image @cf/bytedance/stable-diffusion-xl-lightning

Speech Recognition @cf/openai/whisper

Image Classification @cf/microsoft/resnet-50

Text Classification @cf/huggingface/distilbert-sst-2-int8

Text Embedding @cf/baai/bge-base-en-v1.5

Translation @cf/meta/m2m100-1.2b

Runpods

Website: https://www.runpod.io/serverless-gpu

Fermyon

Website: https://www.fermyon.com/

Fullstack Station Tips

Với CloudFlare là nhà cung cấp hạ tầng khá nổi tiếng, với việc hỗ trợ nhiều model và cách sử dụng khá là dễ dàng. Chỉ cần tạo token key là bạn có thể thao tác được với các model trong CloudFlare. CloudFlare có gói miễn phí dùng thử khá hấp dẫn, được khởi tạo lại theo ngày, chứ không phải theo tháng. Nên với các ứng dụng đơn giản, thì hoàn toàn có thể sử dụng trên CloudFlare miễn phí

Với Serverless AI, bạn có thể nhanh chóng tìm hiểu và kiểm tra tính thực tiễn của các model. Thực nghiệm các ý tưởng để bắt xu hướng AI nhanh hơn!

The post Bắt kịp xu hướng AI với serverless AI appeared first on Fullstack Station.

]]>
https://fullstackstation.com/serverless-ai-la-gi/feed/ 0
Ngôn ngữ lập trình Mojo🔥: Python++ nhanh hơn Python tùy theo tác vụ đến 68.000 lần https://fullstackstation.com/ngon-ngu-lap-trinh-mojo%f0%9f%94%a5-python-nhanh-hon-python-tuy-theo-tac-vu-den-68-000-lan/ https://fullstackstation.com/ngon-ngu-lap-trinh-mojo%f0%9f%94%a5-python-nhanh-hon-python-tuy-theo-tac-vu-den-68-000-lan/#respond Sat, 13 Apr 2024 15:00:04 +0000 https://fullstackstation.com/?p=8047 Ngôn ngữ lập trình Mojo dù chỉ mới ra mắt chưa được 1 năm, nhưng đến nay đã nhận được sự chú ý của cộng đồng lập trình viên và nhận nhiều phản hồi tích cực. Dù tiếp xúc chưa được lâu, nhưng với những gì cảm nhận được thì đây là một ngôn ngữ […]

The post Ngôn ngữ lập trình Mojo🔥: Python++ nhanh hơn Python tùy theo tác vụ đến 68.000 lần appeared first on Fullstack Station.

]]>
Ngôn ngữ lập trình Mojo dù chỉ mới ra mắt chưa được 1 năm, nhưng đến nay đã nhận được sự chú ý của cộng đồng lập trình viên và nhận nhiều phản hồi tích cực. Dù tiếp xúc chưa được lâu, nhưng với những gì cảm nhận được thì đây là một ngôn ngữ lập trình đáng được quan tâm trong vòng 10 năm tới.

Bài viết này sẽ tập trung vào việc đo hiệu suất của ngôn ngữ lập trình Mojo, để xem thực tế chính xác đến đâu nhé. Bạn cũng đừng bỏ qua bài viết Tại sao nên học Python nhé.

Sơ lược về ngôn ngữ lập trình Mojo

Ngôn ngữ lập trình Mojo là gì

Ngôn ngữ lập trình Mojo được phát triển bởi công ty Modular, có cú pháp tương tự như Python và đạt hiệu cao hơn Python nhiều lần như C. Ban đầu họ hướng đến ngôn ngữ lập trình dành cho lập trình AI, nhưng ở thời điểm hiện tại thì đã trở thành ngôn ngữ lập trình cho những mục tiêu chung.

Ngôn ngữ lập trình Mojo khá dễ học do tương đồng với ngôn ngữ lập trình Python và được xem là Python++ nên sẽ giúp rút ngắn khoảng cách của những người nghiên cứu AI (thường sử dụng Python) đến phát triển sản phẩm (Python khá chậm và đòi hỏi nhiều tối ưu để sản phẩm đạt hiệu suất tốt)

Những đặc tính của ngôn ngữ lập trình Mojo

  • Sử dụng được các thư viện Python (numpy, pandas, …): sử dụng thông Cython nên có thể dùng được hầu hết các thư viện này. Tuy nhiên, theo kết quả đo hiệu suất bên dưới, thì việc sử dụng các thư viện này không mang lại kết quả tốt về hiệu suất mong muốn.
  • Sử dụng được cú pháp Python: Bạn hoàn toàn có thể sử dụng code Python trong Mojo, tuy nhiên việc sử dụng Python trong Mojo không nên ưu tiên nếu quan tâm đến hiệu suất.
  • Cú pháp tương tự Python: phong cách viết tương tự Python, tuy nhiên thuần Mojo thì sẽ khắt khe trong type-checker
  • Chạy đa luồng: Mojo sử dụng hạ tầng biên dịch (MLIR) để hỗ trợ nhiều loại phần cứng, bao gồm GPU chạy CUDA và phần cứng tương tự, mà không làm tăng thêm sự phức tạp trong lập trình.

Những điểm còn thiếu sót của ngôn ngữ lập trình Mojo

  • Chưa hỗ trợ Mac Intel, Window và các hệ Linux khác ngoài Ubuntu
  • Còn xa để đạt được mức tập cha (superset) của Python
  • Rất ít các thư viện hỗ trợ
  • Chưa có dependencies management: làm gì có thư viện khác mà đòi quản lý :))

Bạn có thể xem những vấn đề đang tồn tại: https://docs.modular.com/mojo/roadmap#mojo-sdk-known-issues

Cha đẻ của Mojo: Chris Latter

Thật thiếu sót nếu không nói về cha đẻ của ngôn ngữ lập trình Mojo: Chris Latter – người cũng là tác giả của trình biên dịch LLVM. Đồng thời ông cũng là người tạo ra MLIR – compiler stack thế hệ tiếp theo, và Mojo được thiết kế để biên dịch trên MLIR, đó cũng có thể là lý do vì sao Mojo nhanh hơn Rust (Rust và Swift được xây dựng trên nền tảng LLVM). Người sáng lập ngôn ngữ lập trình cũng là người tham gia vào quá trình thiết kế compiler, vì vậy ông rất am hiểu về cách vận hành của các chip cũng như trình biên dịch tương ứng. Đó cũng là ưu thế rất lớn để phát triển ngôn ngữ lập trình Mojo trở thành ngôn ngữ của thập niên tiếp theo – đặc biệt là trong mảng lập trình AI.

So sánh hiệu suất với Python

Môi trường

Công cụ được sử dụng đo hiệu suất: Hyperfine (https://github.com/sharkdp/hyperfine)
Hàm sử dụng: Fibonacci (thuật toán không tối ưu)
Cấu hình máy chính: 2.4 GHz 8-Core Intel Core i9
Cấu hình docker: RAM 8GB, max 200% CPU

Cài đặt Mojo

Cài đặt ngôn ngữ lập trình Mojo chỉ mới dành cho MacOS Apple, và Ubuntu. Với các máy khác có thể sử dụng docker. Chi tiết cho từng phiên bản thì bạn tham khảo ở đây:

https://docs.modular.com/mojo/manual/get-started/

Việc cài đặt cũng không mất nhiều thời gian và khó khăn gì cả nên mình không bổ sung gì thêm.

Code

# fibonacci.mojo
# Fibonacci thuần mojo
import sys
fn fibonacci(n: Int) -> Int:
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)


fn main():
    try:
        print(fibonacci(atol(sys.argv()[1])))
    except:
        pass
# fibonacci_python_style_no_type_annotation.mojo
# Fibonacci không  type-annotation với code kiểu Python
import sys
def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

fn main():
    try:
        print(fibonacci(atol(sys.argv()[1])))
    except:
        pass
# fibonacci_python_style_with_type_annotation.mojo
# Fibonacci  type-annotation với code kiểu Python
import sys
def fibonacci(n: Int) -> Int:
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

fn main():
    try:
        print(fibonacci(atol(sys.argv()[1])))
    except:
        pass
# fibonacci.py
# Fibonacci không  type-annotation (Python)
import sys

def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

def main():
    print(fibonacci(int(sys.argv[1])))

main()
vscode/workspaces/ubuntu $ hyperfine "mojo fibonacci.mojo 40"
Benchmark 1: mojo fibonacci.mojo 40
  Time (mean ± σ):     700.7 ms ±  16.8 ms    [User: 431.9 ms, System: 19.5 ms]
  Range (minmax):   677.3 ms735.1 ms    10 runs
 
vscode/workspaces/ubuntu $ hyperfine "mojo fibonacci_python_style_with_type_annotation.mojo 40"
Benchmark 1: mojo fibonacci_python_style_with_type_annotation.mojo 40
  Time (mean ± σ):      1.202 s ±  0.012 s    [User: 0.927 s, System: 0.021 s]
  Range (minmax):    1.184 s1.217 s    10 runs
 
vscode/workspaces/ubuntu $ hyperfine "mojo fibonacci_python_style_no_type_annotation.mojo 40"
Benchmark 1: mojo fibonacci_python_style_no_type_annotation.mojo 40
  Time (mean ± σ):     15.129 s ±  3.435 s    [User: 14.793 s, System: 0.059 s]
  Range (minmax):   10.228 s19.135 s    10 runs
 
vscode/workspaces/ubuntu $ hyperfine "python3 fibonacci.py 40"
Benchmark 1: python3 fibonacci.py 40
  Time (mean ± σ):     44.586 s ±  3.859 s    [User: 44.502 s, System: 0.033 s]
  Range (minmax):   37.771 s51.637 s    10 runs
 
vscode/workspaces/ubuntu $ hyperfine "./fibonacci 40"
Benchmark 1: ./fibonacci 40
  Time (mean ± σ):     350.3 ms ±   5.5 ms    [User: 346.5 ms, System: 2.4 ms]
  Range (minmax):   340.9 ms358.6 ms    10 runs
 
vscode/workspaces/ubuntu $ hyperfine "./fibonacci_python_style_no_type_annotation 40"
Benchmark 1: ./fibonacci_python_style_no_type_annotation 40
  Time (mean ± σ):     10.667 s ±  0.872 s    [User: 10.650 s, System: 0.007 s]
  Range (minmax):    9.323 s11.830 s    10 runs
 
vscode/workspaces/ubuntu $ hyperfine "./fibonacci_python_style_with_type_annotation 40"
Benchmark 1: ./fibonacci_python_style_with_type_annotation 40
  Time (mean ± σ):     831.7 ms ±  11.5 ms    [User: 827.4 ms, System: 2.5 ms]
  Range (minmax):   814.2 ms852.2 ms    10 runs

Kết quả so sánh

MinMaxMeanHiệu suất
Python thuần37.771 (s)51.637(s)44.586(s)N/A
Mojo phong cách Python10.228(s)19.135(s)15.129(s)x3
Mojo phong cách Python có type-annotation1.184(s)1.217(s)1.202(s)x37
Mojo thuần677.3(ms)735.1 (ms)700.7(ms)x75
Mojo phong cách Python [compiled]9.323(s)11.830(s)10.667(s)x3
Mojo phong cách Python có type-annotation [compiled]814.2(ms)852.2(ms)831.7(ms)x55
Mojo thuần [compiled]340.9(ms)358.6(ms)350.3(ms)x127
Hiệu suất thực tế của ngôn ngữ lập trình Mojo theo từng cách viết so sánh với Python.

Bonus

Với phiên bản Python thuần, nếu bạn tối ưu bằng decorator cache thì tốc độ cũng cải thiện rất nhiều, tuy nhiên Mojo chưa hỗ trợ decorator này nên chưa so sánh được.

import sys
from functools import cache

@cache
def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

def main():
    print(fibonacci(int(sys.argv[1])))

main()
vscode/workspaces/ubuntu $ hyperfine "python3 fibonacci_with_cache.py 40"
Benchmark 1: python3 fibonacci_with_cache.py 40
  Time (mean ± σ):      14.0 ms ±   1.1 ms    [User: 11.6 ms, System: 2.2 ms]
  Range (minmax):    12.7 ms19.3 ms    159 runs
 

Kết luận

Nhanh hơn Python 68.000 lần?

Without a parallel Python implementation, It would be more fair to claim that Mojo is 874 times faster than a naive CPython implementation, 175 times faster than a (rather naive) Numpy code, and 40 times faster than a PyPy implementation (on this specific Mandelbrot set computation).

StackOverflow

Mặc dù con số 68.000 lần là thực tế từ kết quả, tuy nhiên đây chỉ là con số mang tính chất biểu tượng/marketing là chính chứ không có tác dụng trong thực tế nhiều lắm.

  • Mojo là ngôn ngữ multi-threaded chứ không có chạy tuần tự, nên một số tác vụ tính toán có thể hưởng lợi
  • Sử dụng tính toán vector, lại là về tính toán con số; numpy có thực hiện tính toán vector nên vẫn ổn
  • Sử dụng chiến thuật thực thi song hành (parallel) trên con CPU khủng 88-Core Intel Xeon

Bạn có thể đọc thêm cách đo hiệu suất trong 3 bài viết từ blog của Modular có gắn kèm bên dưới.

Bài toán thực tế

Với kết quả từ thực nghiệm ở trên với hàm Fibonacci (một hàm thường được dùng cho việc tính hiệu suất vì có dùng đệ quy), có thể kết luận việc sử dụng ngôn ngữ lập trình Mojo có thể nhanh hơn Python khoảng 100 lần. Đây là con số khá hấp dẫn trong việc chọn lựa với những hệ thống yêu cầu tốc độ. Với những người yêu thích tốc độ như mình thì khó có thể cưỡng lại được 😀

Tốc độ đến từ ngôn ngữ biên dịch và type-checked cũng là điều dễ hiểu, ngoài ra kết hợp tính toán vector, multi-thread thì ngôn ngữ lập trình Mojo có thể còn phát huy được nhiều ứng dụng khác. Về điểm này thì chúng ta nên so sánh với Golang mới đúng, hi vọng sẽ có thời gian để viết bài so sánh với Golang.

Fullstack Station Tips:

  • Không khuyến khích dành cho người mới học lập trình, khuyến khích dành cho người đã biết Python
  • Mặc dù có thể sử dụng cú pháp Python, nhưng với kết quả kiểm tra hiệu suất thì rõ ràng không nên sử dụng cú pháp Python nếu muốn có hiệu suất cao, chí ít cũng phải có type-annotation (xem thêm MyPy là gì). Tốt nhất cũng là sử dụng ngôn ngữ lập trình Mojo thuần để cho tốt độ cao nhất.
  • Tuy tuổi đời còn ít, nhưng với những thành tựu đã đạt được thì ngôn ngữ lập trình Mojo sẽ còn phát triển nhanh và xa. Đặc biệt là rút ngắn khoảng cách từ nghiên cứu đến phát triển sản phẩm AI.
  • Vì chưa trưởng thành, nên nhiều cú pháp sẽ bị thay đổi, không nên sử dụng ngôn ngữ lập trình cho sản phẩm thực tế.
  • Với những lợi ích mà ngôn ngữ lập trình Mojo mang lại, mình nghĩ sẽ rất có lợi cho bạn ở tương lai gần khi học Mojo. Giống như lập trình viên Golang, là một ngôn ngữ lập trình cho bạn mức thu nhập rất tốt.

Tham khảo:

  • https://www.modular.com/blog/how-mojo-gets-a-35-000x-speedup-over-python-part-1
  • https://www.modular.com/blog/how-mojo-gets-a-35-000x-speedup-over-python-part-2
  • https://www.modular.com/blog/mojo-a-journey-to-68-000x-speedup-over-python-part-3
  • https://dev.classmethod.jp/articles/try-mojo-programming-langurage/
  • https://stackoverflow.com/questions/77070883/performance-comparison-mojo-vs-python
  • https://augierpi.gricad-pages.univ-grenoble-alpes.fr/mojo-the-point-of-view-of-a-researcher-using-python.html

The post Ngôn ngữ lập trình Mojo🔥: Python++ nhanh hơn Python tùy theo tác vụ đến 68.000 lần appeared first on Fullstack Station.

]]>
https://fullstackstation.com/ngon-ngu-lap-trinh-mojo%f0%9f%94%a5-python-nhanh-hon-python-tuy-theo-tac-vu-den-68-000-lan/feed/ 0
Tạo mật khẩu SMTP trong Amazon SES https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/ https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/#respond Wed, 17 Aug 2022 01:16:00 +0000 https://fullstackstation.com/?p=6853 Vào một ngày đẹp trời thiết lập gởi mail trong wordpress thì hỡi ôi làm mãi không gởi email đi được. Mãi mới xác định được là cách tạo xác thực trước đây cho SMTP bằng mật khẩu của AWS đã thay bằng Access key ID/AWS secret access key. Với cặp Access key ID/AWS secret […]

The post Tạo mật khẩu SMTP trong Amazon SES appeared first on Fullstack Station.

]]>
Vào một ngày đẹp trời thiết lập gởi mail trong wordpress thì hỡi ôi làm mãi không gởi email đi được. Mãi mới xác định được là cách tạo xác thực trước đây cho SMTP bằng mật khẩu của AWS đã thay bằng Access key ID/AWS secret access key.

Với cặp Access key ID/AWS secret access key thì sẽ được sử dụng cho Amazon SES API, nhưng các plugin dành cho wordpress thì lại không hỗ trợ, nếu có hỗ trợ thì phải sử dụng bản PRO mới có.

Vì vậy muốn sử dụng gởi email qua smtp bằng user/password thì phải “tạo mật khẩu smtp từ AWS secret access key

Bước 1: Tạo tập tin smtp_credentials_generate.py

Cứ copy rồi lưu lại thành tập tin là được, không cần chỉnh sửa gì thêm nhé.

#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    'us-east-2',       # US East (Ohio)
    'us-east-1',       # US East (N. Virginia)
    'us-west-2',       # US West (Oregon)
    'ap-south-1',      # Asia Pacific (Mumbai)
    'ap-northeast-2',  # Asia Pacific (Seoul)
    'ap-southeast-1',  # Asia Pacific (Singapore)
    'ap-southeast-2',  # Asia Pacific (Sydney)
    'ap-northeast-1',  # Asia Pacific (Tokyo)
    'ca-central-1',    # Canada (Central)
    'eu-central-1',    # Europe (Frankfurt)
    'eu-west-1',       # Europe (Ireland)
    'eu-west-2',       # Europe (London)
    'sa-east-1',       # South America (Sao Paulo)
    'us-gov-west-1',   # AWS GovCloud (US)
]

# These values are required to calculate the signature. Do not change them.
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode('utf-8'), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode('utf-8')


def main():
    parser = argparse.ArgumentParser(
        description='Convert a Secret Access Key for an IAM user to an SMTP password.')
    parser.add_argument(
        'secret', help='The Secret Access Key to convert.')
    parser.add_argument(
        'region',
        help='The AWS Region where the SMTP password will be used.',
        choices=SMTP_REGIONS)
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == '__main__':
    main()

Chạy lệnh tạo mật khẩu

python path/to/smtp_credentials_generate.py wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY us-east-1

Sau khi chạy lệnh trên, chúng ta sẽ được 1 dãy ký tự mới, đó chính là mật khẩu STMP. Sử dụng Access key ID và mật khẩu được tạo ra ở trên để cài đặt trong các plugin gởi email bằng SMTP. Bên dưới là phần thiết lập cho plugin WP MAIL SMTP:

Tham khảo thêm các bài viết về Amazon SES:

https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html

https://cuongthach.com/email-marketing/huong-dan-su-dung-amazon-ses-smtp-de-gui-email-tu-wordpress

https://vticloud.io/amazon-ses-la-gi-huong-dan-tong-hop-ve-dich-vu-amazon-ses/

The post Tạo mật khẩu SMTP trong Amazon SES appeared first on Fullstack Station.

]]>
https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/feed/ 0
Streamlit: Công cụ chuyên dụng cho ứng dụng phân tích dữ liệu với Python【Cập nhật 2024】 https://fullstackstation.com/gioi-thieu-streamlit-la-gi/ https://fullstackstation.com/gioi-thieu-streamlit-la-gi/#respond Fri, 11 Oct 2019 08:26:53 +0000 https://fullstackstation.com/?p=1957 Streamlit là gì Streamlit là công cụ được xây dựng với mục đích dành cho Machine Learning Engineer, tạo ra giao diện web như Jupyter notebook. Điểm đặc biệt khác với Jupyter notebook là Streamlit không phải hiển thị code, giúp cho bạn có thể tạo ra sản phẩm có tính hoàn thiện cao. Trong […]

The post Streamlit: Công cụ chuyên dụng cho ứng dụng phân tích dữ liệu với Python【Cập nhật 2024】 appeared first on Fullstack Station.

]]>
Streamlit là gì

Streamlit là công cụ được xây dựng với mục đích dành cho Machine Learning Engineer, tạo ra giao diện web như Jupyter notebook. Điểm đặc biệt khác với Jupyter notebook là Streamlit không phải hiển thị code, giúp cho bạn có thể tạo ra sản phẩm có tính hoàn thiện cao.

Trong bài “Tại sao nên học Python“, mình đã giới thiệu về ưu điểm của Python. Bài này sẽ giới thiệu thêm 1 ứng dụng khác. Về cơ bản có thể hiển thị kết quả từ python ra web, nên có thể sử dụng để tạo app bất kỳ với python.

Các tính năng cơ bản

Các tính năng thường được sử dụng ở streamlit là các biểu đồ, đồ thị, bản đồ, hình ảnh, âm thanh, video… bạn có thể xem toàn bộ tính năng ở đây: https://streamlit.io/components

Sau hơn 5 năm phát triển nền tảng Streamlit, giờ đây đã có rất nhiều tính năng được thêm vào khá đặc biệt như WebRTC, Code Editor…hoặc là các kết nối vào các nền tảng khác như SQL, CockroachDB, AirTable, Google Sheets…

Với những tính năng hiện tại

Một số tính năng hữu ích nâng cao

Cache

Cache được lưu trữ theo mỗi trạng thái của thiết lập điều này giúp cho ứng dụng không cần phải chạy lại cho từng người dùng khác nhau.

Để đảm bảo được cache hoạt động đúng, thì trong hàm sử dụng cache, không được dùng các hàm của streamlit. Các chức năng có thể nên dùng cache như: tải file, xử lý tính toán cho kết quả.

Session State

Sesstion State được sử dụng cho mục đích lưu trữ thông tin và chia sẽ dữ liệu giữa các script trong cùng 1 ứng dụng, ví dụ như thông tin đăng nhập của người dùng. Tuy nhiên, dữ liệu đó không chia sẽ giữa các tab trong cùng 1 trình duyệt và sẽ bị xóa nếu refresh lại trang.

Sesstion State dùng kiểu dữ liệu từ điển (key-value) để lưu trữ và mặc dù khá ít được sử dụng nhưng đối với các trường hợp như thông tin có tính chất phiên làm việc thì khá quan trọng. Widgets tự quản lý state riêng của mình, nên session state không liên quan đến state của widget nhé.

Streamlit Cloud

Với Streamlit Cloud thì bạn có thể triển khai ứng dụng của mình lên máy chủ của Streamlit hoàn toàn miễn phí, với điều kiện là mã nguồn lưu trữ công khai trên Github. Sau khi triển khai xong, bạn có thể tùy chọn cho mình một đường dẫn URL kiểu “xyz.streamlit.io/repo-name”

Fullstack Station Tips

Thường các công ty lớn hay sử dụng các công cụ phân tích/biểu thị dữ liệu như Redash, hay cho vào data warehouse rồi viết lại các dashboard khá mất thời gian. Như redash thì độ linh động cũng không cao cho lắm, còn tự làm dashboard thì khá là vất vả lấy yêu cầu rồi làm frontend, backend này nọ. Cuối cùng thì kết quả cũng chỉ là đưa dữ liệu lên, cho phép người dùng tìm kiếm, lọc dữ liệu theo 1 số tiêu chí nào đó. Điều này đối với streamlit thì khá phù hợp và tiện lợi khi chỉ cần 1 ngôn ngữ duy nhất là Python.

The post Streamlit: Công cụ chuyên dụng cho ứng dụng phân tích dữ liệu với Python【Cập nhật 2024】 appeared first on Fullstack Station.

]]>
https://fullstackstation.com/gioi-thieu-streamlit-la-gi/feed/ 0
Tại sao nên học Python? https://fullstackstation.com/tai-sao-nen-hoc-python/ https://fullstackstation.com/tai-sao-nen-hoc-python/#comments Fri, 02 Aug 2019 09:00:35 +0000 http://fullstackstation.com/?p=1803 Python đã lần đầu tiên đạt được vị trí 3 trên bảng xếp hạng Tiobe Index, với mức tăng +2.90%, vượt qua C++ tại thời điểm tháng 7/2019. Với một tín hiệu tích cực, quá rõ ràng cho xu hướng của Python. Bài này mình sẽ điểm qua các giá trị của Python để trả […]

The post Tại sao nên học Python? appeared first on Fullstack Station.

]]>
Python đã lần đầu tiên đạt được vị trí 3 trên bảng xếp hạng Tiobe Index, với mức tăng +2.90%, vượt qua C++ tại thời điểm tháng 7/2019. Với một tín hiệu tích cực, quá rõ ràng cho xu hướng của Python. Bài này mình sẽ điểm qua các giá trị của Python để trả lời câu hỏi “Tại sao nên học Python” từ bây giờ?

Python ở Tiobe Index: https://www.tiobe.com/tiobe-index/python/

Đôi nét sơ lược về Python

Python là một ngôn ngữ lập trình thông dịch, tương tác, hướng đối tượng và là ngôn ngữ bậc cao, có mục đích chung chung. Được tạo ra bởi Guido van Rossum trong giai đoạn 1985 – 1990. Python là ngôn ngữ của năm 2018 theo bảng xếp hạng Tiobe Index, hạng 3 là thứ hạng cao nhất đạt được.

Lý do Youtube được Google mua lại một phần là vì Python đã được sử dụng trong nền tảng này để tạo ra, phát hành tính năng nhanh hơn Google Video tại thời điểm 2006. Nền tảng youtube lúc đó chỉ có khoảng 20 lập trình viên so với hàng trăm kỹ sư giỏi của Google sử dụng C/C++.

Những điểm mạnh của Python

Mục đích chung chung/General-purpose

Do đặc tính mục đích chung chung của Python, nên Python có thể sử dụng được ở rất nhiều lĩnh vực. Hầu như tất cả ngoại trừ xử lý giao diện ở trình duyệt. Ở độ bao phủ này thì Python chỉ thua mỗi JS, nhưng bù lại Python lại mạnh hơn JS ở mảng về AI. Như vậy nếu bạn có thể lập trình được Python thì có thể làm được rất nhiều việc. Python cũng phù hợp cho các bạn yêu thích khởi nghiệp. Chính vì độ uyển chuyển và thiết kế ra sản phẩm nhanh của Python.

Tương tác/Interactive

Tính năng tương tác nghĩa là bạn có thể truy cập vào shell của python bằng lệnh python. Sau đó có thể viết mã hàm (function), lớp (class) hoặc sử dụng các hàm tích hợp sẵn của python. Không nhiều ngôn ngữ lập trình hỗ trợ tính năng tương tác này. Chỉ có 1 vài ngôn ngữ khác không phổ biến và được sử dụng rộng rãi như lisps (bao gồm lisp, scheme gồm clojure), sml, ocaml, haskell, F#, erlang, scala, ruby, python, lua, groovy, prolog.

Sử dụng thư viện/Import

Cách quản lý thư viện của Python khá linh động, bạn có thể import một hàm; hay class từ thư viện có sẵn, hoặc được cài đặt từ bên thứ ba, hay từ thư mục của dự án. Khái niệm import này sẽ gần giống với Nodejs, PHP hoặc các ngôn ngữ khác. Tuy nhiên điểm khác biệt lớn nhất là có thể sử dụng cùng tên hàm cho từng mô đun (module) khác nhau.

Tính rõ ràng, dễ đọc hiểu/Readability & simplicity

Ví dụ xét đoạn mã sau:

// Python
x = 12
y = 5
result = x / y
if result > 5.5:
    print("12 divided by 5 is greater than 5.5)
else
    print("12 divided by 5 is NOT greater than 5.5)
// C++
#include <iostream>
int main()
{
    double x = 12;
    double y = 5;
    double result = x / y;
    if(result > 5.5)
        std::cout << "12 divided by 5 is greater than 5.5" << std::endl;
    else
        std::cout << "12 divided by 5 is NOT greater than 5.5" << std::endl;
    return 0;
}

Rõ ràng với 1 người chưa biết lập trình thì đoạn mã 1 với Python dễ đọc và dễ hiểu hơn nhiều so với C++. Ngay cả so sánh với JS hay PHP thì Python vẫn vượt trội hơn về tính dễ đọc, dễ hiểu. Python sử dụng cú pháp tương tự tiếng Anh, vì tương tự ngôn ngữ con người nên dễ tiếp thu hơn. Đó cũng là lý do vì sao Python đang dần trở thành ngôn ngữ lập trình được dùng để dạy cho trẻ em.

Những điểm yếu/vấn đề của Python

Khác biệt về cú pháp so với ngôn ngữ khác

Gọi là điểm yếu thì không hẳn, nhưng so với các ngôn ngữ khác như PHP, JS, C, Java thì có dấu chấm kết thúc dòng, có các cặp {} để phân biệt khối, khối trong Python sẽ do số lượng khoảng trắng quy định (indent). Sẽ khiến bạn khó khăn 1 chút khi mới tiếp cận Python, cũng dễ xảy ra lỗi hơn nếu sai indent.

Không thể triển khai trên di động

Python hoạt động tốt ở môi trường máy chủ và ứng dụng máy tính để bàn (desktop applications), tuy nhiên ở trên điện thoại di động thì vẫn chưa có nền tảng nào hỗ trợ. So sánh 1 chút với Nodejs với React Native hay Dart với Flutter thì độ phủ thấp hơn. Với Nodejs và Dart có thể sử dụng cho ứng dụng di động đồng thời cho cả ở máy chủ và ứng dụng máy tính để bàn.

Tốc độ thực thi chậm

Python thực thi chậm hơn PHP 7, Nodejs là điều đã được kiểm chứng, cũng nhiều benchmark được thực hiện rồi. Nếu bạn thực sự đã có ý tưởng sản phẩm và tốc độ thực thi là bắt buộc, thì đây là 1 rào cản khó khăn. Nhưng nếu sử dụng Pypy, hoặc Cython, Numba để cải thiện và nhận lấy lợi ích khác từ Python và hi sinh một phần tốc độ thì cũng không phải là không tốt.

Lỗi run-time

Vì là ngôn ngữ kiểu động (dynamic typed) vì vậy khi chạy (run-time) chương trình Python có thể vẫn xảy ra lỗi về kiểu dữ liệu. Bạn sẽ phải sử dụng try/catch tốt hoặc cải thiện bằng các công cụ checker, linter.

Tại sao Python lại tăng trưởng nhanh như vậy?

Kỷ nguyên AI

Python được sử dụng nhiều trong kỷ nguyên AI khi mà tốc độ thực thi không quá quan trọng bằng tốc độ tính toán của GPU. Còn khả năng của Python thì được ứng dụng thích hợp vì dễ hiểu, dễ bảo trì. Để làm ra sản phẩm thông minh, tính năng AI có thể được huấn luyện hàng trăm giờ nhờ GPU. Trước đó còn có công việc xử lý số liệu, làm prototype…, tất cả những tác vụ này thì Python phù hợp nhất. Vì phần lớn thời gian được thực hiện bằng GPU, nên tốc độ thực thi của C/C++ hay Java không còn là điểm mạnh.

Dành cho các bạn làm Data Science, Python có thư viện Streamlit rất hữu dụng để làm báo cáo, demo.

Blockchain & IOT (Internet of things)

Bạn có thể thiết kế 1 blockchain đơn giản với 50 dòng code! Đây là điều tuyệt vời để bắt đầu với blockchain vì có thể làm thử nghiệm 1 cái gì đó rất nhanh. Python không chạy được trực tiếp trên GPU nên vẫn còn hạn chế với các ứng dụng blockchain đòi hỏi khả năng mining. Nhưng với IOT kết hợp blockchain thì lại là chuyện khác! IOT là những thiết bị có cấu hình thấp hoặc rất thấp, vì vậy Python hoàn toàn phù hợp để lập trình tương tác với các thiết bị này.

Kết hợp ứng dụng blockchain vào IOT đã và đang được triển khai rộng rãi. Vì vậy Python có cơ hội tham gia và quá trình này một cách chặt chẽ. Vì Python đơn giản, mang tính ứng dụng cao nên được nhiều người sử dụng. Vì vậy tăng trưởng cao là điều tất yếu.

Python có thể làm được gì khác?

Ngoài AI, Blockchain và IOT, Python còn được sử dụng ở mảng web, ứng dụng và lập trình điều khiển, tự động hoá.

Lập trình Web và API

Django và Flask là 2 framework hàng đầu cho lập trình web của Python. Nếu PHP có WordPress đang thống lĩnh thị trường thì Python với Django có nền tảng tương tự. Điểm mạnh của Django chính là phát triển web dựa trên ORM và có hệ thống Dashboard mạnh mẽ bao gồm hệ thống xác thực, phân quyền người dùng. Trong phân khúc này, nếu đã có bản template HTML thì Django sẽ phát triển ra ứng dụng nhanh hơn WordPress. Tài liệu của Django cũng rất phong phú và chi tiết, rõ ràng.

Flask thì nhỏ và uyển chuyển hơn Django, có tốc độ khá tốt nhưng thường dùng để lập trình API. Ngoài ra lập trình API thì mới nổi nền tảng FastAPI. Vì tận dụng tính năng async/await cho tốc độ rất tốt và có thể tạo ra tài liệu cho API chuẩn.

Ứng dụng, game & lập trình điều khiển, tự động hoá

Nhiều nền tảng có thể dùng để viết ứng dụng đa nền tảng cho Window, Macos hay Linux như: PyQT, PyGi, Kivy, Tk… ; hoặc tập trung duy nhất cho Macos như Cocoa, PyObjC, xem thêm GUI cho Python. Trong ứng dụng đa nền tảng thì Python không mạnh bằng JS với Electron, hoặc với Dart/Flutter. Tuy nhiên ứng dụng của Python thì có giao diện tự nhiên (native) hơn. Ngoài ra cũng có thể viết game 2D với Python và cũng khá nhiều nền tảng hỗ trợ.

Về điều khiển và tự động thì Python đang dần thay thế các câu lệnh phức tạp của Bash với khả năng lập trình uyển chuyển. Ví dụ bạn có thể điều khiển hệ thống máy chủ, dịch vụ cloud ở AWS bằng Python khá dễ dàng và được hỗ trợ chính chủ, hoặc làm ứng dụng auto-pull github khi có commit mới.

Hướng dẫn cách học Python hiệu quả

Mình cũng từng lướt nhanh khi học Python, nhưng sau một hồi đi lung tung mình nhận thấy cần phải học Python căn bản thật chắc. Đây là các phần cần phải học chắc Python để sử dụng hiệu quả:

  • Cú pháp, bao gồm cách viết hàm, lớp, module
  • Kiểu dữ liệu, cần nắm vững list, tuple, set, dict
  • Cách debug
  • Các cách xử lý dữ liệu ngày tháng, dữ liệu kiểu chuỗi, xử lý tập tin

Danh sách một vài tài nguyên cho việc học Python

Bạn nào đã nắm 1 ngôn ngữ lập trình rồi thì đọc hết và làm theo được các cheatsheet là tương đối ổn rồi.

Mấy cái “cheatsheet” hay “learn X in Y” là để tham khảo thôi. Đọc xong tưởng mình hiểu rồi hông luyện tập thì mãi chỉ là số 0 tròn trĩnh. Đừng ảo tưởng sức mạnh!

Bạn nhìn danh sách này có thể dài, tất nhiên không thể học hết. Điều quan trọng là bạn thích chủ đề nào. Và quan trọng nhất là học Python cho xong một chủ đề. Không nên bỏ học giữa chừng vì thấy chủ đề khác, khoá học khác “có thể” hay hơn.

Ngoài ra, cần phải luyện hàng ngày thì mới lên tay nhanh và chắc được.

Fullstack Station Tips

Nhiều người khuyến nghị là phải học bằng cách làm 1 dự án cụ thể. Đây cũng là điều đúng tuy nhiên thực sự có 1 trở ngại cần phải nói rõ. Ví dụ mình bắt đầu học Python bằng làm dự án dùng Django, với kỹ năng lập trình web nhiều năm việc mình làm Django không hề khó. Nhưng với tài liệu chính thống 2000 trang của Django thì thật không thể nào đọc nổi.

Nhưng những kiến thức về Django không giúp gì nhiều về học Python cơ bản.

Tương tự như vậy khi học về Machine Learning, thường sẽ cần dùng Numpy, Pandas, … . Học Python bằng những thư viện này hầu như không giúp gì cho việc học Python. Tốt nhất là tài liệu của Python: https://docs.python.org/3/tutorial/index.html, hoặc 1 cuốn sách nào đó chuyên về học Python. Khi bạn giỏi Python, bạn đi hướng nào cũng được.

Tóm lại, là cần học cơ bản chắc, đừng học python kết hợp với 1 lĩnh vực mới. Học 2 thứ mới cùng 1 lúc, chỉ khiến bạn mất thời gian, vì cả 2 đều không giỏi.

Còn nếu bạn không đủ động lực để học thuần Python? OK, kết cục đã rõ!

Tham khảo

https://www.zdnet.com/article/python-is-eating-the-world-how-one-developers-side-project-became-the-hottest-programming-language-on-the-planet/

https://www.quora.com/What-about-the-future-of-Python-and-Django

https://blog.geekforbrains.com/why-im-switching-from-python-to-nodejs-1fbc17dc797a?gi=f9c2204ab02e

https://blog.geekforbrains.com/after-a-year-of-using-nodejs-in-production-78eecef1f65a?source=post_page—————————

The post Tại sao nên học Python? appeared first on Fullstack Station.

]]>
https://fullstackstation.com/tai-sao-nen-hoc-python/feed/ 2
FastAPI: triển khai bằng Docker https://fullstackstation.com/fastapi-trien-khai-bang-docker/ https://fullstackstation.com/fastapi-trien-khai-bang-docker/#comments Fri, 17 May 2019 23:00:17 +0000 http://fullstackstation.com/?p=1689 Tiếp theo bài giới thiệu FastAPI, Fullstack Station tiếp tục với triển khai FastAPI bằng Docker. Nhiệm vụ này khá đơn giản và nhanh chóng nhưng mang lại hiệu quả rất lớn. Cấu trúc thư mục Giả sử chúng ta có cấu trúc thư mục như sau: Với nội dung của Dockerfile như sau: Ở […]

The post FastAPI: triển khai bằng Docker appeared first on Fullstack Station.

]]>
Tiếp theo bài giới thiệu FastAPI, Fullstack Station tiếp tục với triển khai FastAPI bằng Docker. Nhiệm vụ này khá đơn giản và nhanh chóng nhưng mang lại hiệu quả rất lớn.

Cấu trúc thư mục

Giả sử chúng ta có cấu trúc thư mục như sau:

.
├── Dockerfile
├── app
│   ├── db.py
│   └── main.py
├── requirements.txt
├── test.db #RISKY, đừng bao giờ lưu trữ dữ liệu trong container.

Với nội dung của Dockerfile như sau:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY ./app /app

Ở đây, bạn chú ý file requirements.txt được tách riêng COPY trước, mục đích là để Docker không cần phải build lại layer này nếu không có gì thay đổi. Như vậy, Docker sẽ tận dụng lại cache của các layer cũ và việc build sẽ nhanh hơn rất nhiều. (Tham khảo tại đây). File requirements.txt sẽ chứa các package được sử dụng trong api.

Thực hiện build image

Phần này đơn giản thôi, sau khi đã có Dockerfile rồi, thì tiến hành build image với lệnh:

 docker build -t test-fastapi-image .

Việc build khá nhanh, tuy nhiên phần image gốc nặng gần 1Gb nên nếu mạng chậm bạn phải chờ 1 chút.

Tiến hành thực thi

Sau khi build xong nếu không có vấn đề gì thì chạy thử xem nhé:

docker run -d --name my-fastapi-container -p 8000:80 test-fastapi-image

Ở đây mình map port 8000 (máy chủ) vào port 80 (của container), sau đó máy chủ sẽ dùng nginx như 1 proxy chuyển request vào container.

Với lệnh trên thành công, chúng ta truy cập tại địa chỉ IP của “máy chủ” ví dụ 127.0.0.1:8000 sẽ có kết quả của API như việc chạy ở bước development uvicorn main:app --reload, hoặc các tài liệu tương tác trực quan như http://127.0.0.1:8000/docs hay http://127.0.0.1:8000/redocs . Điểm quan trọng là chúng ta đã build thành công docker cho api, việc tiếp theo sẽ đưa image lên môi trường production. Việc đưa image lên production có nhiều cách và sẽ được nói trong một bài viết khác.

Fullstack Station Tips

  • Phần docker cho FastAPI được làm rất tốt, nên việc deploy sau này sẽ rất dễ dàng, chỉ đơn giản là lặp lại các thao tác build, deploy mà không cần phải quan tâm các phần khác như sử dụng hypercorn hay unicorn, bao nhiêu workers…
  • Nhiều bạn hay sử dụng pip freeze > requirements.txt để tạo file “requirements.txt”, đây là cách không đúng vì các package dùng cho quá trình development khác với production, không dùng chung. Thường sẽ có base.txt cho các package chung và các môi trường khác nhau như local.txt, production.txt.

The post FastAPI: triển khai bằng Docker appeared first on Fullstack Station.

]]>
https://fullstackstation.com/fastapi-trien-khai-bang-docker/feed/ 1
FastAPI: Tạo API chuẩn và cực nhanh trong Python https://fullstackstation.com/fastapi-tao-api-chuan-va-cuc-nhanh-trong-python/ https://fullstackstation.com/fastapi-tao-api-chuan-va-cuc-nhanh-trong-python/#comments Wed, 15 May 2019 23:30:46 +0000 http://fullstackstation.com/?p=1625 Từ khi biết tới OpenAPI (Swagger) là mình đã mê cách viết tài liệu API có khả năng tương tác. Cực kỳ rõ ràng, xúc tích, dễ hiểu, chỉ cần gởi đường link về tài liệu API là đối tác hay lập trình viên đều có thể tương tác với API, theo cách không thể […]

The post FastAPI: Tạo API chuẩn và cực nhanh trong Python appeared first on Fullstack Station.

]]>
Từ khi biết tới OpenAPI (Swagger) là mình đã mê cách viết tài liệu API có khả năng tương tác. Cực kỳ rõ ràng, xúc tích, dễ hiểu, chỉ cần gởi đường link về tài liệu API là đối tác hay lập trình viên đều có thể tương tác với API, theo cách không thể tuyệt vời hơn. Và càng thích thú hơn nữa khi mình biết tới FastAPI, tạo API chuẩn, đầy đủ tính năng ngon và cực nhanh lại còn tạo ra tài liệu chuẩn OpenAPI. Bài viết này sẽ giới thiệu về FastAPI, framework tạo API trên Python thuộc nhóm nhanh nhất hiện nay.

Giới thiệu FastAPI

FastAPI thiết kế API nhanh và chuẩn

FastAPI là nền tảng thiết kế, lập trình xây dựng API cực kỳ nhanh trên cả 2 phương diện phát triển và thực thi trên Python 3.6+.

Trang chủ: FastAPI

Từ Python 3.6+ thì bạn đã có thể sử dụng cú pháp await/async để chạy code bất đồng bộ, vì lý do này các framework trên Python sẽ đạt được hiệu năng cao, FastAPI là một trong số Python framework nhanh nhất hiện nay.

Với một thời gian tìm hiểu kha khá, mình xác định dự án tới về API sẽ sử dụng FastAPI.

Các tính năng chính

  • Nhanh: hiệu suất thực thi rất cao, có thể cạnh tranh được với Nodejs và Go
  • Phát triển nhanh: nâng cao tốc độ lập trình từ 200% đến 300%
  • Ít lỗi: giảm 40% lỗi do tích hợp ràng buộc dữ liệu khá tốt
  • Trực quan: hỗ trợ bộ soạn thảo tốt với Completion bao phủ.
  • Dễ dàng: được thiết kế để dễ dàng học và sử dụng
  • Ngắn gọn: tối giản hoá sự trùng lặp code.
  • Vững chãi: code đạt mức production, với khả năng tương tác API trên tài liệu
  • Quy chuẩn: thiết kế hoàn toàn dựa trên OpenAPI và JSON schema

Trên đây là các yếu tố được quảng cáo bởi chính FastAPI, tuy nhiên mình cũng xác nhận rằng 60~70% là có thể tin được. Còn tốc độ lập trình và ít lỗi thì còn phụ thuộc vào khả năng code nữa.

Điểm hay nữa của FastAPI chính là tài liệu đầy đủ và ví dụ rõ ràng, dễ hiểu phủ toàn bộ về cách xử lý các thành phần trong request, cho đến xử lý form, tập tin, và bảo mật.

Thực hành viết API

Chúng ta sẽ thử viết api đơn giản thao tác với db sqlite.

Môi trường và thư viện đi kèm

python3.6 -m venv venv
source venv/bin/activate
pip install sqlalchemy uvicorn fastapi

Viết code

File db.py: mục đích là để tạo ra db SQLite

# db.py
from sqlalchemy import Boolean, Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base


SQLALCHEMY_DATABASE_URI = "sqlite:///./test.db"
# SQLALCHEMY_DATABASE_URI = "postgresql://user:password@postgresserver/db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URI, connect_args={"check_same_thread": False}, echo=True
)

Base = declarative_base()

# Định nghĩa table Todo
class Todo(Base):
    __tablename__ = 'todos'
    id = Column('id', Integer, primary_key = True)
    title = Column('title', String(200))
    done = Column('done', Boolean, default=False)

# Tạo table Todo
Base.metadata.create_all(bind=engine)

Chạy python db.py, nếu không có lỗi gì hết thì file “test.db” sẽ được tạo ra.

Mở file “test.db” bằng DB Browser for SQLite:

SQLite DB

File main.py

# main.py
from fastapi import Depends, FastAPI
from fastapi import FastAPI, Path, Body, Depends
from sqlalchemy.orm import Session, sessionmaker
from starlette.requests import Request
from db import Todo, engine

# Connect when a session class instance for DB connection is created
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# Definition of data passed to API using Pydantic Addition of Validation and Documentation functions
class TodoIn(BaseModel):
    title: str
    done: bool


# Utility to get a single Todo
def get_todo(db_session: Session, todo_id: int):
    return db_session.query(Todo).filter(Todo.id == todo_id).first()


# Pass the session of DB connection to the function of each endpoint
def get_db(request: Request):
    return request.state.db


# List Todo
@app.get("/todos/")
def read_todos(db: Session = Depends(get_db)):
    todos = db.query(Todo).all()
    return todos


# Get a Todo by id
@app.get("/todos/{todo_id}")
def read_todo(todo_id: int, db: Session = Depends(get_db)):
    todo = get_todo(db, todo_id)
    return todo


# Create a Todo
@app.post("/todos/")
async def create_todo(todo_in: TodoIn, db: Session = Depends(get_db)):
    todo = Todo(title=todo_in.title, done=False)
    db.add(todo)
    db.commit()
    todo = get_todo(db, todo.id)
    return todo


# Update a Todo
@app.put("/todos/{todo_id}")
async def update_todo(todo_id: int, todo_in: TodoIn, db: Session = Depends(get_db)):
    todo = get_todo(db, todo_id)
    todo.title = todo_in.title
    todo.done = todo_in.done
    db.commit()
    todo = get_todo(db, todo_id)
    return todo


# Delete a Todo
@app.delete("/todos/{todo_id}")
async def delete_todo(todo_id: int, db: Session = Depends(get_db)):
    todo = get_todo(db, todo_id)
    db.delete(todo)
    db.commit()


# Create a session instance for middleware DB connection which will be called for each request
@app.middleware("http")
async def db_session_middleware(request: Request, call_next):
    request.state.db = SessionLocal()
    response = await call_next(request)
    request.state.db.close()
    return response

Chạy ứng dụng với lệnh uvicorn main:app --reload, sau đó bạn có thể sử dụng API ở http://127.0.0.1:8000/todos.

Điểm đặc biệt như đã nói ở trên, là bạn có thể xem và thao tác với API thông qua trang tài liệu của chính ứng dụng ở http://127.0.0.1:8000/docs, hoặc http://127.0.0.1:8000/redoc.

Docs với OpenAPI được tạo ra bởi FastAPI

Fullstack Station Tips

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

  • Về Graphql: Graphql được dựa chính trên Starlette và Graphene, vì vậy nếu dự án thiên về Graphql thì FastAPI không mang lại nhiều ý nghĩa. Nếu dùng graphql trên python, bạn có thể sử dụng Graphene và kết hợp với bất kỳ nền tảng nào cũng được như Flask, Django.
  • Như đã từng giới thiệu về Graphql (xem Graphql là gì), thì API Restful thực sự có nhiều điểm bất lợi hơn, bạn hãy cân nhắc kỹ ứng dụng của mình nên sử dụng Restful hay Graphql
  • Để kích hoạt hiệu suất cao nhất, bạn cần sử dụng driver async tương ứng với DB sử dụng. Ví dụ với MongoDB thì nên dùng https://github.com/mongodb/motor.

Tham khảo:

https://www.toptal.com/python/build-high-performing-apps-with-the-python-fastapi-framework

The post FastAPI: Tạo API chuẩn và cực nhanh trong Python appeared first on Fullstack Station.

]]>
https://fullstackstation.com/fastapi-tao-api-chuan-va-cuc-nhanh-trong-python/feed/ 2
Giới thiệu một số công cụ hỗ trợ lập trình Python https://fullstackstation.com/gioi-thieu-mot-so-cong-cu-ho-tro-lap-trinh-python/ https://fullstackstation.com/gioi-thieu-mot-so-cong-cu-ho-tro-lap-trinh-python/#comments Thu, 21 Mar 2019 15:53:49 +0000 http://fullstackstation.com/?p=1484 Như bất kỳ các ngôn ngữ khác, mình luôn quan trọng các công cụ hỗ trợ để lập trình tốt hơn, nên khi học và sử dụng python mình cũng tìm hiểu các công cụ hỗ trợ, nhận thấy sự hiệu quả đó mình tổng hợp và chia sẽ với các bạn ở bài viết […]

The post Giới thiệu một số công cụ hỗ trợ lập trình Python appeared first on Fullstack Station.

]]>
Như bất kỳ các ngôn ngữ khác, mình luôn quan trọng các công cụ hỗ trợ để lập trình tốt hơn, nên khi học và sử dụng python mình cũng tìm hiểu các công cụ hỗ trợ, nhận thấy sự hiệu quả đó mình tổng hợp và chia sẽ với các bạn ở bài viết này các công cụ đó.

Các công cụ hỗ trợ kiểm tra kiểu dữ liệu

Kiểm tra kiểu dữ liệu là gì?

Đối với các ngôn ngữ lập trình kiểu động, thông dịch như Python, Javascript (Xem thêm Flow: type-checker cho Javascript), Php thì kiểu dữ liệu không bị ràng buộc dẫn đến việc 1 biến, 1 hàm có thể nắm giữ/trả về các kiểu dữ liệu khác nhau trong quá trình thực thi. Mặc dù đây là đặc tính của những ngôn ngữ này, chứ không hẳn là 1 điểm yếu, tuy nhiên để nâng cao khả năng hạn chế lỗi thì chúng ta vẫn cần nâng cao khả năng viết code và sự hỗ trợ của các công cụ.

Ví dụ:

def add(x, y):    
    return x + y

add("hai", "ba")
=> "haiba" # Kiểu string
add(2, 3)
=> 5 # Kiểu integer

add("hai", 3)
hoặc 
add(2, "ba")
=> chúng ta sẽ bị lỗi `TypeError`

Điều này thường dẫn đến các lỗi chương trình mà có xác suất xảy ra thấp và chỉ phát hiện trong lúc thực thi, khiến cho việc gỡ lỗi rất khó khăn.Tầm quan trọng của việc kiểm tra kiểu dữ liệu (type checker) khá cao, và cũng được nói rõ PEP 484 (https://www.python.org/dev/peps/pep-0484/), dựa vào PEP 484 ta sẽ sửa lại như sau:

def add(x: int, y: int) -> int:    
    return x + y

Như vậy, mã nguồn có tính dễ đọc dễ hiểu ngay đầu vào và kết quả trả về của hàm, mã nguồn có tính dễ bảo trì và sẽ hạn chế lỗi không mong muốn. Trong mã nguồn chỉ cần bạn viết theo cấu trúc đó là bạn đã hoàn thành nhiệm vụ của bạn, phần còn lại hãy để các công cụ hỗ trợ bạn.

Ưu và khuyết điểm

Ưu điểm:

  • Nâng cao khả năng hạn chế lỗi lúc thực thi vì có thể phát hiện được lỗi trong quá trình lập trình.
  • Nâng cao khả năng dễ đọc của mã nguồn vì tính rõ ràng của dữ liệu, giúp các lập trình viên dễ dàng nắm rõ chương trình hơn.
  • Khả năng hiểu cấu trúc của chương trình tốt hơn khi bạn nắm vững luồng dữ liệu lúc thực thi.

Khuyết điểm:

  • Giống như hướng tiếp cận TDD (Test-driven development) thì việc viết code theo hướng có chú giải sẽ mất nhiều thời gian hơn 1 chút, và code nặng hơn 1 tí.
  • Mặc dù có type-checker nhưng bản chất Python là dynamic typed, vì vậy kiểu dữ liệu vẫn được tự do bất chấp bạn có viết diễn giải (annotation) kiểu dữ liệu.
  • Cần sử dụng cách viết trong toàn bộ mã nguồn để đạt hiệu quả. Giả sử hàm trên addđược gọi từ 1 hàm khác, và dữ liệu truyền vào không xác định được, thì các công cụ type-checker cũng không kiểm tra được.

Static typing. Sure “real” developers may not need static typing, but if you end up in a situation where a system needs a critical bug fix and the core developers aren’t around anymore or on vacation, and the fix needs to roll out to millions of users, any static analysis ahead of runtime is extremely useful.

Wolfgang Grieskamp, Google Inc.
Tạm dịch: Rõ ràng là đối với lập trình viên thực thụ sẽ không cần quan tâm kiểu dữ liệu, nhưng một lúc nào đó bạn đối mặt với hoàn cảnh là hệ thống cần sửa lỗi nghiêm trọng, và lập trình viên chính không ở đó hoặc đang trong kỳ nghỉ, và việc sửa lỗi ảnh hưởng đến hàng triệu người dùng, thì việc phân tích kiểu dữ liệu trước khi thực thi là cực kỳ cần thiết.

Pyre và Mypy, Pyright

Pyre: https://pyre-check.org/

Mypy: http://mypy-lang.org

Mypy là công cụ được tạo ra trước, nhưng Pyre do Facebook tạo ra, và do cũng được kỳ vọng do đã thành công với các ngôn ngữ khác như Flow cho Javascript hay Hack cho PHP nên Pyre có thể được ưu chuộng hơn. Cá nhân mình sử dụng Mypy là chính, nhưng cũng có cài thêm Pyre để sử dụng cả 2 thì cũng không ảnh hưởng gì. Mặc dù Pyre được quảng cáo là chạy nhanh, nhưng do tính chất chạy nền của các loại công cụ này nên việc nhanh hơn thực sự không quan trọng lắm.

Pyright: https://github.com/Microsoft/pyright

Microsoft đã gia nhập cuộc chơi static type-checker cho Python bằng Pyright, với sự quảng cáo là tốc độ nhanh hơn gấp 5 lần mypy, đây là một ngôi sao mới cần được trải nghiệm. Điểm đặc biệt nữa của Pyright là dùng Typescript nên không phụ thuộc vào môi trường Python.

Pytype

Mặc dù Pytype cũng là 1 công cụ type-checker nhưng với khả năng kiểm tra kiểu dữ liệu không cần type-annotations nghĩa là bạn không cần phải viết chú thích (tuy nhiên đó không phải là mục tiêu của Pytype), đồng thời có thể kiểm tra nhiều kiểu lỗi khác.

Điểm đặc biệt của Pytype là có thể cải tạo các mã nguồn không có type-annotations thành có, tuy nhiên hiện tại chỉ mới dừng ở mức độ từng file, nên nếu dự án có lượng mã nguồn lớn thì cũng tốn nhiều công sức chuyển đổi.

Pycharm

Bạn đang dùng Pycharm thì chúc mừng bạn là type-checker đã được hỗ trợ tích hợp sẵn công cụ type-checker. Tuy nhiên, mình không dùng Pycharm vì phải trả phí cho bản Pro (bản Community khá hạn chế) trong khi hiện tại mình dùng VSCode khá tốt.

Các công cụ hỗ trợ format code

Nếu bạn dùng Pycharm, bạn có thể không cần suy nghĩ nhiều về format code, nhưng trong khía cạnh này có rất nhiều công cụ: autopep8, yapf của Google, Black, isort

Mình thì sử dụng Black, xài rất tốt và hiện tại cũng đạt hơn 8500 stars ở Github gần bằng Yapf, mặc dù được phát triển sau này nhưng Black cũng đạt được tiếng vang tốt, mình nghĩ dùng Black là ổn.

Các công cụ về Linting

Linting thì đa phần các IDE, hay các Text Editors có hỗ trợ Python thì đều có cài đặt sẵn các công cụ lint như Pyflakes, Pylint, pycodestyle, pydocstyle

Các công cụ về Linting ở đây và các công cụ về type-checker, format code có nhiều điểm tương đồng và chồng chéo lẫn nhau, nhưng ở đây Linting xét về tính logic như sử dụng dư thừa thư viện, biến, hoặc các biểu thức logic dư thừa …

Trong khía cạnh này thì `pycodestyle` có phần chiếm ưu thế vì tốc độ thực thi nhanh và khả năng bắt lỗi tốt. Phần linting được trình bày sau bởi vì nếu bạn sử dụng type-checker và format code tự động thì phần linting còn lại sẽ chỉ tập trung vào tính logic của mã nguồn, mặc dù có thể có trùng lắp tính năng nhưng không sao, thà thừa hơn thiếu.

Fullstack Station Tips

Việc tuân thủ coding-standard là cực kỳ quan trọng đảm bảo tính nhất quán theo chuẩn của dự án và hạn chế các lỗi phát sinh ngoài ý muốn. Trong đó viết code theo type-annotations là quan trọng nhất vì có nhiều hiệu quả, còn các thứ khác đa phần là được giải quyết tự động thông qua việc format code và sửa theo gợi ý của các công cụ Linting.

Mỗi khi mình viết code, mà không có type-annotations thì chắc chắn 1 điều là mình hiểu chưa tốt các kiểu dữ liệu của các bộ thư viện đang sử dụng hoặc chính mã nguồn của dự án. Điều này xảy ra khi mình học thêm các thư viện bên mảng Machine Learning như Numpy, Pandas, Pytorch, dẫn tới là 1 áp lực phải học, hiểu rõ các kiểu dữ liệu của các thư viện này.

Bộ công cụ mà mình sử dụng là: mypy, Black và pycodestyle, pytype.

(Pyright là công cụ mới nổi lên từ cuối tháng 3/2019, mình sẽ sử dụng xem như thế nào và báo cáo mọi người sau)

Tham khảo

https://realpython.com/python-code-quality/

https://medium.com/@CodingZen/codingzen-static-typing-in-python-no-way-afb643c334f

The post Giới thiệu một số công cụ hỗ trợ lập trình Python appeared first on Fullstack Station.

]]>
https://fullstackstation.com/gioi-thieu-mot-so-cong-cu-ho-tro-lap-trinh-python/feed/ 1
Kinh nghiệm dành cho người mới bắt đầu lập trình Python https://fullstackstation.com/kinh-nghiem-danh-cho-nguoi-moi-bat-dau-lap-trinh-python/ https://fullstackstation.com/kinh-nghiem-danh-cho-nguoi-moi-bat-dau-lap-trinh-python/#comments Fri, 16 Mar 2018 15:03:19 +0000 https://www.businesscard.vn/blog/?p=1160 Gần đây mình bắt đầu quay lại với Python, thứ mà mình đã bắt đầu tìm hiểu từ lúc Python 3 ra mắt, nhưng lúc đó thực sự chỉ là cưỡi ngựa xem hoa, nên đến lúc tìm hiểu lại thì cũng chỉ là số 0 tròn trĩnh, dù cảm xúc yêu mến python thì […]

The post Kinh nghiệm dành cho người mới bắt đầu lập trình Python appeared first on Fullstack Station.

]]>
Gần đây mình bắt đầu quay lại với Python, thứ mà mình đã bắt đầu tìm hiểu từ lúc Python 3 ra mắt, nhưng lúc đó thực sự chỉ là cưỡi ngựa xem hoa, nên đến lúc tìm hiểu lại thì cũng chỉ là số 0 tròn trĩnh, dù cảm xúc yêu mến python thì vẫn còn chút gì gợi nhớ. Bài viết này tổng hợp những kiến thức, kinh nghiệm dành cho người mới bắt đầu lập trình Python mà mình đã trải nghiệm, tổng hợp được trong thời gian vừa qua. Hi vọng sẽ giúp ích cho những ai cũng mới bắt đầu như mình vậy, mặc dù cách tiếp cận của mình có hơi khác 1 chút là mình chú trọng đến môi trường phát triển, làm sao để “thực hành” mà không bị gặp các trục trặc, chứ không chuyên vào lý thuyết, vì cũng đã có rất nhiều tài liệu rồi.

Python đáng yêu như thế nào

Lần học Python đầu tiên, Python và cộng đồng Python không mạnh như bây giờ, Python giờ giống cô gái sếc-xi mà bao chàng trai đều muốn sở hữu, mình cũng không phải ngoại lệ :D. Chắc các bạn cũng biết bây giờ đang là trào lưu của Machine Learning, Deep Learning mà Python là ngôn ngữ có thể gọi là phù hợp nhất để triển khai, thực hiện.
Bên cạnh đó, Python được thiết kế đa mục đích, có thề lập trình web (Django rất tuyệt), devops, Internet of Things…, hầu như python có thể sử dụng được ở tất cả các lĩnh vực, mặc dù ở một số lĩnh vực thì có thể cũng không thể mạnh hơn so với các ngôn ngữ khác, nhưng trong bài này mình sẽ không đi sâu vào vấn đề này.
 
Được sử dụng nhiều và mạnh mẽ nhưng Python lại khá dễ học, vì vậy mà Python là ngôn ngữ chính được chọn để dạy lập trình cho trẻ em, do vậy bạn hoàn toàn có thể học python một cách nhanh chóng.

So sánh một chút với Javascript

Mục tiêu của blog này là nói về hệ sinh thái Fullstack, thứ mà javascript rất mạnh, tuy nhiên sau khi học python và hoàn thành xong dự án với Django, mình thấy có một điểm mạnh khi kết hợp giữa Django và hệ sinh thái của Javascript, mà nòng cốt là React. Khi sử dụng Django, chúng ta sẽ quay trở lại mô hình cũ Frontend-Backend, trong đó Frontend là hệ sinh thái React, Backend là Django dễ dàng cung cấp API và Admin dashboard. Khi sử dụng Django, mình chỉ cần quan tâm đến thiết kế model (ORM) là mình đã có Admin Dashboard với đầy đủ chức năng bảo mật, phân quyền, dashboard cho CRUD (Create-Read-Update-Delete), tạo API cũng đơn giản hoặc sử dụng Django Rest Framework.
Mặc dù mình rất thích thiết kế của Graphql cho backend, nhưng với những ưu thế mà Django mang lại thì cũng sẽ có nhiều dự án phù hợp.
Chú ý là sự kết hợp này không mạnh để:
– Thiết kế ứng dụng có tính chất reactive (ứng dụng có tính realtime), nếu muốn realtime thì phải kết hợp thêm nodejs hoặc dùng [Channel](https://channels.readthedocs.io/en/latest/) cho Django.
– Ứng dụng sử dụng những điểm mạnh của Graphql
 

Một số kinh nghiệm

Cài đặt python

Python 2 đã ngưng phát triển và sẽ ngưng hỗ trợ từ 2020, chỉ còn 2 năm nữa thôi nên mọi thứ bây giờ bạn nên bắt đầu với Python 3, không cần phải suy nghĩ.
Nếu bạn dùng Window thì cứ vào trang chủ Python.org(https://www.python.org/downloads/windows/) tải về, nhưng với MacOS thì do đã được cài đặt Python 2 nên nếu bạn cài đặt từ Package Installer của Python sẽ phức tạp hơn 1 chút để chuyển sử dụng mặc định python 3. Mình từng sử dụng Package Installer và sau khi cài là không biết đã được cài python ở đâu 😀
Mình đề nghị sử dụng homebrew để cài đặt, sẽ đơn giản hơn, hướng dẫn cài đặt ở đây.
Trước lúc cài đặt bằng homebrew thì mình cũng thử cài bằng Anaconda, nhưng thấy không thuận tiện bằng do máy đã có sẵn homebrew.
(Bài viết này mình dùng MacOS, nên nếu bạn dùng Window có thể sẽ có nhiều ý về thiết lập môi trường sẽ không đúng.)

Virtualenv

Chỉ với Python và PIP thì chúng ta cần cài đặt ở mức hệ thống, nhưng sau đó tất cả những gì bạn cần làm tiếp theo là phải dùng virtualenv (Môi trường ảo). Virtualenv rất quan trọng, nó ảnh hưởng hầu như các bước đi tiếp theo có trôi chảy hay không.
Bởi vì khi dùng PIP của hệ thống nó dính tới phân quyền, lúc nào cũng phải dùng sudo pip install XYZ thì sẽ phức tạp và có rủi ro bảo mật, bạn chỉ cài PIP không phải từ Virtualenv với những thứ liên quan trong hệ thống máy tính của mình.
Với Virtualenv thì bạn có thể hình dung như node_modules của Nodejs và vendor trong composer của PHP, mọi thư viện đều được cài đặt tách biệt với hệ thống và chỉ sử dụng trong nội bộ dự án.
Sử dụng
pip install virtualenv
Giả sử thư mục của dự án là /path/to/my_project/
virtualenv venv
# nếu máy bạn có cả python2, thì phải chỉ rõ đường dẫn đến python thông qua tham số `-p`
virtualenv venv -p `which python3`
Với venv là thư mục chứa python và các package. Xem giải thích về việc chọn thư mục venv ở phần VSCode
Sau khi có virtualenv, bạn cần kích hoạt:
source ./venv/bin/activate
Sau khi không dùng nữa thì dùng lệnh deactivate để thoát khỏi môi trường ảo. Thường mình không dùng lệnh này, cứ bật tab khác của Terminal thôi, vả lại mình không shutdown máy bao giờ :D, chỉ sleep rồi bật lên là xài tiếp nên không cần deactivate.

Text Editor/IDE

Mình có nghe giới thiệu tốt về Pycharm, nhưng không dùng vì phải trả phí, vả lại mình dùng VSCode đã lâu cho các dự án liên quan đến Javascript, Nodejs, PHP và bây giờ là Python đều thấy tốt (riêng đối với PHP thì khá tệ nếu so sánh với PHPStorm).

Sử dụng VSCode

Cài đặt extension Python
Mọi thứ cần thiết chỉ là cài đặt extension Python cho VSCode là xong, biến VSCode thành IDE cho Python thực thụ. Với những thiết lập mình đưa ra bên dưới, bạn sẽ chiến bất kỳ dự án nào mà ko sợ ảnh hưởng đến các dự án khác. Nói chung, cách đơn giản là thiết lập có giá trị cho từng dự án riêng biệt dựa trên VirtualEnv.
Thiết lập cài đặt cho dự án
Lý do mình dùng thư mục `venv` ngay trong thư mục của dự án, một phần là để phối hợp với VSCode tốt hơn, trong `Workspace Settings` của VSCode:
bạn thêm dòng
"python.pythonPath": "${workspaceRoot}/venv/bin/python"
Với ${workspaceRoot} là thư mục gốc của dự án.
Như vậy, kể từ lúc này, các package liên quan đến VSCode được sử dụng để hỗ trợ sẽ được cài đặt trong thư mực venv như pylintdùng để phân tích mã nguồn hay autopep8 hỗ trợ format code python tự động theo chuẩn pep8, hay để autocomplete, code definition, navigation các thư viện được sử dụng trong dự án rất dễ dàng.
 
Cách này có thêm điểm lợi là cấu hình đi theo dự án, không phụ thuộc vào cài đặt python của máy, dù mình có cài máy lại, hay code trên nhiều máy thì cấu hình không thay đổi.
Trong trường hợp sử dụng ở máy cá nhân hay ở máy chủ, thì vì môi trường “venv” là đường dẫn tương đối, nên nếu 2 dự án khác nhau nhưng chung python 3.6 chẳng hạn, thì python được sử dụng chung nhưng `site-packages` thì độc lập.
Ví dụ:
# tại /path/to/projectA
source venv/bin/active
pip install packageA

# chuyển thư mục qua dự án B
cd /path/to/projectB

# trở thành (venv)/path/to/projectB
# chú ý là không cần deactive môi trường vẫn có thể cài đặt package cho projectB được.
pip install packageB

=> 2 package A và B được cài đặt cho 2 dự án hoàn toàn độc lập.

Cấu hình pylint
Trong thư mục gốc của dự án tạo file: .pylintrc
[MASTER]
load-plugins=pylint_common, pylint_django

[FORMAT]
max-line-length=120

[MESSAGES CONTROL]
disable=missing-docstring,invalid-name

[DESIGN]
max-parents=13


Trong file trên, mình có sử dụng  pylint_django, là do mình dùng Django, nếu bạn dùng Flask thì cài và thay bằng pylint_flask chẳng hạn, tuỳ theo framework bạn dùng để cài plugin tương ứng. Mặc định thì pep8 quy định 1 dòng 80 ký tự, mình thấy mức này khá ngắn cho một file bình thường, với mình thì để ở mức 120 thì thoải mái hơn.

Tài liệu, thực hành

Nếu bạn đã có kiến thức ở ngôn ngữ khác rồi, thì nên sử dụng tài liệu LearnXinYminutes, có cách nhìn tổng quan về Python3 một cách nhanh nhất.

Nếu bạn cũng từng làm về PHP thì có thể đọc cuốn “Python rất là cơ bản” của bạn Võ Duy Tuấn – người có kinh nghiệm 10 năm lập trình PHP chuyển sang Python. Cuốn này thì bạn chỉ cần đọc từ chương 1 đến chương 5 là đủ, các chương khác tuỳ theo nhu cầu bạn có thể đọc sau.

Thực hành thì mình dùng LeetCode (http://leetcode.com/) hoặc HackerRank(http://hackerrank.com), vì để giải quyết các vấn đề ở LeetCode, HackerRank chúng ta cần các kiến thức cơ bản của python (ví dụ xử lý số, chuỗi hay xử lý mảng), cũng như cấu trúc dữ liệu khiến cho kiến thức python sâu hơn.

Khi làm dự án về Django thì giúp mình có kiến thức về class trong python, cách thừa kế, khai báo hàm static, method, …Vì vậy, nếu bạn có kiến thức về web rồi thì cũng nên chọn Django để bắt đầu để tận dụng kiến thức web của bạn.

Python Shell: cứ gõ python trong command line rồi bắt đầu quậy thôi. Mình lúc nào cũng bật thêm cửa sổ này để tìm hiểu 1 số lệnh cơ bản, khi chưa dùng VSCode với cấu hình ở trên thì bạn có thể dùng lệnh dir ví dụ dir(className) để liệt kê các phương thức của class đó, hoặc help ví dụ import os rồi help(os) sẽ biết được module os bao gồm những gì. Với VSCode thì chỉ cần Ctrl+Click hoặc Alt+Click là sẽ đến tập tin khai báo module os, thì bạn sẽ đọc được tài liệu về module này.

Bạn có thể sử dụng thêm MyPy để tăng hiệu quả của code, xem thêm tại Mypy 

Fullstack Station Tips

Dù thích python trước đây nhưng mình cũng từng ghét python chỉ vì có khi bị lỗi khi cài đặt qua pip mà không hiểu nguyên nhân. Kinh nghiệm mình đúc kết được ở đây cũng tốn kha khá thời gian tìm hiểu lúc mới bắt đầu lập trình Python, hi vọng sẽ có ích cho các bạn mới bắt đầu lập trình python khác. Python khá dễ học, kết hợp thêm những kinh nghiệm này sẽ khiến cho quá trình học trở nên trôi chảy hơn.

The post Kinh nghiệm dành cho người mới bắt đầu lập trình Python appeared first on Fullstack Station.

]]>
https://fullstackstation.com/kinh-nghiem-danh-cho-nguoi-moi-bat-dau-lap-trinh-python/feed/ 5