03/02/2018

Quy tắc đánh số phiên bản phần mềm

Tài liệu này hướng dẫn bạn một số quy tắc đánh số phiên bản phần mềm dựa trên chuẩn SemVer (viết tắt của Semantic Versioning), được nhiều phần mềm hiện nay sử dụng.
Ngày nay, các phần mềm sử dụng nhiều thư viện bên ngoài để giảm thời gian phát triển. Việc cài đặt một phần mềm có thể phải kéo theo việc tải về và cài đặt các thư viện kèm theo. Đồng thời bạn phải kiểm tra sự tương thích giữa phần mềm và các thư viện đó.
Để giảm thiểu thời gian và rủi ro của việc này, một số phần mềm cho phép bạn đăng ký phần mềm của bạn trong đó xác định tên cùng phiên bản của các thư viện cần thiết. Việc đánh số phiên bản phần mềm vì thế rất quan trọng và tất cả các phần mềm trong hệ thống cần tuân theo một quy chuẩn.
Có thể kể ra một số hệ thống quản lý gói phần mềm như:
  • Bower, phát triển bởi Twitter, quản lý các gói cho front end
  • npm, quản lý các thư viện JS
  • Packagist, quản lý các thư viện PHP
Hai ví dụ dưới đây cho bạn hình dung về việc khai báo thông tin của một thư viện kèm theo phiên bản của các thư viện cần thiết:
{
    "name": "bootstrap",
    "version": "2.3.2",
    "dependencies": {
        "jquery": "~1.8.0"
    }
}
{
    "name": "less",
    "version": "1.4.0-b4",
    "description": "Leaner CSS",
    "homepage": "http://lesscss.org",
    ...
    "repository": {
        "type": "git",
        "url": "https://github.com/cloudhead/less.js.git"
    },
    ...
    "optionalDependencies": {
        "mime": "1.2.x",
        "request": ">=2.12.0",
        "mkdirp": "~0.3.4",
        "ycssmin": ">=1.0.1"
    },
    "devDependencies": {
        "diff": "~1.0"
    },
    ...
}

Các quy tắc đánh số

SemVer đưa ra các tiêu chuẩn sau cho việc đánh số:
  1. Phần mềm sử dụng SemVer PHẢI khai báo các API công cộng. Các API này có thể được khai báo trong mã nguồn chính hoặc trong tài liệu văn bản kèm theo. Tuy nhiên, khi hoàn thành, việc khai báo API phải được thực hiện chính xác và hoàn chỉnh.
  2. Mỗi phiên bản đánh số thông thường PHẢI theo chuẩn X.Y.Z, trong đó X, Y, Z là các số nguyên không âm đại diện cho:
  • X là phiên bản chính (Major version)
  • Y là phiên bản phụ (Minor version)
  • Z là phiên bản vá (Path version)
Khi phát hành một phiên bản mới, X, Y, Z PHẢI được tăng ổn định và có thứ tự. Ví dụ 1.9.0 → 1.10.0 → 1.10.1
  1. Một khi phiên bản mới đã được phát hành, tất cả nội dung (mã nguồn, API) của phiên bản đó KHÔNG ĐƯỢC thay đổi.
Bất kỳ thay đổi phát sinh nào đều PHẢI được công bố như phát hành một phiên bản mới.
  1. Tất cả các phiên bản phát triển ban đầu NÊN được đánh số dạng 0.y.z. Bạn có thể thực hiện bất kỳ thay đổi nào trong các phiên bản ở giai đoạn này. Các hàm API công cộng KHÔNG NÊN được coi là ổn định.
  2. Phiên bản 1.0.0 bắt đầu cung cấp các hàm API công cộng. Kể từ phiên bản này, việc tăng số phiên bản phụ thuộc vào cách thay đổi các API.
  3. PHẢI tăng phiên bản vá Z (x.y.Z, với x > 0) nếu phiên bản này:
  • Chỉ sửa các lỗi phát sinh, và đảm bảo tương thích với các bản cũ trước đó.
  1. PHẢI tăng phiên bản phụ Y (x.Y.z, với x > 0) nếu phiên bản này:
  • Tương thích ngược với các bản cũ có cùng phiên bản chính
  • Cung cấp mới một API công cộng
  • Có API công cộng được khuyến cáo là không nên dùng (deprecated)
Bạn CÓ THỂ tăng Y nếu:
  • Thêm mới một chức năng quan trọng
  • Có thêm bất kỳ cải thiện trong mã nguồn
Phiên bản phụ CÓ THỂ bao gồm những thay đổi ở cấp độ vá. Phiên bản vá z PHẢI được thiết lập về 0 khi tăng số phiên bản phụ y.
  1. PHẢI tăng phiên bản chính X (X.y.z, với X > 0) nếu phiên bản này:
  • Có thêm API công cộng không tương thích với các phiên bản cũ
Phiên bản chính CÓ THỂ bao gồm những thay đổi ở cấp độ vá và cấp độ phụ. Phiên bản phụ y và vá z PHẢI được thiết lập về 0 khi tăng số phiên bản chính x.
  1. Mỗi phiên bản CÓ THỂ sử dụng dấu gạch ngang (-), và một chuỗi dấu chấm (.) để tách các định danh cho một phiên bản tiền phát hành hoặc một phiên bản vá. Các tên hợp lệ PHẢI bao gồm các chữ cái thường, chữ cái hoa, chữ số và dấu gạch ngang (0-9A-Za-z-). Phiên bản tiền phát hành có quyền ưu tiên thấp hơn phiên bản bình thường có liên quan.
Ví dụ: 1.0.0-alpha1.0.0-alpha.1
  1. Các bản metadata CÓ THỂ được biểu thị bằng cách thêm một dấu cộng (+) và một loạt dấu chấm (.) tách các định danh ngay sau số hiệu phiên bản tiền phát hành hoặc phiên bản vá.
Các định danh sau dấu cộng PHẢI bao gồm một chuỗi chữ cái hoa, thường, chữ số, hoặc ký tự gạch ngang (-).
Phiên bản metadata NÊN được bỏ qua khi xác định quyền ưu tiên giữa các phiên bản. Do đó 2 phiên bản chứa các phiên bản chính/phụ/vá giống nhau, nhưng số hiệu metadata khác nhau được coi là tương đồng.
Ví dụ: 1.0.0-alpha+0011.0.0+201303131447001.0.0-beta+exp.sha.5114f85
  1. Trước khi phát hành, quyền ưu tiên PHẢI được tính toán dựa trên thứ tự số hiệu của phiên bản chính, phụ, vá, và tiền phát hành (bản metadata không có quyền ưu tiên). Với số hiệu của mỗi phiên bản, bao gồm các chữ số (được so sánh như so sánh các số tự nhiên), ký tự (-) và các định danh (đươc so sánh theo thứ tự sắp xếp ASCII). Định số luôn có ưu tiên thấp hơn các định dạng khác.
Ví dụ: 1.0.0-alpha < 1.0.0-alpha.2 < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0

Tham khảo


Nguồn: https://github.com/nghuuphuoc/nghuuphuoc.github.io/blob/master/_posts/2013-10-10-quy-tac-danh-so-phien-ban-phan-mem.md

03/01/2018

How do I remove files saying “old mode 100755 new mode 100644” from unstaged changes in Git?



For some reason, when I initially did a pull from the repository for a git project of mine, I got a ton of files in my working copy that have no discernible changes made to them, but keep showing up in my unstaged changes area.
I'm using Git Gui on Windows xp, and when I go to look at the file to see what has changed. All I see is:
old mode 100755  
new mode 100644  
Does anyone know what this means?
How can I get these files out of my list of unstaged changes? (Very annoying to have to go through 100's of files, just to pick out files I've recently edited and want to commit).
That looks like unix file permissions modes to me (755=rwxr-xr-x644=rw-r--r--) - the old mode included the +x (executable) flag, the new mode doesn't.
This msysgit issue's replies suggests setting core.filemode to false in order to get rid of the issue:
git config core.filemode false
ref: https://stackoverflow.com/a/1257613/2599460

18/09/2017

Trong cuộc sống không nên so sánh, một người lái chiếc xe Mercedes-Benz giá 4 tỷ, nhưng họ có thể vay ngân hàng tới 20 tỷ, cuộc sống của họ thực sự đang rất khốn đốn. Một người đi chiếc xe Volkswagen 500 triệu, nhưng họ có thể đang nợ ngân hàng tới 2 tỷ đồng, cũng đang ở trong hoàn cảnh nước sôi lửa bỏng.

Một người đi chiếc xe đạp điện 6 triệu, nhưng họ vẫn có 60 triệu gửi ngân hàng. Họ sống một cuộc sống an nhàn.

Lúc 3 người gặp nhau ở trên đường, người đi xe đạp điện ngưỡng mộ người lái xe Volkswagen, người lái xe Volkswagen ngưỡng mộ người lái xe Mercedes-Benz, người lái xe Mercedes-Benz lại mong muốn có được cuộc sống như người đi xe đạp điện.

Đây chính là thực tại trong xã hội, ai cũng có thể trở thành nô lệ của đồng tiền, nô lệ của cuộc sống!

Mèo thích ăn cá, nhưng mèo lại không biết bơi. Cá thích ăn giun, nhưng cá lại không thể lên bờ. Thượng đế mang đến cho bạn rất nhiều thứ hấp dẫn, nhưng lại không cho bạn dễ dàng đạt được nó.

Nhưng, cũng không thể cứ đổ máu thì kêu đau, sợ tối thì bật điện, nhớ nhung thì liên lạc, ngày hôm nay với bạn là chuyện lớn, nhưng có thể ngày hôm sau lại là chuyện nhỏ. Cuộc đời giống như cây bồ công anh, nhìn có vẻ tự do, nhưng kỳ thực lại là thân bất do kỷ.

Có những chuyện không phải là không thèm lưu tâm, mà là có lưu tâm cũng chẳng làm được gì. Chỉ biết dốc toàn lực của mình để ứng phó là được, cuộc đời không có nếu, chỉ có hậu quả và kết quả …

Đời là bể khổ, bây giờ bạn không khổ, sau này sẽ càng khổ

Vạn sự tương sinh tương khắc, không có lên thì không có xuống, không có thấp thì không có cao, không có đắng thì không có ngọt.

Chỉ khi biết thế nào là mệt mỏi, thì mới cảm nhận được thế nào là an nhàn; nếm qua cay đắng thì mới biết thế nào là ngọt bùi. Nhân lúc đang còn trẻ, dũng cảm bước đi, nghênh đón phong sương gió mưa, tôi luyện bản thân, có thể độ lượng, có thể nhìn xa trông rộng, thì hạnh phúc mới đến.

Trên thế giới này ngoại trừ bạn ra, thì không có ai có thể thực sự giúp đỡ bạn, nếu có giúp thì cũng chỉ là tạm thời. Rất nhiều người đã từng nếm thử “trứng luộc trong nước trà”, vỏ trứng nứt càng nhiều, thì trứng ăn càng ngon miệng. Tương tự như vậy, trong cuộc sống trải nhiệm càng nhiều, trắc trở càng nhiều thì sẽ càng có hương vị.

Khổ có thể giúp một người trưởng thành

Trứng gà bị vỡ do tác động từ bên ngoài là đồ ăn, bị vỡ do tác động từ bên trong thì chính là sinh mệnh. Cuộc sống cũng vậy, làm vỡ từ bên ngoài là áp lực, làm vỡ từ bên trong chính là trưởng thành.

Nếu bạn chờ người khác làm vỡ bạn từ bên ngoài, thì nhất định bạn sẽ là món ăn của người khác; nếu bạn có thể đánh vỡ chính mình từ bên trong, như vậy bạn sẽ thấy rằng mình đã thực sự trưởng thành, cũng giống như là được tái sinh.

Nhìn thấy một con bướm đang giãy giụa muốn thoát ra khỏi cái kén, có người hảo tâm giúp nó thoát ra. Nhưng không ngờ rằng, sau khi con bướm thoát ra ngoài, nó lại không thể duỗi đôi cánh ra được, và cuối cùng thiệt mạng.

Giãy giụa chính là điều con bướm cần làm để trưởng thành, lúc đó bạn giúp nó thoải mái, nhưng sau này nó sẽ không có đủ sức mạnh để đối mặt với những thử thách sẽ phải gặp trong cuộc đời.

Nếu bạn muốn hóa thân thành con bướm, thì bạn phải chịu đựng được nỗi khổ của quá trình giãy giụa ở trong kén, vậy thì mới có thể dang cánh bay cao được.

Trong cả cuộc đời, bạn phải tôn trọng bao nhiêu người, thì sẽ có bấy nhiêu người tôn trọng bạn.

Bạn tin tưởng bao nhiêu người thì sẽ có bấy nhiêu người tin tưởng bạn.

Bạn có thể giúp bao nhiêu người thành công, thì sẽ có bấy nhiêu người giúp bạn thành công!

Trên thế giới này, người giàu có nhất, thường là người vấp ngã nhiều nhất. Người có thể thành công là người mỗi lần vấp ngã, không chỉ có thể đứng dậy, mà vẫn có thể kiên trì tiếp tục bước đi.

06/09/2017

Cấu hình Webpack dùng chung folder dependencies giữa LoopBack và Vue.js

Mình code app full stack javascript là sử dụng Node.js ở backend và Vue.js ở frontend, hoàn toàn là javascript. Một vấn đề lớn của mình là làm thế nào có thể dùng webpack build source code frontend nhưng ở root directory. Mình tổ chức dữ liệu như sau:

Trên hình cấu trúc app mình dùng Loopback CLI để khởi tạo. Sau đó mình xóa đi folder client và dùng Vue CLI để tạo app frontend ở folder client

Sau đó, ở root folder và client folder đều có file package.json. Mình thử command để build frontend bundle như sau:

Mình sẽ thấy 1 folder /client/dist để lưu static và bundle của Vue. Vậy mình có thể run command này ở root folder không? Rõ ràng là sẽ KHÔNG bởi vì file config webpack trong Vue template chứa relative path nên khi gọi từ root folder thì path của các require bên trong config sẽ không đúng.

Vậy mình khắc phục như thế nào?


Như vậy, mình sẽ không cần add bundle của frontend trong source code mà sẽ nhờ heroku build trực tiếp khi deploy.

Đây là repo mình đã test thử và chạy thành công giữa LoopBack và Vue https://github.com/toanalien/loopback-vue-webpack các bạn tham khảo. 





04/09/2017

Bắt đầu với Loopback


LoopBack là một framework Node.js được xây dựng trên Express.js với khả năng mở rộng cao và được IBM và nhóm StrongLoop cam kết duy trì và cải tiến dự án mã nguồn mở LoopBack.

Các ưu điểm vượt trội của LoopBack:

1. Cài đặt


Cài đặt LoopBack CLI tool

2. Khởi tạo ứng dụng đầu tiên

3. Khởi tạo model


4. Định nghĩa thuộc tính


5. Khởi chạy


6. Mở API Explorer test trực tiếp trên browser

7. Tổng kết

Vậy bằng những bước cơ bản, mình đã có thể xây dựng một API Gateway đơn giản. Trong các bài sau mình sẽ hướng dẫn kết nối với databases, data source và mở rộng API.


28/08/2017

How to remove element from array on Vuejs

I send a delete request to the server, if status code === 200, this object has been removed. So, how to remove this element from the array in Vue data on the browser?
I am trying to use array splice. It will replace the array and trigger an update:

kpi = {
    'id': 1,
    'name''kpi test'
}
this.kpis = this.kpis.filter(function (item) { return kpi.id != item.id; });