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]