Làm quen với chef – Infrastructure as Code (1)

Trong các giai đoạn phát triển các ứng dụng, dịch vụ dùng server thì việc xây dựng deployment là không thể thiếu được. Giai đoạn này đòi hỏi người thiết định phải có kinh nghiệm, kiến thức về server, các thiết định performance cùng với tính chính xác trong từng thao tác.
Đặc biệt là đối với các hệ thống có số node (server) từ 2 hoặc nhiều hơn thì việc thiết định thống nhất giữ 2 server là rất quan trọng. Người thực hiện bắt buộc phải ghi nhớ các libraries, tools của từng loại server (DB server thế nào, Cache server, Web server như thế nào).
Ngoài ra các thiết định đã dùng trong quá trình development và production cũng phải đảm bảo tính thống nhất.
Túm lại, quá trình deployment thường gặp phải các khó khăn

  • tốn thời gian và công sức
  • việc sai sót là không thể tránh khỏi.

Infrastructure as Code
Một trong các cách giải quyết các khó khăn trong vấn đề deploy các ứng dụng là quản lý cấu trúc hệ thống bằng code. Infrastructure as Code là khái niệm quan trọng nhất, các thông tin package, library, config của cấu hình hệ thống sẽ thiết định bằng syntax của ngôn ngữ lập trình Ruby và được sử dụng như các chương trình lập trình. Như thế, việc xây dựng cấu hình hệ thống sẽ trở nên giống như lập trình một chương trình vậy.
Framework tự động cấu hình server Chef sẽ tự động cấu hình các server dựa trên các code này.
Chúng ta sẽ có những lợi điểm như sau:

  • Các thiết định này được lưu lại dưới dạng source code nên đảm bảo tính thống nhất, tính tái sử dụng lại của các thao tác
  • Chỉ bằng các lệnh đơn giản, Chef thực hiện xây dựng hàng loạt các server với các cấu hình cần thiết là giảm đi dáng kể thời gian và công sức.
  • Nếu các code này được quản lý bằng SVN hoặc Git, bằng cách xem lại các commit log thì sẽ dễ dànd hình dung được quá trình xây dựng hệ thống.
  • Quá trình check & review thiết định sẽ đơn giản hơn nhiều bằng cách review code thay vì login vào từng server để check.
  • Continue reading Làm quen với chef – Infrastructure as Code (1)

[Javascript] – Làm việc với new constructor

1.Các định nghĩa:
Các khái niệm dùng trong bài.

  • Object (đối tượng) trong Javascript, object có mặt ở khắp nơi. Function cũng là một Object trong Javascript
  • Constructor (hàm khởi tạo) là một function dùng để tạo instance
  • Instance (thực thể ???) là một implementation của một đối tượng

Trong javascript không có khái niệm class, các instanse được tạo từ constructor.
2.Khái quát về constructor
[code language=”javascript”]
function Dog(name, cry) {
this.name = name;
this.bark = function() {
console.log(cry);
};
}
Dog.prototype.hello = function() {
console.log(‘Hello ‘ + this.name);
};
// Tạo dog là một instance của Dog
var dog = new Dog(‘Den’, ‘gau gau’);
console.log(dog.name); // Den
dog.bark(); // gau gau
dog.hello(); // Hello Den
var dog2 = Dog(‘Dom’, ‘wow wow’);
console.log(dog2.name); // undefined
console.log(window.name); // Dom
dog2.bark(); // TypeError: Object #<Object> has no method ‘bark’
dog2.hello(); // TypeError: Object #<Object> has no method ‘hello’
[/code]
Dog là một function nên trường hợp ta viết thiếu mất new thì Dog vẫn được gọi như là một function bình thường. Nhưng sẽ trả về dog2 không đúng, lúc này đối tượng this sẽ là đối tượng global window.
Vậy rốt cuộc new có tác dụng gì?
Nói một cách đơn giản khi có new tự động 2 dòng (1) và (2) sẽ tự động thêm vào. Dog sẽ trả về một instance của object.
[code language=”javascript”]
function Dog(name, cry) {
// var this = {}; (1)
this.name = name;
this.bark = function() {
console.log(cry);
};
// return this; (2)
}
[/code]
Như thế, thì không dùng new thì ta cũng có thể tạo được instance mới.
[code language=”javascript”]
function Dog(name, cry) {
var self = {};
self.name = name;
self.bark = function() {
console.log(cry);
};
return self;
}
[/code]
hoặc có thể như thế này
[code language=”javascript”]
function Dog(name, cry) {
return {
name: name,
bark: function() {
console.log(cry);
};
}
[/code]
2 cách này Dog đều trả về object có thể dùng để tạo instance.
3.Dùng new thì có lợi gì?
Không dùng new thì ta vẫn có thể tạo được instance của object nhưng các cách dùng này instance sẽ không sử dụng được prototype từ parent đáng lẽ phải kế thừa được.
[code language=”javascript”]
function Dog(name, cry) {
return {
name: name,
bark: function() {
console.log(cry);
};
}
Dog.prototype.hello = function() {
console.log(‘Hello ‘ + this.name);
}
// Tạo dog là một instance của Dog
var dog2 = Dog(‘Dom’, ‘gau gau’);
console.log(dog2.name); // Dom
dog2.hello(); // TypeError: Object #<Object> has no method ‘hello’
console.log(dog2.__proto__); // Object {}
[/code]
Tóm lại, dùng new sẽ đảm bảo được instance sẽ sử dụng được các method trong prototype của object parent mà nó kế thừa.
4.Làm thế nào để đảm bảo không thiếu sót new khi tạo instance
Ghi nhớ và viết như một thói quen
Ngoài ra có thể dùng các cách viết để phòng hờ trường hợp bị sót.
[code language=”javascript”]
function Dog(name, cry) {
if (!(this instanceof Test)) {
return new Test(name);
}
this.name = name;
this.bark = function() {
console.log(cry);
};
}
[/code]

nvm – Node Version Manager

Nhân dịp update node version lên bản v0.10.21 (http://blog.nodejs.org/2013/10/18/node-v0-10-21-stable/)

1. nvm là gì?

Là chương trình dùng để quản lý version của Node.js . HP: https://github.com/creationix/nvm

2.Cài đặt nvm trên Mac OS

tuan@tmac ~ $git clone git://github.com/creationix/nvm.git ~/.nvm
tuan@tmac ~ $ source ~/.nvm/nvm.sh
tuan@tmac ~ $ // .bashrc or .bash_profile
[[ -s USER_HOME/.nvm/nvm.sh ]] && . USER_HOME/.nvm/nvm.sh
nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir

3. Sử dụng


tuan@tmac ~ $ nvm
Node Version Manager
Usage:
nvm help Show this message
nvm install [-s] <version> Download and install a <version>
nvm uninstall <version> Uninstall a version
nvm use <version> Modify PATH to use <version>
nvm run <version> [<args>] Run <version> with <args> as arguments
nvm ls List installed versions
nvm ls <version> List versions matching a given description
nvm ls-remote List remote versions available for install
nvm deactivate Undo effects of NVM on current shell
nvm alias [<pattern>] Show all aliases beginning with <pattern>
nvm alias <name> <version> Set an alias named <name> pointing to <version>
nvm unalias <name> Deletes the alias named <name>
nvm copy-packages <version> Install global NPM packages contained in <version> to current version
Example:
nvm install v0.4.12 Install a specific version number
nvm use 0.2 Use the latest available 0.2.x release
nvm run 0.4.12 myApp.js Run myApp.js using node v0.4.12
nvm alias default 0.4 Auto use the latest installed v0.4.x version

3.Cài đặt node.js

List tất cả các version có thể cài đặt được.

tuan@tmac ~ $ nvm ls-remote
tuan@tmac ~ $ nvm install 0.10.21
######################################################################## 100.0%
-f: move to trash.
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
/Users/tuan/.nvm/bin/node-v0.10.21-darwin-x64/node-v0.10.21-darwin-x64.tar.gz: move to trash.
Now using node v0.10.21

4.Chạy node.js với version chỉ định


tuan@tmac ~ $nvm use v0.10.21
tuan@tmac ~ $node -v
v0.10.21

5.Thiết định version mặc định


tuan@mac ~$nvm alias use default  v0.10.21