Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Mẹo vặt Erlang 1616

alide.myopenid.com 32
Updated 2 months ago

Bài viết này đề cập các vấn đề nho nhỏ gặp phải và cách giải quyết khi làm việc với Erlang.

Cài Erlang từ mã nguồn

Để có thể ./configure, make, make install trơn tru, trên Ubuntu cần cài các gói:

sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install libpam0g-dev

Trên CentOS:

sudo yum install gcc
sudo yum install ncurses-devel
sudo yum install openssl-devel
sudo yum install libpam0g-dev

Erlang có chương trình debugger có GUI rất mạnh, nhưng nó đòi wxWidgets. Erlang R13B01 đòi wxWidgets 2.8. Ví dụ trên Ubuntu, trước khi build cần cài thêm các gói sau:

sudo apt-get install libwxbase2.8-dev
sudo apt-get install libwxgtk2.8-dev
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev
sudo apt-get install libglut3-dev

Để bật debugger, chạy erl -smp, rồi gõ debugger:start().

Để cài trên Snow Leopard ở chế độ 64 bit từ mã nguồn, khi configure cần thêm tham số --enable-darwin-64bit.

Erlide

là plugin cho Eclipse. Tuy nhiên sau khi cài xong, click vào tập tin .erl sẽ thấy hiện thông báo đại loại "Error initializing editor". Cách giải quyết là click chuột phải vào project, rồi chọn "Toggle Erlang nature".

Ngoài ra, khi dùng Eclipse để viết chương trình web thì nên bật web ở cổng khác 8000, 3000 như Rails chẳng hạn, vì Eclipse thường chiếm mất cổng 8000.

Tra cứu tài liệu

Tìm vị trí của phần tử trong danh sách

string:str(List, [Element]). Bất ngờ chưa!

Unicode

Tham khảo:

Hiển thị Unicode trên Eshell (Erlang emulator)

Trước tiên là cách dùng Regular Expression cho Unicode (ví dụ tiếng Nhật). Bật Eshell với chỉ định cho LC_CTYPE:

LC_CTYPE=ja_JP.UTF-8 erl

Test:

1> lists:keyfind(encoding,1,io:getopts()).
{encoding,unicode}
2> "ベトナム".
[12505,12488,12490,12512]
3> io:format("~ts~n",[v(2)]).
ベトナム

Để hiển thị đúng cần modifier t, t ở đây là Unicode translation modifier.
v(2): kết quả của câu lệnh thứ 2, trường hợp này là chuỗi ký tự vừa nhập.

Regexp với Unicode

4> {match, M}=re:run("名前=キムタク","名前=(.*)",[unicode, {capture,all_but_first,list}]).
{match,[[12461,12512,12479,12463]]}
5> io:format("~ts~n", [M]).
キムタク
ok

Chuỗi gõ ở Eshell và ở tập tin mã nguồn không phải bao giờ cũng là một

Ví dụ trong tập tin mã nguồn lưu ở dạng UTF-8:

V = "tiếng Việt",
io:format("~p~n", [V])

Biên dịch rồi chạy sẽ ra kết quả:

[116,105,225,186,191,110,103,32,86,105,225,187,135,116]

Tất cả phần tử của mảng đều < 256, nghĩa là trình biên dịch đã biến đổi thành mảng byte tương thích với UTF-8. Còn nếu gõ trực tiếp từ Eshell:

1> "tiếng Việt".
[116,105,7871,110,103,32,86,105,7879,116]

Nghĩa là nếu có hàm nào đó nhận tham số là chuỗi Unicode, thì khi thử nghiệm ở Eshell, cần có bước biến đổi trung gian:

2> B = unicode:characters_to_binary("tiếng Việt").
<<116,105,225,186,191,110,103,32,86,105,225,187,135,116>>
3> L = binary_to_list(B).
[116,105,225,186,191,110,103,32,86,105,225,187,135,116]

Hiện ra toàn bộ màn hình khi escript kết thúc

Erlang có tính năng escript, không cần compile chương trình trước khi chạy. Nhưng có rắc rối là nếu chương trình xuất chuỗi kí tự gì đó ra màn hình, khi chương trình kết thúc nếu không xử lí đặc biệt thì thường chuỗi kí tự chưa được xuất ra hết mà chương trình đã kết thúc mất.

Cần làm như đoạn mã ở dưới. Chú ý nếu bỏ dòng (1) hoặc (2) thì sẽ bị hiện tương trên.

main(_) ->
    S = self(),
    spawn_link(fun() ->
        io:format("~p~p~n", [lists:duplicate(100000, $a), b]),
        io:format(""),  % (1)
        S ! finished
    end),
    receive
        finished ->
            io:format(""),  % (2)
            halt(0);
        _Other ->
            halt(1)
    end.

Tham khảo

Comments

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content