Home Blog Page 86

Hướng dẫn xóa docker image (ví dụ docker rmi)

docker image
Hướng dẫn xóa docker image (ví dụ docker rmi)

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

Hướng dẫn xóa docker image (ví dụ docker rmi)

Hướng dẫn xóa docker image (ví dụ docker rmi)

Để xóa docker image ta dùng lệnh:

docker rmi [OPTIONS] IMAGE [IMAGE...]

trong đó có các option:

--force , -f buộc image (ví dụ nếu có container của image đang chạy ta không thể xóa được nên phải xóa container trước hoặc dùng option này)
--no-prune Không xóa các thằng cha đã bỏ tag

Định dang image được xóa có thể là name:tag hoặc IMAGE ID

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

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

Ví dụ: xóa image theo IMAGE ID

Hướng dẫn xóa docker image (ví dụ docker rmi)

Xóa image theo name:tag

Hướng dẫn xóa docker image (ví dụ docker rmi)

Okay, Done!

References: https://docs.docker.com/engine/reference/commandline/rmi/

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

Ngành Bảo Mật Thông Tin Và Những Cơ Hội Việc Làm Đầy Hấp Dẫn

cơ hội việc làm của ngành bảo mật thông tin
Ngành Bảo Mật Thông Tin Và Những Cơ Hội Việc Làm Đầy Hấp Dẫn

Chúng ta đang sống trong thời đại bùng nổ công nghệ thông tin, sự kết nối giữa người với người trở nên gần gũi hơn bao giờ hết. Không thể phủ nhận rằng công nghệ mang đến quá nhiều lợi ích và mở ra hàng ngàn cơ hội cho tất cả. Tuy nhiên, cũng chưa có lúc nào mà thông tin cá nhân của một người, một tổ chức lại bị chiếm đoạt dễ dàng như hiện tại. Đó cũng là lý do mà ngành bảo mật thông tin đang ngày càng trở nên quan trọng và là phần không thể thiếu với bất cứ cá nhân, tổ chức nào. Vậy ngành bảo mật thông tin là gì? Cơ hội việc làm của ngành bảo mật thông tin hiện đang phát triển ra sao?

cơ hội việc làm của ngành bảo mật thông tin
Các cơ hội việc của ngành bảo mật thông tin hiện nay

Tổng quan về ngành bảo mật thông tin

Bảo mật thông tin là gì?

Bảo mật thông tin có thể hiểu một cách đơn giản là việc bảo vệ an toàn các thông tin và dữ liệu trong một hệ thống, thông qua các phương pháp ngăn cản, phòng ngừa, truy cập hay phát tán thông tin. Bảo mật thông tin là một phần quan trọng trong hệ thống công nghệ thông tin hiện nay.

Hiện tại ở các trường đào tạo chuyên về khoa học máy tính cũng như bảo mật thông tin sẽ giảng dạy các môn học nền tảng có liên quan, từ toán cao cấp, ngôn ngữ lập trình đến kiến thức nâng cao về an ninh mạng như website, hệ thống, máy chủ, cách giải mã các thông điệp mật, bảo mật và mã hóa thông tin,…

>>> Xem thêm Cybersecurity: Khám phá những sự thật bất ngờ về ngành an ninh mạng tại Việt Nam

Sự phát triển của ngành bảo mật thông tin tại Việt Nam

Ở Việt Nam, bảo mật thông tin và an ninh mạng vẫn là lĩnh vực mới và đang phát triển rất mạnh, mở ra cơ hội việc làm cực kỳ hấp dẫn. Công nghệ thông tin ở nước ta đang phát triển nhanh hơn bao giờ hết kéo theo rất nhiều hệ lụy về an toàn thông tin nếu không biết cách bảo vệ. Mỗi người cần tự nâng cao ý thức bảo vệ chính mình trước các thế lực tấn công mạng thông qua việc tìm hiểu thông tin thường xuyên hơn.

Việt Nam hiện đã có sự xuất hiện của nhiều “ông lớn” trong lĩnh vực An toàn Thông tin như: McAfee, Astaro, Check Point, Secure, Trend Micro, FoundStone, BlueCoat,… Số lượng kỹ sư về bảo mật thông tin hiện có khoảng hơn 1000 người được đào tạo chuyên nghiệp. Điều này cho thấy dư địa việc làm của vị trí này vẫn còn rất lớn. Các vị trí tuyển dụng liên quan đến bảo mật và an toàn thông tin luôn nằm trong top các công việc khó tuyển được ứng viên phù hợp nhất do các chuyên viên nhân sự đánh giá. Ngành an toàn thông tin có dễ xin việc không khi yêu cầu đặt ra là khá cao?

>>> Xem thêm Báo Cáo Thị Trường IT Việt Nam Năm 2021: Chuyển Mình Vào Cuộc Cạnh Tranh Tri Thức Toàn Cầu

Cơ hội việc làm của ngành bảo mật thông tin

Các vị trí việc làm phổ biến của ngành bảo mật thông tin

Có rất nhiều các vị trí làm việc khác nhau liên quan đến lĩnh vực bảo mật thông tin, tùy thuộc vào vị trí chuyên môn cụ thể có thể khác nhau. Dưới đây là một số vị trí phổ biến ở thời điểm hiện mà bạn có thể tham khảo như:

  • Chuyên viên tư vấn an toàn thông tin mạng
  • Chuyên viên bảo mật cơ sở dữ liệu
  • Chuyên viên quản trị bảo mật máy chủ và mạng
  • Chuyên viên rà soát lỗ hổng và xử lý sự cố an toàn thông tin mạng
  • Chuyên viên điều tra tội phạm mạng

các ngành nghề bảo mật thông tin

Cơ hội việc làm liên quan đến bảo mật thông tin có ở các cơ quan nhà nước đến công ty tư nhân và cả các công ty nước ngoài. Ngành Big Data đang là lựa chọn phổ biến nhất với các sinh viên định hướng đi theo mảng bảo mật thông tin.

Xem thêm các chương trình tuyển dụng IT HCM trên TopDev

Mức lương ngành an toàn thông tin

Theo số liệu trong Báo cáo thị trường IT Việt Nam 2021 do TopDev thực hiện, ngành an ninh và bảo mật thông tin hiện đang có mức lương cao nhất trong thị trường các việc làm liên quan đến công nghệ thông tin. Mức lương hiện đang dao động trong khoảng trên 1.700 USD với các ứng viên có level từ Senior trở lên. Trong khi đó mức lương khởi điểm của sinh viên mới ra trường chưa bao giờ nằm dưới mức 300 – 400 USD.

Một điều tất yếu đi đôi với mức lương nổi bật hơn hẳn so với mặt bằng chung của thị trường đó là yêu cầu về chất lượng nhân sự đối với ngành an ninh và bảo mật thông tin cũng cao hơn hẳn. Các chuyên viên nhân sự đến từ những công ty hàng đầu luôn gặp rất nhiều khó khăn trong việc tuyển được các ứng viên có năng lực cho những vị trí này.

  Những Kinh Nghiệm Phỏng Vấn Hữu Ích Cho Sinh Viên Mới Ra Trường
  TOP 5 Công Việc Freelance Hot Nhất và Có Thu Nhập Cao Nhất Hiện Nay

Các cơ sở đào tạo bảo mật thông tin uy tín tại Việt Nam

Hiện tại có nhiều trường đại học tại Việt Nam đã đi sâu vào giảng dạy các chuyên ngành liên quan đến an ninh và bảo mật thông tin, trong đó có 8 trường trọng điểm gồm:

  • Học viện Kỹ thuật Mật mã
  • Học viện An ninh nhân dân (Bộ Công an)
  • Học Viện Kỹ thuật Quân sự
  • Trường Đại học Công nghệ thông tin – Đại học Quốc gia TP.HCM
  • Trường Đại học Công nghệ – Đại học Quốc gia HN
  • Trường Đại học Bách Khoa Hà Nội
  • Học viện Công nghệ Bưu chính – Viễn thông

Theo anh Trần Minh Quảng – Trưởng phòng Báo độc và Khai thác lỗi của Công ty An ninh mạng Viettel (Viettel Cyber Security – VCS) trong buổi trò chuyện với TopDev TV đã chia sẻ, để trang bị tốt cho bản thân khi đi theo ngành này, bạn nên: “Có nền tảng về máy tính, CNTT, lập trình… Nắm vững các kiến thức chuyên ngành về Cybersecurity, như dịch ngược, các lỗ hổng phần mềm, lỗ hổng của ứng dụng web, mật mã, mã hóa cũng như kiến thức tổng quan về hệ thống mạng máy tính, máy chủ, các hệ thống dịch vụ trong môi trường doanh nghiệp, tổ chức vận hành như thế nào… Bên cạnh đó, bạn cũng cần thường xuyên chủ động tìm hiểu những công nghệ mới để thành công”.

Xem thêm buổi chia sẻ Cybersecurity: Khám phá những sự thật bất ngờ về ngành an ninh mạng tại Việt Nam

Việt Nam luôn nằm trong top những nước chịu sự tấn công mạng rất mạnh, từ những cuộc tấn công mã độc thông thường đến tấn công có chủ đích. Do đó tất cả các cơ quan tổ chức đang đẩy mạnh hơn nữa việc bảo mật hệ thống thông tin. Cơ hội việc của ngành bảo mật thông tin là hoàn toàn có với những ai đủ đam mê chinh phục và năng lực làm việc. Đón đọc thêm nhiều bài viết hấp dẫn khác tại TopDev trong lĩnh vực IT nhé!

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

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

Có Salt không lo chết đói

salt

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

Salt là gì

Salt (/sɔːlt/ /sɒlt/) là một phần mềm mã nguồn mở, một hệ thống thuộc nhóm Configuration Management (CM), viết bằng Python, sử dụng YAML làm ngôn ngữ giao tiếp với người dùng.

Salt làm gì?

Tính năng của Salt chia làm 2 phần chính: remote execution và configuration management dựa trên nền tảng remote execution.

  10 Lý do nên học Python trong năm 2024

Remote execution

chạy lệnh từ xa. Sau khi cài đặt xong salt-master và các salt-minion, từ salt-master có thể chạy bất kì câu lệnh nào trên máy cài salt-minion.

Tưởng tượng bạn cần xoá 1 file trên 10 hay 100 máy, chỉ cần gõ 1 câu lệnh và tất cả các minion sẽ chạy câu lệnh ấy. Sức mạnh là vô cùng khủng khiếp, giống như nắm một mạng botnet trong tay vậy. Muốn ping 1 server từ 100 máy? gõ lệnh ping -c N victim, và 100 máy sẽ cùng lúc ping đến máy đích.

Configuration management

đảm bảo trạng thái các thành phần của hệ thống. Cần đảm bảo 1 service NGINX chạy với file cấu hình nhất định, forward request đến gunicorn app server trên máy ấy, đã cấu hình để chạy một web application viết bằng Python với phiên bản mới nhất lấy từ 1 git repository? Salt làm được tất cả điều đó, và nó có thể đảm bảo rằng mọi thay đổi bằng tay thực hiện trên những thành phần nói trên sẽ bị thay thế bằng những gì đã định trước.

Theo Chào Muối, em là ai?

Mục tiêu

Bài này cài đặt salt qua pip, và dùng salt-ssh để điều khiển máy khác. Mục tiêu đưa ra một bài hướng dẫn thực hành đơn giản hơn bài hướng dẫn trên trang chủ Salt in 10 minutes và mang lại cảm giác giống đang dùng Ansible.

Kết quả: deploy uds bot – 1 chương trình Python lên máy Ubuntu 18.04, cấu hình systemd chạy vù vù.

3 phút dành cho lý thuyết

  • Máy ra lệnh gọi là salt master
  • Máy bị điều khiển, chạy các câu lệnh gọi là salt minion, trong bài này có IP 192.168.0.110
  • Trong bài này, master sẽ truy cập vào minion qua ssh.
  • Máy master không cần quyền gì đặc biệt và đã cài đặt salt trên Python3.6+
  • Máy minion chạy *NIX OS (Ubuntu, Debian, Fedora, .. MacOS), phải có quyền sudo không password hoặc root để toàn quyền điều khiển máy (như cài package qua apt). Salt có hỗ trợ Windows nhưng nằm ngoài phạm vi bài viết này.

Trên máy minion

  • Tạo 1 user mới: sudo adduser saltuser, trả lời các câu hỏi và gõ password
  • sudo không password: thêm saltuser ALL=(ALL) NOPASSWD: ALL vào cuối file /etc/sudoers
  • Có chương trình sshd listen trên port 22, cài bằng lệnh sudo apt install openssh-server, gõ ss -nlt | grep 22 thấy có kết quả là ok.

Trên máy master

Tạo SSH key nếu chưa có:

ls ~/.ssh/id_rsa || ssh-keygen

Copy ssh public key vào minion:

ssh-copy-id saltuser@192.168.0.110
# rồi gõ password saltuser vừa tạo

Cài đặt

Tạo 1 virtualenv:

python3 -m venv saltenv
. saltenv/bin/activate
pip install salt==3002  # do bản 3003 mới nhất đang có bug

Cài xong kiểm tra

$ salt-ssh --version
salt-ssh 3002

Cấu hình master

Có 2 file cần tạo: master và roster

Tạo 1 thư mục tên saltlab:

mkdir -p ~/saltlab/states
cd ~/saltlab
pwd

File master chứa 2 dòng, root_dir giá trị là đường dẫn đầy đủ tới thư muc saltlab, file_roots có states với giá trị là đường dẫn đầy đủ tới thư mục states, thư mục states sẽ chứa các file “saltstate”

root_dir: /home/hvn/saltlab
file_roots:
  base:
    - /home/hvn/saltlab/states

File roster chứa thông tin về các máy minion:

tv:
  host: 192.168.0.110
  user: saltuser
  sudo: True
trau:
  host: 103.x.y.z
  user: root
  port: 22022

ở đây định nghĩa 2 minion, 1 tên tv và 1 tên trau, minion tv sẽ là đối tượng của bài này.

File này tương tự file inventory (hay có tên là hosts) của Ansible.

Cấu trúc thư mục trông như sau

saltlab/
├── master
├── roster
├── pillars
│   ├── common.sls
│   ├── top.sls
│   └── uds.sls
└── states
    ├── example.sls
    ├── htop.sls
    ├── template.j2
    ├── uds.sls
    └── uds.systemd

Chạy câu lệnh Salt

Từ master, trong venv saltenv, gõ lệnh salt-ssh với đối tượng tv, câu lệnh salt cmd.run, câu lệnh chạy trên tv là uname -a:

(saltenv) $ salt-ssh --config ~/saltlab tv cmd.run 'uname -a'
tv:
    Linux MINIPC-PN50 5.8.0-55-generic #62~20.04.1-Ubuntu SMP Wed Jun 2 08:55:04 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Apply Salt state

Saltstate file là file YAML có đuôi .sls, khai báo (declare) trạng thái của hệ thống mong muốn đạt được. File htop.sls

install htop:   #  ID của "state"
  pkg.installed:  # loại state - tương ứng với 1 python function
    - name: htop   # các tham số - function argument

Cú pháp YAML trên tương ứng với Python dict sau:

{'install htop':
  {'pkg.installed': [{'name': 'htop'}]}}

Sau khi được apply, state trên sẽ cài package htop lên máy, sử dụng package manager của máy minion, dù là apt trên Ubuntu hay yum/dnf trên Fedora.

Đây là một ưu điểm lớn của Salt, người dùng thậm chí không biết chính xác câu lệnh để cài thế nào, chỉ cần liệt kê ra những gì mình cần, Salt sẽ lo tất. Phần này nghe rất “magic”, thực chất thì bên dưới pkg là 1 Python module còn installed là 1 function chạy đủ loại if/else kiểm tra hệ thống và chọn apt hay yum cho phù hợp. Salt gọi đây là state module pkg.

Gõ trên master:

$ salt-ssh --config ~/saltlab tv state.apply htop
tv:
----------
          ID: install htop
    Function: pkg.installed
        Name: htop
      Result: True
     Comment: The following packages were installed/updated: htop
     Started: 15:09:22.550836
    Duration: 10969.17 ms
     Changes:
              ----------
              htop:
                  ----------
                  new:
                      2.2.0-2build1
                  old:

Summary for tv
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1

Xem đầy đủ các option, các function khác của pkg state module tại module-salt.states.pkg

Copy/render file và chạy câu lệnh

File example.sls

render a config file:
  file.managed:
    - source: salt://template.j2
    - template: jinja
    - mode: 0400
    - name: /tmp/ahihi.yml

now run a command:
  cmd.run:
    - name: cat /tmp/ahihi.yml | head

cmd.run dùng để chạy 1 câu lệnh trên minion, lệnh tùy ý. Với cmd.run, ta đã có thể làm được mọi thứ, đây là cách đơn giản nhất để thay thế các bash script mặc dù không phải tối ưu nhất. Ví dụ: nếu chạy apt-get install để cài package thay vì pkg.installed sẽ mất đi các lợi ích pkg.installed thực hiện – chạy trên nhiều OS khác nhau, tự động chạy apt update). Người mới tập dùng Salt có thể dùng cmd.run để bắt đầu, nhưng nên tìm state module có sẵn để thu được kết quả tốt hơn.

file.managed có thể tải 1 file từ internet, có thể copy 1 file từ X đến Y, trong ví dụ này nó copy file từ salt://template.j2 tới minion rồi render với Jinja2 template, ghi vào /tmp/ahihi.yml và chmod 0400.

salt:// trong ví dụ này là file_roots trong file cấu hình master, tức thư mục /home/hvn/saltlab/states trên máy master.

Nội dung file template.j2:

{%- for i in ['meo', 'bo', 'ga'] %}
  - {{ i }}
{%- endfor %}

myuser: user
mypassword: passwd

os: {{ grains['osfinger'] }}
ips: {{ grains['ipv4'] }}

Jinja2 có for if/else như Python, xem Jinja2 template để tìm hiểu thêm.

5 phút dành cho lý thuyết: grains pillar

1 nhược điểm của Salt là theo mốt thời 2010, đặt tên cho mọi khái niệm, và tên đó không thực sự có nhiều ý nghĩa – đơn giản chỉ là bịa ra (theo mốt của Chef – một đối thủ viết bằng Ruby).

Salt có 2 khái niệm:

  • grains: chứa các thông tin về máy minion (OS, version, ip, …)
  • pillar: chứa các thông tin truyền từ master (thường là các thông tin bí mật như user/password).

salt grains

Ví dụ trên có truy cập 2 thông tin từ grains là tên hệ điều hành và các IPv4 của máy minion. state.apply

          ID: render a config file
    Function: file.managed
        Name: /tmp/ahihi.yml
      Result: True
     Comment: File /tmp/ahihi.yml is in the correct state
     Started: 19:33:25.337228
    Duration: 34.549 ms
     Changes:
----------
          ID: now run a command
    Function: cmd.run
        Name: cat /tmp/ahihi.yml | head
      Result: True
     Comment: Command "cat /tmp/ahihi.yml | head" run
     Started: 19:33:25.372408
    Duration: 7.672 ms
     Changes:
              ----------
              pid:
                  42905
              retcode:
                  0
              stderr:
              stdout:

                    - meo
                    - bo
                    - ga

                  myuser: user
                  mypassword: passwd

                  os: Ubuntu-20.04
                  ips: ['127.0.0.1', '192.168.0.110']

Để liệt kê tất cả grains của minion, dùng Salt command grains.items

$ salt-ssh -c ~/saltlab tv grains.items
tv:
    ----------
    biosreleasedate:
        08/27/2020
    biosversion:
        0416
    cpu_flags:
    ...

salt pillar

Pillar chỉ nằm trên master, nó map file nào dành cho minion nào. File top.sls

base:
  '*':
    - common
  'trau':
    - uds

* tức mọi minion đều có thể truy cập các pillar item trong file common.sls, chỉ trau mới truy cập được nội dung trong file uds.sls.

Các file pillar là các file .sls theo syntax YAML, biểu diễn các dictionary của Python. Ví dụ: uds.sls:

telegram_token: this_is_token

database:
  username: root
  password: toor

Để liệt kê tất cả pillar item dành cho minion, dùng Salt command pillar.items (chú ý grains có s, pillar không có).

$ salt-ssh -c ~/saltlab trau pillar.items
trau:
    ----------
    database:
        ----------
        password:
            toor
        username:
            root
    telegram_token:
        this_is_token

Ví dụ 1 file dùng pillar:

# /lib/systemd/system/uds.service
[Unit]
Description=UDS telegram bot

[Service]
User=uds
Environment=BOT_TOKEN={{ pillar['telegram_token'] }}

Deploy 1 Python project

Link này viết 1 salt formula (tên của 1 “bộ cài bằng Salt”) để cài bot telegram uds chạy trên Ubuntu 18.04 với systemd. udsbot-salt

Troubleshooting

Khi kêt quả chạy apply không thành công, thêm -ldebug để xem log chi tiết.

Dùng Ansible “xịn hơn” không?

Không, Ansible giống Salt đến bất ngờ, cũng viết bằng Python với các module tương ứng, cũng dùng Jinja2, cũng viết cấu hình bằng file YAML.

Xem ví dụ.

Ngày nay, Ansible phổ biến hơn nhờ nó đơn giản hơn để bắt đầu, do ít từ khóa hay khái niệm lạ. Năm 2015, RedHat mua lại Ansible khiến cho nó càng trở nên phổ biến hơn.

Salt thành công trước Ansible (2012 2013), đứng sau là công ty SaltStack, đến năm 2020 cũng được ông lớn VMWare mua lại. Salt có nhiều ưu điểm so với Ansible (đặc biệt là nhanh), cung cấp nhiều tính năng phức tạp – dùng trong môi trường phức tạp.

Dùng Salt chuyển sang Ansible mất nửa ngày để map lại khái niệm.

Học salt là học gì

Đa phần là học các salt module (như pkg.installed) có sẵn để viết các state, dùng chúng như các viên gạch để tự động quá trình cài đặt / cấu hình phần mềm trên hệ thống. Cách thực hành đơn giản nhất là dùng Salt cài các phần mềm trên chính máy tính của mình đang dùng, thay vì gọi salt-ssh, dùng

sudo salt-call --local state.apply FORMULA_NAME -linfo

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

Tạo 1 salt formula để deploy app Flask hello world chạy bằng gunicorn với NGINX server rồi tạo Pull Request vào pymivn/flask-salt để trăm hay đều như tay quen.

Kết luận

Năm COVID-19 thứ 2, 2021, Salt, Ansible, Chef hay Puppet không còn mới mẻ gì, từng là “điểm cộng” trong các vòng tuyển dụng thì giờ là yêu cầu hiển nhiên cho giới “DevOps”, thế giới cũng đã đu theo một trend mới hơn, hot hơn có tên Docker+Kubernetes, nhưng các CM vẫn luôn có đất dùng. Trend lên rồi sẽ xuống, hot rồi sẽ nguội, cái gì hợp lý thì ta dùng.

Đến đây, đã đủ để các Python dev deploy code như 1 DevOps engineer thực thụ, không phải nhọc nhằn code bash.

Life’s too short to remember how to write Bash code. I feel liberated. — @laheadle on Clojurians Slack

References

Ủng hộ tác giả

HVN at http://pymi.vn and https://www.familug.org.

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 xóa logs docker, giới hạn file log docker

logs docker
Hướng dẫn xóa logs docker, giới hạn file log docker

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

Hướng dẫn xóa logs docker, giới hạn file log docker.

1. Xóa log của docker

Nếu bạn cài docker, sau một thời gian sẽ thấy ổ cứng rất nhanh bị đầy (nhất là các server chạy nhiều docker container và ghi log liên tục). Trong khi kiểm tra thì docker images và docker container ko chiếm mấy dung lượng.

  25 blogger IT nổi tiếng mà dân lập trình ai cũng phải biết
  Câu chuyện về cái comment tại một blog nọ

Nếu kiểm tra kỹ thì sẽ thấy dung lượng của 2 folder sau rất lớn:

./var/lib/docker/containers

./var/lib/docker

Mặc định docker lưu log trong folder /var/lib/docker/containers, và mặc định thì log sẽ ko bị giới hạn kích thước nên sẽ tăng dần theo thời gian.

Để xóa log, ta dùng câu lệnh sau:

sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'

Ví dụ trước khi xóa log:

Hướng dẫn xóa logs docker, giới hạn file log docker

Kết quả sau khi xóa log

Hướng dẫn xóa logs docker, giới hạn file log docker

2. Giới hạn kích thước file logs của docker

2.1 Cách thứ nhất:

Giới hạn logs của từng docker container khi run với lựa chọn --log-driver--log-opt để quyết định bao nhiêu file log được ghi ra, kích thước mỗi file là bao nhiêu…

Ví dụ:

docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...

Hoặc nếu sử dụng docker compose:

version: '3.7'

services:

 app:

 image: ...

 logging:

 options:

 max-size: "10m"

 max-file: "3"

2.2 Cách thứ hai:

Thiết lập logrotate để xóa log định kì bằng cách:

Sửa file /etc/logrotate.d/docker-logs (nếu chưa có thì tạo mới) với nội dung sau:

/var/lib/docker/containers/*/*.log {

 rotate 7

 daily

 compress

 size=50M

 missingok

 delaycompress

 copytruncate

}

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

HttpOnly Flag và Secure Flag là gì?

HttpOnly Flag và Secure Flag là gì?

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

Trước tiên, nếu bạn nào chưa có cái nhìn qua về cookies thì có thể tham khảo bài viết này. Cookies thật sự rất hữu ích, thuận tiện khi sử dụng nhưng cũng tồn tại không ít rủi ro. Bài viết sau đây giúp tìm hiểu rõ thêm về 2 thuộc tính giúp bảo vệ cookies là httponly và secure.

  Bí kíp tạo website nhờ vào GitHub và Cloudflare
  Cách gỡ bỏ Adobe Flash. Tại sao Flash bị Adobe khai tử?
Http cookies – tiện lợi nhưng không hề an toàn.

1. Httponly Flag.

1.1 Ngày buồn khi mất cookies.

Chuyện kể rằng:

30/2/2001, một ngày đẹp trời, không nắng, cũng méo mưa, thằng XXX (mean Tèo, Toàn, … not porn) lưới web thì thấy trang https://ZZZ.com. Với chút kiến thức hèn mọn, khi thấy website có sử dụng SSL thì XXX yên tâm lắm, login ngay. Ọt, ọt, ọt, tẹt, tẹt, tẹt, server hì hục làm việc, xác cmn định đây chính xác là thằng XXX, server trả về authKey lưu ở cookies xác nhận đã đăng nhập. Đang định xem ít phim thì PING – có email mới. Hí hửng mở xem, tưởng đâu mail công việc, nào ngờ chỉ là một đường link vô hồn với tên miền khêu gợi http://choiemdi.com.vn. Trông có vẻ ngon, đang thèm , XXX click vào ngay. Bùm, toàn bộ thông tin profile lưu ở ZZZ đều bị mất.

Hết chuyện.

Tại sao?. Tại sao?. Có ma mới biết được!. Nhưng sau khi đọc bài này, chắc con ma kia cũng có thể giải thích tại sao thằng ZZZ lại bị mất thông tin. Nếu đọc xong mà không giải thích được, phải chăng các bạn còn thua cả con ma?. =)))

ĐM, lại chửi khéo bố m rồi, bố m đang đọc bài của mày đấy.

1.2 Tại sao lại thế?.

Nguyên nhân XXX bị mất thông tin cá nhân là do quá chủ quan khi click đọc email. Ngoài ra, do cookies phản hồi từ server không được bảo vệ bởi httponly nên đã bị đối tượng xấu lấy mất cookies xác thực đăng nhập -> dẫn tới mất thông tin.

Trường hợp giá trị httponly không được set hoặc set bằng false thì chỉ cần thực hiện một câu lệnh javascript đơn giản là đã có thông tin cookie.

// Nội dung cookie bị đánh cắp có thể sử dụng cho nhiều mục đích
// httponly flag = false hoặc không được set
document.cookie = "authKey cookie của XXX";

Về mặt bản chất, cũng có thể hiểu đây như là một cuộc tấn công XSS, đối tượng gửi email sẽ execute một đoạn script truy xuất dữ liệu từ cookie, đánh cắp thông tin, thay thế người dùng giao tiếp với server.

rủi to khi giao tiếp client và serverHình ảnh mô tả cách thức tấn công bằng XSS (Cros site scripting)

Xã hội phát triển, trải nghiệm người dùng với website càng ngày càng được yêu cầu cao. Người ta chỉ muốn login một lần duy nhất, đóng tab shopping mà vẫn lưu giỏ hàng, … Chính vì vậy, cookie cũng được sử dụng rộng rãi hơn, kéo theo nhiều rủi ro hơn.

1.3 Httponly ra đời.

Để tăng cường bảo mật thông tin lưu trữ trong cookie, httponly ra đời.

Mục đích của thuộc tính httponly là bảo về cookie khỏi việc truy cập trái phép từ browser. Chỉ lưu và gửi kèm cookie phản hồi từ client tới server. Việc hạn chế sự can thiệp từ trình duyệt giúp hạn chế rủi ro từ các cuộc tấn công đánh cắp cookie.

httponly được bật là true cho các cookies quan trọnghttponly luôn set là true cho các item cookies quan trọng (ngân hàng VIB)
Khi truy xuất nội dung cookie, chỉ duy nhất ARRAffinity là có thể đọc được

If one cookie is HttpOnly, it cannot be accessed by client JavaScript, which means hackers cannot read the cookie value and send it to his own server, not even know whether this cookie exist.

Nếu cookie được set cờ HttpOnly, nó không thể bị truy cập bởi client thông qua Javascript. Điều đó có nghĩa rằng hacker sẽ không thể đọc được giá trị của cookie và gửi về server của hắn, thậm chí cũng không thể biết cookie có tồn tại hay không.

httponly-funny

1.4 Liệu rằng đã đủ?.

Ê, thế mỗi lần tao phản rồi cookies thì set cái cờ này thành true như mấy ông ngân hàng là an toàn rồi chứ gì?.

Xin thưa là KHÔNG. Mặc dù httponly giúp bảo vệ việc truy cập cookies, nhưng không có nghĩa chỉ sử dụng httponly thì cookies đã được an toàn. Trường hợp cookies phản hồi từ server về tới client chỉ thông qua giao thức HTTP?. Tất nhiên, dữ liệu không được mã hóa, một ai đó có thể đánh cặp dữ liệu này trên dọc đường phản hồi từ server tới client.

giao tiếp client và server chỉ bật httponly liệu có đủMột mình httponly liệu rằng có đủ?

1.5 Bảo vệ như thế nào?

Ngay khi cookie được tạo và trả về cho client, khi cờ httponly được bật là true. Cả client, browser đều sẽ biết cookie này chỉ được phép truy cập ở máy chủ, mọi phương thức khác cố gắng truy cập thông tin cookie đều bị từ chối.

Ngoài ra, httponly còn có thể:

  1. Hạn chế quyền truy cập tới document.cookie trong IE7, Firefox 3 va Opera 9.5.
  2. Xóa thông tin cookie trong header, khi sử dụng XMLHttpObject.getAllResponseHeaders() – IE 7 .
  3. XMLHttpObject chỉ có thể được gửi trả về domain gốc.

2. Secure Flag

Như phần HttpOnly phía trên ta đã tìm hiểu, chỉ sử dụng riêng HttpOnly là không đủ. Nếu việc bảo mật ở phía client và browser tốt, nhưng lại sử dụng một phương thức transfer kém thì cookie chưa tới được tay người sử dụng đã bị mất (kết hợp Man in the Middle và Session Hijacking). Những cookie đặc biệt quan trọng như (Auth, Session, …) đều có yêu cầu bảo mật rất cao, vì vậy những cookies này chỉ nên được truyền qua những giao thức bảo mật như HTTPS.

Browsers which support the secure flag will only send cookies with the secure flag when the request is going to a HTTPS page. Said in another way, the browser will not send a cookie with the secure flag set over an unencrypted HTTP request.

Trình duyệt hỗ trợ cờ secure sẽ chỉ gửi cookie có kèm cờ này thông qua giao thức HTTPS. Nói theo cách khác, trình duyệt sẽ không gửi cookie thông qua HTTP (không mã hóa dữ liệu).

Đối với môi trường ASP.NET, thao tác bật cờ tương đối đơn giản (thay đổi file Web.config)

Web.config: <httpCookies requireSSL="true" />

Ở một số trang, khi tự động redirect từ http sang https thì client đã có cookie.

Để đảm bảo an toàn, khuyến nghị chung là nên set cờ này cho các cookie quan trọng (website của bạn đã đăng kí thành công SSL/TLS).

hãy set giá trị cho cả httponly flag và secure flag để đảm bảo an toànNên dùng cả 2 cờ cho cookie khi có thể.

3. Tổng kết

Cả HttpOnly flag và Secure flag đều giúp chúng ta nâng cao tính an toàn khi sử dụng cookie, giảm thiểu nguy cơ khi bị dòm ngó bởi các cuộc tấn công như XSS. Tuy nhiên, với mức độ sử dụng cookie thường xuyên và liên tục như hiện nay. Cũng không có gì ngạc nhiên khi sắp tới có thêm một số lỗ hổng nào nữa để ăn cắp cookie. Cuộc đấu giữa người bảo vệ và ăn cắp cookie vẫn đang diễn ra liên tục, vì vậy hãy luôn cập nhật kiến thức của mình về COOKIE (BÁNH NGON NHƯNG KHÔNG HỀ AN TOÀN)

4. Tham khảo

Các bạn có thể đọc thêm các bài viết khác ở đây:

OWASP HttpOnly Flag
OWAS Secure Flag
No cookie for you
Web security: hardening HTTP cookies
Protecting Your Cookies: HttpOnly

Again, thanks for reading, love u so much!

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

Sinh Viên Công Nghệ Thông Tin Kiềm Tiến Bằng Cách Nào?

cách kiếm tiền cho sinh viên công nghệ thông tin
Sinh Viên Công Nghệ Thông Tin Kiềm Tiến Bằng Cách Nào?

Trong khoảng thời gian sinh viên, chắc hẳn ai cũng mong muốn tìm cho mình một công việc để kiếm thêm thu nhập và học cách bươn chải với cuộc sống. Với những ai đang theo học ngành IT, có nhiều cách kiếm tiền cho sinh viên công nghệ thông tin mà bạn có thể tham khảo với bài viết này. Tìm được công việc hợp lí không chỉ giúp bạn có thêm thu nhập mà còn có thể cân bằng được giữa việc làm và việc học của bản thân.

cách kiếm tiền cho sinh viên công nghệ thông tin
Có nhiều cách kiếm tiền cho sinh viên công nghệ thông tin

Làm bán thời gian tại các công ty IT

Đối với các sinh viên đang theo học trên giảng đường thì công việc này có thể xem là phù hợp nhất nên là sự lựa chọn của đa số sinh viên. Với sinh viên học các chuyên ngành về công nghệ thông tin, xin việc làm thêm cho sinh viên IT tại các công ty công nghệ thông tin không chỉ giúp bạn kiếm thêm thu nhập, trang trải cuộc sống cá nhân mà còn là cơ hội hấp dẫn để bạn trau dồi đáng kể kỹ năng chuyên môn từ sớm.

Đa phần các sinh viên từ năm hai trở lên đã có thể bắt đầu nộp hồ sơ ứng tuyển làm thêm các vị trí parttime ở những công ty IT. Mức lương cho các vị trí parttime có thể dao động trong khoảng từ 2 – 6 triệu đồng tùy vào các yếu tố như năng lực, thời gian làm việc,… Ưu điểm lớn nhất của công việc này là bạn sẽ có kinh nghiệm làm việc từ sớm, đây là yếu tố cực kỳ lợi thế trong CV xin việc sau khi tốt nghiệp.

Tại TopDev, đang có những vị trí việc làm cho sinh viên, fresher ngành CNTT như fresher java, fresher front endfresher tester. Trang thông tin việc làm – nghề nghiệp dành riêng cho sinh viên IT, bao gồm các cơ hội việc làm IT từ Internship đến Fresher/ Trainee từ các nhà tuyển dụng uy tín.

Làm freelancer để kiếm tiền từ hoạt động online

Freelancer là công việc hoạt động hoàn toàn tự do và không bị gò bó về mặt thời gian nên đây là sự lựa chọn của nhiều người, từ sinh viên đến người đã đi làm. Các công việc freelancer liên quan đến IT khá nhiều và mức lương dao động tùy thuộc vào tính chất công việc của mỗi dự án khác nhau.

Sinh viên IT có thể tìm kiếm các công việc freelance ở các hội, nhóm trên các trang mạng xã hội liên quan đến công việc IT. Các dự án này có thể là fix bug cho các phần mềm, phối hợp build website trên wordpress,… Vì còn là sinh viên nên nhiệm vụ mà sinh viên IT làm thêm đảm nhận sẽ không quá lớn hay bao quát toàn bộ dự án mà có thể làm chung dự án với vài người khác.

công việc freelance
Công việc freelance là sự lựa chọn của nhiều sinh viên IT hiện tại

Ưu điểm của việc làm freelance là bạn hoàn toàn tự do lựa chọn thời gian và dự án mà mình muốn thực hiện. Freelancer không bắt buộc phải hoạt động liên tục như khi làm việc ở công ty mà có thể linh động thời gian rảnh để tìm dự án và làm việc. Thêm vào đó, nếu sinh viên muốn phát triển chuyên môn nào thì hoàn toàn có thể lựa chọn dự án liên quan đến kỹ năng đó để học hỏi và tìm hiểu sâu hơn. Chẳng hạn nếu bạn muốn học thêm về JavaScript thì có thể lựa chọn các dự án liên quan đến ngôn ngữ lập trình này.

Đương nhiên vì tính chất dự án không liên tục, không phải lúc nào cũng có dự án để làm nên trong thời gian không tìm được dự án mới, bạn sẽ không thể có thêm thu nhập. Do đó, bạn nên cân nhắc theo nhu cầu và nguyện vọng của bản thân để lựa chọn công việc phù hợp.

Xem thêm các việc làm Fresher lương cao hấp dẫn trên TopDev

Xây dựng trang blog hoặc vlog mang thương hiệu cá nhân

Rất nhiều các lập trình viên hiện nay đang lựa chọn hướng xây dựng các trang blog và kênh vlog mang thương hiệu của chính mình. Đây cũng được xem là công việc làm thêm cho dân IT khá phổ biến hiện nay.

IT blogs là một cách rất hay giúp bạn chia sẻ những kiến thức, các mẹo thú vị hoặc chính trải nghiệm cuộc sống hằng ngày của một sinh viên IT với người đọc. Khi blogs càng có chất lượng thì lượt truy cập sẽ ngày một cao và thương hiệu cá nhân của bạn cũng sẽ được đẩy mạnh hơn hẳn. Và khi đó, bạn có thể kiếm được tiền nhờ nhận đặt quảng cáo, bán sản phẩm,…

Với kênh vlog, sinh viên IT cũng có thể làm theo cách tương tự như viết blog, chỉ khác biệt ở hình thức là video. Với video, bạn sẽ cần nhiều thời gian đầu tư và dàn dựng hơn so với việc viết một bài blog. Tuy nhiên, thu nhập từ kênh này cũng hấp dẫn hơn hẳn.

Xem thêm TOP 5 Công Việc Freelance Hot Nhất và Có Thu Nhập Cao Nhất Hiện Nay

Kiếm tiền thông qua việc giới thiệu và sử dụng ứng dụng

Đây cũng là một cách kiếm tiền cho sinh viên công nghệ thông tin khá phổ biến hiện nay. Có một số ứng dụng trên thị trường hiện nay cho phép người dùng giới thiệu ứng dụng cho bạn bè và người quen sử dụng. Bạn vừa có thể sử dụng app vừa có thể được nhận quà từ những chương trình như thế này. Đương nhiên tiền thưởng từ những chương trình này không quá cao, nhưng cũng là một trong những cách đơn giản để sinh viên IT có thể kiếm tiền trong thời gian rảnh rỗi.

  Nguyên Tắc 4 KHÔNG Khi Xin Việc Ai Cũng Cần Nhớ
  Chinh Phục Các Bài Test Tuyển Dụng Với Những Bí Quyết Hay Ho

Lập trình website chuẩn SEO

Với những ai làm về marketing thì SEO là khái niệm rất quen thuộc, vậy SEO có cần thiết với một lập trình viên hay không? SEO là quy trình tối ưu website trên thanh công cụ tìm kiếm của Google. Trong đó tổng hợp checklist nhiều tiêu chí để có thể tối ưu từ khóa, nội dung và cải thiện chất lượng website. Và việc lập trình một website đáp ứng được đủ các yêu cầu trong checklist SEO là yếu tố cực kỳ quan trọng để trang web có thể dễ dàng xuất hiện ở vị trí cao trên Google search.

Với tính chất công việc của một lập trình viên, nhất là các web developers, việc hiểu biết thêm một số kiến thức của lĩnh vực khác liên quan đến website không bao giờ là dư thừa. Nếu biết cách vận dụng nó vào trong chuyên môn làm việc, bạn sẽ rất dễ dàng trong việc phát triển web/app cũng như đáp ứng được nhu cầu của người dùng trong các lĩnh vực đó.

Có rất nhiều cách kiếm tiến cho sinh viên công nghệ thông tin trong thời đại hiện nay. Điều quan trọng vẫn là sự chăm chỉ và thật sự mong muốn được tìm hiểu của mỗi người mà thôi. Tranh thủ thời gian ngay từ khi còn trên giảng đường sẽ giúp chặng đường công việc trong tương lai của bạn suôn sẻ hơn. Cùng đón đọc thêm nhiều bài viết hấp dẫn khác trong lĩnh vực IT cùng TopDev nhé!

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

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

Tổng hợp các công cụ kiểm thử chức năng cho web

Tổng hợp các công cụ kiểm thử chức năng cho web
Tổng hợp các công cụ kiểm thử chức năng cho web

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

Bạn đang tìm kiếm công cụ kiểm thử chức năng cho web và đang không biết bắt đầu từ đâu, như thế nào? Bài viết này sẽ giúp bạn tiết kiệm được rất nhiều thời gian google. Các bạn xem thêm các công cụ kiểm thử chức năng cho Desktop ở đây. Nếu bạn có danh sách khác, hãy chia sẻ bằng cách để lại chú thích nhé.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  10 lý do kiểm thử phần mềm trở thành một nghề thời thượng

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

No. Product Vendor
1 actiWATE Actimind
2 AppsWatch NRG
3 Badboy Badboy Software
4 Canoo WebTest Canoo
5 eValid Software Research
6 IeUnit
7 Imprimatur
8 Internet Macros Opus
9 HTTP::Recorder Opus
10 iRise Application Simulator iRise
11 ITP Incanica
12 liSA iTKO
13 Netvantage Functional Tester Netvantage Technologies
14 PesterCat PesterCat
15 QA Wizard Seapine
16 Ranorex Ranorex Software
17 Rational Robot Rational Software
18 Sahi
19 SAMIE
20 Selenium ThoughtWorks
21 SilkTest Segue Software, Inc.
22 SoapTest Parasoft
23 soapui eviware
24 Solex NEOMAlogic
25 Squish froglogic GmbH
26 swete Neal Lester
27 TestSmith Quality Forge
28 TestWeb Original Software
29 vTest Verisium
30 WatiN
31 Watir
32 WebAii ArtOfTest
33 Webcorder Crimson Solutions
34 WebInject WebInject
35 WebKing ParaSoft
36 WET Qantom Software
37 WSUnit
38 Yawet InforMatrix
Bài viết gốc được đăng tải tại vntesters.com
Có thể bạn quan tâm:
Xem thêm Việc làm IT hấp dẫn trên TopDev

Full Stack Developer giữ vai trò chủ đạo gì trong thế giới công nghệ thông tin?

Full Stack Developer là gì?
Full Stack Developer là gì?

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

Full Stack Developer hiện đang là xu hướng thịnh hành trong giới công nghệ thông tin. Không quá bất ngờ khi hiện nay có vô số khóa học cả trực tiếp lẫn online chuyên đào tạo Full Stack Developer. Vậy thực chất Full Stack Developer làm những gì và làm thế nào để có thể đạt được vị trí đáng mong đợi này. Hãy cùng tìm hiểu chi tiết mọi thông tin liên quan đến Full Stack Developer ngay sau đây.

Full Stack Developer là gì?

Full stack Developer là cụm từ thường xuyên xuất hiện trong cộng đồng lập trình viên. Đây là thuật ngữ dùng để chỉ những người có sự hiểu biết trực quan cũng như nắm vững kiến thức về cả front-end và back-end. Đồng thời, các lập trình viên cấp cao này đều thành thạo các best practices và khái niệm. Hầu hết các Full stack Developer đều có khả năng code cho tất cả các thành phần hệ thống.

Full stack Developer xu hướng thịnh hành trong giới công nghệ thông tin thời đại mới

Nói cách khác, Full stack Developer là một nhà phát triển toàn năng, có kiến thức và kinh nghiệm về phần cứng, phần mềm cũng như nắm vững hệ thống ngôn ngữ lập trình. Những người này chính là tài nguyên tuyệt vời trong việc xây dựng và phát triển website.

  Full stack developer là gì? Bí kíp để trở thành 1 fullstack developer

Full stack Developer làm những gì?

Full stack Developer là người có thể đảm nhận mọi vai trò liên quan đến frontend và backend của ứng dụng. Có nghĩa rằng người này vừa làm việc với phần người dùng thấy được, tương tác được và cả phần ứng dụng xử lý logic, tương tác cơ sở dữ liệu, cấu hình máy chủ… Đồng thời lập trình viên Full stack Developer có thể tiến hành tất cả các công việc liên quan đến Server, Database, Frontend, Backend, UX, UI:

  • Với vốn hiểu biết sâu rộng về phần cứng, phần mềm, hệ điều hành, thiết lập môi trường hệ thống… cho phép đảm nhận công việc liên quan đến Sever, mạng, và hosting
  • Phân tích và thiết kế cơ sở dữ liệu (CSDL), sử dụng thành thạo các hệ quản trị CSDL (MySQL, SQLServer, NoSQL,…) cũng như viết tốt các lệnh truy vấn
  • Sử dụng một hay nhiều ngôn ngữ server-side như Ruby, Python, PHP, Java, C# … để viết các ứng dụng lập trình hoặc dịch vụ web. Công việc này liên quan đến API/ Back-end code.
  • Sử dụng thành thạo và chuyên nghiệp các frameworks như Bootstraps, Jquery, Angular JS…
  • Giao tiếp và thu thập yêu cầu từ phía khách hàng (Client work) bằng việc tạo lập các tài liệu kỹ thuật

Làm thế nào để trở thành Full Stack Developer?

Có thể thấy, Full stack Developer là những người có vốn kiến thức sâu rộng về lập trình cũng như nắm vững về Internet, CSDL, User Interface, API, Bảo mật… Chính vì thế, để có thể trở thành một Full stack Developer chuyên nghiệp, lập trình viên cần linh hoạt trong việc học tập, bồi dưỡng và tiếp nhận:

  • Chủ động học tập về các ngôn ngữ lập trình là bước khởi đầu căn bản nhưng không kém phần quan trọng. Trước tiên, cần nắm bắt và thông thạo về Frontend, bao gồm HTML5, CSS3 và Javascript
  • Học ngôn ngữ lập trình Backend là ưu tiên hàng đầu không thể bỏ qua. Cần nắm vững cả frontend và backend vì đây là yêu cầu tối thiểu của một Full stack Developer
  • Cần nắm vững cách sử dụng công cụ quản lý code như: Git, SVN, Mercury,…
  • Chuẩn bị nền tảng kiến thức về việc xây dựng, tạo lập CSDL để lưu trữ thông tin cho sản phẩm
  • Học hỏi và bổ sung các kiến thức liên quan đến tên miền cho website, hosting hoặc server chứa source-code
  • Cần biết cách quản trị server như: cài đặt hệ điều hành hay cài đặt các phần mềm khác trên server
  • Biết cách tối ưu các công cụ tìm kiếm (SEO) là một lợi thế vì vậy hãy bắt đầu tìm hiểu thêm về chủ đề này để rút ngắn quá trình trở thành Full stack Developer
  Tản mạn về cái tên “Full Stack Overflow Developer”

Tham khảo tin tuyển dụng full stack lương cao không yêu cầu KN

Full stack Developer có những lợi thế nào?

Hiện nay, Full stack Developer đang là xu hướng dẫn đầu trong top những công việc đáng mơ ước của lập trình viên. Vậy vì sao vị trí này lại được nhiều người nhắm đến như vậy?

  • Trước tiên, Full stack Developer có cơ hội nghề nghiệp rộng hơn so với những lập trình viên khác. Với vốn kiến thức và kỹ năng chuyên môn sâu rộng, Full stack Developer có thể đáp ứng nhiều vị trí quan trọng khác nhau.
  • Mang lại thu nhập cao hơn so với các vị trí khác. Full stack Developer có trình độ và kỹ năng chuyên môn cao, có khả năng đảm nhận nhiều công việc, vì vậy hậu đãi cho vị trí này không hề nhỏ
  • Con đường thăng tiến được mở rộng tuyệt đối. Những Full stack Developer vốn có cái nhìn bao quát về hệ thống cũng như lập trình, chính vì vậy phát triển lên thành Team Leader, Product Manager hay Software Architect… không phải là vấn đề quá khó khăn với những người ở vị trí này.
  • Có thể tích lũy được nhiều kiến thức và kinh nghiệm hơn. Công việc của một Full stack Developer đòi hỏi phải thành thạo nhiều lĩnh vực, am hiểu nhiều kiến thức chuyên môn. Và đây là cơ hội tốt cho những lập trình viên trẻ học tập, tích lũy kinh nghiệm cho sự phát triển trong tương lai

Tổng kết

Full stack Developer là gì? Full stack Developer là những gì và làm thế nào để có thể trở thành một Fullstack Developer chuyên nghiệp? Bài viết đã chia sẻ ngắn gọn, súc tích và dễ hiểu phía trên. Hy vọng những thông tin này có thể cung cấp cho bạn đọc những kiến thức bổ ích và thiết thực.

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

Search cha con trong wordpress sử dụng ajax

Search cha con trong wordpress sử dụng ajax
Search cha con trong wordpress sử dụng ajax

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

Ở bài hôm trước mình đã hướng dẫn cho các bạn search cha con trong wordpress theo các thông thường. Nhưng cách đó chỉ phù hợp cho các website có dữ liệu nhỏ và vừa, các website dữ liệu lớn và phần cấp sâu thì dễ bị TOANG

  10 trang web hàng đầu để tìm hiểu WordPress

Vì thế hôm nay mình sẽ hướng dẫn cho các bạn cách cũng search cha con nhưng sẽ dùng ajax.

Search cha con trong wordpress sử dụng ajax

Tạo form search cha con html

Cũng giống như bài trước cấu trúc form ở bài này cũng giống hoàn toàn. Mình sẽ copy lại để các bạn dễ theo dõi nha.

Các bạn copy đoạn code này vào khu vực cần hiển thị form search nha. Đoạn code trên chỉ mới là html chưa có giao diện các bạn về thêm css vào để cho giao diện phù hợp nha.

<form action="/" method="GET" role="form">
<input type="hidden" name="post_type" value="bat-dong-san">
<div class="form-group">
<select name="quan-huyen" id="quan-huyen" class="form-control" required="required">
<option value="">Chọn Quận/Huyện</option>
<?php $args = array( 
'hide_empty' => 0,
'taxonomy' => 'khu-vuc',
'parent' => 0
); 
$cates = get_categories( $args ); 
foreach ( $cates as $cate ) { ?>
<option value="<?php echo $cate->slug; ?>"><?php echo $cate->name; ?></option>
<?php } ?>
</select>
</div>
<div class="form-group">
<select name="xa-phuong" id="xa-phuong" class="form-control">
<option value="">Chọn Xã/Phường</option>
</select>
</div>
<div class="form-group">
<input type="text" name="s" id="keyword" class="form-control" placeholder="Từ khóa tìm kiếm..." autocomplete="off">
</div>
<button type="submit" class="btn btn-primary">Tìm kiếm</button>
</form>

Code chức năng chọn thằng cha show thằng con bằng ajax

Nếu các bạn có đọc qua bài viết ajax trong wordpress sẽ biết để sử dụng ajax chúng ta cần phải xử lý 2 phần: Phần front end và phần backend

Xử lý phần frontend jquery

Chèn đoạn code này vào file footer.php của theme đang dùng nha.

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
var ajaxUrl = '<?php echo admin_url('admin-ajax.php'); ?>';
$('#quan-huyen').change(function(event) {
var id = $(this).val();
$.ajax({
url: ajaxUrl,
type: 'POST',
dataType: 'html',
data: {
action: 'showChild',
slug: id
},
})
.done(function(data) {
$('select#xa-phuong').html(data);
})
.fail(function() {
console.log("error");
})
.always(function() {
});
});
</script>

Đoạn code trên chúng ta bắt sự kiện khi thay đổi Quận/Huyện thì sẽ gọi 1 cái ajax gởi lên phía backend 2 nội dung đó là: action và slug

Sau đó nhận dữ liệu data về add vào select Xã/Phường.

Lưu ý: Bạn nào trong dự án có chứa khai báo jquery rồi thì xóa dòng đầu tiên đi nha

Xử lý phần backend search cha con

Các bạn chèn đoạn code sau vào file functions.php của theme đang sử dung nha.

add_action('wp_ajax_showChild', 'showCateFunc');
add_action('wp_ajax_nopriv_showChild', 'showCateFunc');
function showCateFunc() {
if(isset($_POST['slug']) && $_POST['slug']){
$slug = $_POST['slug'];
$parent = get_term_by('slug', $slug, 'khu-vuc');
$args = array( 
'hide_empty' => 0,
'taxonomy' => 'khu-vuc',
'parent' => $parent->term_id
); 
$cates = get_categories( $args );
echo '<option value="">Chọn Xã/Phường</option>';
foreach ( $cates as $cate ) { ?>
<option value="<?php echo $cate->slug; ?>"><?php echo $cate->name; ?></option>
<?php }
} else {
echo '<option value="">Chọn Xã/Phường</option>';
}
die();
}

Đoạn code trên thực hiện chức năng nhận dữ liệu bằng phương thức POST, sau đó get những giá trị con cuả nó và trả kết quả về cho phía front end.

Như vậy là chúng ta đã thực hiện xong việc chọn thằng cha và show thằng con. Việc bây giờ là xử lý đoạn search trên nữa là xong

Tham khảo thêm việc làm WordPress lương cao cho bạn

Xử lý dữ liệu search

Phần này cũng tương tự chức năng của bài trước, mình sẽ code cho các bạn dễ theo dõi nhé.

Chèn đoạn code này vào file search.php của theme đang dùng nha.

<?php
$post_type = isset($_GET['post_type']) && $_GET['post_type'] ? $_GET['post_type'] : 'post';
$district = isset($_GET['quan-huyen']) && $_GET['quan-huyen'] ? $_GET['quan-huyen'] : '';
$location = isset($_GET['xa-phuong']) && $_GET['xa-phuong'] ? $_GET['xa-phuong'] : $district;
$key = isset($_GET['s']) && $_GET['s'] ? $_GET['s'] : '';
$args = array(
'showposts' => 10,
'post_type' => $post_type,
's' => $key,
'khu-vuc' => $location
);
?>
<?php $the_query = new WP_Query( $args ); ?>
<?php if( $the_query->have_posts() ): ?>
<?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
<p><?php the_title(); ?></p>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_query(); ?>

Tổng kết:

Hôm nay mình đã hướng dẫn cho bạn cách để search cha con sử dụng ajax trong wordpress. Hi vọng mình đã giúp bạn một phần nào trong quá trình lập trình theme.

Chào thân ái và quyết thắng.

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

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

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

Người dùng nhập liệu với hàm input() trong Python

Người dùng nhập liệu với hàm input() trong Python
Người dùng nhập liệu với hàm input() trong Python

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

Video trong bài viết

Trong một chương trình, chúng ta cần có sự tương tác giữa người dùng và chương trình máy tính. Từ các bài viết đầu tiên đến giờ chúng ta đã biết đến hàm print() để in một thông báo ra màn hình cho người dùng. Vậy làm cách nào để người dùng có thể đưa dữ liệu vào chương trình Python trên máy tính?

Hàm input()

Hàm input() trong Python sẽ dừng chương trình lại cho đến khi phím Enter được nhấn, nó trả về một chuỗi ký tự do người dùng nhập vào từ bàn phím (trước khi bấm Enter). Cú pháp của hàm input():

input([promt])

Trong đó [promt] là thông báo sẽ hiển thị ra màn hình, gợi ý thông tin người dùng cần nhập vào chương trình.

  Quy tắc đặt tên biến trong Python đúng chuẩn 2024

Ví dụ 1:

my_name = "Jose"
your_name = input("Enter your name:")

print(f"Hello {your_name}. My name is {my_name}")

Chú ý: Hàm input() trả về một chuỗi ký tự, ngay cả khi người dùng nhập vào một số thì nó cũng chuyển đổi thành chuỗi. Do đó, khi thực hiện các tính toán trên dữ liệu nhập vào, bạn cần chuyển đổi dạng từ chuỗi thành số.

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

Ví dụ 2:

age = input("Enter your age: ")
x = int(age)
print(f"You have lived for {x * 12} months.")

Trong ví dụ trên, chúng ta đã chuyển đổi chuỗi người dùng nhập vào thành một số nguyên thông qua hàm int(). Trong một số bài trước, bạn đã biết đến hàm str() để chuyển đổi một số thành một chuỗi.

  Cấu trúc dữ liệu List trong Python và các thao tác cơ bản

Một số chú ý khi viết code:

  1. Tên biến nên sử dụng là các từ gợi nhớ, mô tả về nội dung biến, tránh đặt tên biến theo kiểu vô nghĩa như xxx, yyy…
  2. Nên tránh sử dụng biến bừa bãi, ví dụ biến chỉ dùng để tính toán 1 lần mà không sử dụng lại ở đâu khác trong code.

Với chú ý trên, đoạn code trong Ví dụ 2 có thể viết lại một cách tường minh như sau:

age = int(input("Enter your age: "))
months = age * 12
print(f"You have lived for {months} months.")

Trong ví dụ này, chúng ta có các hàm Python viết lồng vào nhau (nested), int(input()). Python cho phép viết các hàm lồng vào nhau nhiều cấp, tuy nhiên chúng ta chỉ nên sử dụng các hàm lồng nhau dưới 3 cấp để dễ đọc, bug lỗi cũng như bảo trì sau này.

Code trên Repl.it, bạn có thể thực hiện các đoạn code Python trực tuyến.

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

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 6: Nashorn engine và lập trình tuần tự)

Những điểm mới của Java 8 (phần 6: Nashorn engine và lập trình tuần tự)

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

Bài viết sẽ không nói về tê giác hay một lớp tăng thiết giáp của Đức có tên là Nashhorn. Chúng tôi nói về một Javascript engine. JavaScript engineer nghe có vẻ lạ lẫm, nhưng thực ra đã có trước đó, ví dụ như Rhino (cũng được đặt tên theo một loài tê giác) do Mozilla Foundation xây dựng những năm về trước [1]. JDK 8 phát hành vào đầu quý II/2014, kèm theo một Javascript engine có tên Nashorn.

Javascript engine đặt trong Java Development Kit (Bộ công cụ phát triển Java) để làm gì? Để cho phép lập trình viên Java viết mã nguồn theo phong cách tuần tự của ngôn ngữ lập trình kịch bản (scripting language) giống như Javascript, Python hay PHP. Ngôn ngữ lập trình kịch bản (scripting language) là ngôn ngữ lập trình cho phép ứng dụng thực thi ngay (thông dịch) mà không cần biên dịch. Tất nhiên dù bạn sử dụng Java Nashorn, thì bạn vẫn phải biên dịch. Tuy nhiên cách viết mã nguồn sẽ theo phong cách “tuần tự” (scripting, chạy từ trên xuống dưới, nếu bị lỗi ở dòng code nào thì chương trình dừng lại ở đó).

Kiểm tra rằng biến môi trường JAVA đã khai báo đúng cách, gọi cmd và chạy lệnh:

javac -version

Nếu câu lệnh  trên trả về kết quả, bạn có thể chạy ngay Nashorn engine của JDK 8, gõ lệnh

jjs

Sau đó tại dấu nhắc lệnh của jjs gõ lệnh:

print('SmartJob - mang tuyen dung hang dau VN');

Bạn thấy kết quả là một xâu ký tự (String) đã được in ra màn hình console. Lần đầu tiên bạn đã sử dụng lệnh Java để gọi sinh mã JavaScript. Và có thể là lần đầu tiên lập trình kịch bản (scripting programming) trên máy ảo Java (JVM).

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

TỪ CODE JAVA GỌI HÀM JAVASCRIPT

Để xây dựng các ứng dụng phức tạp hơn, bạn cần mở IDE lên để code, ví dụ Eclipse IDE for Java developer. Tạo class Java có tên Example:

Tại dòng 11, chúng ta đã gọi đến một đoạn mã tuần tự, đó là lối lập trình kịch bản.

Ứng dụng ngày càng trở lên phức tạp hơn, chúng ta không thể gọi các đoạn mã script trong code Java mãi được, chúng ta sẽ tách riêng các script này ra một file riêng. Tạo tập tin script1.js đặt ngang cấp với thư mục mã nguồn Java (src), có 2 phương thức là displayInfo  và getTypeOfObject

Tạo mới class Example2 để tương tác, gọi đến các phương thức đặt trong file script.js

Tại dòng 18, chúng ta gọi đến phương thức displayInfo  (hàm Javascript), tại dòng 23 gọi đến phương thức getTypeOfObject  (hàm Javascript).

Tải về mã nguồn: Nashorn (từ server SmartJob) hoặc https://github.com/SmartJobVN/java8 (từ server GitHub)

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

Đỗ 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 Tìm việc làm IT hấp dẫn trên TopDev

Protocol-oriented programming: Trái tim của Swift!

Protocol-oriented programming: Trái tim của Swift!

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

Nếu bạn đang code Swift và vẫn không biết gì về Protocol-oriented programming(POP) thì đúng là bạn chưa biết gì về Swift. Nếu bạn vẫn giữ khư khư quan điểm lập trình hướng đối tượng(object-oriented paradigm) trong swift và không chịu tiếp nhận POP, thì thật là buồn khi tôi nói bạn không nên tiếp tục đọc bài viết này. Tất nhiên điều đó cũng làm tôi buồn lắm, vì bạn đã bỏ lỡ 1 bài viết quan trọng 😭

  Các cách sử dụng AS, AS?, AS! một cách hiệu quả và an toàn trong code Swift
  Các ưu nhược điểm của Swift so với Objective C

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

Nếu bạn vẫn ở lại, hãy cùng xem những ví dụ đơn giản của POP để thấy được sức mạnh của nó mang lại nhé.

Bài viết tiếng Anh vui lòng xem tại:

Lập trình hướng đối tượng(OOP) là 1 trong những mô hình mà đa số developer sẽ biết đến đầu tiên, là 1 cách tiếp cận phổ biến nhất ở đại đa số các ngôn ngữ lập trình. Tuy nhiên, nó không phải là tất cả. Trong những năm gần đây, cách tiếp cận POP được cộng đồng Swift sử dụng rất nhiều. Nó không phải là thứ gì đó mới và sáng bóng, cũng không phải là viên đạn bạc cho mọi vấn đề. Tuy nhiên, nó đóng vai trò hữu ích trong việc cấu trúc source code. Trong bài viết này, chúng ta cùng nhau đi qua các ví dụ để thấy sự hữu ích của nó.

Object-oriented approach trong Swift

Hãy tưởng tượng bạn được yêu cầu viết 1 chương trình trò chơi, chỉ với 2 level: Cấp độ 1 là trên mặt đất, cấp độ 2 là dưới lòng đất.

Trước tiên hãy dùng hướng đối tượng – OOP để viết. Chúng ta cần liệt kê những điểm chung nhất để bố trí các lớp. Chúng ta cũng sẽ cần 2 loại nhân vật: một cho người chơi, một cho các sinh vật kẻ thù trên đất liền và một đại diện cho quái vật địa ngục. Hãy bắt đầu với class như sau:

Creature

Các thuộc tính và hành vi chung được mô tả như sau:

class Creature {
    let name: String
    init(name: String) {
        self.name = name
    }

    func fight() {
        print("👊")
    }
}

Kẻ thù trên mặt đất có thể chạy bộ và chiến đấu với người chơi. Lớp sinh vật mặt đất được mô tả như sau:

class LandCreature: Creature {
    func walk() {
        print("🚶🏻‍♀️")
    }

    func run() {
        print("🏃🏻")
    }
}
A screenshot with a fragment of a code (landcreature)

Còn những con quái vật trong lòng đất rất nguy hiểm, nó có thể thiêu cháy mọi thứ nó gặp. Chúng nó cũng có thể đi bộ và chạy tới nạn nhân, sau đó thiêu đốt nạn nhân:

class HellCreature: Creature {
    func walk() {
        print("🚶🏻‍♀️")
    }
    func run() {
        print("🏃🏻")
    }
    func burn() {
        print("🔥")
    }
}

Tại thời điểm này, chúng ta có thể sẽ quyết định rằng chạy(run) và đi bộ(walk) là khả năng cơ bản của tất cả các nhân vật, vì vậy chúng tôi nên chuyển chúng vào lớp cha:

class Creature {
    let name: String
    init(name: String) {
        self.name = name
    }

    func walk() {
        print("🚶🏻‍♀️")
    }
    func run() {
        print("🏃🏻")
    }
    func fight() {
        print("👊")
    }
}
class LandCreature: Creature { }
class HellCreature: Creature {
    func burn() {
        print("🔥")
    }
}

Sau đó chúng ta hãy tìm hiểu về HellCreature – một loại sinh vật có thể chạy, chiến đấu và thổi lửa:

A screenshot with a fragment of a code (hellcreature)

Vậy là xong, chúng ta đã hoàn thành để chơi.

Tại thời điểm này, sếp của bạn có thể sẽ nảy ra một ý tưởng tuyệt vời về việc thêm cấp độ cao cấp hơn vào trò chơi. Hãy thêm 1 loại sinh vật bay nổi loạn(pilot) vào trò chơi:

class SkyCreature: Creature {
    func fly() {
        print("🕊️")
    }
}

Hãy khởi tạo loài này như sau:

A screenshot with a fragment of a code (skycreature)

Ồ, điều ngạc nhiên là loài sinh vật này lại có thể chạy bộ. Điều quái quỷ gì thế này? Hãy sửa nó bằng cách viết lại 2 phương thức run() và walk() và thêm dòng này vào:

fatalError()

để nó phát sinh lỗi khi cố tình gọi. Hoặc chúng ta có thể di chuyển chúng về lớp LandCreature và HellCreature. Dù sao thì nó cũng là phần cuối của dự án. Một sự trùng lặp mã nhỏ cũng chả chết ai, phải không?

class Creature {
    let name: String
    init(name: String) {
        self.name = name
    }

    func fight() {
        print("👊")
    }
}
class LandCreature: Creature {
    func walk() {
        print("🚶🏻‍♀️")
    }

    func run() {
        print("🏃🏻")
    }
}
class HellCreature: Creature {
    func walk() {
        print("🚶🏻‍♀️")
    }
    func run() {
        print("🏃🏻")
    }
    func burn() {
        print("🔥")
    }
}

Cuối cùng, Kanimoor không thể chạy hoặc đi bộ được nữa.

A screenshot with a fragment of a code (skycreature)

Một lần nữa, trò chơi đã hoàn thành. Chà… gần như vậy. Trong phiên bản chào năm mới của trò chơi, sẽ có thêm một cấp độ nữa để chơi… đó là đấu với RỒNG! Tôi nghĩ bạn đã có thể nhìn thấy những rắc rối mà chúng ta sẽ gặp phải…

class Dragon: SkyCreature { }
A screenshot with a fragment of a code (dragon)

Tất nhiên 1 con Wyvern thì có thể đi bộ, chạy và phun lửa. Một lần nữa chúng ta có thể di chuyển walk() và run() vào lớp cha, hoặc sao chép code và dán vào lớp Dragon này.

Lập trình hướng giao thức – Protocol-oriented programming

Lần này, giả sử chúng ta có cơ hội bắt đầu lại toàn bộ dự án (đó là một viễn cảnh khá đẹp, phải không?) Và hãy xem cách chúng ta có thể sử dụng các giao thức để cấu trúc toàn bộ vũ trụ tốt hơn. Để làm được điều đó, trước tiên chúng ta phải tìm hiểu lập trình hướng giao thức(POP) với Swift là gì và nó cung cấp những gì. WWDC15 Apple nói rằng:

Protocols have all these advantages, and that’s why, when we made Swift, we made the first protocol-oriented programming language. So, yes, Swift is great for object-oriented programming, but from the way for loops and string literals work to the emphasis in the standard library on generics, at its heart, Swift is protocol-oriented.

protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality

…Một giao thức(protocol) xác định một bản thiết kế các phương thức, thuộc tính và các yêu cầu khác phù hợp với một nhiệm vụ hoặc một phần chức năng cụ thể. 

Protocols tương tự như interfaces -lớp giao diện ở các ngôn ngữ khác. Tuy nhiên với swift thì nó độc đáo và tiện ích hơn nhiều. Đầu tiên, ta có thể có một triển khai protocol mặc định và bắt buộc. Ví dụ:

protocol Running {
    func run()
}

extension Running {
    func run() {
        print("🏃🏻")
    }
}

Kể từ bây giờ loại protocol Running sẽ implementation phương thức run(). Tất nhiên, đôi khi bạn có thể muốn ghi đè nó bằng một cách triển khai hàm run() theo cách khác. Còn khi không muốn, giá trị mặc định phải đủ và hữu ích trong việc tránh trùng lặp mã. Các giá trị mặc định có thể cung cấp cho các lớp chỉ định. Trong ví dụ sau những loại có Persevering và Walking , giao thức Persevering sẽ triển khai phương thức stepByStep() như sau:

extension Persevering where Self: Walking {
    
    func stepByStep() {
        walk()
        walk()
    }
}
Screenshot with a fragment of a code (woolf).

Các kiểu khác nhau có thể áp dụng nhiều giao thức khác nhau, vì chúng có thể làm nhiều việc. Đồng thời, chúng chỉ có thể là một thứ (chỉ kế thừa một lớp cha). Một điều rất quan trọng khác là thực tế là các protocols có thể được chấp nhận bởi cả kiểu tham chiếu (Class) và kiểu tham trị (Struct và Enum), trong khi các lớp cha và con kế thừa bị giới hạn ở các kiểu tham chiếu. Chúng ta không đề cập đến sự khác biệt giữa tham trị và tham chiếu ở đây, nhưng tôi thực sự khuyên bạn nên tìm hiểu điều này. Đó là một tính năng chính khác trong Swift thực sự đáng để biết và sử dụng một cách khôn ngoan.

Extensions

Chúng ta hãy lập mô hình cấu trúc của một ứng dụng trước, thay vì buộc phải đưa ra tất cả các quyết định từ trước. Với các tiếp cận POP, chúng ta có thể bắt đầu triển khai hai cấp độ đầu tiên của trò chơi. Đầu tiên hãy xem xét lớp cơ sở Creature. Chúng ta hãy cho phép phương thức chiến đấu fight() qua protocol Strikeable:

class Creature {
    let name: String
    init(name: String) {
        self.name = name
    }
}

protocol Strikeable {
    func fight()
}

extension Strikeable {
    func fight() {
        print("👊")
    }
}

extension Creature: Strikeable { }

Định nghĩa hàm fight() riêng biệt trong protocol Strikeable, cung cấp khả năng tấn công cho Creatures. Cấp độ đầu tiên diễn ra trên mặt đất, nơi người chơi sẽ chiến đấu chống lại:

LandCreatures

Hành động cơ bản của chúng (ngoài chiến đấu) là đi bộ và chạy. Hai giao thức như sau:

protocol Walking {
    func walk()
}

extension Walking {
    func walk() {
        print("🚶🏻‍♀️")
    }
}
protocol Running {
    func run()
}

extension Running {
    func run() {
        print("🏃🏻")
    }
}

Với 2 protocols trên, LandCreature sẽ được thiết kế khá đơn giản như sau:

class LandCreature: Creature,
                    Walking,
                    Running { }

Các hành động của con Woolfie từ lớp LandCreature có thể được mô tả như sau:

A screenshot with a fragment of a code (landcreature – woolfie).

Hãy xuống địa ngục một lần nữa (?)! Bây giờ hãy thiết kế lớp cho loài HellCreature. Chúng ta sẽ thiết kế hành động đốt cháy burn() trong protocol Burning:

protocol Burning {
    func burn()
}

extension Burning {
    func burn() {
       print("🔥")
    }
}
Và đơn giản, HellCreature được thiết kế như sau:
class HellCreature: Creature,
                    Walking,
                    Running,
                    Burning { }
A screenshot with a fragment of a code (hellcreature)

Thật đơn giản phải không. Bây giờ hãy thiết kế cấp độ 3 cho trò chơi có tên là “Cuộc nổi dậy trên bầu trời” sẽ yêu cầu thêm các hành động fly() và fight() cho loài SkyCreature. Chúng ta cần sửa phương thức fight() mặc định để nó chiến đấu trên bầu trời theo cách của nó:

protocol Flying {
    func fly()
}

extension Flying {
    func fly() {
        print("🛩️")
    }
}
class SkyCreature: Creature, Flying {
    func fight() { 
        print(„🏹")
    }
}
A screenshot with a fragment of a code (skycreature)

Thật là đơn giản và nhanh chóng phải không? Bây giờ hãy mô tả lớp Rồng như sau:

class Dragon: Creature,
              Walking,
              Running,
              Flying,
              Burning { }
A screenshot with a fragment of a code (dragon)

Thật là một thành công lớn! Quá trình tạo các lớp theo hướng giao thức của chúng ta rất dễ dàng!

Bằng cách sử dụng protocol, chúng ta có thể mô tả tất cả các loại sinh vật 1 cách đơn giản, mà không cần qua cách tiếp cận hướng đối tượng phân cấp giữa các lớp cứng nhắc. Với các protocol, chúng ta có thể thêm các thuộc tính thuận tiện để kiểm tra xem một đối tượng nhất định có thể thực hiện một tác vụ cụ thể hay không:

extension Creature {
    
    var canFly: Bool { return self is Flying }
    var canBurn: Bool { return self is Burning }
    var canWalk: Bool { return self is Walking }
}

Điều tuyệt vời ở đây là bạn không cần phải cập nhật các giá trị này khi bất kỳ giá trị nào trong số chúng ngừng tuân thủ giao thức. Đây là các thuộc tính computed properties, vì vậy kết quả sẽ tự động thay đổi.

Rủi ro trong lập trình hướng giao thức POP

Cũng giống như lập trình hướng đối tượng có nguy cơ tạo ra một hệ thống phân cấp lớp rất phức tạp, lập trình hướng giao thức có thể khiến cấu trúc phát triển quá nhiều theo chiều ngang. Quá nhiều mở rộng do tạo ra nhiều giao thức nhỏ sẽ khiến việc duy trì và sử dụng ứng dụng trở nên khó khăn và phiền phức. Chắc chắn, protocols cũng yêu cầu phân lớp trong dự án để bạn không bị mất dấu về những protocol nào đã được thêm vào những class nào. Nó giống như bất kỳ kỹ thuật nào khác: cần phải tìm ra sự cân bằng khi chọn lựa giữa OOP và POP để giải quyết vấn đề chứ không phải là cứng nhắc khi chọn lựa.

Kết luận

Trong lập trình hướng đối tượng, chúng ta tập trung vào đối tượng là gì, trong khi phương pháp hướng giao thức cho phép chúng ta tập trung nhiều hơn vào những gì một đối tượng có thể làm, khả năng và hành vi của nó. Ví dụ trò chơi đơn giản của chúng ta nhằm nhấn mạnh sự khác biệt trong quá trình phát triển bằng cách sử dụng cả hai mô hình này. Lúc đầu, phần mở rộng giao thức(extension) và triển khai mặc định có vẻ giống với các lớp cơ sở hoặc lớp trừu tượng trong các ngôn ngữ khác, nhưng trong Swift, chúng đóng một vai trò lớn hơn. Tại sao?

  • Các kiểu class có thể phù hợp với nhiều hơn một giao thức.
  • Các protocol extension cũng có thể có các hành vi mặc định từ nhiều protocol khác nhau.
  • Không giống như đa kế thừa trong các ngôn ngữ lập trình khác, phần mở rộng giao thức không thêm bất kỳ trạng thái bổ sung nào.
  • Các giao thức có thể được chấp nhận bởi các lớp, struct và enum, trong khi các lớp base và lớp con kế thừa chỉ bị giới hạn ở các loại class.
  • Các giao thức cho phép lập mô hình hồi quy với các phần mở rộng được thêm vào các loại hiện có.

Vậy chúng ta có thể nói protocol là trái tim của swift. Vì vậy hãy học càng nhiều càng tốt từ thư viện tiêu chuẩn – đó là một nguồn kiến ​​thức tuyệt vời! Quan trọng nhất, hãy cho bản thân cơ hội lập trình theo hướng giao thức và tự tìm hiểu cách nó có thể cải thiện quy trình làm việc của bạn.

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

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

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

Đôi điều thú vị về null trong java

Đôi điều thú vị về null trong java

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

Chào anh em, tính là hôm nay không viết bài về java null, chỉ viết về Java Override và Overload. Nhưng mà nghĩ lại thì bài viết dài loằng ngoằng như Stream hay JDBC đọc hoài cũng chán, nên nay đổi gió viết bài giải trí tí xíu về java null.

  10 tips để trở thành Java Developer xịn hơn
  11 mẹo đơn giản để tăng hiệu suất Java cấp tốc

Xem thêm các chương trình tuyển dụng Java hấp dẫn trên TopDev

Sự khác biệt giữa zero và null trong java.Sự khác biệt giữa zero và null. Trường hợp này thì cả 2 đều tệ =)))

Bắt đầu, cái tên null (đánh vần là nờ un nun). Nhắc tới null thì hầu như dev nào mặc định là không có gì. Nhưng bất ngờ thay lại có hẳn một trang wiki viết về nó.

Đắng lòng hơn, tên miền null.vn cũng đã có người mua, đang muốn bán với giá 40 cành. Vì vậy anh em đừng khinh thường nờ un nun nhé!.

tên miền null.vn đã có người muaGiá ra đi 40 cành cọ vàng

1. Phân biệt chữ HOA, chữ thường – null is case sensitive

Đầu tiên, không lấy gì làm bất ngờ. null thì khác NULL. Đừng dại mà uppercase lên cho đẹp source. Tôn chỉ luôn là hãy để em ấy được tự nhiên.

// null != NULL
public class Kieblog { 
public static void main (String[] args) throws java.lang.Exception { 
// compile-time error : không tìm thấy 'NULL' 
Object obj = NULL; 
// runs successfully 
Object obj1 = null; 
} 
}

2. Tham chiếu biến – Reference variale

Bất kì tham chiếu biến nào (nếu không được thiết lập sẵn) thì default là nờ un nun =))

a null pointer funnyNguồn ảnh asciiville.com
// Reference tới object sẽ là null.
public class Test { 
private static Object obj; 
public static void main(String args[]) 
{ 
// it will print null; 
System.out.println("Value of object obj is : " + obj); 
} 
}
Value of object obj is : null

3. Kiểu của null – Type of null

Xin anh em nhớ giúp rằng, trời đánh sinh ra nờ un nun là một giá thằng rất đặc biệt. Không phải là object, cũng không thuộc về bất cứ kiểu nào. Đắng lòng thay, bất cứ kiểu nào cũng có thể cast về null

  // null có thể gán cho String
String str = null; 

// null có thể gán cho Integer
Integer itr = null; 

// tương tự cho Double
Double dbl = null; 

// Cái này đúng là ít người biết
// trớ trêu thay, null cũng cast được qua Sring
String myStr = (String) null; 

// cast null qua Integer
Integer myItr = (Integer) null;

4. Bị kiểu nguyên thủy (primitive type) kì thị

Éo le cuộc tình, kiểu nguyên thủy đã có giá trị default. Ví dụ như double là 0.0dboolean là ‘\u0000’boolean là false. Vì vậy:

public class Kieblog { 
public static void main (String[] args) throws java.lang.Exception { 
// Integer có thể gán là null 
Integer i = null;

// Nhưng nếu gán null cho kiểu nguyên thủy thì sẽ NullpointerException 
int a = i; 
} 
}
Bị kiểu nguyên thủy kì thị thì cũng thôi đi, giờ đến lấy List[0] cũng không có nữa. Hic

5. == và !=

Phép so sánh khác và bằng được phép sử dụng. Vì vậy, sẽ rất thuận thiện để phòng tránh bug. Nếu không chắc, hãy if else kiểm tra với một giá trị nghi ngờ có thể bị ám bởi con quỷ nờ un nun.

public class KieBlog { 
public static void main(String args[]) { 
//return true; 
System.out.println(null==null);

//return false; 
System.out.println(null!=null); 
} 
}

6. Đối với phương thức static và non-static

Java null có thể tham chiếu tới method static, tuy nhiên nếu là method non-static, nó sẽ ném Null pointer Exception.

public class Test { 
public static void main(String args[]) { 
Test obj= null; 
obj.staticMethod(); 
obj.nonStaticMethod(); 
} 

private static void staticMethod() { 
//Can be called by null reference 
System.out.println("static method, can be called by null reference"); 
} 

private void nonStaticMethod() { 
//Can not be called by null reference 
System.out.print(" Non-static method- "); 
System.out.println("cannot be called by null reference"); 
} 

}

7. Kết luận

Trên đầy là một số điều thú vị về nờ un nun. Làm việc với null chưa hẳn là đã chán. Vào một ngày đẹp trời có bug và cả team không ai fix được, bạn bay vào, bùm, bốp, chát. Solved -> PHIÊU ngay.

Feel like a hero, bro
Blank, Empty và NULL

Again, thanks for reading, love u so much!

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

TOP 7 Ngành Nghề Thu Hút Nhân Lực Trong Tương Lai

các ngành nghề hot trong tương lai
TOP 7 Ngành Nghề Thu Hút Nhân Lực Trong Tương Lai

Thời điểm thi tốt nghiệp vừa kết thúc cũng là lúc các bạn học sinh và phụ huynh băn khoăn lựa chọn ngành học và trường học phù hợp. Rất nhiều trăn trở xoay quanh việc học ngành nào sẽ có dễ tìm được việc làm sau khi tốt nghiệp cũng như có thu nhập tốt. Vậy đâu sẽ là các ngành nghề hot trong tương lai? Tìm hiểu qua một số ngành nghề được đánh giá rất cao về cơ hội việc làm trong thời gian tới chắc chắn sẽ giúp chúng ta dễ dàng hơn trong việc lựa chọn ngành nghề phù hợp với bản thân trong tương lai.

các ngành nghề hot trong tương lai
Những ngành nghề hot trong tương lai

1. Ngành Công nghệ thông tin

Cuộc cách mạng công nghiệp 4.0 bùng nổ trên toàn thế giới mở ra cơ hội nghề nghiệp cực kỳ rộng mở và ổn định cho những ai đang định hướng theo lĩnh vực này. Ngành Công nghệ thông tin chính là một trong các ngành hot trong tương lai. Theo số liệu Báo cáo thị trường IT Việt Nam 2021 do TopDev thực hiện, Việt Nam đề ra mục tiêu đến năm 2030 đạt ít nhất 100.000 doanh nghiệp công nghệ số và có 1,5 triệu nhân viên trong lĩnh vực kỹ thuật số.

Đây chính là cơ hội để các doanh nghiệp hoạt động trong lĩnh vực công nghệ bứt phá và mở rộng hơn quy mô kinh doanh nhờ các chính sách hỗ trợ từ nhà nước. Cũng nhờ đó, dư địa việc làm trong lĩnh vực này sẽ còn dồi dào hơn.

Xem thêm các chương trình tuyển dụng Front End hấp dẫn trên TopDev

Dựa trên Báo cáo về thị trường IT Việt Nam 2021 của TopDev, đến năm 2021 Việt Nam sẽ còn cần đến 450.000 nhân lực trong ngành công nghệ thông tin. Trong khi đó, số lượng lập trình viên hiện tại của Việt Nam mới chỉ đạt khoảng 430.000 người. Vậy nên, nếu có sự đầu tư cho việc học và chăm chỉ cập nhật những công nghệ mới, sinh viên ngành Công nghệ thông tin sẽ không phải lo lắng về vấn đề việc làm khi tốt nghiệp.

Xem thêm Báo Cáo Thị Trường IT Việt Nam Năm 2021: Chuyển Mình Vào Cuộc Cạnh Tranh Tri Thức Toàn Cầu

2. Ngành Truyền thông – Marketing

Khi hệ thống công nghệ ngày càng phát triển thì việc tiếp cận thông tin thông qua các phương tiện truyền thông càng trở nên quan trọng hơn. Dù là ở bất cứ lĩnh vực nào, bất cứ ngành nghề nào, chỉ cần làm tốt về mặt truyền thông thì có thể xem như dự án đó đã có bước khởi đầu suôn sẻ. Trong thế giới cạnh tranh khốc liệt của các doanh nghiệp, ngành truyền thông và marketing sẽ giúp tăng mức độ nhận diện của thương hiệu công ty so với các đối thủ cùng ngành nghề.

Đó cũng là lý do nhân tài ngành truyền thông – marketing sẽ có rất nhiều sự lựa chọn công việc cho mình. Chỉ cần vững về kiến thức chuyên môn, nắm tốt các xu hướng trong lĩnh vực của mình, cơ hội việc làm với các ứng viên ngành truyền thông – marketing sẽ luôn rộng mở.

Xem thêm 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

3. Ngành Ngôn ngữ Anh

Ngôn ngữ Anh chắc chắn vẫn là ngôn ngữ toàn cầu trong thời gian tới và việc học tốt ngoại ngữ chắc chắn sẽ giúp cơ hội công việc cũng như mức lương của người trẻ ngày một tốt hơn. Hầu như trong tất cả mọi ngành nghề, ngoại ngữ, nhất là ngôn ngữ Anh luôn xuất hiện. Chính sách mở rộng của nhà nước với các doanh nghiệp nước ngoài giúp việc các công ty đa quốc gia đặt văn phòng tại Việt Nam ngày một nhiều hơn. Theo thống kê, con số hiện nay đã lên đến hơn 1000 văn phòng.

Chính vì thế, ngành ngôn ngữ Anh được xem là một trong các ngành nghề hot trong tương lai. Càng tiếp xúc, trao đổi và học hỏi nhiều, cơ hội việc làm trong lĩnh vực này sẽ càng nhiều. Mang đến cho bạn không chỉ cơ hội được nâng cao chuyên môn nghề nghiệp mà còn cải thiện đời sống với mức thu nhập cực kỳ hấp dẫn.

ngành ngôn ngữ anh

4. Ngành Dịch vụ nhà hàng, khách sạn và du lịch

Xã hội ngày càng phát triển kéo theo các nhu cầu về hưởng thụ cuộc sống của con người cũng ngày càng tăng lên. Đặc biệt với một quốc gia có tiềm năng về du lịch và nghỉ dưỡng lớn như Việt Nam thì cơ hội việc làm trong ngành Dịch vụ nhà hàng, khách sạn và du lịch trong tương lai chắc chắn sẽ cực kỳ hấp dẫn.

Chỉ cần cố gắng làm tốt vấn đề chuyên môn, tận dụng đúng thế mạnh để quảng bá được sức mạnh của du lịch, những sinh viên đang theo học ngành nghề này sẽ không phải lo lắng về việc “thất nghiệp” cũng như có triển vọng phát triển vượt bậc hơn trong tương lai.

5. Ngành Quản trị kinh doanh

Trái với nhiều ngành nghề như IT, Marketing đang trong giai đoạn phát triển rực rỡ thì ngành Quản trị kinh doanh vẫn luôn là ngành hot từ trước đến nay, và trong tương lai chắc chắn vẫn thế. Dựa trên số liệu của Tổng cục thống kê công bố trong 9 tháng năm 2020, tổng số doanh nghiệp thành lập mới và quay trở lại hoạt động đạt đến 133,6 nghìn doanh nghiệp, tăng 2,9% so với cùng kỳ năm trước. Chưa bao giờ thị trường doanh nghiệp ở Việt Nam lại phát triển một cách năng động như hiện tại.

Thị trường nhộn nhịp mở ra cơ hội việc làm rất lớn với những ai theo đuổi ngành Quản trị kinh doanh. Đương nhiên, số lượng càng lớn thì cuộc cạnh tranh càng khốc liệt. Chất lượng nhân lực chính là một trong những thách thức hàng đầu với ngành Quản trị kinh doanh. Do đó, để thành công, bạn hãy liên tục tự trau dồi cho mình năng lực chuyên môn để đáp ứng kịp thời tính chất công việc.

  Những Nỗi Khổ Của Dân IT Không Phải Ai Cũng Biết
  Làm Gì Để Vượt Qua Khủng Hoảng Sau Khi Trượt Phỏng Vấn?

6. Ngành Thương mại quốc tế

Ngành Thương mại quốc tế là một trong những ngành xu hướng trong tổ hợp các nghề nghiệp liên quan đến thương mại và là một trong các ngành hot hiện nay. Chính sách mở cửa và tạo mọi thuận lợi cho việc giao thương trong và ngoài nước tạo cơ hội việc làm cực kỳ rộng mở với những người theo đuổi ngành Thương mại quốc tế. Hơn nữa, từ sau khi đại dịch COVID-19 bùng phát, các chuỗi cung ứng trên thế giới đang có xu hướng dịch chuyển dần qua Việt Nam.

Theo thống kê của Bộ Kế hoạch và Đầu tư, tính đến năm 2020, đã có 125 quốc gia đầu tư vào Việt Nam với tổng vốn đầu tư lớn nhất lên đến 7,92 tỷ USD từ Hàn Quốc. Sự xuất hiện ngày một nhiều của các doanh nghiệp nước ngoài giúp ngành Thương mại quốc tế trở thành ngành nghề hot trong tương lai.

Xem thêm Nguyên Tắc 4 KHÔNG Khi Xin Việc Ai Cũng Cần Nhớ

7. Ngành Xây dựng

Những công trình tầm cỡ ở Việt Nam đang xuất hiện ngày một nhiều là biểu hiện của sự phát triển trong ngành xây dựng. Đây cũng là chủ trương của chính phủ trong việc chú trọng hơn nữa vấn đề đầu tư cơ sở hạ tầng và cải thiện an sinh xã hội. Theo thống kê vào 2019, mỗi năm Việt Nam dành từ 30 – 40% GDP cho đầu tư xây dựng. Ngày càng nhiều công trình từ xây dựng nhà ở, công trình giao thông đến đường sá công cộng,… thì nhu cầu nhân lực cho ngành xây dựng cũng nhiều hơn.

Theo Tổng Hội Xây dựng Việt Nam, cả nước hiện có khoảng gần 78.000 doanh nghiệp hoạt trong ngành xây dựng với khoảng 4 triệu lao động. Tuy nhiên, con số này vẫn chưa thật sự đáp ứng được nhu cầu nhân lực thực tế của ngành, nhất là với các vị trí nhân sự chất lượng cao. Do đó, với những sinh viên đang theo ngành Xây dựng, nếu biết cách đầu tư đúng cách cho tri thức chắc chắn bạn sẽ phát triển vượt bậc hơn cùng ngành nghề trong tương lai.

Trên đây là top 7 ngành nghề được xem là hot nhất trong tương lai mà các bạn học sinh, sinh viên cùng phụ huynh có thể tìm hiểu. Kết hợp với đam mê và sự chăm chỉ rèn luyện, tin chắc chúng ta đều có thể làm tốt và phát triển bản thân mình hơn nữa. Đón đọc thêm nhiều bài viết hữu ích khác tại TopDev bạn nhé!

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

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

Chuyển đổi hệ cơ số trong Python

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

Chuyển đối hệ cơ số 10 sang hệ cơ số B
Cách chuyển đổi số nguyên N từ hệ cơ số 10 sang hệ cơ số 2, trong ảnh dưới đây là ví dụ chuyển số 15 và số 6 sang hệ cơ số 2:

Gán m = 15.
Put phần dư m chia cho 2 (m % 2) vào stack.
Gán m = m / 2.
Nếu m > 0 quay lại bước 2.
Đảo ngược lại stack ta được số cần tính.

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

Ví dụ chuyển đối hệ cơ số 10 sang hệ cơ số B
Giả sử hệ cơ số cần chuyển là 2 <= B <= 16. Số đại điện cho hệ cơ số B > 10 là A = 10, B = 11, C = 12, D = 13, E = 14, F = 15.

Chúng ta tạo ra một chương trình như sau để chuyển đổi hệ cơ số trong python:

"""
# Chuyển đổi số nguyên n sang hệ cơ số b
#
# @author viettuts.vn
# @param n: so nguyen
# @param b: he co so
# @return he co so b
"""
def convert_number(n, b):
    if (n < 0 or b < 2 or b > 16):
        return "";
 
    sb = "";
    m = 0;
    remainder = n;
 
    while (remainder > 0):
        if (b > 10):
            m = remainder % b;
            if (m >= 10):
                sb = sb + str(chr(55 + m));
            else:
                sb = sb + str(m);
        else:
            sb = sb + str(remainder % b);
        remainder = int(remainder / b);
    return "".join(reversed(sb)); # đảo ngược chuỗi sb
 
n = int(input("Nhập số nguyên dương n = "));
print("Hệ cơ số 2 của số nguyên ", n, "là:", convert_number(n, 2))
print("Hệ cơ số 16 của số nguyên ", n, "là:", convert_number(n, 16))
  Tổng hợp các Module Python "khủng" mà bạn có thể đã bỏ qua
  Hướng dẫn cài đặt, lập trình Python trên Ubuntu (Linux)

Kết quả:

Nhập số nguyên dương n = 15
Hệ cơ số 2 của số nguyên  15 là: 1111
Hệ cơ số 16 của số nguyên  15 là: F

Search theo custom field trong wordpress và các ứng dụng của nó

Search theo custom field trong wordpress và các ứng dụng của nó

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

Để xây dựng tính năng search trong wordpress thì phải nói cực kỳ đơn giản, các bạn chỉ cần vài ba đoạn code nhỏ là có thể làm được. Nhưng… Search theo custom field ? Các bạn đã thử chưa 😀 Nếu chưa thì hôm này mình sẽ hướng dẫn cho các bạn cách để làm chức năng đó.

  Search cha con trong wordpress tưởng không dễ mà dễ không tưởng
  Custom authentication filter đăng nhập không cần password trong Spring Security
  Custom checkbox là gì ? Và cách tạo custom checkbox đẹp dễ dàng

Để ôn lại 1 tý thì mình sẽ nhắc lại cách tạo 1 form search bình thường trong wordpress. Các bạn xem đoạn code phía dưới nha

Tạo form search trong wordpress

Form search đơn giản nhất

<form action="/" method="GET" role="form" _lpchecked="1">
<input type="text" name="s" id="s-home" autocomplete="off" placeholder="Từ khóa...."> 
<button type="submit" class="button-search"><i class="fa fa-search"></i></button>
</form>

Search theo 1 post type nào đó

<form action="/" method="GET" role="form" _lpchecked="1">
<input type="hidden" name="post_type" value="post">
<input type="text" name="s" id="s-home" autocomplete="off" placeholder="Từ khóa...."> 
<button type="submit" class="button-search"><i class="fa fa-search"></i></button>
</form>

Trong ví dụ trên mình search các bài viết thuộc post type là post nha. Các post type khác sẽ không được hiển thị trong kết quả search

Tìm việc làm WordPress lương cao mới nhất trong tháng tại đây <<<

Search theo 1 category nào đó

<form action="/" method="GET" role="form" _lpchecked="1">
<select name="cat" id="cat" class="form-control">
<option value="">Chọn chuyên mục</option>
<?php $args = array( 
'hide_empty' => 0,
'taxonomy' => 'category'
); 
$cates = get_categories( $args ); 
foreach ( $cates as $cate ) { ?>
<option value="<?php echo $cate->term_id; ?>"><?php echo $cate->name; ?></option>
<?php } ?>
</select>
<input type="text" name="s" id="s-home" autocomplete="off" placeholder="Từ khóa...."> 
<button type="submit" class="button-search"><i class="fa fa-search"></i></button>
</form>

Đoạn code trên cho phép chọn chuyên mục cần search.

Search theo custom field trong wordpress

Chức năng search theo custom field trong wordpress

Để dễ hình dung mình sẽ đưa ra yêu cầù rồi chúng ta sẽ theo yêu cầu mà làm chức năng nhé, yêu cầu như sau:

Tạo form search bất động sản theo từ khóa và khoảng giá. Khoảng giá ở đây có 2 giá trị là giá nhỏ nhất và giá lớn nhất, với giá của bất động sản được lưu ở custom field

Với yêu cầu như trên, chúng ta sẽ thự hiện 2 công việc chính là: Tạo form search và xử lý trả dữ liệu

Tạo form search theo custom field giá:

Các bạn chèn đoạn code sau vào vị trí mà các bạn mong muốn hiển thị form search. Chú ý code dưới chỉ là html chưa có giao diện gì cả, các bạn muốn đẹp thì thêm css vào nha.

<form action="/" method="GET" role="form"> 
<input type="hidden" name="post_type" value="bat-dong-san"> 
<input type="text" name="s" id="s-home" autocomplete="off" placeholder="Từ khóa....">
<input type="number" name="min-price" placeholder="Giá thấp nhất">
<input type="number" name="max-price" placeholder="Giá cao nhất">
<button type="submit" class="button-search"><i class="fa fa-search"></i></button> 
</form>

Mình sẽ tạo form search theo phương thức get, khi sumit form website nó sẽ có đường dẫn ở dạng như sau: domain.com/?post_type=bat-dong-san&s=đất+nền&min-price=500&max-price=50000000

Chúng ta sẽ dựa vào các dữ liệu được truyền trên url để get các giá trị và xử lý.

Xử lý search dữ liệu và hiển thị kết quả:

Chắc các bạn cũng biết kết file hiển thị dữ liệu trả về của form search trong theme wordpress là file search.php. Vì thế để xử lý dữ liệu tìm kiếm chúng ta viết trong file search.php đoạn code sau.

<?php
$post_type = isset($_GET['post_type']) && $_GET['post_type'] ? $_GET['post_type'] : 'post';
$minprice = isset($_GET['min-price']) && $_GET['min-price'] ? $_GET['min-price'] : 0;
$maxprice = isset($_GET['max-price']) && $_GET['max-price'] ? $_GET['max-price'] : 99999999999999;
$key = isset($_GET['s']) && $_GET['s'] ? $_GET['s'] : '';
$args = array(
'showposts' => 10,
'post_type' => $post_type,
's' => $key,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'price',
'value' => $minprice,
'type' => 'NUMERIC',
'compare' => '>='
),
array(
'key' => 'price',
'value' => $maxprice,
'type' => 'NUMERIC',
'compare' => '<='
)
),
);
?>
<?php $the_query = new WP_Query( $args ); ?>
<?php if( $the_query->have_posts() ): ?>
<?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
<p><?php the_title(); ?></p>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_query(); ?>

Mình sẽ giải thích theo từng dòng để các bạn dễ theo dõi:

  • Từ dòng 2 đến dòng 5 thực hiện kiểm tra dữ liệu và lấy dữ liệu được truyền qua thông qua phương thức get $_GET
  • Dòng 7 số lượng bất động sản hiển thị là 10
  • Dòng 8 post_type ở đây sẽ nhận giá trị là ‘bat-dong-san’
  • Dòng 9 điều kiện search theo từ khóa
  • Dòng 10 đến 25 đây là khu vực truyền tham số search theo custom field
    • ‘relation’ => ‘AND’ các điều kiện sẽ kết hợp với nhau theo phương thức bằng
    • Dòng 12 đến dòng 17 điều kiện cho giá trị nhỏ nhất
    • Dòng 18 đến 23 điều kiện cho giá trị lớn nhất
  • Từ dòng 27 đến kết thúc là  vòng lặp get post trong wordpress

Một số ví dụ về search theo custom field khác

Ví dụ search các bài viết có trên 100 lượt views

<?php 
$args = array(
'numberposts' => 10,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'views',
'value' => 100,
'type' => 'NUMERIC',
'compare' => '>'
)
)
);
$the_query = new WP_Query( $args );?>
<?php if( $the_query->have_posts() ): ?>
<ul>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('event_thumbnail'); ?>" />
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); ?>

Search 10 sản phẩm có trên 10 lượt mua và màu sắc là màu đỏ.

<?php 
$args = array(
'numberposts' => 10,
'post_type' => 'product',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'total_sales',
'value' => 10,
'type' => 'NUMERIC',
'compare' => '>'
),
array(
'key' => 'color_product',
'value' => 'red',
'compare' => '='
)
)
);
$the_query = new WP_Query( $args );?>
<?php if( $the_query->have_posts() ): ?>
<ul>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('event_thumbnail'); ?>" />
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); ?>

Tổng kết:

Bài viết hôm nay mình đã giới thiệu cho các bạn cách search theo custom field cũng như là query các dữ liệu có liên quan đến custom field. Biết được món này thì bạn không phải lo xử lý các vấn đề trong việc làm các site bất động sản hoặc site du lịch.

Bài viết này code hơi nhiều, bạn nào chưa hiểu chổ nào có thể comment phía dưới mình sẽ hỗ trợ. Nếu có thể mình sẽ làm video hướng dẫn.

Chào các bạn! À nhở ủng hộ site mới học wordpress của mình nha!

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

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

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

Làm tròn hay làm méo?

Làm tròn hay làm méo?

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

Làm việc với kiểu dữ liệu float (số thực) luôn mang lại những bất ngờ đầy thú vị (thú vị không có hàm ý là tốt hay xấu). Nếu như kiểu integer (số nguyên) luôn tròn trịa, đẹp đẽ, thì float lại xù xì, thô ráp, thiếu chính xác (float là biểu diễn gần đúng), thực dụng, và đầy dãy bất ngờ.

  "Dân làm Product khác hoàn toàn 180 độ với dân làm outsourcing"

YinYang

Số nguyên như một bức tranh về những tưởng tượng của con người. Còn số thực thì rất thực, như cuộc sống này vậy.

Python có sẵn function round dùng để làm tròn một số float về kiểu int, rất dễ hiểu, gần gữi như lúc ta học

P.S: code trong bài sử dụng Python 3.5

In [2]: round(4.2)
Out[2]: 4

In [3]: round(6.9)
Out[3]: 7

In [4]: round(6.0)
Out[4]: 6

In [5]: round(7.0)
Out[5]: 7

Mọi thứ đều đơn giản, cho đến khi có vấn đề xảy ra. Liệu kết quả sẽ thu được là mấy nếu làm tròn 9.5? Là 9 hay là 10? Nếu tuân theo logic thông thường, ta sẽ làm tròn về số nguyên nào mà ở gần 9.5 hơn. Với 9.5, khoảng cách tới 9 hay 10 đều là 0.5. Vậy em chọn lối nào?

Đưa ra lựa chọn là một điều không hề đơn giản, đưa ra lựa chọn đúng thì phải mãi về sau có kết quả rồi ta mới biết.

Giả sử với bộ dữ liệu có

L = [5.5, 6.5, 7.5, 8.5]

Bộ dữ liệu này có giá trị trung bình là

In [1]: L = [5.5, 6.5, 7.5, 8.5]

In [2]: sum(L)/len(L)
Out[2]: 7.0

Khi mang đi làm tròn, ta chỉ muốn thu được các giá trị “tròn” hơn, nhưng vẫn mong muốn giữ nguyên ý nghĩa của bộ dữ liệu – giá trị trung bình (mean) ở đây là một đại diện có thể xem xét.

Nếu làm tròn lên số nguyên lớn hơn, ta có:

In [3]: import math

In [4]: [math.ceil(n) for n in L]
Out[4]: [6, 7, 8, 9]

In [5]: up = [math.ceil(n) for n in L]

In [6]: sum(up)/len(up)
Out[6]: 7.5

Bộ dữ liệu của ta giờ đã có vẻ tiến lên so với ban đầu.

Nếu làm tròn xuống số nguyên gần nhất, ta có:

In [7]: [math.floor(n) for n in L]
Out[7]: [5, 6, 7, 8]

In [8]: down = [math.floor(n) for n in L]

In [9]: sum(down)/len(down)
Out[9]: 6.5

Bộ dữ liệu có vẻ đã “dịch xuống” một chút.

Giải pháp nào để làm tròn mà giảm thiểu sự lệch của bộ dữ liệu? Vấn đề này có thể không xuất hiện ở Việt Nam, với đơn vị tiền tệ biểu diễn bằng kiểu integer, với đơn vị tối thiểu là trăm (đồng), nhưng hẳn đã khiến người Mỹ đau đầu khi đơn vị dola ($) thường xuất hiện ở dạng 1.5 $, 2.4 $…

Và nói đến tiền, những người hiểu về tiền nhất, có lẽ là các nhà ngân hàng (banker). Ngành banker có một phương pháp làm tròn mà Microsoft, … các ngôn ngữ lập trình đều học theo, đó là làm tròn tới số chẵn gần nhất.

In [2]: [round(n) for n in L]
Out[2]: [6, 6, 8, 8]

In [3]: bankers = [round(n) for n in L]

In [4]: sum(bankers)/len(bankers)
Out[4]: 7.0

Trong một bộ số liệu bất kỳ, khi tỷ lệ giữa số chẵn và số lẻ là như nhau, nếu làm tròn 5.5 lên 6 (số chẵn gần nhất), ta tăng nó lên 0.5, còn với 6.5, làm tròn sẽ giảm đi 0.5 thì kết quả là các số lẻ tiến lên, các số chẵn lùi lại, ta giữ được thế cân bằng. Cách làm tròn này vốn tồn tại với cái tên “bankers’ rounding”, sau này được chuẩn hóa vào tiêu chuẩn xử lý số thực (float) IEEE-754 mà hầu hết các ngôn ngữ lập trình tuân theo.

Cái gì quá cũng không tốt, to quá, nhỏ quá, mạnh quá, yếu quá, ít quá, nhiều quá đều không ổn. Vạn vật chỉ phát triển khi đạt tới một thế cân bằng, âm dương hòa hợp, đất trời nảy hoa, cỏ cây xanh lá.

P.P.S: cách làm tròn này là một thay đổi của Python 3 so với Python 2, có ghi trong changelog của python 3.0

Tham khảo

Xem thêm bài viết về một “sự thật” cần biết về số thực tại đây.

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

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

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

Code ví dụ TypeScript, hướng dẫn tạo project TypeScript

Code ví dụ TypeScript, hướng dẫn tạo project TypeScript

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

Code ví dụ TypeScript, hướng dẫn tạo project TypeScript

Yêu cầu: đã hiểu biết về javascript/nodejs.Biết cách sử dụng npm (Xem lại: Hướng dẫn NodeJs)

Việc làm Typescript lương cao up to 2000USD

1. Tạo TypeScript project

Trong ví dụ này, mình sẽ tạo Project TypeScript với tên là typescript-project

Tạo folder typescript-project:

mkdir typescript-project

Vào foder typescript-project:

cd typescript-project

Khởi tạo project nodejs (bước này có thể bỏ qua, vì khi bạn cài đặt package nào đó nó cũng tự động tạo file package.json rồi. Xem lại Tạo nodejs project)

Code ví dụ TypeScript, hướng dẫn tạo project TypeScript

Cài thư viện (package) typescript:

npm i typescript --save-dev

*Lưu ý: ở đây mình dùng option --save-dev vì package typescript chỉ cần thiết cho môi trường dev. Sau khi build project thành các file .js thì package typescript không cần thiết.

Sau khi cài xong package typescript thì ta có thể khởi tạo project TypeScript bằng lệnh:

npx tsc --init

Lệnh này sẽ tạo ra file tsconfig.json, chứa cấu hình của project TypeScript như: file js được build ra chỗ nào? những file nào sẽ được build…

Hướng dẫn tạo project TypeScript chi tiết, ví dụ TypeScript

Đây là cấu  trúc project typescript-project được sinh ra

Code ví dụ TypeScript, hướng dẫn tạo project TypeScript

File tsconfig.json mình sẽ sửa lại đơn giản như sau:

{

"compilerOptions": {

"target": "es6",

"module": "commonjs",

"strict": true,

"outDir": "dist",

"sourceMap": true

}

}

Ý nghĩa của các field trong file tsconfig.json thì các bạn có thể đọc ở comment trong file sau khi được sinh ra ở trên. Ở đây mình giải thích lại một số field mình dùng:

  • "target": "es6" các file .js được generate từ file .ts sẽ được format theo chuẩn es6
  • "outDir": "dist" các file .js được sinh ra ở folder dist
  Authorization Code grant type với Proof Key for Code Exchange (PKCE) trong OAuth 2.1
  Các kiểu dữ liệu trong lập trình C/C++ (Data type)

2. Code ví dụ TypeScript

Mình sẽ tạo file index.ts trong folder src với nội dung sau: (thường thì 1 project sẽ chứa code trong folder src)

class Demo {

 message: string;




 constructor(message: string){

this.message = message;

}




public hello() {

 console.log(this.message);

}

}




const demo = new Demo('hello world');

 demo.hello();

Hướng dẫn tạo project TypeScript chi tiết, ví dụ TypeScript

Đọc code file index.ts ta sẽ thấy nó khá giống với Java hay .Net, cho chỉ rõ kiểu dữ liệu của biến…

3. Thực hiện compile project TypeScript

Để build project typescript, ta chạy lệnh:

npx tsc

Hướng dẫn tạo project TypeScript chi tiết, ví dụ TypeScript

Như bạn thấy, file .js được tạo ra trong folder dist

Hướng dẫn tạo project TypeScript chi tiết, ví dụ TypeScript

Bạn cũng có thể thực hiện build và chạy project typescript bằng cách thêm script vào trong file package.json

Ví dụ mình thêm script “start”: “tsc && node dist/index.js” vào file package.json

Khi chạy thì chỉ cần gõ lệnh npm start

Hướng dẫn tạo project TypeScript chi tiết, ví dụ TypeScript

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

References: https://www.typescriptlang.org/docs/

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