Tiếp cận dễ dàng với các nhân vật chính quốc tế

Trang này là bản dịch của tác phẩm gốc của Alan Zisman. Bạn có thể tìm thấy trang này tại http://www.zisman.ca/keyboard/

bởi Alan Zisman (c) 2001

Nhiều người dùng tiếng Anh có nhu cầu dễ dàng truy cập vào các ký tự có dấu và các ký tự không phải tiếng Anh khác. Mặc dù điều này có thể được thực hiện bằng cách học một số ít tổ hợp mã Alt + 0xxx hoặc sử dụng phụ kiện Windows Charmap, nhiều người dùng Windows có thể thấy hữu ích khi cài đặt và học cách sử dụng thiết lập Bàn phím Quốc tế Windows US.

Cài đặt bàn phím Hoa Kỳ (Quốc tế)

Mở Bảng điều khiển và đi tới biểu tượng Bàn phím. Bấm vào tab Ngôn ngữ. Bấm đúp vào mục tiếng Anh (Hoa Kỳ) (hoặc, với mục đó được chọn, bấm vào nút Thuộc tính). Từ danh sách thả xuống, hãy chọn Hoa Kỳ – Quốc tế. Bấm OK.

(Bạn có thể cần có sẵn đĩa CD Windows của mình vì một số tệp sẽ được cài đặt).

Sử dụng bàn phím quốc tế

Thoạt nhìn, bàn phím của bạn sẽ có vẻ bình thường. Tuy nhiên, bạn có thể nhận thấy rằng một số phím dường như không có tác dụng gì … tuy nhiên, nếu bạn nhấn một trong các phím đó theo sau là một số chữ cái, những điều thú vị sẽ xảy ra:

  • Circumflex (ký tự ^) … với bàn phím Quốc tế, giữ phím shift + 6 (cho dấu mũ), theo sau là các chữ cái a hoặc e tạo ra nguyên âm đó bằng dấu mũ.
  • Trọng âm Grave được tạo ra bằng cách gõ dấu ngoặc kép đơn (‘) theo sau là chữ a, e, v.v … kết quả là một nguyên âm có dấu.
  • Dấu ngã – phím này (thường bên cạnh số 1 – lưu ý bạn cần giữ phím shift) theo sau là a hoặc n tạo ra ký tự đó có dấu ngã ở trên cùng.
  • Dấu trọng âm được tạo ra bằng cách sử dụng dấu nháy đơn (ký tự không được dịch chuyển bên dưới dấu ngã – không phải dấu ngoặc kép) theo sau là a, e hoặc i.
  • Umlaut: sử dụng dấu ngoặc kép (“) theo sau là a, e, i, v.v. để tạo ra hai dấu chấm nhỏ đó trên chữ cái. (Cảm ơn Adrienee Mahafey đã cho tôi biết tên của hai dấu chấm, còn được gọi là “diaeresis”).

Lưu ý rằng bạn sẽ chỉ nhận được ký tự đặc biệt nếu bạn nhập tổ hợp phím cho một chữ cái có thể sử dụng một trong các ký tự đó … nếu bạn nhập một ký tự co như không phải, chẳng hạn, bạn sẽ không có dấu trọng âm qua chữ t.

Nhưng nếu bạn thực sự muốn lấy ký tự trên khóa – ví dụ như dấu ngoặc kép đơn hoặc kép? Để làm như vậy, hãy bấm phím, sau đó nhấn phím cách. Điều này có thể hơi khó khăn khi đặt một cụm từ trong dấu ngoặc kép.

Cách khác…

Ngoài ra, nhấn giữ đồng thời phím Alt phải trên bàn phím hoặc Ctrl + Alt cùng với nhiều chữ cái của bàn phím và bạn sẽ nhận được một ký tự thay thế (thường có dấu) như trong hình minh họa sau. (Hình minh họa được quét từ Windows 95 Secrets của Brian Livingston và David Straub (1995, IDG Books, trang 501)

US International Keyboard Alt-key layout

Bạn có thể tìm thấy một trang hữu ích về cách nhập Dấu và Ký tự Khóa Quốc tế trong cả Mac và Windows tại: http://lrcnt.fas.harvard.edu/Resources/Documentation/accents.htm 

Nhận xét (tháng 7 năm 2011): Việc phát hành Mac OSX 10.7 Lion của Apple giúp dễ dàng thêm các ký tự quốc tế trên máy Mac. (Xem bài viết này). Nó ghi chú:

“Windows lộn xộn và không nhất quán khi bạn muốn nhập các ký tự có dấu.” Bạn có thể chọn bố cục bàn phím Hoa Kỳ-Quốc tế “trong ứng dụng Bàn phím trong Bảng điều khiển Windows, cho phép bạn (ví dụ) nhấn phím dấu ngoặc kép, sau đó là “u” để nhận u-umlaut. Tất nhiên, điều này khác với phương pháp được tích hợp trong Microsoft Word (với bất kỳ bàn phím nào), trong đó bạn nhấn Ctrl-dấu ngoặc kép, sau đó “u” để nhận u-umlaut . Hệ thống tốt nhất để chèn các ký tự có dấu trong Windows là chương trình AllChars mã nguồn mở, có sẵn từ http://sourceforge.net/projects/allchars/, sử dụng phím Ctrl bên phải, theo sau là một cặp ký tự trực quan, để tạo các ký tự có dấu trên toàn hệ thống. Hoặc bạn có thể chỉ cần mua một máy Mac.”

Mục lục

  1. PHẦN MỀM ĐIỀU KHIỂN
  2. CHUYỂN TẬP TIN
  3. MÃ NGUỒN
  4. PHIÊN BẢN UNIX
  5. CHUYỂN SANG MỘT NỀN TẢNG MỚI
  6. SỬA LỖI
  7. LỊCH SỬ CẬP NHẬT
  8. TẢI VỀ

EK ( Kermit Nhúng, E-Kermit) là một ứng dụng của giao thức chuyển đổi tập tin Kermit, viết bằng ngôn ngữ ANSI C và dùng để nhúng vào các thiết bị hoặc phần lõi. Mục đích là dùng trong các ứng dụng thời gian thực hoặc xây dựng cơ sở dữ liệu DLL hoặc các thư viện. EKSW là một phiên bản mới của E-Kermit có hỗ trợ giao thức cửa sổ trượt thực. EK và EKSW nên được tổng hợp lại thành một cơ sở code, nhưng hiện tại điều này chưa xảy ra.

E-Kermit có khả năng gì

EK chỉ có hai chức năng: gửi và nhận tập tin. Giao thức này gọn nhẹ và hoàn toàn chạy lại được. Trên SPARC (RISC), kermit.o nặng tầm 25K. Trên Intel (CISC) nó tầm 15K. Bằng cách giảm các kích cỡ đệm và loại bỏ tính năng thừa và phụ, ta có thể đạt được kích cỡ nhỏ hơn.

E-Kermit KHÔNG có khả năng gì

EK không bao gồm các tính năng máy chủ/máy khách; một ngôn ngữ lập trình hoặc điều khiển; chuyển đổi các bộ ký tự; mã hóa vận chuyển; hoặc bất kỳ phương thức giao tiếp hoặc quy trình nhập/xuất tập tin nào. Nó không liên kết với modem cũng như tạo kết nối. Nó không có sẵn các ngăn xếp TCP/IP hoặc giao diện dẫn đến ngăn xếp ngoại. Nếu bạn cần những tính năng này, bạn nên sử dụng chương trình đầy đủ của Kermit ví dụ như  C-Kermit hoặc Kermit 95.

Bản thân EK không phải là một ứng dụng, mà nó chỉ là một quy trình phụ của phần mềm chính. Nó chỉ thực sự hữu dụng với các kỹ sư phần mềm, và họ phải chuẩn bị phần mềm chính hoặc môi trường gọi biến cũng như các tập tin và quy trình giao tiếp nhập/xuất. Môi trường gọi biến cũng phải tạo ra và điều chỉnh kết nối giao tiếp nếu chưa có và nếu cần. Môi trường gọi biến mẫu và hỗ trợ nhập/xuất sẽ được cung cấp trong phiên bản Unix.

Khách hàng của chúng tôi đã tinh chỉnh EK cho thích ứng với nhiều môi trường và nền tảng, bao gồm Palm Pilot, nhiều loại thiết bị cho kỹ thuật viên (ví dụ như thiết bị chẩn đoán lỗi và bảo dưỡng tháp điện thoại), và đôi khi họ cũng cung cấp bản tinh chỉnh của họ hoặc quy trình nhập/xuất của họ. Chúng tôi có thể chia sẻ những phiên bản này, nhưng hoàn toàn ở dạng nguyên mẫu. Chúng tôi không thể hỗ trợ hoặc duy trì các dòng lệnh viết bởi người dùng; do vậy(ví dụ) nếu một phiên bản mới của EK được phát hành, các module do người dùng cung cấp có thể sẽ không được cập nhật. Các dòng lệnh được người dùng phát triển bao gồm:

  • Chuyển đổi hệ cho Microsoft Windows 9x/ME/NT/2000/XP/Vista/7 và nhập/xuất tập tin EK 1.3 trở về sau.
  • Wind River VxWorks cho EK 1.1.
  • EK 1.2 dịch sang ngôn ngữ Java.

EK bao gồm các tính năng sau trong Giao thức Kermit:

  • Gói tin dài
  • Cửa sổ trượt với khả năng hồi phục lỗi Go-back-to-N (tính năng lặp lại có chọn lọc ở trong EKSW).
  • Nén số lần lặp lại
  • Gán và bỏ gán tiền tố cho ký  tự điều khiển
  • Gán tiền tố cho bit thứ 8 (để chuyển dữ liệu 8 bit qua đường dẫn 7 bit) (= parity)
  • Gói tin thông số (loại, kích cỡ, và ngày)
  • Gửi và nhận nhiều hoặc một tập tin.
  • Chuyển đổi tự động giữa chế độ nhị phân và chế độ chữ theo từng tập tin.
  • Cả ba loại kiểm tra khối (checksum 6 bit và 12 bit, CRC 16 bit).
  • Báo cáo tình hình (hiện trạng giao thức, tên tập tin, kích cỡ, mốt thời gian, số byte đến hiện tại).
  • Hủy giao dịch, có thể được kích bởi bất kỳ bên nào.

Những tính năng thuộc Giao thức Kermit sau không được đưa vào:

  • Cửa sổ trượt với tính năng tái truyền có chọn lọc (trừ trong EKSW)
  • Bộ ký tự
  • Thay đổi khóa
  • Máy khách/máy chủ

Hết thời hạn kết nối là trách nhiệm của chương trình Kermit ở mấy bên kia hoặc, nếu bản thân E-Kermit cần, quy trình đọc gói tin phụ thuộc vào nền tảng mà bạn viết nên.

Từ phiên bản 1.5 về sau, E-Kermit bao gồm các cấu trúc tiền xử lý để giúp bạn loại bỏ các tính năng như gói thông tin dài, cửa sổ trượt, cửa sổ, và kiểm tra khối ở mức độ cao nhằm mục đích sử dụng càng ít bộ nhớ càng tốt, và cấu trúc này cũng có thể được sử dụng trong cấu hình Chỉ-nhận.

PHẦN MỀM ĐIỀU KHIỂN

EK được thiết kế để dùng trong một môi trường hợp tác đa nhiệm, nhưng nó không cần một môi trường như vậy. Chương trình điều khiển sẽ quản lý việc xếp lịch. Dưới đây là những gì phần mềm điều khiển phải (và/hoặc có thể) làm:

  • Nếu muốn, mở thiết bị giao tiếp, nếu có.
  • Nếu muốn, đưa thiết bị giao tiếp, nếu có, vào “chế độ gói dữ liệu”.
  • Kích hoạt cấu trúc Kermit với thông số hoạt động mong muốn.
  • Gọi hàm kermit(K_INIT, …) để Kermit tự kích hoạt.
  • Nếu đang gửi tập tin, gọi kermit(K_SEND) để bắt đầu chuyển giao.

(Khi E-Kermit được dùng để nhận tập tin, nó sẽ đợi gói dữ liệu đầu tiên từ người gửi tập tin; vậy nên nó sẽ đơn giản là gia nhập vòng lặp gói dữ liệu.) Trong vòng lặp gói dữ liệu, E-Kermit sẽ:

  • Tạo phần đệm và đọc dữ liệu đến trong đó.
  • Kiểm tra xem có bị người dùng gián đoạn.
  • Gọi lệnh kermit(K_RUN, …) để làm những bước tiếp.
  • Làm bất kỳ điều gì nó muốn  (ví dụ như chạy lệnh khác).
  • Thoát hoặc tiếp tục vòng lặp tùy theo lệnh trở về kermit().

Mỗi khi phần mềm điều khiển gọi hàm kermit(), nó sẽ được ủy quyền để giải quyết một gói dữ liệu; vậy nên một gói dữ liệu = một lát cắt thời gian. Nếu phần mềm điều khiển không còn gì để làm, nó sẽ xử lý các gói dữ liệu liên tục như một phần mềm Kermit bình thường. Khi đang ở trong vòng lặp chuyển giao dữ liệu, mọi lệnh gọi kermit() sẽ đưa ra cấu trúc bao gồm:

  • Hiện trạng của giao thức
  • Tên hiện tại của tập tin;
  • Kích cỡ tập tin nếu biết được, hoặc -1;
  • Mốc thời gian của tập tin, nếu biết;
  • Số byte đã chuyển đến hiện tại.

Khi đã xong, phần mềm điều khiển sẽ:

  • Khôi phục và đóng (nếu muốn) thiết bị liên lạc.

Những hàm mà phần mềm điều khiển có thể gọi bằng lệnh kermit() bao gồm:

K_INIT   — Kích hoạt kiến trúc dữ liệu.

K_SEND   — (Chỉ dùng khi gửi) — Kích hoạt gửi dữ liệu.

K_RUN    — Chạy giao thức.

K_STATUS — Trả lại bảng thông báo tình hình ở cấu trúc k_response.

K_QUIT   — Thoát ngay lập tức.

K_ERROR  — Gửi gói dữ liệu Error xong thoát.

Lệnh trả về của hàm kermit() gồm:

X_OK     — OK, giao thức đã kích hoạt.

X_DONE   — OK, giao thức hoàn thành.

X_ERROR  — Lỗi nghiêm trọng.

X_STATUS — Trích xuất hiện trạng nhằm trả lời cho K_STATUS.

(Thật ra hiện trạng được trích xuất trong mỗi cuộc gọi) Mã hiện trạng của giao thức bao gồm:

-1       — Lỗi nghiêm trọng

 0       — Người nhận (giao thức không hoạt động)

 1       — Người nhận đang đợi gói dữ liệu S

 2       — Người nhận đang đợi gói dữ liệu F hoặc B

 3       — Người nhận đang đợi gói dữ liệu A hoặc D

 4       — Người nhận đang đợi gói dữ liệu D hoặc Z

10       — Người gửi (giao thức không hoạt động)

11       — Người gửi gửi gói S (bắt đầu)

12       — Người gửi gửi gói F (tên tập tin)

13       — Người gửi gửi gói A (giá trị)

14       — Người gửi gửi gói D (dữ liệu)

15       — Người gửi gửi gói Z (EOF)

16       — Người gửi gửi gói B (EOT)

CHUYỂN TẬP TIN

Vì EK được thiết kế chủ yếu cho phần mềm nhúng, nó không dùng chức năng chạy trực tiếp dữ liệu hoặc (trừ trường hợp EKSW) cửa sổ trượt thực (dẫu vậy, đa phần các dòng lệnh của tính năng cửa sổ trượt vẫn còn). Đây là lý do vì sao:

  • Sử dụng giao thức thông thường  ACK/NAK sẽ giúp phần mềm điều khiển nắm quyền lại sau mỗi gói dữ liệu. Điều này giúp nó đảm nhận đa nhiệm vụ, hiển thị quá trình chuyển đổi tập tin, hoặc bất kỳ điều gì. Chạy trực tiếp hoặc sử dụng cửa sổ trượt sẽ khiến phần mềm điều khiển không sử dụng được trong một quãng dài.
  • Chạy trực tiếp dữ liệu hoặc sử dụng cửa sổ trượt sẽ khiến giao diện giữa phần mềm điều khiển và module kermit() trở nên phức tạp hơn nhiều. Thực tế là điều này sẽ khiến các chi tiết của giao thức bị đẩy vào không gian của phần mềm điều khiển, nơi chúng không thuộc về.
  • Chạy trực tiếp dữ liệu thường cần đến kết nối vững vàng (ví dụ như TCP/IP) nhưng các thiết bị với giao tiếp nhúng thường dùng cổng nối tiếp.

Việc EK thiếu tính năng cửa sổ trượt thực được bù đắp bằng việc khiến EK giả vờ hỗ trợ chúng mà không thực sự làm vậy. Điều này giúp cho các bên gửi “phát trực tiếp” gói dữ liệu thay vì đợi ACKs sau mỗi gói, miễn là không có lỗi xảy ra. Nếu có lỗi xảy ra, chiến thuật phục hồi sẽ là “quay lại n” (hoặc “error out” trong một số trường hợp) thay vì “lặp lại có chọn lọc”. EKSW, một phần mềm tách biệt không tích hợp kèm EK (nhưng nên vậy), có hỗ trợ cửa sổ trượt thực với lặp lại có chọn lọc; nghĩa là chỉ những gói dữ liệu cần thì mới được gửi lại.

Nói tóm lại là vì EK được thiết kế đa phần cho phần mềm nhúng nên chậm trễ trong các vòng gửi-nhận tập tin sẽ không là một nhân tố đáng kể; kết nói thường chỉ ở mức cục bộ, nhanh, ngắn, và nếu được điều hành hiệu quả, không có lỗi. Khi điều hành không hiệu quả, tốc độ và/hoặc kích thước gói dữ liệu và/hoặc kích cỡ cửa sổ có thể được tinh chỉnh lại theo giá trị nhất định dể tối ưu hóa hiệu quả và giảm thiểu mất dữ liệu.

MÃ NGUỒN

Các tập tin nguồn bao gòm:

platform.h

Tập header cho các định nghĩa dành riêng cho các nên tảng khác nhau (nếu cần). Dù có rỗng thì đây là tập tin thiết yếu, vì kermit.c bao gồm nó.

kermit.h

Tệp header cho các module. Chứa định nghĩa của cấu trúc k_data và k_response.

kermit.c

Đây là engine chính của giao thức Kermit. Động lực duy nhất của nó là các dữ liệu nó chứa. Tất cả thông tin trạng thái sẽ được lưu ở cấu trúc dữ liệu Kermit. Các thông tin trạng thái này sẽ được truyền theo tham chiếu từ module chính đến các tính năng khác trong module kermit, rồi về lại module này. Vậy nên một module có thể chuyển nhiều tập tin cùng một lúc trên nhiều hệ kết nói khác. Ngoài ra, không có thư viện tham chiếu nào trên module của Kermit, kể cả stdio (trừ khi đang mở chế độ sửa lỗi), và không có tập tin header /usr/include/* đi kèm. Luật lệ dành riêng cho kermit.c:

  • Không biến toàn cục (trừ khi sửa lỗi) hoặc bộ đệm.
  • Không kích hoạt mảng bằng trình biên dịch.
  • Để an toàn, không kích hoạt biến vô hướng.
  • Không gọi thư viện hoặc hệ thống, không dùng hàm #include <…>.
  • Mọi giao tiếp nhập/xuất sẽ được thực hiện bằng các hàm được định dạng ở module tách biệt.

Điểm bắt đầu duy nhất của module kermit.c là hàm kermit():

int kermit(struct k_data * k, struct k_response * r)

Cấu trúc k chứa tất cả những thông số vận hành, biến, thông tin thể trạng, và bộ đệm; cấu trúc r sẽ giúp người gọi biết hiện trạng của giao thức, tên và thông tin tập tin, và tiến độ chuyển giao (byte đã chuyển).

main.c

Phần mềm điều khiển mẫu. Trong môi trường thử Unix, nó chỉ là hàm truyền thống main(), dùng để đọc các điều kiện trong dòng lệnh điều khiển, kích hoạt giao thức, rồi gọi module của giao thức theo vòng lặp phụ thuộc vào hiện trạng, rồi dọn dẹp lại. Trong môi trường nhúng, các tính năng này sẽ được tích hợp trong phần mềm điều khiển.

unixio.c

Các hàm nhập/xuất của Unix. Thay bằng module của bạn mà có tích hợp các hàm này vào môi trường mong muốn và thay đổi quá trình xây dựng của bạn để liên kết với nó. Khởi điểm và quy ước gọi tên sẽ được mô tả ở dưới.

PHIÊN BẢN UNIX

EK được phát triển trên nền tảng Unix thông thường, ví dụ như Mac OS, AIX, Solaris, HP-UX, … hoặc, dạo gần đây, một biến thể của BSD và Linux. Trên các nền tảng này thì EK được cấu tạo như một phần mềm chuyển tập tin từ xa, tương tự như G Kermit, và đã được kiểm nghiệm so sánh với Kermit trên máy bàn như K95 hoặc C-Kermit. LƯU Ý: Phiên bản Unix vẫn hoạt động với stdin/stdout; các “hàng” được cấu tạo theo hướng khó sử dụng nhất có thể (system(“stty …”)). Điều này dẫn đến kết quả khá khác biệt; ví dụ: tải tập tin bằng EK trên hệ Solaris có thể chỉ đạt tốc độ 17Kcps, trong khi đó dùng cùng mạng cùng máy nhưng trên hệ Linux có thể đạt 1700Kcps. Điều này không đáng lo lắm vì vốn EK không được dùng cho mục đích sản xuất trên hệ Unix, vốn đã có G-Kermit và C-Kermit cho mục đích này.

Makefile của Unix bao gồm những mục tiêu sau (it’s easy to add more):

gcc:   Cấu tạo với gcc (mặc định).

cc:    Cấu tạo với cc.

hp:    Cấu tạo với HP-UX.

gccnd: Cấu tạo với gcc, không sửa lỗi.

gprof: Cấu tạo với gcc, bao gồm liệt kê tính chất.

clean: Loại bỏ đối tượng và tập tin chủ đạo.

Makefile này sẽ tạo nên một tệp thực thi trên Unix tên là “ek” (kermit nhúng). Quy trình mẫu main() sau cung cấp bảng hiển thị lệnh điều khiển đơn giản:

$ ./ek -h

Usage: ./ek options [cách dùng]

Options: [Lựa chọn]

 -r           Receive files [Nhận tập tin]

 -s files     Send files [Gửi tập tin]

 -p [neoms]   Parity: none, even, odd, mark, space [Số chẵn hoặc lẻ]

 -b [123]     Block check type: 1, 2, or 3 (default = 3) [Loại test kiểm tra khối]

 -k           Keep incompletely received files [Giữ tập tin chưa nhận đủ]

 -B           Force binary mode [Ép vào chế độ nhị phân]

 -T           Force text mode [Ép vào chế độ chữ]

 -R           Remote mode (vs local) [Chế độ điều khiển từ xa]

 -L           Local mode (vs remote) [Chế độ điều khiển cục bộ]

 -E number    Simulated error rate (0-100) [Tỉ số lỗi giả lập]

 -d           Create debug.log [Tạo tập tin debug.log]

 -h           Help (this message) [Hỗ trợ]

$

Khi gửi tập tin, nếu bạn không định dạng cụ thể là nhị phân hay chữ, EK sẽ quét từng tập tin và dùng dạng chữ hoặc nhị phân theo nội dung từng tập.

Chế độ điều khiển từ xa và chế độ cục bộ chỉ được dùng để kích hoạt khả năng ngăn quy trình chuyển tập tin bằng bàn phím.

THAY ĐỔI THÍCH ỨNG VỚI MỘT NỀN TẢNG KHÁC

Phiên bản 1.0 của EK đã được thay đổi thích ứng với VxWorks bởi Airvana, Inc, Chelmsford MA. Gói chương trình VxWorks EK 1.1 toàn diện đã được đính kèm theo đây để làm ví dụ cho một chương trình sản xuất, với sự cho phép của Airvana (lưu ý rằng API của EK đã thay đổi kể từ lúc viết bài, nên trước khi bạn dùng mã VxWorks, bạn phải cập nhật nó). Để thay đổi thích ứng với một nền tảng khác:

  • Tạo một makefile mới cho nền tảng đích, hoặc viết nên quy trình cấu tạo của riêng bạn.
  • Tạo một tập tin platform.h cho nền tảng của bạn. Tập tin này có thể bao gồm các định nghĩa cần thiết, và nó cũng có thể chép đè lên một số định nghĩa gốc ở trong kermit.h:
    #define NODEBUG để xây dựng phần mềm không chứa lệnh sửa lỗi.
    #define HAVE_UCHAR nếu UCHAR đã được định nghĩa hoặc typedef’d các dữ liệu char không dấu.
    #define HAVE_ULONG nếu ULONG đã được định nghĩa hoặc typedef’d các dữ liệu long không dấu.
    #define IBUFLEN để định ra kích cỡ mong muốn của bộ đệm tập tin vào.
    #define OBUFLEN để định ra kích cỡ mong muốn của bộ đệm tập tin ra.
    #define FN_MAX để định ra số ký tự tối đa của tên tập tin.
    #define P_PKTLEN để chép đè lên kích thước tối đa của gói dữ liệu.
    #define P_WSLOTS để chép đè lên số chỗ tối đa trong cửa sổ.
  • Thay tập tin mẫu main.c bằng phần mềm điều khiển của riêng bạn. Dùng cùng tập tin header và quy ước gọi như trong mẫu.
  • Sao chép unixio.c đến xxxio.c (tự đặt tên theo ý bạn), tinh chỉnh lại tập tin để nó tương thích với nền tảng mới, và thay đổi lại quy trình cấu tạo để nó liên kết với module xxxio thay vì unixio. Lưu ý rằng bộ đệm dành cho tập tin vào và tập tin ra (i_buf[] and o_buf[]) phải được định dạng trong quy trình xxxio.

Dưới đây là một số mẹo khi bạn tạo một module nhập/xuất:

Thiết bị thực hiện nhập/xuất sẽ được giao vai trò tự đảm nhiệm các thông số liên lạc, bao gồm tốc độ dẫn truyền thông tin, tính chẵn-lẻ, và điều hành quy trình. Đặc biệt, Kermit sẽ không đảm nhiệm tính chẵn lẻ, nhưng vẫn phải biết về nó. Bạn có thể làm điều này trong bước cài đặt thông qua main(). Quy trình readpkt() nên loại bỏ tính chẵn lẻ và tx_data() nên loại thêm nó vào nếu cần. Trên nền mạng nối tiếp, có thể lập trình để UART đảm nhiệm việc này.

Thay đổi trong API giữa EK 1.1 và  1.2: Quy ước gọi tên (danh sách đối số trong hàm và giá trị cho ra) đã được thay đổi giữa hai phiên bản 1.1 và 1.2, chủ yếu để tất cả các quy trình đều tiếp cận được cấu trúc K một cách nhất quán, cũng như là để người gọi nhận được phản hồi tốt hơn. Trong trường hợp đã có thay đổi giữa các phiên bản, cả định dạng cũ lẫn mới sẽ được hiển thị.

Các hàm nhập/xuất của thiết bị bao gồm:

int

devopen(char * device)

Mở thiết bị giao tiếp đã chọn. Có thể cũng là chủ của mạng lưới. Trả kết quả 0 nếu thất bại, 1 nếu thành công.

int

devsettings(char * settings)

Lệnh này sẽ điều khiển các thông số kỹ thuật cần thiết của thiết bị, ví dụ như tốc độ và quy trình chạy của một thiết bị nối. Vì không có cách nào để biết chính xác các thông số liên quan là gì, quy trình này sẽ lấy một chuỗi ở bất kỳ định dạng nào, ví dụ “9600;8N1” hoặc “speed=57600;flow=rts/cts”; quy trình devsettings sẽ phân tích các thông số đó. Trả số 0 nếu thất bại, 1 nếu thành công.

int

devrestore(void)

Nếu muốn, trả thiết bị về nguyên dạng lúc devsettings() kích hoạt, ví dụ như trước lúc đóng nó.

int

devclose(void)

Đóng thiết bị liên lạc.

int

readpkt(UCHAR * buffer, struct k_data * k) (1.1)

readpkt(struct k_data * k, UCHAR * buffer, int length) (1.2)

Quy trình này phải làm đúng chính xác những gì quy trình mẫu làm: tìm khởi nguồn của gói dữ liệu, sau đó sao chép tất cả ký tự cho đến (nhưng không bao gồm) đuôi của gói vào bộ đệm dữ liệu, với địa chỉ đã cho trước. Bạn cần phải viết lệnh này càng hiệu quả càng tốt, và dùng bất kỳ mánh nào bạn biết như: đọc đệm không chặn, v.v. Nếu bạn muốn chương trình Kermit của bạn phải chờ đợi phản hồi, đây là chỗ để gắn dòng lệnh đó. LƯU Ý: Không cần thiết phải gián đoạn để chờ đợi phản hồi, vì khả năng đối tác Kermit của EK không thể chờ đợi phản hồi là 0%. Định dạng EK 1.2 đặt k làm đối số đầu để nhất quán với các quy trình khác, và định dạng này cũng đã thêm đối số cho kích thước bộ đệm.

Lưu ý cho tính năng F_CTRLC. Tính năng này mặc định sẽ được bật. Nó cho phép EK bức phá ra khỏi chế độ gói dữ liệu bằng cách gửi cho nó ba lệnh Ctrl-C liên tiếp vào dòng dữ liệu. Thông thường thì bạn không cần phải tắt tính năng này, vì dù người gửi đang “bỏ gán tiền tố” Ctrl-C, ba lệnh liên tục thường sẽ được gom thành một chuỗi đếm lặp.

int

tx_data(UCHAR * data, int length, short parity) (1.1)

tx_data(struct k_data * k, UCHAR * data, int length) (1.2)

Ở đây bạn lại phải giải quyết vấn đề chẵn lẻ (nếu nó chưa được giải quyết tự động bằng phương tiện liên lạc hoặc trình điều khiển thiết bị). Quy trình này cần phải hiệu quả và chắc chắn. Nó được dùng để truyền tải toàn bộ chuỗi dữ liệu, hoặc không sẽ thất bại. Tham khảo mẫu unixio.c để biết thêm chi tiết về độ chắc chắn. Ở EK phiên bản 1.2 trở về sau, tính chẵn lẻ được xác định từ cấu trúc k .

Các hàm nhập/xuất của tập tin bao gồm; dĩ nhiên là chúng có thể được dùng để đọc bất kỳ thức gì — không chỉ là tập tin: bộ nhớ, băng, các loại thẻ, tia laser, bộ điều khiển thiết bị, bất kỳ thứ gì. Bạn gọi những quy trình này là gì không quan trọng, nhưng danh sách đối số và loại kết quả trả lại phải đúng như mẫu; ngoài ra, nếu bạn đặt tên khác cho chúng, bạn cần phải đổi mẫu đầu tiên trong kermit.h:

int

openfile(UCHAR * filename, int mode, struct k_date * k) (1.1)

openfile(struct k_date * k, UCHAR * filename, int mode) (1.2)

Mở tập tin đã đặt tên trong chế độ đã định  (1 = đọc, 2 = chép, 3 = gọi tên). Trả lại kết quả X_OK khi thành công, X_ERROR khi thất bại.

ULONG

fileinfo(UCHAR * filename, UCHAR * buf, int buflen, short * type, short mode) (1.1)

fileinfo(struct k_data * k,UCHAR * filename,UCHAR * buf,int buflen,short * type,short mode) (1.2)

Lấy thông tin về một tập tin cục bộ cụ thể: kích cỡ, ngày tháng, và , nếu mode == 0, loại tập tin (chữ hoặc nhị phân). buf và buflen áp dụng cho chuỗi ngày/tháng của tập tin. Trả kết quả X_OK hoặc X_ERROR.

int

readfile(struct k_data *)

Đọc một phần đệm từ tập tin vào và, nếu quy trình chuyển giao đang ở chế độ chữ, chuyển định dạng ghi chép sang Kermit Stream CRLF tiêu chuẩn. Trả lại kết quả X_OK hoặc X_ERROR.

int

writefile(struct k_data *, CHAR * buffer, int length)

Viết một phần đệm cho tập tin ra, và nếu quy trình chuyển giao ở chế độ chữ, chuyển định dạng ghi chép tiêu chuẩn Kermit Stream CRLF sang định dạng yêu cầu cục bộ. Trả lại kết quả X_OK hoặc X_ERROR.

int

closefile(struct k_data *, UCHAR code, int mode)

Đóng tập tin. Với tập tin xuất, dĩ nhiên là lệnh này sẽ hủy bỏ mọi dữ liệu đệm còn chờ trong tập tin trước khi đóng; sau đó nó sẽ kiểm tra xem máy Kermit gửi có hủy chuyển giao tập tin trước khi nó hoàn thành không (mã == ‘D’). Trong trường hợp này nó sẽ xóa tập tin khuyết thay vì giữ nó. Phần chế độ sẽ xác định đây là tập tin nhận hay tập tin xuất, nên các tập tin khuyết có thể được xóa nếu muốn. Trả lại kết quả X_OK hoặc X_ERROR.

Quy ước gọi tên chính xác sẽ được hiển thị trong tập tin unixio.c.

SỬA LỖI

Nếu EK được thiết kế mà NODEBUG không được định dạng, thì bạn có thể thêm lựa chọn -d vào dòng lệnh điều khiển. Bản mẫu dựa trên hệ Unix của EK sẽ tạo tập tin debug.log tại thư mục hiện tại của nó. Trong phiên bản sản xuất, bạn có thể thêm dòng -DNODEBUG vào trình biên dịch C CFLAGS để hủy bỏ chế độ sửa lỗi. Các kích cỡ trên đã bao gồm chế độ sửa lỗi. Bạn có thể xây dựng chế độ sửa lỗi tùy theo  ý bạn muốn trong các module nhập/xuất phụ thuộc vào nền tảng.

LỊCH SỬ PHÁT HÀNH

Phiên bảnNgày thángMô tả
1.12002/10/07   Phiên bản phát hành đầu tiên. Phiên bả VxWorks vẫn ở mức độ này.
1.22003/01/28Phát triển API, bản thích ứng Java (vẫn ở mức độ này).
1.32004/03/04Sửa lỗi chuyển giao tập tin với HyperTerminal.
1.42004/03/20Sửa lỗi nhận tập tin rỗng.
1.52004/04/10Sửa lỗi với các gói dữ liệu A, cho phép các cấu hình siêu nhỏ hoặc/và chỉ-nhận.
1.512004/09/23Thích ứng với Philips XAG30 (John Dunlap)
EKSW 0.942010/06/24Cửa sổ trượt thực với chế độ truyền lại có chọn lọc (John Dunlap)
1.62011/03/30Phát hành dưới giấy phép 3-Clause Revised BSD License.
1.72011/06/06Giao thức FORCE-3, làm việc chung với C-Kermit 9.0 (giải thích ở đây)
1.82021/06/26Sửa lỗi với đối số -B và -T tại dòng điều khiển (chỉ trên bản dùng thử Unix)

TẢI VỀ

Có nhiều phiên bản ứng dụng E-Kermit khác nhau để bạn tải về. Bản thân E-Kermit phiên bản 1.8 là bản chính. Phiên bản 1.7 vẫn còn tải được. Những bản khác là phiên bản thích ứng cho các nền tảng hoặc ngôn ngữ khác trươc khi E-Kermit được phát hành, như đã đề cập ở các mục trước; nói cách khác, những bản vá lỗi trong E-Kermit 1.3, 1.4, and 1.5 sẽ không tòn tại trong bản VxWorks hoặc Java, và phiên bản VxWorks dùng API E-Kermit 1.1 thay vì API tốt hơn ở bản 1.2. EKSW có chỉnh sửa đôi chút API và một số điểm thiếu nhất quán mà bạn phải gỡ ra trước khi nó được tích hợp vào EK 1.6, nhưng nó hoàn toàn có thể chạy độc lập. Thật ra, đây là phiên bản chạy thế hệ mới của Apex-EM ocean floats và đã được kiểm định ở nhiều điều kiện bất lợi hơn có thể nói là bất kỳ phiên bản ứng dụng khác của giao thức Kermit. Phiên bản này đã hỗ trợ xây dựng nên phiên bản 1.7, với giao thức kiểm lỗi từng gói dữ liệu mới Force-3. (Trong tương lai, EKSW nên có thêm tính năng này.)

Original article: https://www.kermitproject.org/ek.html

Tạo hoạt ảnh cho web…

Original author: Alan Zisman

Original article: http://www.zisman.ca/Animate/

(bằng phần mềm miễn phí!)

Những hoạt ảnh cầu kỳ bạn thấy trên các trang web thường được tạo bởi các chương trình phức tạp và khó làm quen như Macromedia Flash. Những hoạt ảnh nhỏ hơn và đơn giản hơn, được gọi là hoạt ảnh GIF, cũng có thể làm các trang web thêm sinh động, và bạn có thể tạo ra chúng bằng các phần mềm đơn giản.

Đây là ví dụ của một hoạt ảnh GIF, lấy từ một trang web tuyên truyền chống hút thuốc: Cigarette.com

Hoạt ảnh GIF là một loạt ảnh tĩnh với đủ 256 màu và cùng kích cỡ, được lưu ở định dạng GIF. Phần mềm tạo hoạt ảnh GIF sẽ cho bạn khả năng sắp xếp thứ tự các khung hình, hẹn giờ, và tinh chỉnh xem các ảnh sẽ lặp lại hay chỉ chạy một lần.

Có rất nhiều phần mềm miễn phí cũng như có phí giúp bạn tạo các hoạt ảnh GIF… Chúng ta sẽ dùng phần mềm nhỏ, tiện lợi, và đơn giản: UnFREEz. Nếu bạn chưa cài sẵn phần mềm thì có thể nhấn vào tên trên để tải về (Bạn phải cài phần mềm giải nén để mở chương trình này– Không cần cài; chỉ cần nhấp đôi vào tập tin đã giải nén để chạy… lưu ý rằng UnFREEz và cả bài hướng dẫn này dành cho người dùng hệ điều hành Windows. Người dùng hệ Mac có thể xem qua các chương trình như: GifBuilder (GifBuilder Carbon for OS X) hoặc HVS Animator ).

Khi UnFREEz khởi động, chương trình sẽ trông như sau:

Để tạo hoạt ảnh, bạn cần phải tạo một loạt ảnh tĩnh bằng các chương trình vẽ như Microsoft Paint (chương trình sẽ mở và lưu lại ảnh ở định dạng GIF nếu bạn có cái Microsoft Office), hoặc các chương trình chuyên dụng hơn như Photoshop. Ngoài ra, bạn có thể dùng KidPix hoặc Microsoft Paint để lưu một loạt tập tin ảnh ở định dạng Windows Bitmap (BMP) hoặc khác, rồi dùng chương trình chuyển ảnh miễn phí như  Irfanview để chuyển đổi chúng sang định dạng GIF.

Khi bạn đã có ảnh tĩnh, tìm những tập tin này trong My Computer hoặc Explorer, rồi sau đó kéo biểu tượng của chúng theo thứ tự bạn muốn chúng xuất hiện vào cửa sổ khung ảnh của UnFREEz. Khi đã xong, nhấn nút Make Animated GIF và điền tên cùng địa điểm lưu hoạt ảnh. (Mẹo: Nếu bạn muốn dùng hoạt ảnh trên web thì đừng dùng khoảng cách khi lưu tên ảnh)

Bạn cũng có thể thử nghiệm với tùy chọn Frame Delay để ảnh tĩnh chạy nhanh hơn hoặc chậm hơn – Chậm hơn thì hoạt ảnh sẽ cứng, còn nhanh quá sẽ khó nhìn!

Xem hoạt ảnh của bạn

Có thể bạn đã nhận ra là chương trình UnFREEz thiếu tính cho phép bạn xem hoạt ảnh sẽ trông ra sao. Bạn sẽ phải xem ảnh bằng chương trình khác. Chương trình miễn phí và đa dụng Irfanview là một lựa chọn tốt.

Tạo ảnh tĩnh bằng Paint

Đầu tiên, bạn cần đảm bảo rằng phiên bản Paint của bạn có khả năng đọc và lưu tập tin ở định dạng GIF. (Nếu không thì bạn vẫn có thể dùng nó để tạo ảnh tĩnh, và dùng Irfanview để chuyển đổi từ định dạng BMP thành GIF). Mở Windows Paint (bạn sẽ thấy biểu tượng ở menu Start Menu/Programs/Accessories)… đi đến menu File/Open và nhấn vào danh sách Files of Type… để xem bạn có lựa chọn này không:

Nếu có, bạn có thể tiếp tục mà không cần chuyển đổi gì thêm. Nếu không, cứ làm tiếp, nhưng hãy nhớ rằng bạn sẽ phải chuyển đổi ảnh tĩnh sang định dạng GIF (dùng Irfanview hoặc các chương trình khác) trước khi bạn có thể dùng chúng với các phần mềm hoạt ảnh GIF.

Trước khi vẽ, bạn nên chọn kích cỡ hoạt ảnh. Quy tắc chung là cáng nhỏ càng tốt. Hoạt ảnh nhỏ sẽ chạy nhanh hơn trên mạng Internet. Trong Paint, nhấn vào menu Image/Attributes. Bạn sẽ thấy:

Chỉnh đơn vị thành Pixels (các dấu chấm trên màn hình)… Để bạn dễ hình dung hơn, hình ảnh này có kích cỡ 200 x 200 pixels (và nó khá lớn so với một hoạt ảnh GIF):

Sau khi đã chọn kích cỡ ảnh, bạn có thể bắt đầu tạo ảnh tĩnh đầu tiên. Nếu được thì bạn nên lưu ở định dạng GIF. Tôi khuyên bạn nên lưu kèm số thứ tự để dễ biết được đây là khung ảnh nào, ví dụ như Frame1.gif.

Dưới đây là một lựa chọn khá tốt– một khi bạn đã lưu ảnh tĩnh ở định dạng GIF, nếu bạn quay về menu Image/Attributes, bạn sẽ thấy là lựa chọn Transparancy, vốn không hoạt động như hình trên, giờ đã sẵn sàng… Chọn mục [  ] Use Transparent Background Color sẽ cho phép bạn lựa ra một màu– tất cả mọi yếu tố có màu đó sẽ chuyển thành trong suốt khi hoạt ảnh chạy– Đây là một tính năng hay vì nó giúp bạn đăng hoạt ảnh lên mọi trang web với mọi màu nền, và hoạt ảnh sẽ không có những ô vuông màu. Bạn có thể để ý cách dùng ở hoạt ảnh đầu lâu đầu trang.

Sau khi lưu Frame1, chọn File/New để tiếp tục với các ảnh tĩnh tiếp theo. Mục Image/Attributes sẽ giữ nguyên hiện trạng, nhưng bạn phải chọn lại màu trong suốt cho mỗi ảnh. Dĩ nhiên là tất cả mọi ảnh tĩnh phải cùng kích cỡ. Cố gắng có ít nhất 12 ảnh tĩnh để hoạt ảnh mượt nhất có thể.

Lưu ý khi lưu ảnh ở định dạng GIF:

Định dạng GIF chỉ có 256 màu. Vì vậy, nếu bạn dùng ảnh chụp làm một phần ảnh (bất kể ảnh động hoặc tĩnh), khi bạn lưu ảnh ở định dạng GIF, chất lượng ảnh sẽ không còn sinh động bằng. Hãy nhìn vào bức ảnh đầu lâu ở đầu trang– thoạt nhìn thì trông tốt, nhưng nếu nhìn kỹ thì sẽ thấy số màu bị giảm đi.

(Bạn có thể dán ảnh lên các khung ảnh, rồi sau đó vẽ đè lên chúng như trong hoạt ảnh đầu lâu trên).

Kết luận:

Tạo từng ảnh tĩnh bằng các chương trình như Microsoft Paint sẽ rất chán nản. Nhưng nếu sử dụng các chương trình đơn giản như này, hoặc các chương trình miễn phí như UnFREEz, học sinh cùng những người không có chuyên môn sẽ tạo được hoạt ảnh hiệu quả. Chỉ cần nhớ là kích cỡ phải nhỏ! — Ngày 19 tháng 2, 2002