Phần Mềm Kế Toán CSS-ACC
(Cập nhật mới theo TT200/BTC và tương thích phần mềm HTKK của Tổng Cục Thuế)
Các tính năng :
Nhập và in phiếu thu, chi, UNC, phiếu nhập, phiếu xuất, chứng từ ghi sổ (thay cho việc viết phiếu thu chi, nhập xuất hàng ngày). Đặc biệt viết phiếu thu theo từng hoá đơn nợ của khách hàng và cho nhiều khách hàng cùng lúc. Viết phiếu chi cho nhiều hoá đơn cùng lúc. Viết phiếu thu, chi ngoại tệ với bất kỳ loại ngoại tệ nào. Sau đó tại bất kỳ thời điểm nào cũng có thể in các báo cáo sau đây hoặc kết xuất ra MS-EXCEL và MS-WORD
1/ Các báo cáo về tiền mặt, tiền gửi :
Tồn Quỹ tiền mặt, tiền gửi, Sổ Quỹ, tiền mặt tiền gửi.
Chứng Từ Ghi Sổ tiền mặt, tiền gửi, Các Nhật Ký Chứng Từ số 1 và số 2.
Sổ theo dõi ngoại tệ - kim loại quý (với bất kỳ loại ngoại tệ va kim loại quí nào).
2/ Các báo cáo về xuất nhập tồn :
Thẻ kho, Sổ Chi Tiết Vật Tư, Bảng Kê Hàng Hóa Nhập/Xuất (theo từng đối tượng khách hàng, hàng hóa nhà cung cấp), Tình Hình Tồn Kho, Xuất Nhập Tồn Kho. Xuất Nhập Tồn Kho theo nhóm, Tổng Hợp Số Phát Sinh Cho TK 152, 153, 156,...
Chi tiết phân bổ - luân chuyển bao bì, Tổng hợp phân bổ - luân chuyển bao bì. Từ tiêu thụ chuyển sang xuất kho với giá vốn.
Xác định giá vốn xuất kho cuối kỳ. Nhập tồn kho cuối kỳ xác định lại xuất kho. Quản lý khuyến mãi, in hóa đơn hàng khuyến mãi.
Tổng hợp hàng khuyến mãi. Bảng kê hóa đơn hàng nông sản. Chuyển xuất kho sang bán hàng theo giá bán.
3/ Tính giá thành (chọn thêm):
a/ Tính giá thành theo định mức : Xuất nguyên vật liệu theo định mức bán thành phẩm. Xác định giá bán thành phẩm. Xác định giá bán thành phẩm trong kỳ, quản lý xuất nhập tồn bán thành phẩm. Xác định định mức bán thành phẩm cuối cùng, tính giá thành bán thành phẩm cuối cùng. Phân bổ bao bì trong kỳ, phân bổ các chi phí khác (lương trực tiếp, quản lý phân xưởng). Xác định giá thành phẩm nhập kho. Tự động tạo giá xuất kho thành phẩm.
b/ Tính giá thành theo hệ số giá bán và số lượng sản xuất trong kỳ : Nhập tồn kho cuối kỳ, xác định giá tổng xuất dùng cho sản xuất. Xác định hệ số phân bổ trong kỳ. Phân bổ nguyên vật liệu, bao bì, lương trực tiếp, chi phí quản lý, sản phẩm dở dang đầu kỳ vào giá thành. Các báo cáo về giá thành thành phẩm nhập kho. Tự động xác định giá thành phẩm xuất kho. Báo cáo xuất nhập tồn kho có phân loại.
c/ Giá thành công trình xây dựng
4/ Các báo cáo về bán hàng và thuế :
Nhập hoá đơn bán hàng có chiết khấu, khuyến mãi, ngoại tệ. Chuyển chiết khấu bán hàng sang giảm giá hoặc ngược lại. Sổ Chi Tiết Bán Hàng theo từng đối tượng tài khoản, khách hàng, nhóm khách hàng, người quản lý. Báo Cáo Doanh Thu (có thuế). Báo Cáo Doanh Thu nhóm theo mã hàng hoá . Sổ Chi Tiết tài khoản phải thu (gồm chi tiết doanh thu và phần đã trả của khách hàng).
Thống kê chi tiết và tổng hợp hàng hoá bán theo khách hàng. Thống kê khách hàng, nhóm khách hàng theo hàng hoá. Thống kê hàng hoá bán theo khu vực. Thống kê các biến động về khách hàng.
Báo cáo hoá đơn đầu vào, Báo cáo hoá đơn đầu ra, Tờ khai thuế GTGT.
5/ Các báo cáo về nợ :
Chi Tiết Công Nợ của từng khách hàng, nhóm khách hàng (phải thu, phải trả). Cân Đối Công Nợ theo khách hàng, nhóm khách hàng và theo tài khoản (các loại tài khoản 131, 136, 138, 141, 311, 315, 331, 334, 335, 336, 338, 341, 342, 344).
Báo Cáo Số Dư Công Nợ, Chi tiết và tổng hợp nợ theo nhóm khách hàng (nhân viên tiếp thị). Chi tiết và tổng hợp nợ theo hàng hoá, theo công trình. Nhật ký chứng từ số 10. Chi tiết và tổng hợp nợ ngoại tệ.
Quản lý nợ theo hóa đơn. Quản lý mức nợ tối đa.
6/ Các báo cáo về TSCĐ :
Thẻ TSCĐ, Chứng Từ Ghi Sổ Tính Khấu Hao, Bảng Tính Khấu Hao TSCĐ.
Báo Cáo tăng, giảm TSCĐ. Tự động trích khấu hao TSCĐ sang chi phí.
7/ Các báo cáo chi tiết theo loại hình kế toán :
Nhật ký Sổ cái, Bảng Tổng Hợp Chừng Từ Gốc (Cho từng TK), Bảng Kê Chi Tiết Tài Khoản (cho từng TK chọn). Nhật Ký Chứng Từ Chung, Nhật ký mua hàng, Nhật ký bán hàng, Nhật ký thu tiền, Nhật ký chi tiền. Bảng đăng ký chứng từ ghi sổ. Các chứng từ ghi sổ số 1, 2, 3,... Nhật Ký Chứng Từ số 7, Sổ Cái Chi Tiết Tài Khoản, Sổ cái tổng hợp tài khoản.
8/ Các báo cáo tổng hợp :
Cân Đối Tài Khoản, Cân Đối Kế Toán. Kết Quả Kinh Doanh. Lưu chuyển tiền. Thuyết minh báo cáo tài chánh
9/ Danh mục hệ thống :
Quản lý danh mục tài khoản, khách hàng nhà cung cấp, nhóm khách hàng, vật tư hàng hoá, nhóm vật tư hàng hoá, vật tư hàng hoá liên kết, kho hàng, in mã vạch hàng hoá, danh mục ngoại tệ, bảng kết chuyển, ràng buộc tài khoản theo chứng từ.
Các tuỳ chọn theo đặc thù doanh nghiệp, tạo mã vật tư hàng hoá tự động, đăng ký số dư đầu kỳ. Bảo mật và phân quyền đăng nhập chương trình.
Chép số liệu vào và ra hệ thống. Kiểm soát và sửa chữa số liệu. Tạo và chuyển số dư cho năm tài chánh kế tiếp,... và các tiện ích khác.
Các tài khoản kết chuyển được cài đặt trước để kết chuyển tự động. Các báo cáo cần thiết sử dụng tiếng Anh
10/ Có thể chọn một trong bốn hình thức kế toán :
Nhật ký chung. Nhật ký chứng từ. Chứng từ ghi sổ. Nhật ký sổ cái
Quản lý thu nợ theo hoá đơn
Nút màu đỏ "Điều chỉnh nợ theo HĐ" để tập hợp tất cả các khoản nợ theo hoá đơn |
A/ Các chứng từ ghi nhận nợ theo hoá đơn:
- Các chứng từ tiêu thụ 031, có số sê-ri và số hoá đơn, tài khoản ghi nợ 131 hoặc 136.
- Các chứng từ tiêu thụ 031 ghi cho khuyến mãi (như hình trên), có số sê-ri và số hoá đơn, tài khoản ghi có 131. Lúc này tiền nợ sẽ là số âm (thêm dấu trừ ở trước số tiền).
- Các chứng từ ghi nợ dịch vụ 023, có số sê-ri và số hoá đơn, tài khoản ghi nợ 131.
- Các chứng từ trả hàng 032, có số sê-ri và số hoá đơn, tài khoản ghi có 131 hoặc 136.
- Các chứng từ cấn trừ nợ 022, 023, có số sê-ri và số hoá đơn, tài khoản ghi có 131 hoặc 136 phải có mã khách hàng bên có.
- Các chứng từ thu theo hoá đơn 011 hoặc 013, có số sê-ri và số hoá đơn, tài khoản ghi có 131 hoặc 136.
Nhấn nút ">" sẽ hiển thị các hoá đơn chưa thu |
C/ Khi thu tiền, sau khi chọn mã khác hàng cần thu, nhấn nút ">" phần mềm sẽ hiển thị tất cả các hoá đơn khách hàng này còn nợ. Nhập số tiền trả vào ô số tiền, phần mềm sẽ tự động phân bố số tiền trả theo các hoá đơn nợ ở trên. Cũng có thể nhập số tiền trả theo từng hoá đơn tại cột màu xanh lá. Nhấn nút "Dán nhiều HĐ" nếu thu một lúc nhiều hoá đơn hoặc "Dán số HĐ" nếu chỉ thu một hoá đơn.
Quản lý kho hiệu quả (Just In Time)
Nhấn F3 tạo phiếu xuất Just In Time |
Không chỉ làm công việc của kế toán, phần mểm kế toán KT-ACCsev còn giúp quản lý kho hiệu quả. Nó cho phép tạo phiếu xuất kho tự động dựa trên phiếu nhập kho, giúp kiểm soát kho tối ưu. Thực hiện theo các bước sau đây:
1/ Nhập kho với mã nhập N20 rồi lưu phiếu nhập này.
2/ Chọn phiếu nhập N20 rồi nhấn F3. Phần mềm sẽ tự động tạo phiếu xuất X20 với các mã hàng và số lượng tương tự như phiếu nhập (trừ đi phiếu xuất từ F3 trước đó nếu có). Số chứng từ phiếu xuất là số lớn nhất cộng 1 trong ngày hiện hành.
3/ Có thể sửa phiếu xuất phù hợp với thực tế xuất hàng (ít mã hàng, ít số lượng hơn phiếu nhập).
4/ Nếu chưa xuất hết theo phiếu nhập ở 1, thực hiện tiếp bước 2. Nếu đã xuất hết, phần mềm không tự động cho xuất nữa đối với phiếu nhập này.
5/ Để kiểm soát phiếu nhập nào chưa xuất hết vào "Báo Cáo Theo Mã Nhập Xuất" chọn mã kho, mã nhập: N20. Nhấn vào Bảng kê Just-In-Time. Phần mềm sẽ liệt kê những mặt hàng và số lượng của phiếu nhập chưa xuất hết.
6/ Nút "Bảng kê" sẽ liệt kê những phiếu nhập / xuất theo mã nhập / xuất. Do đó, nó cho chúng ta biết chứng từ nhập / xuất theo mã N20 / X20.
Cách thay đổi mật khẩu
Màn hình phần mềm sau khi đăng nhập với tên đăng nhập sysuser |
1/ Tại màn hình đăng nhập nhấn F3.
Sau khi nhấn F3 |
Chú ý:
- Ghi nhớ mật khẩu mới sau khi thay đổi.
- Nếu bạn nhập không đúng mật khẩu cũ, phần mềm không cho bạn thay đổi mật khẩu.
- Nếu xác nhận mật khẩu mới không giống mật khẩu mới đặt, phần mềm không cho bạn thay đổi mật khẩu.
5 điều cần biết về mạng riêng ảo VPN
VPN tạo một đường kết nối an toàn giữa máy tính của bạn và mạng Internet công cộng. |
(PCWorldVN) VPN không chỉ được sử dụng bởi doanh nghiệp mà cũng đang là lựa chọn của hầu hết người dùng cá nhân nhằm tăng tính bảo mật khi kết nối với mạng công cộng.
Internet là một môi trường công cộng, do đó việc chia sẻ dữ liệu có tính riêng tư thông qua hệ thống mạng Internet là cực kỳ nguy hiểm vì thông tin có thể bị rò rỉ, mất cắp... Chính vì vậy, mạng riêng ảo VPN (Virtual Private Network) ra đời dựa trên cơ sở hạ tầng của hệ thống mạng Internet nhằm tạo ra một kết nối mạng hoàn toàn riêng tư và bảo mật.
VPN được ví như một “đường ống” an toàn giữa hai hoặc nhiều máy tính trên mạng Internet, cho phép chúng truy cập với nhau như thể đang ở trong một mạng LAN nội bộ riêng biệt. Trước đây, VPN được sử dụng chủ yếu bởi các doanh nghiệp muốn kết nối an toàn nhiều chi nhánh cách xa nhau về mặt địa lý, hoặc cho phép nhân viên của họ kết nối vào mạng văn phòng để làm việc từ xa mà vẫn đảm bảo tính bảo mật. Tuy nhiên, ngày nay VPN cũng đang trở thành một dịch vụ quan trọng đối với hầu hết người dùng cá nhân nhằm bảo vệ họ khỏi sự tấn công khi kết nối với các mạng công cộng.
Giải pháp hiệu quả để bảo vệ sự riêng tư
Mạng không dây mở thường phải đối mặt với nhiều nguy cơ rò rỉ thông tin của người sử dụng, bởi vì kẻ xấu có thể kết nối vào đó một cách dễ dàng và sử dụng các kỹ thuật khác nhau để theo dõi lưu lượng web hay thậm chí chiếm quyền điều khiển tài khoản các trang web không sử dụng giao thức bảo mật HTTPS. Ngoài ra, một số người dùng mạng Wi-Fi có thể cố tình đưa quảng cáo vào các trang web và dẫn đến những thao tác theo dõi không mong muốn.
Bằng cách sử dụng kết nối VPN, tất cả lưu lượng trong hệ thống mạng của bạn có thể được truyền đi một cách an toàn thông qua một máy chủ đặt ở nơi khác trên thế giới. Giải pháp VPN sẽ bảo vệ máy tính của bạn tránh khỏi mọi nỗ lực theo dõi và xâm nhập. VPN thậm chí có thể giấu địa chỉ IP máy tính thật của bạn khi truy cập một số trang web hay dịch vụ.
VPN có thể vượt tường lửa và không bị chặn về mặt địa lý
Người dùng cá nhân thường sử dụng VPN để mở các nội dung trực tuyến vốn không được phép truy cập trong khu vực của họ. Điều này hầu như phụ thuộc vào những quy định do nhà cung cấp dịch vụ mạng ISP đưa ra. Tuy nhiên, các nhà cung cấp dịch vụ VPN thường đặt máy chủ tại nhiều nước trên thế giới và cho phép người dùng dễ dàng chuyển đổi giữa những máy chủ này với nhau. Ví dụ, người dùng một số nước châu Á có thể kết nối thông qua một máy chủ ở Mỹ để truy cập nội dung Netflix, vốn là dịch vụ hiện không được cung cấp rộng rãi tại khu vực này.
Ở một số quốc gia trên thế giới, chính phủ không cho phép người dùng truy cập một số trang web nhất định vì lý do kinh tế, chính trị, văn hóa,… Ngoài ra, một số trang web hay dịch vụ bán hàng trực tuyến thường ngăn chặn truy cập từ một số nước vì lý do an toàn. Tuy nhiên, vài người dùng vẫn có thể sử dụng VPN để truy cập và “qua mặt” những quy định này.
Miễn phí hay có phí
Hiện nay, người dùng cá nhân có nhiều lựa chọn dịch vụ VPN miễn phí hoặc trả phí. Các ứng dụng VPN miễn phí thường hiển thị quảng cáo, số lượng máy chủ hạn chế và tốc độ kết nối cũng chậm hơn. Tuy nhiên, nếu nhu cầu chỉ là thường xuyên lướt web hay truy cập một vài dịch vụ nhất định thì như vậy có lẽ là quá đủ đối với hầu hết người dùng thông thường.
Các dịch vụ VPN miễn phí thường đi kèm quảng cáo. |
Trong khi đó, các dịch vụ VPN thương mại có trả phí thường hoạt động dựa trên mô hình đăng ký và có nhiều gói tốc độ tải về hoặc giới hạn dữ liệu. Một vài nhà cung cấp phần mềm chống virus còn tích hợp dịch vụ VPN vào sản phẩm của họ, có cả phiên bản miễn phí lẫn các giải pháp thương mại đắt tiền hơn. Nhìn chung, các giải pháp VPN này cung cấp các thiết lập bảo mật hợp lý hơn, vì vậy người dùng không phải lo lắng quá nhiều về việc cấu hình.
Không phải mọi VPN đều như nhau
Hiện nay, có nhiều công nghệ VPN khác nhau với thế mạnh mã hóa đa dạng. Chẳng hạn, công nghệ VPN PPTP (Point-to-Point Tunneling Protocol) là nhanh nhất nhưng ít an toàn hơn so với IPSec hoặc OpenVPN, vốn là những công nghệ sử dụng giao thức SSL/TLS (Secure Sockets Layer/Transport Layer Security). Người dùng nên lựa chọn công nghệ VPN trên cơ sở từng trường hợp cụ thể, tùy thuộc vào loại dữ liệu sẽ được chuyển qua đó.
Về cơ bản, OpenVPN hỗ trợ nhiều thuật toán mã hóa kết hợp với nhau, các giao thức trao đổi khóa và thuật toán băm. Cách thực hiện phổ biến nhất được cung cấp bởi các nhà cung cấp dịch vụ VPN cho các kết nối OpenVPN là mã hóa AES với trao đổi khóa RSA và chữ ký SHA. Các thiết lập được đề nghị là mã hóa AES-256 với một khóa RSA có độ dài ít nhất 2.048 bit và SHA-2 (SHA-256), thay vì SHA-1. Ngoài ra, cũng nên lưu ý là trong các mạng VPN dựa trên giao thức TLS thì loại thuật toán mã hóa và độ dài khóa được sử dụng cũng rất quan trọng.
Tự tạo VPN
Nếu là người yêu thích công nghệ, hẳn có lúc bạn sẽ cần kết nối để truy cập các thiết bị trong mạng gia đình từ bất cứ nơi nào. Sẽ là lựa chọn tốt hơn nếu bạn tự tạo một dịch vụ VPN riêng nhằm tránh bị rò rỉ thông tin cá nhân và cũng để đảm bảo tính bảo mật cho hệ thống mạng của mình.
Hầu hết router đời mới đều tích hợp tính năng VPN. |
Tự tạo bộ phân tích cú pháp bằng JavaCC
Nguyễn Văn Sơn - Global CyberSoft VN
(PCWorldVN) JavaCC là một bộ thư viện mã nguồn mở chạy trên nền Java VM được Sun Microsystems tạo ra nhằm hỗ trợ cho các lập trình viên trong quá trình phát triển phần mềm.
Trong suốt sự nghiệp, hẳn các lập trình viên (LTV) không ít lần phải đối diện với các vấn đề xử lý chuỗi kí tự có cấu trúc phức tạp, hoặc với các bài toán hóc búa như viết một trình thông dịch, trong đó cần xử lý số lượng lớn các lệnh cấp cao do người dùng nhập vào, hoặc thậm chí tự sáng tạo cho riêng mình một ngôn ngữ lập trình mới với một tập hợp những câu lệnh có cú pháp được định trước. Để phục vụ mục đích đó, giải pháp thường được các LTV nghĩ đến đầu tiên là tự viết cho mình một thư viện xử lý chuỗi, kèm theo những thuật toán cắt nối phức tạp và các vấn đề đau đầu như việc tối ưu việc sử dụng bộ nhớ, tăng tốc độ xử lý.
JavaCC là một bộ thư viện mã nguồn mở chạy trên nền Java VM (từ 1.2 về sau), được Sun Microsystems tạo ra đã giảm một gánh nặng cho các LTV khi tự động hóa hầu hết các công đoạn xử lý và tính toán trên. Một cách đơn giản, LTV chỉ cần định ra một tập hợp các mẫu cú pháp (grammar) theo cấu trúc xác định, và JavaCC sẽ giúp sinh mã nguồn trọn vẹn của một bộ phân tích và bóc tách cú pháp cho bạn (thường được gọi là analyzer và parser), ở dạng ngôn ngữ Java hoặc C/C++.
Trong bài này, tôi sẽ mô tả cách thức sử dụng JavaCC để xử lý các chuỗi lệnh có cú pháp đơn giản, với hy vọng sẽ giúp các bạn có cái nhìn tổng quát về bộ thư viện tuyệt vời này và áp dụng hiệu quả cho nhu cầu thực tế của mình. Để thuận tiện, tôi sẽ áp dụng Java trong ví dụ kèm theo, trên hệ điều hành Windows.
Thư viện JavaCC không cần thao tác cài đặt phức tạp, tất cả những gì bạn cần là tải bản JavaCC mới nhất được biên dịch sẵn tại javacc.java.net và giải nén tại một thư mục bạn làm việc. Tôi sẽ tạm đặt nó tại C:\JavaCC-6.0\. Để tiện việc chạy lệnh phân tích và sinh mã nguồn, tôi tạo một batch file có tên "javacc.bat" và bổ sung vào đường dẫn hệ thống (system path) cho nó. Batch file có nội dung như sau:
java -cp c:\javacc-6.0\bin\lib\javacc.jar javacc %1
Để kiểm tra xem thao tác cài đặt JavaCC vào hệ thống của bạn đúng hay không, bạn mở cửa sổ lệnh (command prompt) của Windows tại một thư mục bất kì, và nhập vào "javacc". Nếu nội dung hướng dẫn câu lệnh của JavaCC xuất hiện, tức là bạn đã cài đặt đúng. Ngược lại, bạn cần xem lại quá trình cài đặt.
Giả định phần mềm chúng ta đang phát triển cho phép người dùng soạn các mã lệnh (tạm gọi là script) để điều khiển tự động một tác vụ nào đó. Cụ thể hơn, người dùng cần một tập các tác vụ sau được lặp lại nhiều lần:
- Chọn một ô nhập (text field) trên màn hình
- Gõ vào chuỗi "ABC"
- Nhấn nút "Submit"
Hãy hình dung trên cửa sổ soạn thảo của phần mềm, người dùng sẽ nhập các dòng script sau:
[Screen01].[TextBoxA].Select
[Screen01].[TextBoxA].EnterString("ABC 123")
[Screen01].[ButtonSubmit].Click
Yêu cầu là trình soạn thảo phải kiểm tra xem các lệnh trên có đúng cú pháp không và nếu đúng thì cần tách các thông tin để xử lý cho từng lệnh cụ thể. Đến lúc này, ta sẽ cần đến sức mạnh của JavaCC.
Một trong những điểm có thể gọi là trái tim trong bộ parser của JavaCC là khả năng phân tích các chuỗi kí tự dựa trên các câu ngữ pháp (grammar) bạn cần tổ chức bằng các mẫu Regular expression (tạm gọi là Regex) mà JavaCC gọi là các Regex Production. Tức là, với các mẫu câu lệnh script trên, bạn cần hình dung và định ra một cấu trúc chung, tương tự như việc phân tích một câu văn có chủ ngữ, vị ngữ, động từ... Bộ parser tương lai của bạn hoạt động chính xác và nhanh hay không, hoàn toàn phụ thuộc vào sự hợp lý và tinh tế trong việc sử dụng regex cho các production này. Có hai dạng production trong JavaCC, một là Regex Production, được tổ chức trực tiếp bằng các từ khóa "TOKEN" mà bạn sẽ thấy bên dưới. Thứ hai là dạng BNF Production (Backus–Naur Form Production), cho phép bạn tổ chức các câu ngữ pháp regex trong các hàm Java.
Để bắt đầu, ta soạn một tập tin văn bản có tên "Keywords.jj" (còn gọi là tập tin grammar) và mô tả các cú pháp lệnh dưới các dạng production ta muốn theo cấu trúc mà JavaCC quy định. JavaCC khuyến khích bạn đặt tên tệp tin grammar này có đuôi .jj, tuy nhiên thực tế bạn có thể đặt với đuôi bất kỳ và lưu tại thư mục bạn làm việc. Hãy xem đoạn ví dụ bên dưới:
<Mã nguồn toàn bộ file grammar của ví dụ>
options
{
IGNORE_CASE = true;
//OUTPUT_LANGUAGE="c++";
}
PARSER_BEGIN(KeywordParser)
public class KeywordParser
{
public static void main(String[] args) throws ParseException, TokenMgrError
{
KeywordParser parser = new KeywordParser( System.in ) ;
parser.parseScript();
}
}
PARSER_END(KeywordParser)
SKIP: { "\n" | "\r" | "\r\n" | "\t" }
TOKEN:
{
<KW_SELECT: "Select" >
|<KW_ENTER_STRING: "EnterString">
|<KW_CLICK: "Click">
|<KW_PREFIX: <OBRACKET><IDENTIFIER><CBRACKET>( (<DOT>) <OBRACKET><IDENTIFIER><CBRACKET>)*>
}
TOKEN:
{
<#DIGIT: (["0"-"9"])+>
| <#ALPHABET: (["a"-"z", "A"-"Z"])+>
| <IDENTIFIER: <ALPHABET>(<ALPHABET>|<DIGIT>|<SPACE>)*>
| <DOT: ".">
| <OBRACKET: "[">
| <CBRACKET: "]">
| <OQUOT: "(">
| <CQUOT: ")">
| <DQUOT: "\"">
| <SPACE: " ">
}
/* main BNF production routine */
void parseScript() : {}
{
( statement() )*
<EOF>
}
/* detail BNF productions routines */
void statement() : {}
{
{ System.out.println("\n=== Start a command ==="); }
(
<KW_PREFIX> { System.out.println("\tPrefix: " + token.image); }
<DOT>
)
(
<KW_SELECT> { System.out.println("\tKeyword: " + token.image); }
| <KW_CLICK> { System.out.println("\tKeyword: " + token.image); }
|
(
<KW_ENTER_STRING> { System.out.println("\tKeyword: " + token.image); }
<OQUOT><DQUOT>
(
<IDENTIFIER> { System.out.println("\tString: " + token.image); }
)
<DQUOT><CQUOT>
)
)
}
Một số thành phần của tập tin grammar trên có ý nghĩa sau:
- options: nơi thiết lập cấu hình chung cho bộ sinh mã nguồn JavaCC. Ví dụ, khi chỉ định "IGNORE_CASE = true", JavaCC sẽ cho phép phân tích các chuỗi kí tự không phân biệt chữ hoa hay thường. Có một số tùy chọn quan trọng bạn sẽ cần tham khảo, chẳng hạn OUTPUT_LANGUAGE chỉ thị sinh mã Java hay C++, hay UNICODE_INPUT cho phép hỗ trợ phân tích các chuỗi định dạng UNICODE, khi bạn cần hỗ trợ tiếng Việt hay Nhật.
- PARSER_BEGIN và PARSER_END: JavaCC cần bạn định nghĩa một lớp Java (Java class) chính cho bộ parser, trong đó bạn có thể bổ sung mã Java cho các mục đích riêng, chẳng hạn như tổ chức và lưu trữ dữ liệu có được từ quá trình phân tích và bóc tách các chuỗi. JavaCC sẽ dùng tên class trên để đặt cho các tập tin chứa mã nguồn bộ parser sắp sinh ra.
PARSER_BEGIN(parser_name)
. . .
class parser_name . . . {
. . .
}
. . .
PARSER_END(parser_name)
- TOKEN: Nơi định nghĩa các thành phần trong một câu ngữ pháp, các kí tự đặc biệt, chuỗi cố định và các regex production phức tạp hơn. Bạn có thể tập hợp nhiều định nghĩa vào chung một nhóm token, cách nhau bởi dấu "|" (OR trong Java). Vài ví dụ:
<DOT: ".">: định nghĩa kí tự đặc biệt dấu "."
<#DIGIT: (["0"-"9"])+>: định nghĩa một chuỗi chỉ chứa các kí tự số từ 0-9, có ít nhất một số. Dấu thăng "#" chỉ định token này chỉ được dùng nội bộ trong các token khác, không dùng trong các hàm Java NBF production (trong đoạn mã nguồn trên, hàm parseScript là một BNF production).
- SKIP: Nơi định nghĩa các token mà bạn muốn parser bỏ qua trong quá trình phân tích. Ví dụ các kí tự đặc biệt không cần thiết giữa các lệnh, các kí tự xuống dòng...
- BNF Production: Là một hàm Java định nghĩa một câu có ngữ pháp phức tạp, đồng thời cho phép ta chèn mã nguồn Java giữa các thành phần để thực hiện các thao tác kiểm tra, lưu trữ dữ liệu hoặc thông báo lỗi. Ví dụ hàm “parseScript” như sau:
void parseScript() :
{
/* bạn có thể khai báo, khởi tạo các biến tùy ý nơi này */
}
{
( statement() )*
<EOF>
}
Hàm “parseScript” sử dụng regex để mô tả nội dung tập tin script chứa các mã lệnh, trong đó đoạn (....)* chỉ định có thể không có lệnh nào, hoặc nhiều lệnh. Kí hiệu <EOF> được JavaCC định nghĩa sẵn, chỉ định việc kết thúc tập tin script.
Tiếp tục, để hỗ trợ ba lệnh "Select", "EnterString" và "Click", bạn cần một hàm BNF khác được đặt tên "statement" trong mã ví dụ trên. Hàm "statement" này đại diện cho một cấu trúc lệnh tổng quát bao gồm 2 thành phần chính:
- Prefix: tức là đoạn "[Screen01].[TextBoxA]". Được định nghĩa bằng token <KW_PREFIX> ở trên.
- Keyword chính: tức là đoạn có chuỗi chính xác là "Select", "EnterString" và "Click", được định nghĩa bằng 3 token <KW_SELECT>, <KW_CLICK>, <KW_ENTER_STRING>. Giữa prefix và keyword chính được phân cách bởi dấu chấm, tức token <DOT>.
Khi đã hoàn tất tập tin grammar, chúng ta sẽ tiến hành chạy bộ sinh mã của JavaCC bằng lệnh sau:
javacc Keywords.jj
Nếu thành công, bạn sẽ thấy kết quả như hình 1. Nếu gặp lỗi sai cấu trúc tập tin grammar, hoặc các production bạn không đúng, JavaCC sẽ thông báo cho bạn.
Hình 1 |
Hình 2 |
[Screen01].[TextBoxA].Select
[Screen01].[TextBoxA].EnterString("ABC 123")
[Screen01].[ButtonSubmit].Click
Trước tiên, ta dùng Java để biên dịch các tập tin Java vừa sinh ở trên:
javac *.java
Nếu trong tập tin grammar trên có các lỗi liên quan đến mã Java mà bạn nhúng kèm, bước này sẽ thông báo cụ thể cho bạn.
Cuối cùng, bạn chạy thử bộ parser mới để kiểm tra các lệnh trong script.txt:
java KeywordParser < script.txt
Kết quả phân tích được thể hiện trong hình bên dưới:
Hình 3 |
Trên đây là ví dụ đơn giản thể hiện khả năng của JavaCC. Trên thực tế, bạn sẽ cần tìm hiểu rõ hơn về các thông số chỉ thị và các cách thức xử lý khi gặp các câu ngữ pháp phức tạp, ví dụ như câu lệnh IF...THEN...ELSE trong ngôn ngữ lập trình. Tất cả các thông tin đó đều được mô tả khá chi tiết cùng nhiều ví dụ cụ thể tại trang chủ của JavaCC.
Hy vọng qua bài viết này, bạn có một cái nhìn tổng quát về cấu trúc một tập tin ngữ pháp của JavaCC cũng như cách thức chạy lệnh để sinh mã nguồn bộ parser riêng cho mình mà không cần bận tâm các vấn đề xử lý chuỗi phức tạp. Một lập trình viên thành thạo các ngôn ngữ lập trình và các kỹ thuật là điều cần có, nhưng khả năng vận dụng nhuần nhuyễn các thư viện hỗ trợ như JavaCC không chỉ giúp tạo nên những sản phẩm có giá trị thực tế, mà còn giúp tiết kiệm được rất nhiều thời gian và công sức trong quá trình phát triển phần mềm.
Đôi điều về Regex
Để làm chủ được bộ ngữ pháp của JavaCC, bạn cần thành thạo Java và regular expression. Dưới đây là vài chú ý về regular expression được dùng trong ví dụ trên:
(...)+ : Một hoặc nhiều
(...)* : Không hoặc nhiều
(...)? hoặc […]: Tùy chọn và không bắt buộc
(["0"-"9"])+ : Chuỗi chỉ chứa các kí tự dạng số, có ít nhất một kí tự.
Về việc vận dụng JavaCC tại Global CyberSoft VN (GCS)
Tại Global CyberSoft VN, chúng tôi đã phát triển thành công phần mềm eMonKey giúp tự động hóa việc kiểm thử phần mềm (software testing) trên nhiều platform khác nhau, bao gồm desktop, web và mobile. eMonKey áp dụng kỹ thuật keyword-driven, cho phép thu giữ (record) lại các tác vụ của người dùng trên phần mềm chỉ định được dạng các keyword, đồng thời cho phép người dùng soạn thảo và hiệu chỉnh các lệnh keyword đó, cuối cùng sẽ cho phép chạy lại (playback) các tác vụ đó trên phần mềm cần kiểm thử. Chức năng soạn thảo của eMonKey sử dụng JavaCC làm bộ phân tích cú pháp và bóc tách dữ liệu.
Tham khảo: https://javacc.java.net/doc/javaccgrm.html
Top 10 ngôn ngữ lập trình 2016
Thanh Phong
(PCWorldVN) C vẫn là số 1, nhưng dữ liệu lớn mới là người thắng cuộc
Năm thứ ba IEEE Spectrum xếp hạng các ngôn ngữ lập trình phổ biến nhất. Spectrum đánh giá ngôn ngữ qua 12 chỉ số, mỗi chỉ số xem xét mức độ phổ biến theo một hướng khác nhau. Kết hợp các chỉ số cho ra thứ hạng của ngôn ngữ.
Vì mỗi người có thể xem trọng những khía cạnh khác nhau, công cụ tương tác Top Programming Languages của Spectrum của phép bạn điều chỉnh trọng lượng của từng chỉ số góp phần vào việc xếp hạng. Ngoài ra còn có bộ lọc tùy chọn: ví dụ, chỉ xem xét các ngôn ngữ được sử dụng trong các hệ thống nhúng hoặc ứng dụng di động. Bạn có thể tùy chỉnh trọng lượng từng chỉ số hoặc sử dụng những thiết lập có sẵn.
Thiết lập mặc định phản ánh mối quan tâm chung của các thành viên IEEE. Vậy theo Spectrum Top 10 ngôn ngữ lập trình năm 2016 là những ngôn ngữ nào?
Sau hai năm ở vị trí thứ hai, C cuối cùng đã lật đổ Java để leo lên vị trí số 1. Trong Top 5, Python đã hoán đổi vị trí với C++ để chiếm vị trí số 3, C# bị R hất ra khỏi Top 5. R được đà từ những năm trước, nằm trong xu hướng chung đang lên của các ngôn ngữ dữ liệu lớn hiện đại được phân tích chi tiết trong bài “Xu hướng ngôn ngữ lập trình: Sự trỗi dậy của dữ liệu lớn”.
Google và Apple cũng khiến người ta phải chú ý, Go của Google đã đánh bại Swift của Apple để vào Top 10. Tuy nhiên Swift cũng tăng ấn tượng khi nhảy 5 bậc lên vị trí thứ 11 so với năm rồi (năm đầu tiên Swift góp mặt trong bảng xếp hạng). Không như năm rồi xuất hiện nhiều gương mặt mới, năm nay trong bảng xếp hạng chỉ có những cái tên cũ.
Những thay đổi đáng chú ý khác như Ladder Logic tăng 5 bậc leo lên vị trí thứ 34. Ladder Logic được sử dụng trong các bộ điều khiển logic lập trình, đặc biệt là những bộ điều khiển được dùng trong các nhà máy. Mặc dù sản xuất có vẻ như là một ngách hẹp của ngôn ngữ, nhưng mức độ khá phổ biến của nó cho thấy thị trường ngách đó thực sự lớn. HTML tiếp tục phổ biến, tăng lên vị trí thứ 16. (Spectrum xác định một ngôn ngữ lập trình phải có cú pháp riêng biệt được dùng để tạo ra các chỉ thị máy tính, ngay cả khi đó chỉ là những chỉ thị về cách cấu trúc dữ liệu).
Trong những cái tên rớt hạng, có lẽ đáng ngạc nhiên nhất là sự sụt giảm của ngôn ngữ lập trình Shell (dùng để tạo kịch bản) được các nhà quản trị hệ thống ưa thích, rớt 7 bậc xuống vị trí thứ 19. Điều này có thể phản ánh sự phát triển của các hệ thống tinh vi hơn để quản lý các trung tâm dữ liệu dựa trên đám mây, nhưng chúng ta sẽ phải chờ xem xu hướng này có tiếp tục trong năm tới hay không hay đây chỉ là một sự tình cờ thống kê.
Nguồn: IEEE Spectrum