Tuesday, March 9, 2010
You're smarter than you think - Thomas Amstrong
Sunday, May 17, 2009
Beginning with module (cont.)
use Some::Packagewill tell Perl to search for module Package in Some/Package.pm
but
@ISA = ("Some::Package")will not direct Perl correctly to the tree Some/Package.pm
why???? and how to tell Perl that we WANT Some/Package.pm, not Some::Package ???
Beginning with module
All the books and forum about Perl Modules converge in saying this:
when you
use Some::Package;Perl will look for Package.pm in directory tree ./Some/Package.pm
Sure, but...
The important thing that almost nobody has remembered to refer that, in the Package.pm, the first line must be
package Some::Package;not
package Package;if the package is not specified like that, you will undoubtedly receive error message saying that
"can't locate object method via package Some::Package ... perhaps you forgot to load Some::Package at use_some_package.pl line xx"
And here's the example


Sunday, October 12, 2008
Segmentation fault
A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. A segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (for example, attempting to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as address or bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.
On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception, and usually a window asking the user to send an error report to Microsoft appears.
------------
Well, worth learning huh?
That's the error I got when running Matt to align 3 pdb structures. Omg, how can I fix such a mass of c library without no knowledge about the language? Hehe, the final way is nothing other than emailing the author. OMG, I' ve just remember that the author was not at the same institute when he wrote this any longer. OMG, then... what to do next???
Tuesday, August 12, 2008
Linux loadable kernel modules (LKM)
15.1 Trình phiên dịch thi hành (Executable interpreters)
Bạn phải có ít nhất một trình phiên dịch thi hành gắn vào kernel cơ sở, vì để load một LKM phiên dịch thi hành (executable interpreter LKM), bạn cần phải thực thi một lệnh, và do đó, cần có chương trình để phiên dịch lệnh thực thi này.
Trình này gần như hiển nhiên là ELF, vì hầu hết các lệnh thực thi trong hệ thống Linux là ELF.
Trước khi ELF tồn tại trên Linux, dạng lệnh thực thi thông thường là a.out. Có một thời gian ngắn, các hệ thống nửa-ELF/nửa-a.out khá thông dụng. Một số vẫn còn tồn tại.
15.1.1. binfmt_aout: EI cho dạng a.out
a.out là định dạng thực thi phổ biến trong những ngày đầu của Linux và từng là định dạng duy nhất của Linux. Cho đến ngày nau, tên mặc định của các file xuất thực thi của một trình biên dịch GNU (GNU compiler) là a.out (bất kể chúng có định dạng gì).
Nếu bạn thử chạy một file thực thi a.out mà không cần EI, lệnh hệ thống
exec sẽ không thực hiện được và báo lỗi "cannot execute binary file".Không có tham số LKM
Ví dụ:
modprobe binfmt_aout
15.1.2 binfmt_elf: EI cho định dạng ELF
ELF là định dạng thực thi thông thường trên các hệ thống Linux.
Gần như không thể nào không có EI này trong kernel cơ sở của bạn (nếu không còn lý do nào khác thì:
insmod là một file thực thi dạng ELF!). Tuy nhiên, về lý thuyết, có thể bỏ nó ra khỏi kernel cơ sở và đưa nó vào như một LKM.Không có tham số LKM.
VD:
modeprobe binfmt_elf15.1.3 binfmt_java: EI cho Java bytecode
Java là một ngôn ngữ lập trình hướng đối tượng khá hiện đại. Những chương trình Java truyền thống được biên dịch thành các "Java bytecode", nghĩa là cần phiên dịch bởi một trình phiên dịch Java bytecode. Điếm quan trọng đối với ngôn ngữ hướng đối tượng mới này là các file đối tượng hoàn toàn linh động: chúng có thể được chạy trên mọi hệ thống, miễn là hệ thống đó có một trình phiên dịch bytecode.
Trong khi dự tính ban đầu là trình phiên dịch bytecode sẽ chạy như một chương trình người dùng, với LKM này, bạn có thể làm cho kernel linux phiên dịch file thực thi Java như bất kỳ một file thực thi nào khác. Và vì vậy, bạn có thể chạy một chương trình biên dịch từ Java cũng như chương trình biên dịch từ C, tức là gõ tên chương trình tại dấu đợi lệnh của giao diện dòng lệnh.
Thực tế, lợi ích của ngôn ngữ bytecode trung gian vẫn chưa được chứng minh. Và thường, Java được biên dịch hẳn thành một file thực thi truyền thống như ELF. Nếu làm như vậy, bạn sẽ không cần tới
binfmt_java.Không có tham số LKM.
VD:
modeprobe binfmt_java15.2. Block device drivers
15.2.1. floppy: floppy disk driver
Đây là driver thiết bị cho ổ đĩa mềm. Bạn sẽ cần đến driver này để có thể truy xauất một đĩa mềm. Tài liệu về LKM này được ghi trong README.fd đặt trong
linux/drivers/block directory.Lưu ý rằng nếu bạn boot từ đĩa mềm hay có hệ thống file root trên một đĩa mềm, bạn phải đưa driver này vào kernel cơ sở.
[ ... ]
15.2.2 loop: loop device driver
Module này cho phép bạn tổ chức một filesystem được lưu trữ dưới dạng file thông thường (trong một filesystem khác). File này được gọi là backing file.
Một ứng dụng của việc này là kiểm tra một filesystem ISO 9660 trước khi ghi chính thức lên một CD. Bạn xây dựng một filesystem trong một file thông thường 650MB. File này sẽ được đưa vào một chương trình ghi đĩa CD. Nhưng bạn có thể định nghĩa một loopback device dựatre6n file này như một backing file và sau đó tổ chức filesytem từ backing file.
Bạn cũng có thể dùng loop device để chuyển các tập hợp file qua một hệ thống mạng. Nó giống như một file .tar, chí khác là bạn không cần phải gói và mở gói. Bạn chỉ cần tổ chức lại file nguyên thủy.
Một số người dùng các loop device trên một hệ thống khi thì chạy WIndows, khi thì chạy Linux, để có thể duy trì hệ thống Linux thông qua hệ thống Windows: đặt một root filesystem vào một file trong hệ FAT để windows có thể truy xuất, sau đó tổ chức hệ thống Linux thông qua một loop device khi Linux đang chạy.
Bạn có thể giữ filesystem mã hóa hoặc nén, hoặc bất cứ cách biến đổi nào, trong một backing file. Loop device mã hóa khi bạn ghi vào, và giãi mã khi bạn truy xuất. Một chiến lược khác khá phổ biến để mã hóa và nén một filesystem là sử dụng một định dạng filesystem đã nén hoặc mã hóa, chẳng hạn như Cfs, Tcfs, Stegfs.
Một hệ thống mã hóa được dựa trên một hàm chuyển (transfer function). Có hai hàm chuyển sẵn có trong một loop module: identify (dùng cho trường hợp mã hóa thông thường: những gì bạn thấy trong loop device chính xác là những gì có trong backing file) và hàm mã hóa XOR đơn giản. Một module độc lập khác có thể bổ sung vào bất kỳ chức năng chuyển nào bằng cách gọi hàm
loop_register_transfer() trong loop module.
Tuesday, August 5, 2008
[Chapter 20] Web automation - Perl cookbook
Vấn đề
Dùng một script để truy xuất đến một url
Giải pháp
Sử dụng hàm
get từ module LWP::Simple.use LWP::Simple$content = get($url)Thảo luận
Hàm
get trong LWP::SImple trả về undef nếu có lỗi, nên ta có thể kiểm tra lỗi như sau:use LWP::Simple;unless (defined ($content = get $url) ) { die "could not get $url\n";}Tuy nhiên, với cách trên, ta không thể xác định được nguyên nhân gây lỗi. Để có được khả năng này cũng như một số xử lý tinh tế hơn, chúng ta cần dùng các module khác.Ví dụ 20.1 là một chương trình truy xuất một tài liệu từ xa. Nếu thất bại, chương trình sẽ xuất ra dòng trạng thái lỗi, ngược lại xuất ra tiêu đề của tài liệu và số byte có trong nội dung. Ở đây chúng ta sử dụng 3 module từ LWP và 1 module khác.
LWP::UserAgent
Module này tạo ra một trình duyệt ảo. Đối tượng trả về từ hàm
new được dùng để tạo một request thực. Tên của trạm trình duyệt ảo được đặt là "Schimozilla/v9.14 Platinum" để webmaster thấy ganh tị khi họ kiểm tra file log. :))HTTP::Request
Là đối tượng được trả về khi trạm người dùng (user agent) chạy request. Dùng để kiểm tra nội dung và lỗi.
URI::Heuristic
Module tí hon này sử dụng thuật toán đoán theo kiểu Netscape để mở rộng các URL chưa hoàn chỉnh. Ví dụ:
Đơn giản Đoán
perl http://www.perl.com/
www.oreilly.com http://www.oreilly.com/
ftp.funet.fi ftp://ftp.funet.fi/
/etc/passwd file:/etc/passwd
Mặc dù những địa chỉ này không phải là những url hợp lệ, Netscape cố đoán url chính xác của chúng. Hầu hết các browser khác cũng làm tương tự.
Source
#!usr/bin/perl# titlebytes - tim tieu de va kich thuoc cua tai lieuuse warnings;
use LWP:::UserAgent;use HTTP::Request;use HTTP::Response;use URI::Heuristic;
my $raw_url = shift or die "usage: $0 url\n";my $url = URI::Heuristic::uf_urlstr($raw_url);$ = 1; # flush dòng kế tiếpprintf "%s =>\n\t", $url;my $ua = LWP::UserAgent->new();$ua->agent("Schmozilla/v9.14 Platinum"); # đợi đi, thế nào cũng cómy $req = HTTP::Request->new(GET => $url);$req->referer("http://wizard.yellowbrick.oz"); # tung hoả mù cho các chương trình phân tích log
my $response = $ua->request($req);if ( $response->is_error() ) { printf " %\n", $response->status_line;} else {my $count;my $byte;my $content = $response->content();$bytes = length $content;$count = ($content =~ tr/\n/\n/);printf "%s (%d lines,%d bytes)\n", $response->title(), $count, $byte;}Khi chạy, chương trình sẽ cho ra kết quả như sau:
% titlebytes http://www.tpj.com/http://www.tpj.com/ => The Perl Journal (109 lines, 4530 bytes)
Xem thêm
Tài liệu CPAN về LWP::Simple, trang hướng dẫn của
lwpcook đi kèm với LWP; tài liệu của các module LWP::UserAgent, HTTP::Request, HTTP::REsponse, URI::Heuristic, công thức 20.2.
[Chapter 20] Web automation - Perl cookbook
Chương này tiếp cận Web từ một hướng khác so với chương 19 (CGI programing): thay vì trả lời một yêu cầu từ trình duyệt, ở đây chúng ta giả làm một trình duyệt, phát sinh yêu cầu và xử lý kết quả trả về. Vì các giao thức mạng và các định dạng tài liệu rất phức tạp, chúng ta sẽ tận dụng các module sẵn có để đơn giản hoá quá trình này và có thể tập trung vào chương trình của mình.
Những module thích hợp có thể tìm thấy tại http://www.perl.com/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/
Có những module dùng để kết toán thẻ tín dụng, tương tác với Netscape hay API của server Apache, xử lý bản đồ hình ảnh, kiểm tra tính hợp lệ của HTML, thao tác MIME. Những module lớn nhất và quan trọng nhất đối với chương này được tìm thấy trong bộ module libwww-perl, gọi tắt là LWP. Sau đây là một số module được tích hợp trong LWP:
Các module HTTP và LWP cho phép thực hiện một yêu cầu tài liệu từ một server. Cụ thể, module LWP::Simple cung cấp một cách thức dơn giản đế lấy về một tài liệu. Tuy nhiên , module này không có khả năng truy xuất đến từng thành phần riêng biệt của một trả lời http. Để có thể truy xuất các thành phần này, cần dùng đến TTP::Request, HTTP::Response và LWP::UserAgent.
| Module | Mục đích |
| LWP::UserAgent | www user agent class |
| LWP::RobotUA | Phát triển các ứng dụng robot |
| LWP::Protocol | giao tiếp với các kiểu giao thức khác nhau |
| LWP::Authen::Basic | Xử lý các trả lời 401 và 407 |
| LWP::MEdiaTypes | cấu hình các kiểu MIME (text/html, ...) |
| LWP::Debug | debug logging module |
| LWP::Simple | giao tiếp với các giao thức đơn giản cho các hàm chung |
| HTTP::Headers | các dạng header MIME/RFC822 |
| HTTP::Message | message dạng HTTP |
| HTTP::Request | HTTP request |
| HTTP::Response | HTTP response |
| HTTP::Deamon | 1 lớp HTTP server |
| HTTP::Status | mã status HTTP |
| HTTP::Date | lấy ngày từ định dạng ngày http |
| HTTP::Negotiate | HTTP content negotiation calculation |
| HTTP::RobotRules | đọc các file robot.txt |
| File::Listing | đọc danh sách liệt kê thư mục |
Liên hệ chặt chẽ với LWP nhưng không được phát hành chung với LWP là các module HTML. Các module này cho phép diễn dịch tài liệu HTML. Chúng cung cấp nền tảng cho các recipe được giới thiệu trong phần 20.5, 20.4, 20.3 và 20.7
Recipe 20.12 đưa ra một rehular expression để giải mã các trường trong file log của web server và trình bày cách diễn dịch các trường này. Regular expression này được sử dụng cùng với module Logfile::Apache trong recipe 20.13 để trình bày hai cách tóm lược dữ liệu trong log file của web server.