Thứ Ba, 10 tháng 9, 2013
Tích hợp Apache PHP và Mysql trên Linux
Bạn xem chi tiết tại đây:
http://www.php.net/manual/en/install.unix.apache2.php
Mình tóm tắt lại vài ý chính như sau:
1. Cài đặt apache
./configure --enable-so
make
make install
2. Cài đặt php
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
make
make install
3. Setup PHP.ini
cp php.ini-development /usr/local/lib/php.ini
4. Bổ sung vào cuối httpd.conf
LoadModule php5_module modules/libphp5.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Kiến trúc máy tính
Mình sẽ viết một bài dài cung cấp các kiến thức phổ thông về kiến trúc máy tính.
BIOS
Là firm ware nằm trong ROM. Chức năng của nó là thực hiện POST và load bootloader. Thông tin cấu hình cho BIOS lại nằm trong một thành phần khác gọi là CMOS. Dữ liệu trong CMOS được nuôi bởi pin CMOS.
Kiến trúc 32 bits và 64 bits
Bạn thường nghe thấy thuật ngữ hệ điều hành 32 bits và 64 bits. Sự khác biệt giữa chúng là gì ? Hệ điều hành 32 bits là các hệ điều hành hoạt động trên các CPU có hỗ trợ 32 bits địa chỉ. Tương tự vậy với hệ điều hành 64 bits. Hai con số 32 và 64 chủ ý nói đến khả năng quản lý địa chỉ bộ nhớ của CPU. Với CPU 32 bits, CPU này hỗ trợ dải địa chỉ 32 bits, tương đương với 4GB (*). Con số này có ý nghĩa thế nào ? Nếu máy tính của bạn có nhiều bộ nhớ hơn 4GB thì cũng vô nghĩa. Thực tế là CPU dùng 32 bits địa chỉ này không chỉ cho RAM mà để dành cho nhiều thành phần khác nhau của máy tính như I/O, PCI bus... Với Win 7 32 bits thì số RAM tối đa mà nó có thể truy xuất chỉ là 3GB. Muốn tận dụng nhiều RAM hơn thì bạn cần:
- Sử dụng CPU hỗ trợ dải địa chỉ 64 bits
- Cài đặt hệ điều hành 64 bits
32 bits -> biểu diễn được 2^32 số khác nhau. Mỗi con số này được gán làm địa chỉ cho một ô nhớ. Mỗi ô nhớ có dung lượng là 1 byte -> có 2^32 bytes. Ta biết 1GB = 2^30 bytes -> 2^32 = 2^2 * 2^30 = 4GB.
Boot sector
Là sector đầu tiên của đĩa cứng. Mỗi sector có 512 bytes. Boot sector chứa: partition table, boot loader và signature. Signature này là dấu hiệu để nhận diện một sector là boot sector
Partition table
Là một bảng có bốn bản ghi nằm trong boot sector. Vì có bốn bản ghi nên một máy tính chỉ có thể có tối đa 4 phân vùng chính (primary partition). Một trong số bốn phân vùng chính có thể được chọn làm phân vùng mở rộng (Extended partition). Trong một phân vùng mở rộng, bạn có thể thoải mái chia thành các logical partition. Tùy vào giao diện của disk là SCSI hay IDE mà số lượng logical partition tron một extended partition sẽ bị giới hạn khác nhau.
Disk formatting
Là một quá trình gồm ba bước:
Low level:
Thường thực hiện tại nhà máy. Người dùng không bao giờ phải thực hiện bước này.
Disk partititoning:
Phân chia disk thành nhiều vùng. Có thể coi mỗi vùng đó như là môt disk riêng biệt.
High level:
Là bước cuối. Bước này sẽ thực hiện tạo file system lên đĩa.
Hoạt động của disk
Disk là một thiết bị gồm nhiều đĩa từ chồng lên nhau. Giữa các đĩa có đầu tư cơ học di chuyển để đọc dữ liệu trên đĩa. Mỗi đĩa có cấu trúc như sau:
Mỗi đĩa có nhiều rãnh - track. Trên mỗi rãnh có một đầu từ (Head - H) di chuyển để đọc dữ liệu trên rãnh. Mỗi rãnh lại gồm nhiều đơn vị gọi là sector - S. Mỗi sector có dung lượng 512 bytes. Các rãnh xếp chồng lên nhau tạo thành cylinder - H. Dung lượng đĩa có thể tính đơn giản bằng: C * H * S * 512 (bytes)
Disk hiện nay đã tiên tiến hơn sử dụng SSD - Solid State Disk. Loại bỏ hoàn toàn cơ chế cơ học đọc ghi của đĩa. Nhờ vậy tốc độ và độ bền của đĩa tăng lên đáng kể.
Quá trình khởi động máy tính
- BIOS thực hiện POST - Power On Self Test
- BIOS xác định boot sector dựa vào signature rồi chuyển quyền điều khiển cho boot loader nằm trong boot sector.
- Boot loader thực hiện load OS vào RAM rồi chuyển quyền điều khiển cho OS.
Thứ Hai, 9 tháng 9, 2013
Kỹ thuật kiểm tra bản ghi trùng lặp trước khi insert dữ liệu vào database ?
Đây là một kỹ thuật được sử dụng sai rất nhiều khi lập trình web application. Sai lầm nằm ở chỗ lập trình viên đã quên mất môi trường web application là môi trường multi-thread. Mỗi request của người dùng đến application sẽ được application xử lý trong một thread.
Giả sử bạn lập trình bằng struts action (1 hay 2 cũng được). Bạn viết đoạn code kiểm tra xem có yêu cầu insert có vi phạm một unique constraint nào không trước khi insert ? Bạn yên tâm là đoạn code bạn hoàn hảo. Đúng vậy nhưng chỉ trong môi trường single thread. Trong môi trường multi-thread thì sao ?
Giả sử có hai thread cùng muốn insert data, data của hai thread đều mới nhưng lại giống hệt nhau. Ví dụ cả hai cùng muốn insert user, username của cả hai đều giống nhau và đều chưa có trong database. Username đã được áp unique constraint.
Thread 1 check exists successfully -> Pause -> Thread 2 check exists successfully -> insert data -> Thread 2 insert successfully -> Thread 1 running -> insert data -> Thread 1 meet runtime exception.
Nếu lập trình viên cẩu thả không áp unique constraint thì kết quả còn nghiêm trọng hơn: Lệnh insert của cả hai thread đều thành công dẫn đến dữ liệu trong bảng sẽ vi phạm business logic.
Nếu lập trình viên cẩu thả không áp unique constraint thì kết quả còn nghiêm trọng hơn: Lệnh insert của cả hai thread đều thành công dẫn đến dữ liệu trong bảng sẽ vi phạm business logic.
Đây là một trường hợp điển hình minh họa rằng check exists chẳng có tác dụng gì cả trong môi trường multi-thread
Vậy phương án giải quyết triệt để là gì ?
Áp unique constaint lên trường username.
Không cần check exists
Cho phép insert và catch exception ném ra từ database.
Xử lý exception đó và trả lại thông báo lỗi cho người dùng.
Lý do phương án đó thành công vì database có cơ chế lock table khi có một yêu cầu insert.
Thứ Sáu, 23 tháng 8, 2013
Tại sao spring bean lại mặc định là singleton bean ?
Spring bean có hai scope quan trọng là singleton và prototype. Singleton bean là những bean được tạo ra vào thời điểm khởi tạo spring context. Bean này được tạo ra đúng một lần trong suốt thời gian hoạt động của application. Bất cứ khi nào có yêu cầu inject thì instance đã có của bean này sẽ được lôi ra sử dụng. Prototype bean là những bean được tạo ra bất cứ khi nào có yêu cầu inject. Khác với singleton bean, bạn sẽ có nhiều instance của prototype bean trong spring context.
Việc tạo instance của bean cũng tiêu tốn performance của application nhưng đó không phải là lý do chính. Singleton bean cũng đồng thời là stateless bean - Bean không có state ( Class không có instance field ). Những tác động của mỗi request lên bean sẽ không được bean ghi nhớ lại. Nếu stateless bean có state thì đó phải là shared state - Bất cứ request nào tác động đến bean cũng cần state này. Hầu hết web application của bạn sử dụng các stateless bean. Mô hình của bạn thường gồm các tầng action -> service -> dao -> session factory. Bạn chỉ sử dụng method mà object của mỗi tầng cung cấp, bạn chẳng làm thay đổi state nào cả. Bản thân object của mỗi tầng cũng đâu chứa state nào. Singleton cộng với stateless thì sẽ không gây ra các vấn đề về concurrency. Vì nhu cầu chung là sử dụng stateless nên mặc định spring bean là singleton.
Những prototype bean sẽ được sử dụng cho các stateful bean. Mỗi instance của bean sẽ được tạo ra cho một request. Do bean không dùng chung nên các tác động lên bean của mỗi request được giữ lại trong state của bean. Vì là new instance bean per request nên cũng sẽ không có vấn đề về concurrency.
Tại sao struts action lại được thiết kế non thread-safe ?
Lý do đơn giản là những lập trình viên thiết kế struts mong muốn sử dụng lại action class đã được tạo ra. Không tạo mới instance. Sử dụng chung một instance cho tất cả các thread ( Thread ở đây chính là request người dùng đến action. Mỗi request sẽ được xử lý trong một thread ). Điều này khiến action class non thread-safe. Vấn đề sẽ xuất hiện khi trong action class, bạn khai báo thêm các mutable instance field và mutable static field. Bị tác động từ nhiều thread sẽ khiến các trường giá trị này thay đổi mà bản thân lập trình viên không thể tiên đoán được. Chính vì vậy, trong struts action 1, mọi dữ liệu được đẩy lên action sẽ được truyền vào qua tham số.
Struts action 1 là non thread safe. Nhưng struts action 2 lại là thread safe. Bạn sẽ sinh ra instance của action class cho mỗi thread. Nhờ đó bạn có thể nhận dữ liệu từ request đẩy lên action qua các mutable instance field của struts action class 2.
Thứ Hai, 19 tháng 8, 2013
How to turn on/off mysql server ?
How to turn on mysql server ?
sudo service mysql start
Hoặc
sudo mysqld
How to turn off mysql server ?
sudo service mysql stop
Hoặc
sudo mysqladmin -u root -p shutdown
How to disable mysql at startup in Linux ?
Bạn có nhiều cách để disable mysql tại thời điểm startup. Trong bài viết này, mình trình bày cách đơn giản nhất mình biết.
Bạn di chuyển đến thư mục /etc/init. Trong thư mục này, bạn sẽ thấy file cấu hình của mysql có tên là mysql.conf Để disable mysql, bạn không cần sửa file cấu hình này. Đơn giản nhất, bạn chỉ cần tạo một file có tên là /etc/init/mysql.override có nội dung là manual.
Đăng ký:
Bài đăng (Atom)