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.
Đăng ký:
Bài đăng (Atom)