Friday, 30 December 2016

Vì sao 0.1 + 0.1 + 0.1 không bằng 0.3?

Nếu có thể trả lời chính xác câu hỏi sau và giải thích tại sao, bạn có thể bỏ qua bài này:
0.1 + 0.1 + 0.1 == 0.3
Trong Python, biểu thức này trả về đúng (True) hay sai (False)? hay nói cách khác, khi gõ biểu diễn trên máy tính vế trái có bằng vế phải không?
Có thể sử dụng bất kỳ ngôn ngữ lập trình nào khác: Python, C, Java, Golang, ... kết quả là không đổi.
Câu trả lời ngắn gọn: Kết quả trả về là False, hay vế trái không bằng vế phải.

Float là gì?

Kiểu dữ liệu float là viết tắt của "real floating-point number" - kiểu "số thực dấu chấm động".

float là một cách BIỂU DIỄN XẤP XỈ cho một số thực (real number) bằng cách đánh đổi độ chính xác (precision).

Các quy tắc / chuẩn để biểu diễn float được mô tả trong tiêu chuẩn quốc tế IEEE 754

Số thực

là tập số gồm:
  • các số hữu tỷ (số biểu diễn được ở dạng phân số: VD: 2, 1/3)
  • và các số vô tỷ (số không biểu diễn được ở dạng phân số: VD: căn bậc 2 của 2)

Số vô tỷ

Wednesday, 28 December 2016

[pandas] Truy cập nội dung DataFrame

Bài trước đã hướng dẫn các khái niệm cơ bản và cách tạo một bảng dữ liệu bằng pandas.
Bài này sẽ hướng dẫn cách xem bất cứ phần nào ta muốn trong bảng (DataFrame) đã tạo.

Tạo bảng mới

In [1]: import pandas as pd
In [4]: import numpy as np
In [5]: dates = pd.date_range('20161212', periods=6)
In [6]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
In [7]:  df
Out[7]:
                   A         B         C         D
2016-12-12 -0.115304 -0.400382  1.254944  0.702264
2016-12-13  1.436155  0.476939  1.334369  0.223856
2016-12-14 -0.124606 -0.017318  0.824345 -0.432029
2016-12-15 -1.013802  0.266865  1.341752 -0.990876
2016-12-16  0.669347 -1.086764  0.555358 -0.579439
2016-12-17 -0.405407 -0.044016 -0.153047 -0.800809

Truy cập hàng và cột trong bảng

Lấy danh sách tên các cột (column)

In [60]: df.columns
Out[60]: Index(['A', 'B', 'C', 'D'], dtype='object')

Lấy danh sách tên các dòng (index)

[Pymi.vn] Python là gì? Python để làm gì?





Xem bài viết hướng dẫn tại http://pymi.vn/tutorial/python-la-gi/

[Swift] Phân biệt let và var - giữa struct và class - [phần 1]

Để bắt đầu serial Kiến thức phỏng vấn cho lập trình viên iOS, mình xin đề cập đến hai khái niệm let và var trong ngôn ngữ Swift mà các bạn khi phỏng vấn sẽ rất hay hỏi.

Mình sẽ dùng phiên bản mới nhất đó là Swift 3 và mới hơ

I - Khái niệm:

var vs let - sẽ tương ứng với hai khái niệm biến số và hằng số

VD:
let wife = "Joana"
var darling = "Beautiful Girl"
Hai dòng code trên có ý nghĩa như sau:
"Khai báo một hằng số tên là wife, có giá trị là Joana. Tiếp theo, khai báo một biến số tên là darling và cho nó một giá trị khởi tại là  Beautiful Girl."

Tuesday, 27 December 2016

[Python] Tạo bảng dữ liệu với pandas

pandas là gì

pandas là bộ công cụ để phân tích và chỉnh sửa dữ liệu mạnh nhất thế giới, được sử dụng rộng rãi trong phân tích tài chính, phân tích dữ liệu.

Python pandas

pandas là một Python package.

Cài đặt pandas

(trong virtualenv):
$ pip install pandas
...
Installing collected packages: pandas
Successfully installed pandas-0.19.2
NOTE: pandas phụ thuộc vào package numpy,  tức cài xong pandas thì đã có cả pandas lẫn numpy.

Muốn phân tích thì phải có dữ liệu và hiển thị nó lên bảng thành hàng cột đã rồi làm gì thì làm.
Trong bài đầu tiên của series, ta sẽ sử dụng pandas để tạo một bảng dữ liệu có hàng, cột, giống như Excel hay Google spreadsheet.

Kiểu dữ liệu trong pandas

pandas có hai kiểu dữ liệu chủ chốt
- Series: kiểu dữ liệu một chiều (1D) - chuỗi các giá trị
- DataFrame: kiểu dữ liệu hai chiều (2D) - tức sẽ biểu diễn thành bảng , có hàng / cột trên Excel hay Google spreadsheet.

Monday, 26 December 2016

[Debian] Khám phá các tiện ích trong package dpkg

Trong package dpkg có gì? 

Bạn hỏi, dpkg trả lời:
$ dpkg -L dpkg | grep bin/
/sbin/start-stop-daemon
/usr/bin/dpkg-split
/usr/bin/dpkg-statoverride
/usr/bin/dpkg
/usr/bin/dpkg-divert
/usr/bin/dpkg-query
/usr/bin/dpkg-maintscript-helper
/usr/bin/dpkg-deb
/usr/bin/update-alternatives
/usr/bin/dpkg-trigger

Các câu lệnh dpkg này làm gì?

Whatis:
$ for binary in $(dpkg -L dpkg | grep bin/); do whatis $(basename $binary); done
start-stop-daemon (8) - start and stop system daemon programs
dpkg-split (1)       - Debian package archive split/join tool
dpkg-statoverride (8) - override ownership and mode of files
dpkg (1)             - package manager for Debian
dpkg-divert (8)      - override a package's version of a file
dpkg-query (1)       - a tool to query the dpkg database
dpkg-maintscript-helper (1) - works around known dpkg limitations in maintainer scripts
dpkg-deb (1)         - Debian package archive (.deb) manipulation tool
update-alternatives (8) - maintain symbolic links determining default commands
dpkg-trigger (1)     - a package trigger utility

dpkg - chương trình quản lý package cho Debian

dpkg có các câu lệnh để :

[Python] thôi dùng subprocess.check_output

Function tiện tay subprocess.check_output rất hấp dẫn khiến người ta khó có thể từ chối dùng nó. Để kiểm tra output một câu lệnh, chỉ cần:
In [1]: import subprocess as spr

In [2]: output = spr.check_output(['ls', '/etc/hosts'])

In [3]: print(output)
b'/etc/hosts\n'
Chuyện này không có gì sai cho đến khi có gì đó sai sai xảy ra.

Nếu có lỗi xảy ra, ta chỉ nhận được một exception chứ không thu được phần lỗi của câu lệnh (stderr):

Sunday, 18 December 2016

Làm quen với Ansible - viết playbook đơn giản

Sau khi đã cài đặt Ansible và chạy được ad-hoc command, bài viết này sẽ hướng dẫn viết các file playbook để thực hiện hàng loạt task thay vì chỉ chạy từng câu lệnh một. Các file Playbook này thường cho vào một git repo để tiện quản lý.

Ansible playbook

Một Ansible Playbook là môt file ở định dạng YAML (.yml), nó ở dạng list và chứa một hoặc nhiều "play".

Play

Mỗi "play" dùng để kết nối (map) một nhóm các "host" với một vài "role". Roles trong playbook được gọi là "tasks".

Role và task

Một task thực hiện gọi đến một Ansible module nào đó.

Ví dụ một playbook tên là vim.yml, chỉ chứa 1 play map tất cả các hosts với role cài vim:
$ cat vim.yml
---
- hosts: all
  remote_user: root
  tasks:
    - name: Install vim
      apt: name=vim state=present

Saturday, 17 December 2016

Làm quen với Ansible - module, ad-hoc command

Mình dùng SaltStack để quản lý cấu hình và tự động hoá hệ thống.
Mình muốn thử dùng Ansible để xem có gì hay ho, vì nhiều người bị ho và cứ hỏi là SaltStack hơn Ansible cái gì, nên mình đọc doc.


Mình không hiểu nổi tại sao có cái document to đùng và xinh đẹp ở đấy thì mọi người chả đọc, cứ đi tìm cái đâu đâu, kỳ 😶

Cài đặt Ansible

Nếu biết pip là gì thì dùng pip là nhanh gọn nhất,  vì Ansible viết bằng Python, cài bằng pip là điều hiển nhiên không cần bàn cãi. Chạy lệnh sau:
$ pip install ansible
...
Successfully installed ansible-2.1.0.0
Nếu thấy dòng trên sau khi chạy lệnh pip tức là đã thành công.

Nhận xét:
- Ansible khuyến khích người dùng cài từ bản develop checkout từ Ansible repo trên GitHub
- Nếu không được thì cài từ pip
- Nếu vẫn không được thì cài bằng các package manager của hệ thống như apt, yum...
- Phần hướng dẫn thì ít mà chú ý thì nhiều.

Monday, 5 December 2016

[Rust] Học Rust để tính toán

Việc học không có mục đích sẽ khó đi đến đích, dễ lạc lối và hoang mang.

Bài này giới thiệu đủ các khái niệm của Rust để tính toán cơ bản, cụ thể là làm vài bài ProjectEuler.net
Nếu ai hỏi học Rust làm gì, có ai thuê đâu? thì câu trả lời là mình học cho đỡ vui 🤑


Các khái niệm cần thiết gồm có:
- Đặt biến để chứa giá trị
- Thực hiện các phép toán cơ bản: cộng trừ nhân chia, chia lấy dư
- Các câu lệnh điều khiển: if/else if/else
- Các vòng lặp: while, for
- In ra màn hình: println!

Tạo project bằng câu lệnh:
cargo new --bin rustmath
Bấm vào đây để xem thêm về cách tạo Rust project và dùng cargo.

Sửa file rustmath/src/main.rs
Đoạn code sau để kiểm tra số x có phải số chẵn không, in ra màn hình.
fn main() {
    let x = 42;
    if x % 2 == 0 {
        println!("{} is even", x);
    } else {
        println!("{} is odd", x);
    }
}
Giải thích:
- Dùng hai dấu bằng ``==`` để kiểm tra xem giá trị vế trái và vế phải có bằng nhau không. Ở đây kiểm tra x chia cho 2 có dư 0 hay không (có chia hết không).
- Để in ra màn hình, dùng "macro": println!  - có dấu ! chỉ rằng đây là một macro, macro là gì tạm thời để sau, giờ cứ biết làm thế để in ra màn hình.
- Trong khi gọi macro!(), dùng dấu ``{}`` để giữ chỗ cho giá trị sẽ được thay thế sau đó. Nội dung in ra nằm trong dấu nháy kép (double quotes): "{} is odd".

Thử làm bài Project Euler 1:
Tính tổng các số nhỏ hơn 1000 chia hết cho 3 hoặc chia hết cho 5.