GoGPT Best VPN GoSearch

Biểu tượng yêu thích OnWorks

samplan9 - Trực tuyến trên đám mây

Chạy samplan9 trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks trên Ubuntu Online, Fedora Online, trình mô phỏng trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS

Đây là lệnh samplan9 có thể được chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS

CHƯƠNG TRÌNH:

TÊN


sam, B, E, sam.save, samterm, Samsave - trình chỉnh sửa màn hình với các biểu thức chính quy cấu trúc

SYNOPSIS


sam [ tùy chọn ... ] [ các tập tin ]

sam -r máy

sam.save

B hồ sơ[:hàng] ...

E hồ sơ

MÔ TẢ


Sam là một trình chỉnh sửa nhiều tệp. Nó sửa đổi bản sao cục bộ của tệp bên ngoài. Bản sao là
ở đây được gọi là hồ sơ. Các tệp được liệt kê trong menu có sẵn thông qua nút chuột 3 hoặc
các n chỉ huy. Mỗi tệp có một tên được liên kết, thường là tên của tệp bên ngoài
từ đó nó được đọc và một bit được sửa đổi cho biết liệu tệp của trình biên tập
đồng ý với tệp bên ngoài. Tệp bên ngoài không được đọc vào tệp của trình chỉnh sửa cho đến khi
trước tiên nó trở thành tệp hiện tại — tệp mà các lệnh chỉnh sửa áp dụng — trên menu của nó
mục nhập được in. Các tùy chọn là

-a Autoindent. Trong chế độ này, khi một ký tự dòng mới được nhập vào thiết bị đầu cuối
giao diện, học kỳ sao chép khoảng trắng dẫn đầu trên dòng hiện tại sang dòng mới.

-d Đừng `` tải xuống '' phần đầu cuối của sam. Việc chỉnh sửa sẽ được thực hiện bằng lệnh
chỉ ngôn ngữ, như trong ed(1).

-r máy
Chạy phần máy chủ từ xa trên máy được chỉ định, phần đầu cuối cục bộ.

-s con đường
Khởi động phần máy chủ từ tệp được chỉ định trên máy chủ từ xa. Chỉ có ý nghĩa
với -r tùy chọn.

-t con đường
Bắt đầu phần đầu cuối từ tệp được chỉ định. Hữu ích cho việc gỡ lỗi.

Đều đặn biểu thức
Biểu thức chính quy như trong regexp(7) với việc bổ sung \n để đại diện cho các dòng mới. MỘT
biểu thức chính quy có thể không bao giờ chứa ký tự dòng mới theo nghĩa đen. Thông thường rỗng
biểu thức là viết tắt của biểu thức hoàn chỉnh cuối cùng gặp phải. Một biểu thức chính quy trong
sam khớp với chuỗi con ngoài cùng bên trái dài nhất được đối sánh chính thức bởi biểu thức. Đang tìm kiếm
theo hướng ngược lại tương đương với tìm kiếm ngược với phân loại
thao tác đảo ngược trong biểu thức.

Địa chỉ
Một địa chỉ xác định một chuỗi con trong một tệp. Trong phần sau, ký tự ` n' có nghĩa là những
chuỗi null sau n-ký tự thứ trong tệp, với 1 ký tự đầu tiên trong tệp.
`Dòng n' có nghĩa là những n-kết hợp thứ, bắt đầu ở đầu tệp, của kết quả thông thường
biểu thức Tất cả các tệp luôn có một chuỗi con hiện tại, được gọi là dấu chấm, đó là chuỗi mặc định
địa chỉ nhà.

Đơn giản Địa chỉ
#n Chuỗi trống sau ký tự n; #0 là phần đầu của tệp.
n Dòng n; 0 là phần đầu của tệp.
/regexp/
?regexp?
Chuỗi con phù hợp với biểu thức chính quy, được tìm thấy bằng cách nhìn về phía cuối
(/) hoặc bắt đầu (?) của tệp, và nếu cần, tiếp tục tìm kiếm từ
đầu kia đến điểm bắt đầu tìm kiếm. Chuỗi con phù hợp có thể chạy ngang
điểm băt đâu. Khi nhập một mẫu có chứa dấu chấm hỏi theo nghĩa đen cho
tìm kiếm ngược, dấu hỏi phải được chỉ định là thành viên của một lớp.

0 Chuỗi trước dòng đầy đủ đầu tiên. Đây không nhất thiết là chuỗi null;
xem +- phía dưới.

$ Chuỗi null ở cuối tệp.

. Chấm.

' Dấu trong tệp (xem k lệnh dưới đây).

"regexp"
Đặt trước một địa chỉ đơn giản (mặc định .), đề cập đến địa chỉ được đánh giá trong
tệp duy nhất có dòng menu khớp với biểu thức chính quy.

Hợp chất Địa chỉ
Trong những điều sau đây, a1a2 là các địa chỉ.

a1+a2 Địa chỉ a2 được đánh giá bắt đầu từ cuối a1.

a1-a2 Địa chỉ a2 đánh giá nhìn theo hướng ngược lại bắt đầu từ đầu
of a1.

a1,a2 Chuỗi con từ đầu của a1 đến cuối a2. Nếu a1 bị mất tích, 0 is
được thay thế. Nếu như a2 bị mất tích, $ được thay thế.

a1;a2 Như a1,a2, nhưng vơi a2 được đánh giá ở cuối và dấu chấm được đặt thành, a1.

Các nhà khai thác +- được ưu tiên cao, trong khi ,; được ưu tiên thấp.

Ở cả hai +- biểu mẫu, nếu a2 là địa chỉ dòng hoặc ký tự bị thiếu số,
số mặc định là 1. Nếu a1 bị thiếu, được thay thế. Nếu cả hai a1a2 có mặt
và có thể phân biệt được, + có thể được làm sáng tỏ. a2 có thể là một biểu thức chính quy; nếu nó được phân định
bởi tác dụng của + or - được đảo ngược.

Đây là một lỗi đối với một địa chỉ ghép để biểu thị một chuỗi con không đúng định dạng. Một số hữu ích
thành ngữ: a1+- (a1-+) chọn dòng chứa cuối (đầu) của a1. 0/regexp/
xác định vị trí khớp đầu tiên của biểu thức trong tệp. (Hình thức 0; // đặt dấu chấm
không cần thiết.) ./regexp/ / / tìm lần xuất hiện thứ hai sau đây của biểu thức, và
., /regexp/ mở rộng dấu chấm.

Lệnh
Trong phần sau, văn bản được phân giới bằng dấu gạch chéo thể hiện văn bản được phân tách bằng bất kỳ văn bản nào có thể in được
ký tự ngoại trừ chữ và số. Bất kỳ số lượng dấu phân cách ở cuối có thể được giải thích, với
nhiều tổng thể sau đó đại diện cho chuỗi null, nhưng dấu phân cách đầu tiên phải luôn là
Món quà. Trong bất kỳ văn bản được phân tách nào, dòng mới có thể không xuất hiện theo nghĩa đen; \n có thể được đánh máy cho
dòng mới; và \/ trích dẫn dấu phân cách, ở đây Dấu gạch chéo ngược được hiểu theo nghĩa đen,
Ngoại trư s lệnh.

Hầu hết các lệnh có thể được bắt đầu bằng một địa chỉ để chỉ ra phạm vi hoạt động của chúng. Những thứ kia
mà có thể không được đánh dấu bằng một bên dưới. Nếu một lệnh có địa chỉ và không có địa chỉ nào được cung cấp,
dấu chấm được sử dụng. Ngoại lệ duy nhất là w lệnh, mặc định là 0, $. Trong
mô tả, `phạm vi 'được sử dụng để đại diện cho bất kỳ địa chỉ nào được cung cấp. Nhiều lệnh được thiết lập
giá trị của dấu chấm như một hiệu ứng phụ. Nếu vậy, nó luôn được đặt thành `` kết quả '' của thay đổi:
chuỗi trống để xóa, văn bản mới để chèn, v.v. (nhưng hãy xem se
lệnh).

bản văn lệnh
a/văn bản/
or
a
dòng of văn bản
. Chèn văn bản vào tệp sau phạm vi. Đặt dấu chấm.

c
i Giống như a, Nhưng c thay thế văn bản, trong khi i chèn trước phạm vi.

d Xóa văn bản trong phạm vi. Đặt dấu chấm.

s/regexp/văn bản/
Thay thế văn bản để so khớp đầu tiên với biểu thức chính quy trong phạm vi. Bộ
chấm vào phạm vi đã sửa đổi. Trong văn bản nhân vật & viết tắt của chuỗi mà
phù hợp với biểu thức. Dấu gạch chéo ngược hoạt động như bình thường trừ khi được theo sau bởi một chữ số: \d
là viết tắt của chuỗi phù hợp với biểu thức con bắt đầu bởi d-n trái
dấu ngoặc đơn. Nếu như s ngay sau đó là một số n, như trong s2 / x / y /, Các n-thứ tự
trận đấu trong phạm vi được thay thế. Nếu lệnh được theo sau bởi một g, như trong
s / x / y / g, tất cả các trận đấu trong phạm vi đều được thay thế.

m a1
t a1 Di chuyển (m) hoặc sao chép (t) phạm vi sau a1. Đặt dấu chấm.

Giao diện lệnh
p In văn bản trong phạm vi. Đặt dấu chấm.
= In địa chỉ dòng và địa chỉ ký tự của dải ô.
=# Chỉ in địa chỉ ký tự của phạm vi.

Tập tin lệnh
* b danh sách tập tin
Đặt tệp hiện tại thành tệp đầu tiên có tên trong danh sách sam cũng có trong nó
thực đơn. Danh sách có thể được thể hiện <Kế hoạch 9 lệnh trong trường hợp đó tên tệp là
được lấy dưới dạng các từ (theo nghĩa shell) được tạo ra bởi lệnh Plan 9.
* B danh sách tập tin
Giống như b, ngoại trừ tên tệp không có trong menu được nhập vào đó và tất cả tệp
tên trong danh sách được kiểm tra.
* n In menu các tệp. Định dạng là:
' hoặc trống cho biết tệp đã được sửa đổi hoặc sạch,
- or + cho biết tệp chưa đọc hoặc đã được đọc (trong thiết bị đầu cuối, * có nghĩa
nhiều hơn một cửa sổ đang mở),
. hoặc trống cho biết tệp hiện tại,
khoảng trống,
và tên tệp.
* D danh sách tập tin
Xóa các tệp đã đặt tên khỏi menu. Nếu không có tệp nào được đặt tên, tệp hiện tại sẽ bị xóa.
Đó là một lỗi để D một tệp đã sửa đổi, nhưng một tệp tiếp theo D sẽ xóa một tệp như vậy.

I / O Lệnh
* e tên tập tin
Thay thế tệp bằng nội dung của tệp bên ngoài được đặt tên. Đặt dấu chấm thành
đầu của tệp.
r tên tập tin
Thay thế văn bản trong phạm vi bằng nội dung của tệp bên ngoài được đặt tên. Đặt dấu chấm.
w tên tập tin
Viết phạm vi (mặc định 0, $) vào tệp bên ngoài được đặt tên.
* f tên tập tin
Đặt tên tệp và in mục nhập menu kết quả.
Nếu tên tệp không có trong bất kỳ tên nào trong số này, thì tên tệp hiện tại sẽ được sử dụng. e luôn luôn
đặt tên tệp; rw làm như vậy nếu tệp không có tên.
< Kế hoạch 9 lệnh
Thay thế phạm vi bằng đầu ra tiêu chuẩn của lệnh Kế hoạch 9.
> Kế hoạch 9 lệnh
Gửi phạm vi đến đầu vào tiêu chuẩn của lệnh Kế hoạch 9.
| Kế hoạch 9 lệnh
Gửi phạm vi đến đầu vào tiêu chuẩn và thay thế nó bằng đầu ra tiêu chuẩn, của
Lệnh kế hoạch 9.
* ! Kế hoạch 9 lệnh
Chạy lệnh Kế hoạch 9.
* cd thư mục
Thay đổi thư mục làm việc. Nếu không có thư mục nào được chỉ định, $ nhà Được sử dụng.

Trong bất kỳ <, >, | or !, nếu Kế hoạch 9 lệnh bị bỏ qua cuối cùng Kế hoạch 9 lệnh (của bất kỳ
loại) được thay thế. Nếu như sam is Đã tải xuống (sử dụng chuột và màn hình raster, tức là không
sử dụng tùy chọn -d), ! đặt đầu vào tiêu chuẩn thành / dev / nullvà nếu không thì đầu ra chưa được chỉ định
(tiêu chuẩn cho !>, tiêu chuẩn cho tất cả) được đặt trong /tmp/sam.err và vài dòng đầu tiên
được in.

Loops Điều kiện
x/regexp/ lệnh
Đối với mỗi đối sánh của biểu thức chính quy trong phạm vi, hãy chạy lệnh với tập hợp dấu chấm
vào trận đấu. Đặt dấu chấm cho trận đấu cuối cùng. Nếu biểu thức chính quy và
dấu gạch chéo được bỏ qua, được giả định. Các trận đấu chuỗi rỗng có khả năng xảy ra trước đó
mọi ký tự của phạm vi và ở cuối phạm vi.
y/regexp/ lệnh
Như x, nhưng hãy chạy lệnh cho từng chuỗi con nằm trước, giữa hoặc sau
các trận đấu sẽ được tạo bởi x. Không có biểu thức chính quy mặc định.
Các chuỗi con rỗng có thể xảy ra trước mọi ký tự trong phạm vi.
* X/regexp/ lệnh
Đối với mỗi tệp có mục nhập menu khớp với biểu thức chính quy, hãy làm cho
tệp hiện tại và chạy lệnh. Nếu biểu thức bị bỏ qua, lệnh sẽ được chạy
trong mọi tệp.
* Y/regexp/ lệnh
Giống như X, nhưng đối với các tệp không khớp với biểu thức chính quy và
biểu thức là bắt buộc.
g/regexp/ lệnh
v/regexp/ lệnh
Nếu phạm vi chứa (g) hoặc không chứa (v) một kết quả phù hợp cho biểu thức, đặt
chấm vào phạm vi và chạy lệnh.
Chúng có thể được lồng vào nhau một cách sâu sắc tùy ý, nhưng chỉ một trường hợp của một trong hai X or Y có thể xuất hiện
trong một lệnh duy nhất. Một lệnh trống trong một x or y mặc định là p; một lệnh trống trong X
or Y mặc định là f. gv không có giá trị mặc định.

sai lầm
k Đặt dấu của tệp hiện tại thành phạm vi. Không đặt dấu chấm.

* q Từ bỏ. Đó là một lỗi khi thoát với các tệp đã sửa đổi, nhưng một giây q sẽ thành công.

* u n Hoàn tác cuối cùng n (mặc định 1) các lệnh cấp cao nhất đã thay đổi nội dung hoặc tên của
tệp hiện tại và bất kỳ tệp nào khác có thay đổi gần đây nhất đồng thời với
thay đổi của tệp hiện tại. Kế tiếp uđang di chuyển xa hơn trong thời gian. Duy nhất
các lệnh mà bạn không hiệu quả là cd, u, q, wD. Nếu n là tiêu cực, u
`redoes '', hoàn tác việc hoàn tác, tiến lại trong thời gian một lần nữa.

(trống)
Nếu phạm vi là rõ ràng, hãy đặt dấu chấm cho phạm vi. Nếu như sam được tải xuống,
chấm kết quả được chọn trên màn hình; nếu không thì nó được in. Nếu không có địa chỉ
được chỉ định (lệnh là một dòng mới) chấm được mở rộng theo một trong hai hướng này sang dòng
ranh giới và in. Nếu do đó dấu chấm không thay đổi, thì dấu chấm đó được đặt thành . + 1 và được in.

Nhóm nhiều thay đổi
Các lệnh có thể được nhóm lại bằng cách đặt chúng trong dấu ngoặc nhọn {}. Các lệnh trong dấu ngoặc nhọn phải
xuất hiện trên các dòng riêng biệt (không yêu cầu dấu gạch chéo ngược giữa các lệnh). Về mặt ngữ nghĩa, một
dấu ngoặc nhọn mở giống như một lệnh: nó lấy một địa chỉ (tùy chọn) và đặt dấu chấm cho mỗi con
chỉ huy. Các lệnh trong dấu ngoặc nhọn được thực hiện tuần tự, nhưng các thay đổi được thực hiện bởi một
lệnh không hiển thị đối với các lệnh khác (xem đoạn tiếp theo). Dấu ngoặc nhọn có thể được lồng vào nhau
một cách tùy tiện.

Khi một lệnh thực hiện một số thay đổi đối với tệp, như trong x / re / c / text /, địa chỉ của
tất cả các thay đổi đối với tệp được tính trong tệp gốc. Nếu những thay đổi trong
trình tự, chúng được áp dụng cho tệp. Các lần chèn liên tiếp ở cùng một địa chỉ là
được phân loại thành một phụ trang duy nhất bao gồm một số phụ trang theo thứ tự được áp dụng.

thiết bị đầu cuối
Những gì sau đây đề cập đến hành vi của sam khi được tải xuống, nghĩa là khi hoạt động dưới dạng
trình chỉnh sửa hiển thị trên màn hình raster. Đây là hành vi mặc định; kêu gọi sam với
-d (không tải xuống) tùy chọn chỉ cung cấp quyền truy cập vào ngôn ngữ lệnh.

Mỗi tệp có thể có không hoặc nhiều cửa sổ đang mở. Mỗi cửa sổ tương đương và được cập nhật
đồng thời với các thay đổi trong các cửa sổ khác trên cùng một tệp. Mỗi cửa sổ có một
giá trị độc lập của dấu chấm, được biểu thị bằng một chuỗi con được đánh dấu trên màn hình. Dấu chấm có thể là
trong một khu vực không nằm trong cửa sổ. Thường có một `` cửa sổ hiện tại '', được đánh dấu bằng
đường viền tối, áp dụng cho văn bản đã nhập và lệnh chỉnh sửa. Văn bản có thể được đánh máy và chỉnh sửa
như trong rio(1); cũng như phím thoát (ESC) chọn (đặt dấu chấm thành) văn bản được nhập kể từ lần cuối cùng
nhấn nút chuột.

Menu nút 3 điều khiển các hoạt động của cửa sổ. Phần trên cùng của menu cung cấp thông tin sau
toán tử, mỗi toán tử sử dụng một hoặc nhiều riogiống như con trỏ để nhắc lựa chọn một
cửa sổ hoặc quét hình chữ nhật. `` Quét 'một hình chữ nhật rỗng sẽ được một cửa sổ lớn,
rời khỏi cửa sổ lệnh hoặc toàn bộ màn hình, tùy thuộc vào vị trí rỗng
hình chữ nhật là.

người mới Tạo một tệp mới, trống.

số không Tạo bản sao của một cửa sổ hiện có.

thay đổi kích thước Như trong rio.

gần Xóa cửa sổ. Trong cửa sổ cuối cùng của tệp, gần tương đương với một D cho
tập tin.

viết Tương đương với một w cho tệp.

Bên dưới các toán tử này là danh sách các tệp có sẵn, bắt đầu bằng ~~ sam ~~, lệnh
cửa sổ. Việc chọn một tệp từ danh sách sẽ tạo cửa sổ được sử dụng gần đây nhất trên tệp đó
hiện tại, trừ khi nó đã là hiện tại, trong trường hợp đó các lựa chọn xoay vòng qua
các cửa sổ. Nếu không có cửa sổ nào đang mở trên tệp, người dùng sẽ được nhắc mở một cửa sổ. Các tập tin
khác hơn ~~ sam ~~ được đánh dấu bằng một trong các ký tự - + * theo XNUMX, một hoặc
nhiều cửa sổ được mở trên tệp. Một dấu khác xuất hiện trên tệp trong hiện tại
cửa sổ và một câu trích dẫn duy nhất, ', trên một tệp được sửa đổi kể từ lần viết cuối cùng.

Cửa sổ lệnh, được tạo tự động khi sam bắt đầu, là một cửa sổ bình thường ngoại trừ
văn bản được nhập vào nó được hiểu là các lệnh cho trình soạn thảo thay vì văn bản bị động,
và văn bản được in bởi các lệnh của trình soạn thảo sẽ xuất hiện trong đó. Hành vi giống như rio, với một
`` điểm đầu ra '' phân tách các lệnh đang được nhập từ đầu ra trước đó. Các lệnh đã nhập
trong cửa sổ lệnh áp dụng cho tệp đang mở hiện tại — tệp trong tệp hiện tại gần đây nhất
cửa sổ.

Thao tác văn bản
Nút 1 thay đổi lựa chọn, giống như rio. Trỏ đến cửa sổ không hiện hành bằng nút 1
làm cho nó hiện hành; trong cửa sổ hiện tại, nút 1 chọn văn bản, do đó đặt dấu chấm.
Bấm đúp để chọn văn bản đến ranh giới của từ, dòng, chuỗi được trích dẫn hoặc
chuỗi trong ngoặc, tùy thuộc vào văn bản lúc nhấp chuột.

Nút 2 cung cấp một menu các lệnh chỉnh sửa:

cắt Xóa dấu chấm và lưu văn bản đã xóa trong bộ đệm snarf.

dán Thay thế văn bản trong dấu chấm bằng nội dung của bộ đệm snarf.

tiếng gầm gừ Lưu văn bản dưới dạng dấu chấm trong bộ đệm snarf.

chì Gửi văn bản trong vùng lựa chọn dưới dạng tin nhắn. Nếu lựa chọn trống,
khối văn bản được phân tách bằng dấu cách trắng được gửi dưới dạng một tin nhắn nhỏ với một Nhấp chuột
thuộc tính xác định nơi lựa chọn nằm (xem chì(7)).

xem Tìm kiếm sự xuất hiện tiếp theo của văn bản chữ trong dấu chấm. Nếu dấu chấm là
chuỗi null, văn bản trong bộ đệm snarf được sử dụng. Bộ đệm snarf không bị ảnh hưởng.

Trao đổi bộ đệm snarf với rio.

/regexp
Tìm kiếm kết quả phù hợp tiếp theo của biểu thức chính quy cuối cùng được nhập vào
chỉ huy. (Không có trong cửa sổ lệnh.)

gửi Gửi văn bản dưới dạng dấu chấm hoặc bộ đệm snarf nếu dấu chấm là chuỗi rỗng, như thể nó là
nhập vào cửa sổ lệnh. Lưu văn bản đã gửi trong bộ đệm snarf. (Chỉ huy
chỉ cửa sổ.)

Bên ngoài thông tin
Sam lắng nghe chỉnh sửa cổng dọi. Nếu hệ thống ống nước không hoạt động, trên lệnh gọi sam tạo ra
một đường ống được đặt tên / srv / sam.người sử dụng hoạt động như một nguồn lệnh bổ sung. Nhân vật
được ghi vào đường ống được đặt tên được coi như thể chúng đã được nhập vào cửa sổ lệnh.

B là một lệnh cấp shell gây ra một phiên bản của sam chạy trên cùng một thiết bị đầu cuối để
tải tên các tập tin. B sử dụng hệ thống ống nước hoặc đường ống được đặt tên, bất kỳ dịch vụ nào là
có sẵn. Nếu hệ thống ống nước không được bật, tùy chọn cho phép chỉ định số dòng
để vị trí ban đầu hiển thị trong tệp được đặt tên cuối cùng (hệ thống ống nước cung cấp thêm
cơ chế chung cho khả năng này).

E là một lệnh cấp shell có thể được sử dụng như $ EDITOR trong môi trường Unix. Nó chạy B
on hồ sơ và sau đó không thoát cho đến khi hồ sơ được thay đổi, được coi là tín hiệu cho thấy hồ sơ
đang được chỉnh sửa xong.

Dị thường Chấm dứt
If sam kết thúc khác với một q lệnh (bằng cách gác máy, xóa cửa sổ của nó, v.v.),
các tệp đã sửa đổi được lưu trong một tệp thực thi, $ HOME / sam.save. Chương trình này, khi
được thực thi, hỏi có ghi từng tệp trở lại tệp bên ngoài hay không. Câu trả lời gây ra
viết; bất cứ điều gì khác sẽ bỏ qua tệp.

Sử dụng samplan9 trực tuyến bằng các dịch vụ onworks.net


Máy chủ & Máy trạm miễn phí

Tải xuống ứng dụng Windows & Linux

Lệnh Linux

Ad




×
quảng cáo
❤️Mua sắm, đặt phòng hoặc mua tại đây — không mất phí, giúp duy trì các dịch vụ miễn phí.