Skip to content

Cơ bản về Nguyễn Hồng Sơn

Rừng Na-uy

Rừng Na-uy, không phải là chỉ một khu rừng nào cả. Đó là tên một bài hát của nhóm nhạc huyền thoại The Beatles. Đây là bài mà nhân vật nữ chính trong tiểu thuyết, "nàng" Naoko yêu thích và "phải trả tiền cho mỗi lần nghe đàn" của chị Reiko. Khi đọc sách, mình đã dừng lại và tìm kiếm bài hát để nghe. Một bài hát ngắn thôi, tiếng đàn ghi-ta rõ từng nhịp, có lẽ đó thứ âm thanh nói lên tâm tư của thời đại trước. Nhưng hay hơn, vẫn là những ca từ đơn giản, tình cảm và giàu ý nghĩa, như Trịnh Lữ đã nhắc tới trong phần giới thiệu.

Mình vẫn luôn thích bố cục của những sản phẩm được sản xuất chỉn chu. Cuốn sách có vài nhận xét của các tờ báo, tạp chí, tác giả khác, giới thiệu về tác giả cuốn sách, Murakami Haruki. Nhưng với mình, đầy đủ hơn cả là lời người dịch. Mình cho rằng, ngôn từ luôn mang trong mình chất nghệ thuật riêng có, tính tượng thanh, tượng hình hay chơi chữ được chuyển sang ngôn ngữ khác khi dịch thì mới giữ trọn vẹn ý nghĩa tác phẩm. Trịnh Lữ đã nói ra suy nghĩ của ông khi đọc tác phẩm, thông qua câu từ mà truyền nguyên vẹn tới tay bạn đọc, mà ông vẫn khiêm tốn nhận rằng bản dịch hẵng còn có thể cố gắng thêm.

Đến với Rừng Na-uy, ta thấy đúng thực là cái chết không phải đối lập với sự sống mà chính nó là một phần của sự sống, đang diễn ra và đi cùng chúng ta mỗi ngày. Nhiều người đã yêu và chết vì tình yêu của họ. Họ khát khao được yêu, yêu bùng cháy và trần trụi, nguyên nghĩa, làm ta đôi lúc tự hỏi có phải tình yêu chính là như vậy. "Làm sao cắt nghĩa được tình yêu" ngoài câu trả lời của Xuân Diệu thì có chăng, chính là như vậy. "Làm sao sống được mà không yêu, không nhớ không thương một kẻ nào?", nhiều người trong tiểu thuyết đã chết vì tình yêu của họ không còn nữa, người yêu họ đã chết hay tình yêu họ đã chết. Họ đã tự kết liễu mình theo những cách khác nhau. Chỉ có Toru là còn ở lại, ngồi trên máy bay và hồi tưởng lại những kỷ niệm thời trẻ của anh.

Mình thích cách mở đầu khi kể chuyện. Phải đến khi những ký ức về Naoko chỉ còn mờ mờ, những mảnh ký ức không liên tục, Toru mới viết về câu chuyện của anh. Như đời sống của chính ta vậy, những điều mới trải qua, quá rõ ràng, ít khi làm ta có cảm giác hồi tưởng và suy nghĩ về nó.

Cả thời đại học của Toru sống trong ký túc xá, ngoài những câu chuyện dung tục của anh và Nagasawa, thì không gì hơn là anh bạn cùng phòng. Mình ấn tượng với anh chàng học làm bản đồ có thói quen sống sạch sẽ và lành mạnh này, hơn những câu chuyện tình yêu, tình dục của Toru. Tiếc là nhân vật này dần dần mất đi trong những câu chuyện của Toru, nhường mạch kể cho những đêm ân ái của Toru và các cô gái của anh.

Thứ làm nên hiện tượng văn hóa của Rừng Na-uy, có lẽ chính là cách sử dụng ngôn từ trong những lần ân ái đó. Chuyện trai gái đến rất tự nhiên và mãnh liệt, tác giả miêu tả mọi thứ, những điều vốn là định kiến, xiềng xích trong tư tưởng của các lớp thanh niên trong xã hội Nhật những năm 60, là những thanh niên đại học đương thời đang đấu tranh (Toru xem là đạo đức giả).

Dù chỉ là phần nhỏ, những xung đột tư tưởng, về chủ nghĩa dân tộc cực đoan, một đoạn nhắc nhỏ tới chủ nghĩa Mác, chính là hiện thực tư tưởng của thanh niên thời đại đó. Họ loay hoay trong những thay đổi lớn lao của thời đại về kinh tế và tư tưởng, họ không biết làm cái gì, phê phán đối tượng nào, xây dựng cuộc sống ra sao. Điều duy nhất họ biết là yêu, yêu hết mình, yêu theo đúng cái cách mà họ muốn. Và khi không còn đạt được nó nữa, họ ra đi theo cách của họ.

Cái chết không phải đối diện với sự sống, nó đi cùng sự sống và bên cạnh ta mỗi ngày.

Tại sao tôi làm podcast?

Tôi làm podcast cho chính tôi nghe. Đó là lý do khiến tôi bắt tay vào việc thu âm và tải nó lên mạng.

Ý tưởng gì khiến tôi bắt đầu nói chuyện một mình và tải lên mạng?

Tôi là một người ham chạy bộ, cũng không hẳn là nhiều nhưng tôi vẫn muốn chạy vào những lúc không lười. Chạy bộ là môn thể thao không tốn quá nhiều chi phí nếu không tham gia các giải, có thể thực hiện một mình, nghĩa là tôi có thể chủ động hoàn toàn những lúc tôi muốn, hay không muốn ra đường. Giày, đồng hồ, hay ti tỉ thứ khác có thì rất tốt, nhưng tôi nghĩ nếu không có thì chỉ khó hơn một chút. Nếu không mua, quả thực tôi có ít động lực hơn để chạy, nhưng nó cũng không phải là rào cản mà tôi có thể đổ vấy lên mà lười vận động. Có chăng chỉ là nơi chạy. Chạy ở công viên, đường vắng, đẹp và mát rõ ràng an toàn và tốt hơn chạy ngoài phố đầy xe.

Ai đã từng chạy bộ, hẳn đều muốn nghe nhạc trong lúc chạy. Tôi cũng vậy. Lâu lâu, thay vì nghe nhạc thì tôi nghe podcast này nọ, của chị Chi Nguyễn hay của bất kỳ ai nói về chủ đề tôi thích. Nhưng những người làm podcast chất lượng tôi tìm thấy thì hơi ít (hoặc tôi không tìm kiếm thấy, hoặc có những phương pháp trả phí mà tôi không biết), dần dà những nội dung tôi đã nghe hết.

Tôi nghe nhạc và podcast trên Spotify, chủ yếu bởi vì nó đồng bộ tốt giữa ứng dụng trên điện thoại và đồng hồ. Tôi sử dụng một dạng đồng hồ hơi đa dụng, vừa có thể đo các chỉ số vận động, vừa có thể kết nối tai nghe để nghe nhạc mà không cần mang theo điện thoại bên người. Vì vậy, tôi rất cần những nội dung nghe có sẵn trên Spotify. Và thế là tôi làm podcast

Bên cạnh đó, tôi nghĩ cũng có một động lực khác, nhỏ hơn nhưng cần nói thêm, là những suy nghĩ lắng đọng từ cảm xúc. Tôi có cái thói quen suy nghĩ nhiều, dạo gần đây lại càng nhiều và mệt hơn. Nam Cao từng viết: "Một người đau chân có lúc nào quên được cái chân đau của mình để nghĩ đến một cái gì khác đâu?". Một người nghĩ lắm như tôi cũng cho rằng mình như vậy. Mà suy nghĩ nhiều nếu không viết ra, mài đi mài lại thì nó cứ lập lờ, quanh quẩn mãi trong cái nơ-ron, không thể thoát ra được.

Tôi làm gì ngoài việc làm podcast?

Làm podcast là cách nói quá. Tôi không coi nó là một nghề thứ 2, thứ 3 gì cả. Xem chị Chi nhiều nhưng tôi không có bao nhiêu ước vọng làm cái nghề bán con chữ, nước bọt. Hoặc giả như tôi chỉ là cái mầm tí con, còn làm mọi thứ như là một thú giải trí thuần túy. Chắc phải thật lâu, thật lâu nữa tôi mới tới cái giai đoạn xem cái kinh nghiệm mình là quý báu để mang đi kiếm tiền được.

Hiện tại tôi đang làm kỹ thuật tại một tập đoàn công nghệ lớn, tại Việt Nam. Tôi nói hiện tại tức là thời điểm cái bài viết này được viết ra, còn lúc các bạn đọc được, nghe được thì không chắc. Chính tôi cũng không chắc sang tháng tôi có làm tiếp ở đây không. Ai cùng ngành và có quen biết tôi, hẳn biết chuyện gì đang xảy ra. Và trường hợp tôi thì nói chung là "anh em đang cố gắng" mà thôi.

Mấy thứ trên đây nói về gì?

Nói là làm podcast, nhưng tôi vẫn tải các tệp thu âm sẵn của một số vấn đề tôi muốn nghe mà không cần phải xin bản quyền, chủ yếu là các bài viết của lãnh đạo trên các báo chính trị, các văn kiện công khai. Có một số là những bài viết xàm xí của tôi trên blog, lâu lâu lại là những bình luận, phân tích rởm đời. Nghe lại những gì mình đọc, mình viết có cái hay của nó. Có dạo tôi viết nhật ký, sau đọc lại thì tưởng như người khác chắp bút. Nhiều khi ta quên mất chính mình đã từng như vậy. Nghe để biết, nghe để hiểu, nghe để nghiền ngẫm, nghe để học và để nhớ, nghe để hồi tưởng và nhìn lại. Cái sự nghe như kiểu chính mình dạy học cho mình vậy.

Những vấn đề chính trị, xã hội mà tôi làm ra đây, ít nhất ở tiếng Việt, tôi thấy có ít người nói. Khi tìm kiếm philosophy trên podcast, tôi không thấy có bao nhiêu kênh có nội dung hay cả. Hoặc là hàn lâm thuần túy, hoặc là giọng văn, nội dung có sử dụng thủ thuật. Nghĩa là các nghiên cứu, các nội dung đề cập đôi khi lại dẫn chứng vài số liệu không toàn diện, không đúng, dẫn tới có sự sai lệch trong cách nhìn, cách hiểu của độc giả. Hội đồng cừu là một kênh cung cấp góc nhìn thú vị. Tuy nhiên nó không mang tính hội đồng. Như tác giả tự nhận là nhà nghiên cứu cánh hữu, các số liệu, chủ đề nghiên cứu, mục tiêu nghiên cứu cũng nhằm phổ biến quan điểm chính trị của tác giả. Vậy nên nó thiên kiến.

Tôi nói như vậy, bởi chính tôi cũng sẽ thiên kiến, và các nội dung tôi cung cấp cũng chỉ nằm trong vài chủ đề tôi quan tâm. Tôi không có nhiều thời gian và công sức để nghiên cứu những điều tôi không thích. Nhưng kể cả những việc tôi làm có nguồn thu nhập như kênh khác, thì e rằng việc nghiên cứu một chủ đề khác nằm ngoài khả năng. Tôi được chỉ ra điều này, khi giảng viên của tôi nói rằng, mặc dù có rất nhiều nghiên cứu chỉ ra có lợi ích của việc uống cafe, nhưng lại không có nghiên cứu nào chỉ ra tác hại của nó; ảnh hưởng của sóng tới cơ thể con người cũng vậy.

Thầy nói rằng, bản chất của sóng trong lò vi sóng, và sóng do các thiết bị di động chúng ta đang sử dụng không có khác biệt quá nhiều. Sóng trong lò vi sóng làm chín đồ ăn, vậy có khi nào sóng điện thoại, sóng viễn thông đang làm chín chúng ta? Chúng ta thực sự không biết nó ảnh hưởng như thế nào, ít hay nhiều, tốt hay xấu. Khi một nghiên cứu ra đời với mục tiêu chứng minh rằng sóng 5G có hại cho sức khỏe, có lẽ nó sẽ bị đình chỉ tài trợ. Phần kinh phí đó sẽ chuyển qua quảng bá cho sức mạnh (dĩ nhiên) của sóng 5G và hiệu quả kinh tế mà nó mang lại.

Cho nên, những chuyện tôi nói, rõ ràng sẽ theo một xu hướng nhất định. Nhìn ở bình diện nhỏ vài bài, có thể sẽ không thấy rõ, nhưng bao quát hơn, khi kênh có vài chục nội dung, độc giả hẳn sẽ thấy điều đó. Tôi sẽ không thay đổi nó chừng nào mục đích của tôi chưa thay đổi.

Viết để làm gì nếu chỉ cần nói?

Việc viết lại, trước khi nói có cái hay của nó. Giống như soạn bài văn hay phát biểu, thông qua viết ta chỉnh sửa được cái tứ mà mình định nói, không lan man, dài dòng, đi xa khỏi các vấn đề vốn có giới hạn thời gian để nói.

Nhiều người cho rằng việc chỉ nói mà không cần viết mới là giỏi. Cá nhân tôi cho rằng việc một người có thể trình bày trôi chảy một vấn đề mà không cần lập dàn ý trước, là một người rất giỏi. Nhưng không đồng nghĩa với việc người cầm giấy đọc là dốt. Tôi là người rất tự tin về việc nói, dù rằng như các bạn nếu đang nghe, thì giọng tôi không hề tốt có phần khó nghe. Tôi giỏi biện luận và có thể nói một vấn đề rất dài, nói hàng giờ để dẫn dắt từ vấn đề này tới vấn đề khác. Tôi tự thấy tôi hay lan man, vì vậy tôi cần phải viết. Một điều mà tôi thấy hay ho hơn hẳn, là tôi có thể biên soạn những câu thật dài, với ý bao trùm các khía cạnh khác nhau. Bình thường nếu chỉ nói, tôi sẽ bị ngắt quãng và có đôi khi phải dừng lại một chập để suy nghĩ.

Thứ nữa là tôi viết để ước lượng tôi sẽ nói trong bao lâu. Như các bạn đang đọc bài viết, phía trái có một ô ghi thời gian đọc. Cái số đó không phải tôi tự đặt ra đâu. Có nghiên cứu hẳn hỏi đấy. Tốc độ đọc trung bình của mỗi người đâu đó vào khoảng 265 từ mỗi phút1. Tôi muốn tôi nói bao lâu, tôi sẽ ngồi viết bấy lâu. Tuy có suy chuyển theo nhịp đọc, nhưng tôi nghĩ không đáng kể.

Viết trước, cũng không hề dễ dàng. Như bài này tôi đã cố gắng viết thêm, nghĩ thêm ra vài ý liên quan, nhưng vẫn không dài nổi. Mà podcast thì đâu thể ngắn quá được. Ngắn quá thì sản phẩm không chất lượng, người nghe là chính mình đây tự dưng cũng thấy hụt hẫng. Cái khó là chỉ với chừng đó ý và nội dung, viết mãi mà dài ra được. Lý do tôi làm podcast, vốn chỉ có nhiêu đó thôi. Làm sao viết cho nó dài ra, là một công việc khó khăn.

Có chia sẻ gì về việc làm podcast không?

Hôm nay tôi mới chỉ bắt đầu, vì vậy tôi chưa có gì để chia sẻ cả. Tôi chỉ thấy việc tải lên podcast ở Spotify thật vô cùng đơn giản. Nhu cầu của tôi chỉ là muốn đăng lên để nghe thôi, nhưng cách nó hoạt động thật sự ấn tượng.

Thú thực là tôi biết rõ cái giọng của mình không hề phù hợp để đi làm podcast. Vì nhiều lý do chủ quan và khách quan, phát âm tiếng Việt của tôi còn khó nghe nữa, nên việc sử dụng giọng đọc của mình để làm một cái gì đó hẳn là điều viển vông nhất tôi từng nghĩ đến, và thực sự thì tôi đang làm. Tôi không biết tôi sẽ duy trì nó bao lâu. Nhưng cái sự nghiệp mà tôi hướng tới, thì không thể vươn tới đỉnh cao nếu không có chất giọng hay được.

Tôi đã lục tìm nhiều hướng dẫn về giọng bụng, giọng mũi, giọng phổi và học hỏi. Tôi vẫn thấy giọng mình phát gớm ghi nghe lại.


  1. Medium Help Center. Read time. 2024. URL: https://help.medium.com/hc/en-us/articles/214991667-Read-time (visited on 2024-09-20). 

Thiết kế ứng dụng Google Apps Script CICD từ Github

Giới thiệu về Google Apps Script

[Phần giới thiệu tạo từ ChatGPT]

Google Apps Script là một nền tảng phát triển mã nguồn miễn phí do Google cung cấp, cho phép người dùng tạo các ứng dụng tùy chỉnh và tự động hóa các tác vụ trong các dịch vụ của Google như Google Sheets, Google Docs, Google Drive, Gmail, và nhiều hơn nữa.

  1. Một số đặc điểm chính của Google Apps Script:

    • Ngôn ngữ: Google Apps Script sử dụng JavaScript, rất thân thiện cho những người đã quen thuộc với ngôn ngữ này.
    • Tích hợp sẵn với dịch vụ Google: Apps Script có các API tích hợp sẵn, giúp dễ dàng truy cập và thao tác với dữ liệu trong các ứng dụng Google Workspace, như tạo email tự động với Gmail, xử lý dữ liệu trong Google Sheets, hoặc quản lý tập tin trong Google Drive.
    • Khả năng tự động hóa: Người dùng có thể lên lịch các tác vụ tự động bằng cách sử dụng trình kích hoạt (trigger), chẳng hạn như tự động gửi báo cáo hàng ngày qua email hoặc cập nhật dữ liệu vào Google Sheets hàng tuần.
    • Giao diện xây dựng web: Apps Script hỗ trợ xây dựng giao diện người dùng (UI) bằng HTML, CSS và JavaScript. Điều này giúp tạo ra các ứng dụng web đơn giản và tùy chỉnh giao diện người dùng cho các tác vụ phức tạp.
    • Triển khai dễ dàng: Google Apps Script cho phép triển khai các dự án thành ứng dụng web, tiện ích bổ sung (add-ons) cho Google Workspace, hoặc API web để tích hợp với các dịch vụ khác.
  2. Một số ứng dụng của Google Apps Script:

    • Quản lý dữ liệu: Tự động cập nhật dữ liệu giữa Google Sheets, Google Forms và Google Drive.
    • Gửi email tự động: Tạo các quy trình gửi email theo điều kiện trong Gmail.
    • Xây dựng các tiện ích bổ sung cho Google Workspace: Tạo add-ons giúp mở rộng tính năng của Google Sheets, Google Docs và các ứng dụng khác.
    • Tích hợp bên ngoài: Kết nối với các API bên ngoài để tích hợp với các dịch vụ khác, như Slack, Trello, hoặc các ứng dụng CRM.

Tạo một ứng dụng Apps Script

Chúng ta sẽ làm gì?

Tạo một ứng dụng Google Form hỗ trợ quyên góp/mượn/trả sách cho thư viện.

  • Người dùng quyên góp sách nhập thông tin sách vào form. Kết quả được thêm vào danh mục sách trong thư viện. Một email được gửi tới người quyên góp sách nhằm cảm ơn đóng góp, đồng thời thông tin người đóng góp được thêm vào danh sách để vinh danh.

  • Người dùng mượn sách lấy sách từ thư viện, nhập thông tin vào form. Kết quả là số lượng của đầu sách đó trong danh mục giảm đi. Một dòng nhật ký thể hiện thông tin về người mượn, đầu sách, thời gian mượn được ghi vào bảng. Từ thời gian mượn đếm ngược tới khi hết 14 ngày, một email tự động nhắc nhở việc trả sách được gửi cho người mượn.

  • Người dùng trả sách trả sách về thư viện, nhập thông tin vào form. Kết quả số lượng của đầu sách đó trong danh mục tăng lên. Dòng nhật ký thể hiện thông tin mượn sách được cập nhật ngày trả. Một email cảm ơn được gửi tới người vừa trả sách, đính kèm danh mục sách còn trong thư viện để người dùng đó có thể sẵn sàng tra cứu.

Tạo Google Form

Để đáp ứng các yêu cầu được đặt ra tại phần đặt vấn đề, ta cần tạo một Google Form đơn giản. Hình bên minh họa form vừa được tạo

example-form

Sau khi đã có thông tin cơ bản về form, tại góc trên bên phải, ta mở trình tạo script để bắt đầu tạo ứng dụng.

open-script-editor

Thử những dòng code đơn giản

Trong giao diện appscript, ta nhập vào code của mình và nhấn Run để chạy thử code. Đoạn code mẫu dưới đây nhận vào thông tin được nhập trong form và in nó ra. Form ID chính là dòng chuỗi ký tự nằm trên link của form https://docs.google.com/forms/d/your-google-form-id-in-edit-version/edit

function onFormSubmitTrigger() {
  var form = FormApp.openById("your-google-form-id-in-edit-version");
  var formResponses = form.getResponses();
  var formResponse = formResponses[formResponses.length - 1];
  var itemResponses = formResponse.getItemResponses();

    for (var j = 0; j < itemResponses.length; j++) {
        var itemResponse = itemResponses[j];
        console.info(itemResponse.getResponse())

    }

}

Kết quả như hình nghĩa là script đã hoạt động

test-script

Setup CICD

Tại phần này, ta sử dụng Github Action để trigger hành động push lên branch và chạy runtime. Runtime là script clasp, xác thực với Google và push code lên Script đã chỉ định

Install clasp

  • Install NodeJS

  • Install clasp

    npm install @google/clasp -g
    

  • Sau khi cài đặt thành công, tiến hành login vào clasp

    clasp login
    

  • Một web popup được mở lên, ta login vào bằng tài khoản Google, cho phép tất cả quyền với clasp. Sau khi có thông báo Logged in! You may close this page. Ta tắt trình duyệt. Clasp secret được lưu tại /home/your-user/.clasprc.json. Nội dung file có dạng:

    {"token":{"access_token":"ya29.a0AeDClZDSqUjpogftPSUV2YEbqcmdzm583fr3Rd_JoURVY7fQ0175","refresh_token":"1//0gXg54AF-AkdBCgYIARAAGBASNwF-L9IrB_UcEiO2xoywoMncHEQX31g9X0uKyVTAOMoxVwcgpyNeuBoiCtqz-jB2NPr96QSy0nU","scope":"https://www.googleapis.com/auth/logging.read https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/script.projects https://www.googleapis.com/auth/script.webapp.deploy https://www.googleapis.com/auth/userinfo.email openid https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/service.management https://www.googleapis.com/auth/script.deployments https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/cloud-platform","token_type":"Bearer","id_token":"eyJhbGciOjE3MzAzOTIzMTZ9.i06D7jynHSvjAKRaMucEK3vQYF7aRRHy9H_8zp5uglcnKecMdXbyqL1x334UXx2vggEutNvzAdFUr9M8ec6y9LWcNCJx8l8tHgakMA-0hpp-bp3wBx4Gzac-H-8DSo7wTw3E9XEBDTYZBe1kPqiN0ivVqzfQ6PusaGvsuuY8n0dVvNC559EFkyGfklE_xIxKNJbUBem9NednIfkkfKbuA-eURN16BE86cdO8MBE99pCrdy2w7eYO0s8wd-Xl46OhQKm4TRFz5ZGf06NdkC_SQtHwphurxKCYVuECjon7iVXLpjpKmdHAS6jyYl78qd6bTVloonLA9kl4o_HCjcbOyQ","expiry_date":1730392315187},"oauth2ClientSettings":{"clientId":"1072944n0.apps.googleusercontent.com","clientSecret":"v6V3fKV_zWU7iw1DrpO1rknX","redirectUri":"http://localhost"},"isLocalCreds":false}
    
    Ta lưu thông tin này và add vào github Action

Thao tác trên App Script

Để có thể clasp làm việc với appscirpt, source code của chúng ta cần có các file config.

Đầu tiên là appscript.json, đây là một file cài đặt của project, nó quy định runtime, dependencies... Ta có thể dễ dàng kiểm tra nó bằng cách

  • Trên giao diện Apps Script, tại thanh công cụ bên trái, chọn biểu tượng cài đặt, vào Project Settings.

  • Tại giao diện cài đặt, phần Genral settings, chọn dấu tích vào ô bên trái của lưạ chọn Show "appsscript.json" manifest file in editor

  • Quay trở lại giao diện Editor, ta sẽ thấy file appsscript.json, file có nội dung tương tự phía dưới.

{
    "timeZone": "Asia/Ho_Chi_Minh",
    "dependencies": {},
    "exceptionLogging": "STACKDRIVER",
    "runtimeVersion": "V8",
    "webapp": {
        "access": "ANYONE",
        "executeAs": "USER_DEPLOYING"
    }
  }

Thứ hai là file .clasp.json, file này chỉ dấu project nào, script nào bạn muốn thao tác. File này có thể tạo ra bằng các câu lệnh của clasp. Ở đây mình đưa ra file mình đã sử dụng

{
    "scriptId": "your-script-id",
    "rootDir": ".",
    "projectId": "your-project-id",
    "fileExtension": ["js","html"]
}

Các thông tin scriptID và projectID có thể lấy tạị giao diện cài đặt. Nếu là script mới, thông số Project Number sẽ không có. Bạn cần tạo một project và change project ID cho script đó.

script-id-project-id

Ngoài việc hard code project ID và script ID ở code, bạn có thể sử dụng github variables và script để parse thông tin đó vào file .clasp.json. Ở đây mình không sử dụng variables đó.

Có một thông tin cần nữa là Deployment ID. Sau khi deploy script, bạn lưu lại nó để sử dụng sau. Thông tin này lấy được bằng cách

  • Tại giao diện chính của Apps Script, phía trên bên phải, chọn Deploy

  • Tại pop-up deploy, chọn Manage deployments

  • Lựa chọn deployments cần quản lý, copy và lưu lại thông tin Deployment ID

Thao tác trên github

  • Sử dụng Github Action, ta tạo các secrets

    • CLASPRC_JSON: Là chuỗi được lấy từ clasp ở trên
    • REPO_ACCESS_TOKEN: Là chuỗi access token của tài khoản github
    • DEPLOYMENT_ID: đã được nhắc tới ở trên.
  • Project structure như sau

    .github
    └── workflows
        └── cicd.yml
    config
    ├── .clasp.json
    └── appsscript.json
    src
    ├── app1.js
    ...
    └── appn.js
    

Các file .clasp.jsonappsscript.json ta đã có ở trên. Các file trong thư mục src chứa source code của project. File cicd.yml như dưới đây

name: CI/CD
on:
  workflow_dispatch:
  push:
    branches: ["main"]
  schedule:
    - cron: "0 1 * * *"

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: "pages"
  cancel-in-progress: false   

jobs:
  apps_script_deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: Install clasp
        id: install-clasp
        run: sudo npm install -g @google/clasp

      - name: Write CLASPRC_JSON secret to .clasprc.json file
        id: write-clasprc
        run: echo "$CLASPRC_JSON_SECRET" > ~/.clasprc.json
        env:
          CLASPRC_JSON_SECRET: ${{ secrets.CLASPRC_JSON }}

      - name: Check clasp login status
        id: clasp_login
        run: clasp login --status 

      - name: Save current .clasprc.json contents to CLASPRC_JSON_FILE environment variable
        id: save-clasprc
        run: |
          echo ::add-mask::$(tr -d '\n\r' < ~/.clasprc.json)
          echo "CLASPRC_JSON_FILE=$(tr -d '\n\r' < ~/.clasprc.json)" >> $GITHUB_ENV        

      - name: Save CLASPRC_JSON_FILE environment variable to CLASPRC_JSON repo secret
        id: set-clasprc-secret
        if: ${{ env.CLASPRC_JSON_FILE != env.CLASPRC_JSON_SECRET  }}
        uses: hmanzur/[email protected]
        env:
          CLASPRC_JSON_SECRET: ${{ secrets.CLASPRC_JSON }}
        with:
          name: "CLASPRC_JSON"
          value: ${{ env.CLASPRC_JSON_FILE }}
          repository: ${{ github.repository }}
          token: ${{ secrets.REPO_ACCESS_TOKEN }}


      - name: Checkout repo
        id: checkout-repo
        if: ${{github.event_name    != 'schedule' }}
        uses: actions/checkout@v2


      - name: set environtment
        id: set-env
        if: ${{github.event_name    != 'schedule' }}
        run: rsync -auvh --delete config/.clasp.json config/appsscript.json src/

      - name: debug location of directory
        if: ${{github.event_name    != 'schedule' }}
        run: |
          pwd
          ls -lah

      - name: Push script to scripts.google.com
        id: clasp-push
        if: ${{ github.event_name   != 'schedule'}}
        run: cd src && clasp push -f

      - name: Deploy Script
        id: clasp-deploy
        if: ${{github.event_name    != 'schedule' }}
        run: cd src/ && clasp deploy -i "$DEPLOYMENT_ID" -d "$GITHUB_REF"
        env:
          DEPLOYMENT_ID: ${{ secrets.DEPLOYMENT_ID }}

      - name: remove .clasprc.json credential file
        run: rm -rf ~/.clasprc.json

Như vậy, sau khi chúng ta push code lên branch main, clasp sẽ sử dụng REPO_ACCESS_TOKEN để truy cập vào repository, sử dụng CLASPRC_JSON để login vào google, push code lên scriptID được cấu hình sẵn, tạo một deployments mới thay cho DeploymentID cũ.

Từ iptables tới nftables

nftables là một dự án phát triển sau với mục đích thay thế {ip,ip6,arp,eb}tables. Nó cung cấp một khuôn khổ phân loại gói tin mới dựa trên network-specific Virtual Machine và một command line tool mới. Nó có sẵn trên Linux Kernel kể từ phiên bản 3.13. Hầu hết các system admin đã quen với việc dùng iptables, bài này sẽ đưa ra các so sánh giữa iptables và nftables.

Lược sử iptables và nftables

Lược sử iptables và nftables

Cả iptablesnftables đều là những sản phẩm của dự án The Netfilter Project.

Netfilter được thành lập bởi Paul "Rusty" Russell, là một lập trình viên người Úc. Rusty đã kêu gọi nhằm thiết kế và cải thiện lại ipchainsipfwadm trên những phiên bản Linux 2.0.x.

Các hoạt động đóng góp vào các ứng dụng sơ khởi trên Linux vẫn xảy ra, nhưng ít người có thể duy trì nó một cách lâu dài. Rusty là người kiên trì nhất và đã giữ vững các đóng góp của mình trong top đầu contributions. Điều này làm Marc Boucher chú ý và hai người đã thành lập dự án này. Hai người đã đóng góp nhiều công sức và viết ra một số modules như iptable_{filter,nat,mangle}. Sau đó, những contributions tốt được James Morris đóng góp, thứ hạng ngay dưới Rusty. Morris là core team member thứ 3 của project. Cả ba người đã làm việc và phát hành Netfilter là một phần của Linux Kernel 2.4. Có nhiều thay đổi trong thời gian này, nhiều cộng đồng đã thành lập và giải tán. Nhiều người đã đóng góp vào project, Harald Welte là một người trẻ đã xử lý những hỗn độn trong NAT code.

Vào tháng 11 năm 2001, development workshop đầu tiên của netfilter được tổ chức. Kể từ đó, nhiều lần workshop được tổ chức hơn và có thêm các core member với những đóng góp rất tích cực. Tại lần thứ 2, họ đã quyết định rằng sẽ bầu một người làm chủ tịch, người đó sẽ đưa ra quyết định cuối cùng cho mọi chuyện. Những thành viên không còn đóng góp trong thời gian dài sẽ là thành viên danh dự.

Pablo Neira Ayuso trở thành co-maintainer từ 2011, và tại workshop 2013, anh chính thức được bầu làm người đứng đầu trong nhóm core team.

Note

Mặc dù nftables có những cải tiến trong việc quản lý dòng lệnh bằng command line interface, song đối với những hệ thống lớn, việc system admin gõ từng lệnh để cấu hình rule là không nhiều. Các rule chủ yếu sẽ được viết theo mẫu trên các file sau đó import cấu hình vào. Vậy nên bài viết sẽ nhấn mạnh các yếu tố sử dụng file config.

Info

Các câu lệnh và hình chụp được thực hiện trên lab, OS Rocky Linux 9.4

Chuyển config từ iptables sang nftables

Do cùng thuộc một project, với vai trò đi sau, nftables đương nhiên phải hỗ trợ chuyển đổi từ iptables sang nó. Rule cũ từ iptables có thể dễ dàng chuyển đổi sang nftables rule1 bằng câu lệnh iptables-translate. Ví dụ:

iptables-translate -A OUTPUT -s 10.10.10.24/32 -d 10.10.15.11/32,10.10.25.11/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow call database"
sẽ có kết quả là
nft 'add rule ip filter OUTPUT ip saddr 10.10.10.24 ip daddr 10.10.15.11 tcp dport 3306 ct state new,established counter accept comment "Allow call database"'
'add rule ip filter OUTPUT ip saddr 10.10.10.24 ip daddr 10.10.25.11 tcp dport 3306 ct state new,established counter accept comment "Allow call database"'
Tất nhiên, translate cũng hỗ trợ ruleset từ một file

iptables-restore-translate -f iptables > nf-rules.txt

Ngoài ra còn một số câu lệnh khác được hỗ trợ, sẽ không đề cập thêm ở đây do tác giả thấy không cần thiết.

Warning

Sau khi kiểm thử, nhận thấy rằng các rule được translate có thể không hoạt động giống cách mà chúng hoạt động ở iptables. Kiểm tra lại các rule trước khi active chúng vì nó sẽ drop connection. Hãy cẩn thận nếu không bạn sẽ rơi vào tình trạng tự cắn lưỡi do drop ssh connection.

Phương pháp cấu hình

Bằng kinh nghiệm cá nhân, như đã đề cập ở trên, tôi thấy phần lớn sẽ tập trung rule trong một hoặc một số file, mỗi khi cần thêm/xóa rule, system admin thêm/xóa rule trong các file này. Sau đó restart iptables hoặc dùng chuỗi các dòng lệnh nhằm xóa tất cả rule hiện hữu, thêm toàn bộ rule mới, commit cấu hình hiện tại.

Sau khi tham khảo một số phương pháp cấu hình iptables2 và so sánh với phương pháp cấu hình của bản thân, nhận thấy các phương pháp cấu hình không hỗ trợ nhiều file rule. Hoặc các rule sẽ được viết hết vào 1 file, hoặc sẽ dùng script để load nhiều file rule. Như vậy, ưu điểm của nftables đã rõ ràng hơn khi nó có hỗ trợ nhiều file config thông qua config include.

Bắt đầu cấu hình với nftables

Sau khi cài đặt (hoặc start service đối với các server có sẵn), ta có thông tin của file nftables.service

thong-tin-service

Kiểm tra nội dung file, ta thấy khi start hoặc reload, nftables sẽ flush ruleset và load toàn bộ rule từ file /etc/sysconfig/nftables.conf.

tchi-tiet-service

Sau khi theo dõi file config của file /etc/sysconfig/nftables.conf, nhận thấy nó sẽ include tới các file trong /etc/nftables. Cụ thể là main.nft. Trong main.nft, ta lại thấy nó include các file khác trong thư mục.

Best Practice

Như vậy, best practice có khả năng là:

  • Uncomment dòng include trong file /etc/sysconfig/nftables.conf để nó yêu cầu rule set từ /etc/nftables/main.nft
  • Backup và tạo mới file /etc/nftables/main.nft, trong file này include tới các file config rule chi tiết.
  • Tạo thư mục /etc/nftables/conf.d/ và chứa tất cả các file rule chi tiết. Khai báo từng file trong /etc/nftables/main.nft.

Tiến hành thử nghiệm

Ta sẽ tiến hành cấu hình với những rule cơ bản

  • Chỉ mở kết nối SSH từ một source IP tới server
  • Cho phép ping tới server
  • Established connections được cho phép ở cả hai chain INPUT và OUTPUT
  • Allow traffic loopback và forward
  • DROP các connection khác trên chain INPUT và OUTPUT.

Theo như best practice đã đề cập ở phần trên. ta cấu hình như sau

/etc/sysconfig/nftables.conf
# Uncomment the include statement here to load the default config sample
# in /etc/nftables for nftables service.

include "/etc/nftables/main.nft"

# To customize, either edit the samples in /etc/nftables, append further
# commands to the end of this file or overwrite it after first service
# start by calling: 'nft list ruleset >/etc/sysconfig/nftables.conf'.
/etc/nftables/main.nft
include "/etc/nftables/conf.d/ssh.nft"
/etc/nftables/conf.d/ssh.nft
add table ip connection

add chain ip connection INPUT { type filter hook input priority 0; policy drop; }
add chain ip connection FORWARD { type filter hook forward priority 0; policy accept; }
add chain ip connection OUTPUT { type filter hook output priority 0; policy drop; }

add rule ip connection INPUT ip saddr 10.30.90.40 ip daddr 10.20.90.30 tcp dport 22 ct state new,established counter accept comment "Allow ssh connection from my server" # (1)
add rule ip connection INPUT iifname "lo" counter accept
add rule ip connection INPUT icmp type echo-request counter accept
add rule ip connection INPUT icmp type echo-reply counter accept
add rule ip connection INPUT ct state established counter accept
add rule ip connection INPUT counter drop
add rule ip connection FORWARD counter accept
add rule ip connection OUTPUT oifname "lo" counter accept
add rule ip connection OUTPUT ct state established counter accept
add rule ip connection OUTPUT counter drop
  1. Rule allow ssh from in comming. Because all established accepted, so we don't need create same rule for chain OUTPUT. If you do not have established rule, you must be create one more rule for OUTPUT chain.

Để các rule hoạt động, ta restart nftable bằng câu lệnh systemctl restart nftables. Kiểm tra lại danh sách rule, nft list ruleset, kết quả như sau

table ip connection {
    chain INPUT {
        type filter hook input priority filter; policy drop;
        ip saddr 10.30.90.40 ip daddr 10.20.90.30 tcp dport 22 ct state established,new counter packets 993 bytes 77572 accept comment "Allow ssh connection from my server"
        iifname "lo" counter packets 0 bytes 0 accept
        icmp type echo-request counter packets 0 bytes 0 accept
        icmp type echo-reply counter packets 0 bytes 0 accept
        ct state established counter packets 0 bytes 0 accept
        counter packets 108 bytes 6894 drop
    }

    chain FORWARD {
        type filter hook forward priority filter; policy accept;
        counter packets 0 bytes 0 accept
    }

    chain OUTPUT {
        type filter hook output priority filter; policy drop;
        oifname "lo" counter packets 0 bytes 0 accept
        ct state established counter packets 745 bytes 163284 accept
        counter packets 360 bytes 58317 drop
    }
}

Kiểm tra lại thấy ssh đã vào được server, nhưng các connection tới nginx, httpd đã không còn hoạt động.

Inside the blind box

Lược dịch từ bài viết của Andrej Stender3 và thêm vào các chi tiết của tôi

Netfilter

Netfilter là một framework trong linux kernel. Nó cung cấp các hooks cho phép các packages trong mạng đi qua và xử lý chúng khi các packages này đi qua kernel. Các thành phần khác của kernel có thể đăng ký hàm call back với các hooks này, cho phép chúng kiểm tra các gói tin và tiến hành drop, accept gói tin trong kernel.

flowchart LR
  A(net_device) --> B[Prerouting];
  B --> C{ Routing };
  C --> D[Input];
  C --> E[Forward];
  D --> F(Local Process);
  F --> G(Routing);
  G --> H[Output];
  H --> I[Postrouting];
  I --> Z(net_device);
  E --> I;

Một gói tin nhận được từ network device đầu tiên đi qua Prerouting hook. Định tuyến quyết định chuyện gì sẽ xảy ra và kernel xác định gói tin này có được đưa vào một local process (chuyển tới một port đang listen trên server) hay forward nó tới Postrouting (trường hợp hệ thống hoạt động như router).

Trong trường hợp đầu tiên, gói tin chuyển tới Input hook và đi vào local process. Local process xử lý các tác vụ của chương trình và tạo ra một gói tin (server trả lời message của client) và gửi chúng tới Output hook, đi tới Postrouting hook, cuối cùng gửi ra ngoài thông qua một network device.

Trong trường hợp thứ hai, gói tin chuyển qua Forward hook và đi tới Postrouting hook, cuối cùng gửi ra ngoài thông qua một network device.

Netfilter hook là một tập các hook functions được sắp xếp theo thứ tự ưu tiên. Đối với mỗi gói tin mạng đi qua hook , các hook functions sẽ được gọi lần lượt theo thứ tự mà chúng có trong mảng hook (thứ tự được xác định bởi độ ưu tiên).

nf-hook-flow

Mỗi hook function được yêu cầu trả về một giá trị cho Netfilter, Có một vài giá trị trả về nhưng chỉ có hai giá trị liên quan là NF_ACCEPTNF_DROP. NF_ACCEPT nói với Netfilter rằng nó "cho phép" gói tin đó, tới trạm của hook function tiếp theo (nếu tồn tại). Nếu tất cả các hook function đều trả về NF_ACCEPT, gói tin sẽ đi tiếp quá trình của nó trong kernel network stack. Ngược lại, gói tin sẽ bị "dropped" và nó sẽ không còn di chuyển tới hook function tiếp theo.

Iptables

Iptables tổ chức các rules của nó vào các tableschains. Các tables đơn giản được hiểu là các group để gom các chains có điểm chung lại với nhau. Các rules thật sự nằm trong các chain. Iptables đăng ký các chains này với Netfilter hook như là các hook function. Nghĩa là khi các gói tin đi qua một hook (Prerouting, Input) thì sẽ đi qua các hook function được đăng ký với chúng, và do đó, đi qua các rule được quy định.

Iptables, có một tập hợp các tables đã đã được tạo trước, mỗi tables có một số chains đã được định sẵn. Các chains được đặt tên giống như tên của các hook của Netfilter.

table contains chains
filter INPUT, FORWARD,OUTPUT
nat PREROUTING,INPUT, OUTPUT,POSTROUTING
mangle PREROUTING,INPUT, FORWARD,OUTPUT,POSTROUTING
raw PREROUTING,OUTPUT

Các tables và các chain mặc định này có thể dễ dàng thấy được khi ta cấu hình các rule, và sau đó sử dụng câu lệnh iptables-save để lưu các rule đó vào file. Hình dưới cho thấy, mặc dù trên hệ thống của mình không setup các rule ở các tables mangle, raw thì khi save các rule, iptables vẫn nhận diện các rule mặc định để lưu vào file.

iptables-default-tables

Do các chains trong iptables được đặt tên giống với các hook name trong Netfilter, ta dễ dàng biết được các chain đó sẽ được đưa vào hook nào trong Netfilter flow. Hình dưới mô tả flow gói tin sẽ đi qua tập chác chain của iptables đã đăng ký với Netfilter hook. Có thể thấy rõ chains nào của iptables sẽ được gọi trước, cái nào được gọi sau (thông qua chỉ số ưu tiên màu đỏ, nhỏ hơn thì được gọi trước).

nf-hook-iptables

Như vậy, iptables có các chain tương tác với tất cả các hook trong Netfilter. Và do iptables có pre-defined tableschains, các rule mặc định sẽ luôn được gọi ở các hook function bất kể việc chúng ta có định nghĩa chúng hay không. Hai điểm này là điểm khác biệt lớn và là ý tưởng để tạo nên nftables sau này.

nftables

Nhìn chung, cách mà nftables tổ chức các rules, chains và tables giống như iptables. Các tables tiếp tục chứa các chains và các chains mang rules. Tuy nhiên, như đã đề cập ở phần trên, người dùng phải định nghĩa toàn bộ các tables và chains một cách rõ ràng. Người dùng đặt tên cho các tables và chains khi tạo chúng.

NFtables chia các chains thành hai loại:

  • Base-chains sẽ được đăng ký với Netfilter như là một hook function đã đề cập ở trên và người dùng cần chỉ định hook đó khi tạo chains. Người dùng không bị bắt buộc tạo chains name giống với name của Netfilter hook mà chúng được đăng ký. Điều này vừa thuận lợi nhưng cũng đồng thời gây ra một số nhầm lần
  • Regular chains không được đăng ký với bất kỳ hook nào.

Không giống như iptables phải chia ra nhiều userspace tool để hỗ trợ các thành phần khác nhau (ipv4, ipv6), nftables sử dụng một concept mới gọi là Address Families. Khi người dùng tạo table, sẽ cần phải chỉ định nó được tạo trong Address Families nào. Các Address Families được map với các hook theo danh sách bên dưới.

  • ip: maps to IPv4 protocol hooks / NFPROTO_IPV4 (default)
  • ip6: maps to IPv6 protocol hooks / NFPROTO_IPV6
  • inet: maps to both IPv4 and IPv6 protocol hooks
  • arp: maps to ARP protocol hooks / NFPROTO_ARP
  • bridge: maps to bridging hooks / NFPROTO_BRIDGE
  • netdev: maps to ingress hook / NFPROTO_NETDEV

Ví dụ sau nghĩa là, bạn tạo một table mới tên foo, trong Address Families ip, sau đó tạo một base-chains tên là bar trong table foo, đăng ký nó với Netfilter hook input, chỉ định số ưu tiên là 0

nft create table ip foo
nft create chain ip foo bar {type filter hook input priority 0\;}

Ruleset best practice

Do đã quen thuộc với cách đặt tên các table và chain ở iptables giống với các hook ở Netfilter, mặc dù nftable không bắt buộc, ta cũng nên đặt tên table và chain như vậy để dễ quản lý và vận hành trong quá trình chuyển tiếp.

add table inet filter

# Base chain
add chain inet filter INPUT { type filter hook input priority 0; policy drop; }
add chain inet filter FORWARD { type filter hook forward priority 0; policy accept; }
add chain inet filter OUTPUT { type filter hook output priority 0; policy drop; }

# Regular chain
add rule inet filter INPUT iifname "lo" counter accept comment "Allow connection on loopback interface"
add rule inet filter INPUT icmp type echo-request counter accept comment "Allow ping to server"
add rule inet filter INPUT icmp type echo-reply counter accept comment "Allow reply ping package"
add rule inet filter INPUT ip saddr 10.30.90.40 ip daddr 10.30.90.40 counter accept
add rule inet filter INPUT ct state established counter accept comment "Allow reply package on input chain"
add rule inet filter INPUT ip saddr 10.30.80.40 ip daddr 10.30.90.40 tcp dport 22 ct state new,established counter accept comment "Allow ssh from my admin server"
add rule inet filter INPUT counter drop comment "Drop other input connection"

add rule inet filter OUTPUT oifname "lo" counter accept comment "Allow connection on loopback interface"
add rule inet filter OUTPUT ct state established counter accept comment "Allow reply package"
add rule inet filter OUTPUT counter drop comment "Drop other output connection"

Bên trên diễn dải danh sách rule được sử dụng với cùng yêu cầu thể hiện tại phần thực nghiệm


  1. nftables wiki. Moving from iptables to nftables. 2021. URL: https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables (visited on 2024-10-03). 

  2. SERVER FAULT. Insert multiple iptables rules in critical situations. 2019. URL: https://serverfault.com/questions/980343/insert-multiple-iptables-rules-in-critical-situations (visited on 2024-10-03). 

  3. Andrej Stender. Nftables - packet flow and netfilter hooks in detail. 2022. URL: https://thermalcircle.de/doku.php?id=blog:linux:nftables_packet_flow_netfilter_hooks_detail (visited on 2024-10-14). 

Bức thư gửi lại người đang sống

Tình cờ vào năm 2020, khi xem chương trình "Ký ức vui vẻ", tôi có nghe anh BTV Quang Minh kể câu chuyện về "Bức thư gửi lại người đang sống" được in trong tập hồi ký của cố Thượng tướng Trần Văn Trà. Xúc động vì những câu văn đẹp, mình tìm và thấy trọn vẹn bức thư của các anh. Ba mươi phút đọc những con chữ mà rưng rưng trước các anh. Nói là phần mộ, nhưng là ba chiếc võng treo. Các anh bị thương nặng và biết chắc mình sẽ chết, để lại bức thư gửi người còn sống. Tôi xin trích lại từ Báo Bình Dương1 (chỉ giữ lại nguyên văn nội dung bức thư) làm tư liệu tham khảo cho mình cũng như bạn đọc.

Trích

Chúng tôi:

1) Lê Hoàng Vũ, quê Thái Bình

2) Nguyễn Chí, quê Quảng Ngãi

3) Trần Việt Dũng, quê thành phố Sài Gòn.

Chiến sĩ thuộc Tiểu đội 1, Trung đội “Ký Con” của Trung đoàn BG chủ lực Quân giải phóng miền Nam Việt Nam.

Chúng tôi không biết nên viết một bản báo cáo, một lá thư hay một tường trình vì lẽ rất đơn giản là chúng tôi không biết rằng ai sẽ đọc bản viết này. Nếu đơn vị của chúng tôi có cơ may tìm ra chúng tôi sau trận đánh kết thúc thì đây là bản báo cáo đầy đủ chi tiết về mọi diễn biến trong quá trình thi hành nhiệm vụ của tiểu đội chúng tôi gửi về Trung đoàn BG, về anh Năm "Sài Gòn" và các đồng chí lãnh đạo thân mến của chúng tôi...

Nếu phát hiện ra chúng tôi khi nước nhà đã hoàn toàn tự do, độc lập, thống nhất, sau năm, mười năm kết thúc cuộc chiến tranh, hoặc giả muộn màng hơn nữa sau 50 hoặc 100 năm, thì đây là một bức thư của người đã ngã xuống trên một mảnh rừng của đất nước thương yêu gửi lại người đang sống.

Ôi, giờ đây thiên nhiên quanh chúng tôi tràn đầy không khí thanh bình, cây cối điểm những chồi non mơn mởn, vạn vật đang dạt dào nô nức sang xuân. Làn gió nhẹ lướt qua đang thì thầm trong muôn ngàn kẽ là như mách bảo chúng tôi rằng có lẽ phải đến một ngày hòa bình nào đó những dòng chữ này mới được về trong lòng đồng chí, đồng bào. Còn bây giờ chúng tôi cố động viên nhau ráng sống thêm một số giờ nữa cho bản viết hoàn thành, có đầy đủ ý kiến của ba chúng tôi. Phải, chúng tôi đã sống, chiến đấu và hoàn thành nhiệm vụ khiêm nhường nhất của chúng tôi, cũng nhờ cả tiểu đội chúng tôi hợp lực lại. Giờ đây tám đồng chí chúng tôi đã chết, họ không chết, họ chỉ ngừng hoạt động và chuyển những hoạt động lại cho chúng tôi sống và hành động đến giờ này. Rồi chưa biết đích xác lúc nào, mấy giờ nữa, ngày mai, hay thêm một đêm nữa, biết đâu chúng tôi cũng sẽ ngừng mọi cử động trong lúc vạn vật, xem kìa, đang rạo rực cảnh xuân của đất trời. Chiến tranh mà. Nó định đoạt vận mệnh con người một cách mù quáng, kinh khủng. Nhất định chúng tôi sẽ phải hoàn thành bản viết này - đó là ý chí cuối cùng - để vẹn tròn nhiệm vụ của mình, vẹn tròn cuộc đời của những chàng trai thời đại mà Tổ quốc đang cần được giải phóng, dân tộc đang cần phải đứng lên.

Chúng tôi xin viết, viết tất cả những gì đã xảy ra đối với tiểu đội chúng tôi khi thi hành nhiệm vụ, tất cả những suy nghĩ của chúng tôi trong giờ phút cuối cùng này

Thế là trận đánh của trung đoàn kết thúc. Một trận tiêu diệt gọn tiểu đoàn quân xâm lược, quân số chúng bằng cả trung đoàn chúng tôi. Thương vong ta không thiếu nhưng chiến lợi phẩm và tù binh thì nhiều lắm.

Đúng ba giờ sáng, chuông điện thoại riêng của trung đội reo - Chưa bao giờ trung đội lại có riêng một máy điện thoại còn gắn vào một máy tăng âm có loa nghe chung liên lạc trực tiếp với trung đoàn trưởng như vậy. Rõ ràng trung đội của chúng tôi đang giữ một trách nhiệm quan trọng, cả trung đội vây quanh đều nghe rõ rành rọt tiếng của anh Năm “Sài Gòn”:

  • A lô! “Sài Gòn” đây, Trung đội “Ký Con” đó phải không?

Trung đội trưởng báo cáo, tất cả trung đội đang tập trung sẵn sàng và đều nghe rõ tiếng đồng chí.

Anh Năm “Sài Gòn” nói:

  • Chào tất cả các cậu, trung đoàn chúng ta có thể thắng to nếu phần cuối cùng này của trận đánh trót lọt mà phần này là do hành động dũng cảm và mưu lược của các cậu quyết định. Hãy triển khai thực hiện ngay kế hoạch “Mưa rừng” đã định. Toàn trung đoàn tin tưởng và chờ chiến công xuất sắc của các cậu. Chúc toàn thắng!

Chúng tôi hiểu rõ nhiệm vụ nghi binh thu hút địch cho trung đoàn rút lui an toàn - Trung đội lập tức chia làm ba tiểu đội đi ba hướng. Tiểu đội 1 chúng tôi có trung đội trưởng cùng đi gồm 11 người, hành quân nhanh về hướng đông bắc. Tiểu đội trưởng tự mang đài vô tuyến điện thoại PRC 10 lấy của địch. Tới đường 16, chúng tôi triển khai làm các vệt đường hành quân giả rồi chiếm lĩnh mặt đường, mỗi người cách nhau cỡ 20 mét. Dùng quẹt lửa được trang bị, thỉnh thoảng chúng tôi đánh lửa rồi tắt, mỗi lần đánh lửa lại xê dịch chỗ khác, giống như rất nhiều người. Tiểu đội trưởng chốc chốc lại nói vào máy PRC 10: "Đây trực ban tác chiến tham mưu trung đoàn, tiểu đoàn X qua mau lên... tiểu đoàn X qua mau lên, dồn đội hình lại... rồi... tiểu đoàn pháo các anh ì ạch quá, không được cản trở đơn vị Y đi sau đội hình các anh đó, nghe rõ chưa, đơn vị Y đó..."

Một thanh niên thắc mắc:

  • Sao lại xưng và nói thế? Có nghĩa gì?

  • Cốt cho địch bắt và nghe thấy mà - Tín giải thích.

“Một chiếc trực thăng trinh sát của địch quần quật cánh quạt bay vòng trên đầu chúng tôi. Tất cả quẹt đều thổi bật lửa. Tiểu đội trưởng lại dùng máy nói rời rạc, ngắn gọn với từng đơn vị trong trung đoàn. Trực thăng qua khỏi, chúng tôi lại nháng lửa lên. Rồi hai trực thăng nữa đến, chiếu đèn pha sáng rực con đường 16 từng lúc. Lại một OV 10 và 1 RC-47 đến lượn vòng. Chúng tôi rời đường, tách lên phía bắc, vào bìa rừng, đi sâu vài chục thước lại nháng lửa - Tiểu đội trưởng đóng vai trực ban tác chiến tham mưu trung đoàn, thúc giục các đơn vị đoàn tải tù binh đi nhanh. Từ bìa rừng chúng tôi nổ mấy loạt đạn vào máy bay trực thăng trinh sát. Hai bên đường 16, chúng tôi tạo ra nhiều dấu vết rạp cỏ, gãy cây con và xóa dấu vết vội vàng khi qua đường làm rớt lại những ga-mên, túi đạn, vải bạt lấy từ trong cụm Mỹ vừa tiêu diệt.

Một đoàn trực thăng vũ trang bay tới bắn xối xả, nã rốc két vào rừng phía bắc đường, sát sạt bên chúng tôi. Chẳng may chiến sĩ trong tiểu đội bị thương ở đầu và mông. Băng bó xong còn dìu đi được. Trung đội trưởng ra lệnh cho chúng tôi nhanh chóng hành quân theo hướng đông bắc. Vừa chạy được một cây số thì 4 khu trục trên thả bom vào nơi chúng tôi vừa đi khỏi. Cây đổ, mảnh bom và đất đá bay tứ tung, lần này không ai việc gì, chúng tôi tiếp tục đi nhanh hơn. Lại 4 khu trục nữa lên thả bom, thi đua với một đoàn 12 trực thăng vũ trang quần bắn hỏa tiễn, nã đại liên. Hai trực thăng chiếu đèn pha soi sáng nhưng rừng cây che kín, chúng chẳng phân biệt gì được. Chúng tôi đã nghe từ xa vọng lại ầm ầm tiếng của xe cơ giới, xe tăng. Chắc chắn, chúng đã bị lừa, tưởng trung đoàn rút lui về Chiến khu Đ nên bộ binh và xe tăng truy kích.

Chúng tôi vạch rừng đi nhanh hơn theo hướng đã định. Trời đã sáng. Mặt trời vừa vượt lên chiếu những tia nắng ban mai êm dịu xuống khắp rừng. Tiếng chim gọi nhau ríu rít. Một bầy gà rừng đang ăn nghe tiếng chân chúng tôi, bay loạn xạ tứ phía. Anh Thành trung đội trưởng, người chiến sĩ lão luyện, nói với chúng tôi: ta đã thành công thu hút địch, nhưng chưa phải đã hoàn thành nhiệm vụ, không được để chúng lộn trở về sau khi không tìm ra bóng dáng anh giải phóng ở khu vực này. Phải làm cho chúng tưởng rằng trung đoàn đã vượt lên phía đông bắc rồi, chúng đã vồ mồi hụt, để lại tiếp tục truy kích ít nhất trong suốt ngày hôm nay. Anh vừa nói dứt thì ngay phía bắc chúng tôi hàng loạt bom nổ liên hồi. Loạt bom nổ xong mới nghe tiếng may bay rầm rầm bay qua đầu. Thì ra địch cho B.52 thả bom chặn phía bắc khu rừng kết hợp với bọn truy kích từ phía nam lên. Hết đợt B.52 này đến đợt khác, rừng bị tàn phá thành một vệt dài, chiều rộng của vệt có đến vài chục mét. Đất bị cày xới lên, đoạn trắng bệch, đoạn đỏ lòm. Cây cối la liệt nằm ngang, nằm dọc. Bụi khói quyện nhau ánh chớp, tiếng nổ, tiếng cây ngã ầm ầm. May mà không ngay đúng chỗ chúng tôi nhưng trên đầu chúng tôi một số cành, ngọn cây, bị mảnh bom tiện đứt nghiến, rớt xuống rào rào. Mặt đất rung chuyển dữ dội. Chúng tôi có cảm giác như ngồi trên võng. Có tới vài chục chiếc B.52 đã bay qua rền vang đều đều. Trung đội trưởng ra lệnh giãn rộng đội hình và hành quân nhanh, vượt qua vệt rừng bị tàn phá. Đường đi bây giờ rất gay go, đất chỗ lồi chỗ lõm, từng hàng lỗ bom sâu hoắm và giữa những lỗ bom thì thành những bờ cao, lởm chởm nào đá nào các tảng đất lớn. Cây rừng to nằm ngang dọc, có chỗ chui qua được, có chỗ phải leo lên thân cây. Thế mà máy bay trinh sát, trực thăng, soi mói, sẵn sàng nổ hàng loạt rốc két vào cái gì lay động. Còn hai thương binh ngày càng yếu sức phải mất hai người dìu mới đi nổi nhưng rất mệt nhọc. Tiểu đội trưởng cho phép bỏ bớt trang bị, nào xẻng, cuốc, quần áo... trừ súng, đạn, lựu đạn, cho nhẹ người đi mau. Nhưng cũng không mau hơn bao nhiêu, nhiều lần phải nằm im để tránh máy bay trinh sát phát hiện. Qua đến gần hết vệt bom, thì từ đông sang tây lại một số đợt B.52 nổ chồng mí lên vệt cũ và mở rộng vệt về phía bắc. Bây giờ thì chúng tôi bị bom trùm lên trọn gói, mỗi người chỉ kịp nhanh nhất nằm bẹp xuống hố bom cũ, chỗ trũng, nép vào thân cây to.

Đất đá văng tứ tung, rơi đập vào đầu, vào lưng chúng tôi, đau điếng. Khi B.52 qua rồi chúng tôi đứng dậy phủi bụi đất và tìm nhau. Tiểu đội trưởng cùng bốn chiến sĩ nữa lần lượt đứng lên. Người nào cũng rờ khắp thân mình xem có bị thương không, rồi vội đi tìm các đồng chí mình. Gặp đồng chí đầu tiên nằm sấp trên mặt đất giữa hai hố bom bị thương ở đầu, không động đậy. Sờ vào tim không còn đập, ngực không còn hơi thở, mép và mũi có những vệt máu chảy xuống má, chân tay đã lạnh, nhưng khắp mình không có một vết mảnh bom nào, chỉ quần áo thì rách tươm. Có thể đồng chí bị sức ép của bom quá mạnh mà người thì đã yếu. Người thứ hai, trời ơi, lại là trung đội trưởng Thành của chúng tôi, đồng chí nằm nghiêng trên bờ một hố bom, nửa người bị nát bét, may mà còn nhìn ra được dáng hình và nửa mặt bên kia. Thế là tiểu đội chúng tôi mất đi người chỉ huy, người đồng chí nhiều kinh nghiệm chiến đấu nhất và cũng là người thạo khu rừng này nhất. Người thứ ba là Tựu, người vạm vỡ nhất trong tiểu đội. Tựu nằm bất tỉnh dưới một cành cây, một cánh tay bị nát và gãy đứt, chỉ còn miếng thịt mỏng và miếng da nối liền với vai trái. Khắp mình bị cây đập, người bị nhiều vết sứt, vết bầm, quần áo tả tơi. Tôi vừa tới thì Tựu mở mắt ra nhìn ngơ ngác như không hiểu sự việc gì xảy ra. Tôi đỡ Tựu dậy, tay trái lủng lẳng, người rã rời. Nhưng may quá chỉ có vết thương cánh tay là nặng. Sau khi đã tỉnh, biết cánh tay trái dập nát không còn tác dụng, Tựu rút dao găm bên mình ra cắt bỏ luôn rồi mới để tôi băng bó giúp. Đồng chí thứ tư gặp được là Sơn, không hề gì đang giúp băng vai mới bị thương cho Hùng, đã bị thương mông trước đây. Như vậy là còn một đồng chí nữa. Đó là đồng chí Bảy Đước quê Cà Mau, là người lớn tuổi nhất trong tiểu đội chúng tôi, người luôn tự hào về quê hương của mình. Bảy Đước thường kể cho anh em nghe những câu chuyện vui của ông Ba Phi vùng U Minh làm ai cũng thích thú. Bảy Đước là con người luôn lạc quan, luôn sẵn sàng giúp đỡ mọi người và thường chỉ nói đến một ước mơ: Hòa bình rồi, nước nhà giải phóng rồi, tôi sẽ xin được đi khắp đất nước để nhìn tận mắt mình bà con, làng mạc, cây trồng, đất đai. Tôi mong tất cả mọi miền đều tốt như ở rừng U Minh, lúa, cá nhiều như ở Cà Mau chúng tôi và cây gỗ nhiều như ở miền Đông này và mọi người như anh em trong một gia đình hòa hợp. Chưa tìm được Bảy Đước, chúng tôi đã nhớ đến những câu chuyện anh kể, đến ước mơ mà anh luôn nhắc tới. Chúng tôi chia nhau đi khắp nơi, đến từng hố bom. Cuối cùng chúng tôi tìm ra cây súng tiểu liên của Bảy Đước ở một gốc cây đổ, súng bị cong vẹo. Những mảnh vải ba lô, những mảnh của bộ quần áo độc nhất bằng ni lông mà anh thường bận quanh năm, từng mảnh rách mắc vào cành cây ngã ở một hố bom. Chúng tôi đoán Bảy Đước đã phải chịu cả một quả bom. Thân anh không còn lấy một mảnh, đã trở thành bụi để bón cho đất miền Đông.

Mặt trời đã xế về tây. Chúng tôi vội gom các đồng chí đã chết chôn chung gần một gốc cây lớn chưa bị trốc, những cành lá gãy trơ trụi, giữa vệt tàn phá của B.52. Chúng tôi khắc ba tên vào gốc cây, tuy chỉ chôn được có hai thây đồng đội. Xương thịt của anh Bảy Đước cũng ở đây thôi, chỉ khác là rải rác khắp cùng trên mặt đất mà không phải ở dưới một huyệt nào. Thực tình chúng tôi nghĩ rằng anh Bảy đã chết rồi thì những cái còn lại là trách nhiệm của những người đang sống. Chết như thế nào để cho năm tháng đã sống được gọi là sống, đời người dù 20 hay 70 hay 80 tuổi vẫn chỉ là khoảnh khắc. Cái quan trọng là cái khoảng đời mình dù dài hay ngắn có cái gì để mọi người chứng nhận rằng đã có một con người tồn tại...

Chúng tôi tập hợp đi tiếp về phía đông bắc. Còn lại tất cả 8 người, trong đó có 2 là thương binh mà mọi người phải chia sẻ thêm một phần sức lực để dìu đi. Các đồng chí thương binh muốn từ chối tất cả sự giúp đỡ. Không muốn tiểu đội còn ít ỏi, bị mệt nhoài, lại phải gánh thêm gánh nặng “Chúng tôi không là gì cả, đừng phí thêm sức của tiểu đội”. Anh em thương binh nói vậy.

Các đồng chí đó nghĩ cũng đúng. Bản thân chúng tôi mỗi người không là gì cả đối với vận mệnh của dân tộc. Đừng nghĩ đến mình quá trong những giờ phút lịch sử này.

Các đồng chí thương binh nghĩ như vậy, nhưng chúng tôi thì không thể như vậy. Nghĩa cả có nên được là phải do sự cộng sức của mọi người: “Đông có mày, tây có tao” mà. Chúng tôi đã cùng sống chết có nhau, không thể lúc khỏe thì khăng khít, mà lúc bị thương, kiệt sức thì “bay chết mặc bay”. Bản thân mình khi cần sẵn sàng hy sinh không do dự, nhưng phải biết nâng niu quý trọng từng sức lực nhỏ còn lại của mỗi người. Sống có nhân nghĩa, có thủy có chung, vì bè vì bạn là lẽ sống của người Việt Nam từ ngàn xưa như vậy. Chúng tôi lại nhớ đến lời Bác Hồ: “Nhân dân ta từ lâu đã sống với nhau có tình có nghĩa. Từ khi có Đảng ta lãnh đạo và giáo dục, tình nghĩa ấy càng cao đẹp hơn, trở thành tình nghĩa đồng bào, đồng chí, tình nghĩa năm châu bốn biển một nhà”. Các đồng chí thương binh ơi! Chúng tôi không thể bỏ bạn bỏ bè nửa chừng. Hãy để chúng tôi mang hết súng ống đồ đạc cho các đồng chí, dìu các đồng chí đi, dù cho chúng tôi có kiệt sức thì đến lúc nào đó chúng ta cùng nằm xuống trên mảnh đất thân yêu này

Tiểu đội trưởng ra lệnh. Đến rừng chúng ta còn phải nhử địch cho chúng đuổi theo đúng như anh Thành, trung đội trưởng kính yêu đã chỉ thị, giữ địch ít nhất hết ngày nay. Kìa, khu trục, trực thăng đã thả bom bắn hỏa tiễn khắp khu rừng giáp với vệt B.52 rồi. Nếu kiểm tra không thấy dấu vết gì của trung đoàn chúng ta, chúng lại quay về đuổi theo hướng khác thì không hay tí nào. Này, chúng ta hãy ráng hết sức đi nhanh hơn, vượt “Sông Bé”. Đường đi thật là gian nan nhưng không thể tránh ngã khác được cứ phải trèo lên tụt xuống lúc thì gò đất lúc thì thân cây, cành lá chằng chịt. Thế nhưng phải đi nhanh và phải dìu thương binh. Nhưng rồi mọi người cũng đã qua được hết. Lại vượt rừng bỏ xa khu vực này để bảo đảm an toàn hơn. Nhìn đất đai, cây lá, đồng chí Sơn reo lên “Sắp đến bờ sông Bé rồi”. Sơn quê xã Phước Sang, huyện Phú Giáo, nhà nghèo, từ nhỏ đã sống nhờ rừng. Vì vậy, đồng chí thuộc rừng miền Đông như thuộc từng đường mòn, bụi cây trong xóm mình sinh đẻ. Khi trung đoàn cần hành quân đến bất cử địa điểm nào ở nguồn sông Đồng Nai hay nguồn sông Bé và bất cứ xuất phát từ đâu, Sơn đều có thể cắt rừng đưa đơn vị đến nơi chính xác theo đường gần nhất. Anh có thể kể rành rọt đâu có bàu nước, suối con, đâu có sườn núi cao, có khe hẻm khó qua. Tuyệt nhất là anh biết cách sống ở rừng bằng các loại lá cây thế lương thực. Anh biết ở vùng nào có trái cây nuôi sống như trái trám, trái gùi, xoài mút... ở đâu có củ mài, củ chụp hoàn toàn có thể thay cơm gạo, anh còn nhớ rõ các “Xóm voi”, “Xóm heo rừng”, “Nhà nai”, “Bàu sấu”... Nhìn lá nhìn thân cây, anh biết ngay đó là loại gỗ quý gì, cỡ bao nhiêu tuổi... Tiểu đội chúng tôi từ lâu đã có những bữa ăn thịnh soạn thực sự nhờ anh biết cách bắt chim cò ngãng, một loài chim sống rất nhiều trong rừng toàn miền Nam nước ta, lớn bằng chim bồ câu nhưng thịt chắc và nhiều hơn. Khi có lệnh nghỉ, anh liền tách ra khỏi hàng quân vào rừng vài ba mét, giăng lưới, thổi. Trong thời gian ngắn ngủi ấy, anh cũng bắt được có khi 5, 6 con, ít ra cũng được vài ba con. Hành quân đến địa điểm cắm trại là có một bữa ăn ngon và bổ cho tiểu đội rồi và còn chia cho tiểu đội khác nữa. Anh Thành, trung đội trưởng cũng rành như vậy nhưng nay thì anh đã nằm lại dọc đường. Giờ đây cả tiểu đội chúng tôi dựa vào Sơn như cột trụ.

Quả thật đi một đoạn nữa chúng tôi đến bờ sông. Mùa này, nước cạn lòng sông hẹp hơn mùa mưa nhiều, nhưng hai bờ lại sâu hoắm và nước thì chảy xiết. Chúng tôi vội vã chặt cây rừng nối lại cho dài và buộc vào một gốc cây sát mặt nước ở nơi hẹp. Đồng chí Sơn người còn khỏe nhất trong chúng tôi tình nguyện lội qua trước để cột đầu dây bên bờ sông phía bắc. Sơn đi ngược dòng nước một đoạn rồi băng mình lội qua, một tay giữ vững đầu dây. Anh đã buộc được dây, giúp chúng tôi lần lượt bám vào, lội qua với thương binh và đồ đạc. Tiểu đội trưởng lại thúc giục mọi người rời bờ sông ngay và tiếp tục đi nhanh. Cách bờ khoảng non cây số, chúng tôi lại dừng lại, giở trò lừa địch. Trời đã xế chiều, mặt trời đã bắt đầu xuống khỏi ngọn cây, xa xa vẫn vọng lại tiến nổ ì ầm của bom và pháo. Chúng tôi vội vã gom lá cây khô mục lại thành 20 đống rải rác một vùng rộng, tương ứng khu vực đóng quân của một trung đoàn. Mặt trời đã lặn hẳn, bóng tối bắt đầu tràn lan khắp khu rừng âm u. Tiểu đội trưởng ra lệnh nổi lửa. Từng vòi khói tuôn lên thẳng đứng vụt khỏi ngọn cây rồi tỏa theo hướng gió. Rõ ràng như có 20 bếp đại đội đang thổi cơm chiều. Chúng tôi lại tập hợp lại hành quân hàng dọc, sát nhau, về hướng đông bắc, dẫn đầu là đồng chí Sơn. Trời tối mịt, trong rừng lại càng khó nhận những gì xung quanh mình. Tiểu đội trưởng luôn thúc giục đi nhanh, cố rời bỏ vùng “Hạ trại của trung đoàn”, lúc này tất cả chúng tôi đều mệt mỏi rã rời. Ngày nay đã có cái gì vào bụng đâu, nhưng không ai còn nghĩ đến cái ăn. Lương thực đều bị mất hết rồi, có gì đâu mà ăn. Nước uống may ra còn, tranh thủ lấy đầy bi đông khi qua sông Bé. Chúng tôi vừa đi được một đoạn thì đã nghe OV-10 và RC-47 bay vù vù trên đầu. Chúng thính thật và đích thị là chúng quyết tâm đeo theo trung đoàn để gỡ lại trận thất bại. Hai máy bay trinh sát không những bay trên vùng có khói mà còn bay rộng ra khỏi cả nơi chúng tôi đang đi. Những chiếc trinh sát này dai như đỉa đói, chúng bám mục tiêu hàng mấy giờ liền và bắn cũng rát lắm.

Chúng tôi mải miết đi, biết rằng ngày càng xa nơi các đống rác cháy càng an toàn, nhưng vẫn lo một nỗi là có thu hút được địch không. Đường đi mỗi lúc một khó, phải leo lên những dốc ngày càng cao. Xuống khỏi một dốc đứng, qua một nơi trũng rồi leo lên một sườn dốc thoai thoải, chúng tôi lọt ra một cái trảng trống chỉ khoảng 400 mét nhưng dài có đến 3 cây số. Một làn gió mát lạnh làm cho chúng tôi tỉnh táo đôi chút. Sơn cho biết đây đã cách bờ sông Bé độ 13 cây số rồi. Tiểu đội trưởng lẩm nhẩm tính, gật gù đồng ý. Anh ra lệnh cho tiểu đội ngồi nghỉ. Vừa mệt, vừa buồn ngủ, vừa đói lại vừa khát, ai nấy ngồi thả phịch xuống cỏ một cách khoan khoái. Đã 3 giờ sáng, hôm nay không có trăng nhưng bầu trời cao đầy sao cũng giúp chúng tôi nhìn thấy lờ mờ không xa lắm quanh mình. Việc đầu tiên chúng tôi phải làm là săn sóc ngay cho thương binh. Tập trung hết băng cá nhân lại, chúng tôi bắt đầu thay băng cho các đồng chí và còn xé áo quấn chặt những vết thương nặng ra nhiều máu. Cánh tay của đồng chí Tựu cụt đến gần vai, bị nhiễm trùng sưng to lên. Đó là vết thương làm Tựu đau nhức nhiều hơn các vết khác. Người anh lực lưỡng là vậy mà nay đi muốn hết nổi vì vừa đau lại vừa đói. Còn Hùng, bị sốt cao, bả vai bị thủng và bể xương, máu luôn rỉ ra, mông thì không nguy hiểm nhưng cũng bị sưng xuống tận gần đầu gối. Mặt Hùng đanh lại, răng cắn chặt chịu đựng, không thốt một lời nào. Bây giờ ai nấy mới cảm thấy đói quá, đói như cào cấu trong ruột, nhưng không có cái gì để ăn. Sơn xin phép tiểu đội trưởng đi kiếm lá rừng ăn được. Đêm tối không thấy rõ nhưng Sơn có nhiều kinh nghiệm nên mò mẫm đi, khoảng nửa tiếng đã đem về một ôm lá non đủ loại. Sơn giải thích từng loại lá rành mạch khiến ai cũng tin tưởng. Chúng tôi chỉ nhớ được mấy tên như lá két, lá trâm lan, lá bứa, lá bếp, lá kim cang, lá búng (ngon như giá đậu xanh)... Chúng tôi nhai ăn một cách ngon lành, như dự một bữa tiệc thịnh soạn. Vị lá cây vừa chua chua, chát chát, vừa rất tươi mát, ăn vào làm tỉnh cả người, ruột đỡ cồn cào và cũng đỡ khát nước. Nhưng Tựu và Hùng không ăn gì được cả. Chỉ uống nước thôi, mà uống cũng phải tiết kiệm, không dám cho uống nhiều, chúng tôi thì không được uống để dành cho thương binh, vì theo Sơn, ở đây không có nguồn nước nào nữa. Anh nói:

  • Cách đây không xa lắm, có một vùng có nhiều củ chụp, tới đó sẽ đào lên và tha hồ mà nấu cháo ăn.

  • Sơn giải thích, ta sẽ chặt tre và làm những cái chụp mà đào. Củ rất dài, cắm sâu dưới đất, đào đỡ thì mỗi dây cũng lay lên được nửa củ đủ nấu cháo rồi. Qua đó một chút có một con suối nhỏ quanh năm có nước, ta lấy uống và dự trữ đem theo. Nói đến cháo và nước làm ai nấy mặt sáng hẳn lên, đầy hy vọng. Chúng tôi nghĩ như vậy đã hơn một tiếng đồng hồ, đồng chí tiểu đội trưởng vừa ra lệnh, vừa động viên: “Đứng lên! Các đồng chí, ráng sức đi theo đồng chí Sơn đến rừng củ chụp và suối nước trong. Ta sẽ dừng lại đấy lâu hơn để nấu cháo, các đồng chí thương binh rất cần cháo!”.

Thế là tất cả đều gắng sức đứng dậy, người đã đỡ mệt hơn trước. Nhưng tức thì, không ai bảo ai, mọi người đều nằm mọp ngay xuống - từng tràng bom nổ dữ dội đi đôi với những làn chớp kinh khủng của B.52. Tiếng tiểu đội trưởng reo lên: Địch lại mắc mưu ta rồi. Chúng dội bom xuống “nơi đóng quân của trung đoàn!”. Thế là chúng tôi đứng dậy nhìn về hướng “tác phẩm” của mình ở bờ bắc sông Bé. Từng đợt, từng đợt B.52 trùm cả khu vực các đống lửa. Chúng tôi quên cả đói, quên cả mệt, reo hò hân hoan. Như vậy là chúng tôi đã thành công, đã làm tròn nhiệm vụ giao phó. Hẳn giờ đây, toàn trung đoàn ta đang chuẩn bị rút kinh nghiệm về trận đánh tại nơi đóng quân an toàn.

Chúng tôi lại đi, rời trảng trống vào rừng, rừng ở đây lớn quá, cây cối còn tốt tươi, chưa thấy có dấu vết gì của khai thác, cũng chưa có dấu vết gì của chiến tranh. Chúng tôi nghĩ, hòa bình trở lại thì cây, gỗ này quý giá cho chúng ta biết dường nào. Giờ thì đối với chúng tôi, nó chưa có tác dụng gì. Rõ ràng mọi thứ trên đời phải đặt vào đúng chỗ và sử dụng đúng lúc thì mới rõ chân giá trị. Giờ đây đối với chúng tôi, một gáo nước trong, vài ba củ chụp đã là hạnh phúc biết bao, là mục đích tôi cần cho cuộc sống của đời chiến sĩ rồi

Vừa suy nghĩ, vừa lê tấm thân rã rời, vừa dìu từng bước các bạn thương binh, chúng tôi hầu như không đo được không gian cũng không tính được thời gian. Lên đến đỉnh một ngọn đồi, thấp thôi, cây cối thưa thớt thoáng mát, cơn buồn ngủ đã xâm chiếm chúng tôi không gượng lại nổi. Một đồng chí vừa đi vừa ngủ lúc nào không biết, va đầu vào một gốc cây, dội ngược lại ngã xuống. Mọi người tỉnh hẳn, vì ai cũng chập chờn. Tiểu đội trưởng ra lệnh ngồi nghỉ. Một đồng chí nào đó vội hỏi Sơn có còn xa nơi rừng củ chụp không. Sơn đáp: “Còn một đoạn đường nữa thôi nhưng ta đuối quá rồi đã đi được bao nhiêu đường đất đâu”. Tiểu đội trưởng nhắc anh em nghỉ cho đỡ mệt nhưng không ai ngủ vì ngủ thì không dậy nổi nữa để đi.

Trên đầu chúng tôi bầu trời cao vút đầy sao. Im lặng quá! Thanh bình quá! Chúng tôi có cảm giác như vừa rời khỏi vùng có chiến tranh. Nhưng đây chỉ là giả tạo. Quả nhiên chúng tôi ngồi chưa đến 15 phút thì từng đợt dội bom của B.52 bao trùm lên cả khu vực đồi chúng tôi đang nghỉ. Nước Mỹ giàu vũ khí bom đạn thật. Chỉ có một tiểu đội của chúng tôi thôi mà Mỹ đã dùng bao nhiêu trực thăng, khu trục, máy bay chiến lược, thả hàng trăm tấn bom, chưa kể các loại đạn khác, rồi pháo sáng, bộ binh, xe tăng, truy kích... Đợt bom cuối cùng chấm dứt không biết bao lâu, chúng tôi mới tỉnh lại và thế là chỉ có 3 chúng tôi: Vũ, Chí, Dũng mà người nào cũng thương tích đầy người, may mà còn sống. Tiểu đội trưởng và các đồng đội chúng tôi trong đó có Sơn, người biết khu củ chụp và suối nước trong đều đã hy sinh. Lúc chúng tôi gắng gượng dậy được, điểm lại quân số là lúc mặt trời đã lên khỏi ngọn cây. Có lẽ những tia nắng ấm le lói buổi sáng đã giúp chúng tôi tỉnh dậy và chuyển vào máu thịt chúng tôi một ít sinh khí của đất trời chăng. Dầu sao thì chúng tôi vẫn còn sống, ngồi dậy gần nhau và cố lê lại sát bên nhau.

Thời gian trôi qua chậm chạp vô ngần hoặc giả chúng tôi trở thành chậm chạp đáng sợ. Không biết bao nhiêu lâu ngồi đó, mân mê săn sóc các vết thương của nhau rồi chúng tôi mới cố dìu nhau đứng dậy, cố dìu nhau đi tìm đồng đội. Giờ đây mỗi người chúng tôi có lẽ chỉ còn bằng không đầy một phần ba con người nên cả ba phải dựa vào nhau mà chưa bằng được sức một người. Rõ ràng giá trị sức lực con người của chúng tôi thấp đi thảm hại. Mãi chúng tôi mới gom tản mát từng bộ phận thân thể chừng bằng ba con người đồng đội chúng tôi, số khác không còn tìm đâu ra. Chúng tôi lại chôn cả vào một hố bom đào sẵn dưới một gốc cây to bị trốc lên. Bây giờ mà bảo chúng tôi đào một cái huyệt thì thật quả là quá sức rồi. Và lần này cũng không khắc được tên các đồng chí vào thân cây nữa - gốc cây hãy làm dấu giùm là 5 đồng đội chúng tôi đã nằm ở đây vậy.

Lo cho đồng đội xong, chúng tôi lo cho mình. Nhưng lo gì đây, bông băng không còn, quần áo rách tả tơi, vết thương nhiều quá, thôi thì mặc thế. Chỉ vết thương nào chảy máu nhiều thì dùng một ít mảnh quần áo còn lại buộc chặt cho đỡ mất máu thôi. Bây giờ thấy mệt ghê gớm, khát nước không sao tả được. Người như khô cháy cả ruột gan. Nhìn vào đâu, trên thân cây, lá cây, quanh bờ bụi, đất, đá, đều mơ có nước. Bây giờ chúng tôi mới thấy hết cái khổ sở của một con người mất nước mà không tìm đâu ra nước. Đồng chí Chí nói theo cách chơi chữ: "Chúng ta mất Nước, khát Nước nên đi chiến đấu để giành lại Nước và giờ đây chúng ta khát nước quá nên việc trước tiên là phải lo tìm cho có nước". Chúng tôi lại dìu nhau, dựa vào nhau đi kiếm cái suối chảy quanh năm, đâu gần đây mà đồng chí Sơn khi còn sống đã dẫn chúng tôi đi. Từng bước vịn vào nhau, vịn vào cây rừng, có lúc bò qua một gò đất, leo qua một cây ngã, chúng tôi cứ đi mặc dầu không biết phương hướng nào, đi về đâu. Cái khát kéo chúng tôi đi, đòi chúng tôi phải đi để tìm cho được nước. Thỉnh thoảng chúng tôi ngất đi, nằm lịm trên mặt đất, không biết bao lâu, rồi lại tỉnh dậy, rồi lại đi. Ngày và đêm không thành vấn đề đối với chúng tôi nữa. Ngày cũng thế mà đêm cũng thế thôi. Chỉ có ngất lịm nằm đó rồi tỉnh dậy, lê đi. Và cũng không biết bao nhiêu lần ngất đi để mà tỉnh nữa.

Rồi một hôm nào đó không biết làm sao chúng tôi đưa nhau đến được khu rừng này và cảm thấy tỉnh táo lạ lùng. Khu rừng đẹp đẽ xanh tươi, có tiếng chim hót, có tiếng sóc nhảy từ cành này qua cành khác. Mặt trời lên cao, ánh nắng xuyên qua kẽ lá từng tia, từng giọi rơi xuống mặt đất, rơi vào chúng tôi. Nhờ tỉnh táo lại, chúng tôi trao đổi với nhau. Không còn hy vọng tìm ra nước. Đã nhiều ngày không có gì ăn. Máu đã mất nhiều, những cơn sốt thường xuyên hành hạ từng người. Chúng tôi cũng không thể hiểu sao lại còn sống đến giờ này. Cái sống quả thật cũng dai dẳng kỳ lạ. Tự mỗi người chúng tôi thấy không còn sống được bao lâu nữa, quá kiệt sức rồi. Vậy đi nữa để làm gì? Giả dụ có tìm được củ chụp cũng không đủ sức mà đào, có tìm được nước uống thỉ phỏng có cứu sống được để thoát khỏi khu rừng này, không biết nó nằm ở đâu để trở về với đồng đội, đồng bào. Vậy thì ta dừng lại ở đây, chọn khu rừng đẹp đẽ này làm nơi an nghỉ cuối cùng. Biết dừng lại kịp thời, đúng lúc, mới là con người trí dũng. Nếu cứ tiến lên chạy theo cái khát đi tìm suối một cách tuyệt vọng rồi gục chết nơi nào đó chưa biết, thì thật là ngông cuồng dại dột chẳng ích lợi gì.

Quyết định rồi chúng tôi tự nhiên thấy khoan khoái lạ thường. Sáng suốt hẳn lên. Chúng tôi bàn nhau rất tiếc là tiểu đội không còn một người sống để về báo cáo nhiệm vụ hoàn thành và kinh nghiệm rút ra từ những thực tế. Vậy dừng lại ở đây với một ít sức lực còn lại, viết một tường trình cuộc chiến đấu gởi lại cho ai đó tìm được. Nhất trí với nhau rồi, chúng tôi phấn khởi hẳn lên, mỗi người đứng trước cái chết của mình cố gắng dùng một chút sức còn lại, quả thật rất ít ỏi, để xây dựng ngôi mộ cho mình và sau đó an tâm bàn ý rồi thay nhau chấp bút. Chúng tôi đã chọn cây gõ tơ còn sống lâu này làm trụ, giúp nhau mắc võng cho từng người, thống nhất nhau tư thế nằm trên võng, sắp xếp vài vật còn lại. Chúng tôi lên võng nằm thử để tự mình được nhìn thấy rõ cái mộ chung của mình, một nấm mồ giữa trời và đất. Ban đêm những tán lá sum suê được cài muôn ngàn những vì sao lấp lánh, phải chăng là những vòng hoa thiên nhiên không bao giờ tàn tạ đã dành cho chúng tôi. Tiếng gió rì rào như tiếng nhạc rừng cùng tiếng chim ca hót vào buổi bình minh phải chăng là bản hòa tấu âm thanh muôn thuở ru hồn chúng tôi trong giấc ngủ ngàn thu. Chúng tôi rất bằng lòng, lòng thanh thản kỳ lạ. Thì ra cái chết có gì là ghê gớm lo âu đâu. Chúng tôi sẽ chết ung dung thư thái như đã từng sống mãnh liệt mà thư thái với công việc của mình đã làm.

Nhìn cảnh vật xung quanh sao mà đẹp lạ. Màu xanh lá cây không phải chỉ một màu đơn điệu mà thành nhiều màu sắc xanh đậm, xanh lợt, có ánh nắng mặt trời chiếu rọi, nó sáng tươi lên, có gió thổi vào, lung tung thay đổi thật là ngoạn mục. Quanh chúng tôi đều như vậy, nó lại nằm trên một nền đất đá nhiều màu sắc xám, đỏ, vàng với những hòn sỏi trắng xinh xinh. Trời cao vời vợi, lất phất những áng mây cũng muôn màu, muôn sắc. Gió dịu dàng mơn man cành lá, vuốt ve chúng tôi. Vài con chim từ đâu bay lại, chuyền từ cành này sang cành khác, hát lên những điệu hát thánh thoát yêu đời. Sao mà trìu mến quá, ôi cảnh vật của đất trời, của con người muôn thuở. Rồi ký ức lần lượt trở về trong chúng tôi. Chúng tôi lôi hết đoạn này đến đoạn nọ của đời mình ra mà nói cho nhau nghe. Nhớ biết bao đến các đồng chí trong đơn vị. Những hình ảnh của bạn bè, đồng đội cực khổ luyện tập, hành quân, dũng mãnh xung phong trên trận địa, quây quần bên nhau trên một khóm rừng, chuyện trò hàn huyên trên các chiếc võng. Cái gì cũng đẹp đẽ, cũng nhớ, cũng thương. Rồi trở về làng xưa, phường cũ. Bà con ta thế nào rồi, đã qua cảnh làm ăn vất vả? Còn mẹ, vợ con ta giờ đây có đỡ lo chạy từng miếng cơm, manh áo, có phải chịu đựng nặng nề những cuộc càn quét, ném bom của quân man rợ. Rồi anh rồi em, không biết đã có vào du kích? Có bao giờ họ được về đoàn tụ quanh bếp lửa của gia đình? Ước gì trên mặt đất này không còn cảnh chiến tranh tàn phá. Ước gì ở thế gian này đều là bạn thân thương.

Vũ, quay nhìn về phương Bắc, nói: "Bố ơi! Suốt đời bố lao động cực nhọc! Ngày còn rời trường Đại học Bách khoa Hà Nội, sau mới 3 năm kỳ cục ở đấy, tình nguyện vào Nam chiến đấu, bố vừa thương, vừa đồng tình nhưng dặn: "Chiến đấu xong về học tiếp nghe con! Đời bố, đời ông có đâu dám mơ đại học". Giờ thì con xin lỗi bố, không thực hiện được lời bố dặn. Dành cho các em con, các cháu nhỏ của xóm làng vậy".

Chí thì lờn tuổi hơn Vũ, đã có người yêu ở quê nhà. Anh khoe: "Cả nhà mình đều là du kích đấy! Mẹ mình... rồi mắt anh nhìn xa xăm... đã già rồi nhưng vẫn đứng vững khi anh mình hy sinh ở trận Vạn Tường. Bây giờ đến mình, chắc chắn mẹ vẫn dũng cảm, mẹ nhỉ. Còn Hương của mình, khi chia tay nhau Hương thách thi đua giết giặc với mình. Anh chịu thua em rồi, Hương của anh...".

Mỗi người là một tâm tình. Tôi thì cha mẹ mất sớm. Tôi thương vợ, thương con. Ôi bàn chân con mũm mĩm thật là xinh, ngày nay hẳn đã cứng cáp. Vợ tôi: Trâm, trong đội nữ biệt động Sài Gòn đã hẹn, ngày tôi ra khu xin vào chủ lực: Bao giờ chủ lực các anh đánh về thành, biệt động chúng em sẽ đánh kết hợp thật đẹp. Trâm ơi! Em gánh vác thêm nhiệm vụ của anh từ đây em nhé, con lớn sẽ thay anh nếu giặc vẫn còn".

Ôi, giờ đây sao mà nhớ thương da diết bao người ruột thịt họ hàng, đồng chí, đồng đội, bạn bè hàng xóm. Tha thiết làm sao với từng vùng đất đã sống và chiến đấu, với bà con đã đùm bọc từng lon gạo hũ mắm... viết làm sao hết cho mọi người, về mọi thứ.

Nhưng rồi các bạn giục kết thúc lá thư đi thôi. Thời gian không chờ chúng tôi nữa. Chúng tôi đã cảm thấy sắp đến giờ phải từ giã cõi đời này rồi. Trước khi ra đi thơ phải được bảo quản cẩn thận để tránh thời gian mưa nắng phủ phàng. Thơ. Thơ phải về với tay những người đang sống.

Các bạn muốn nhắn nhủ quá nhiều điều làm sao mà viết ra hết được. Nhất là lúc mà tử thần đang đứng đợi trên đầu võng chúng tôi. Sao mà trước khi chết, ý kiến về cuộc sống lại phong phú dồi dào đến thế. Hỡi người đang sống đừng bỏ qua những trăng trối đầy nhiệt tình của chúng tôi trước lúc từ giã cõi trần.

Nếu lá thư này được về với đồng đội chúng tôi trong Trung đoàn BG Quân giải phóng miền Nam hay một đơn vị bạn nào đó đi qua đây, xin chuyển lên giùm cấp trên.

Tiểu đội Giải phóng quân chúng tôi trong Trung đội “Ký Con” đã hoàn thành nhiệm vụ. Chúng tôi mong được ghi nhận rằng chúng tôi đã từng sống, chiến đấu và đã chết trong một mùa xuân giữa đất trời như trăm ngàn cái chết của những người Việt Nam chân chính cho Tổ quốc và dân tộc sống còn.

Còn như chúng tôi được phát hiện muộn hơn sau 5 - 10 năm - tự do quý giá, thì xin cho chúng tôi - gởi đến những người đang sống, sống đúng ý nghĩa của nó, trong một thời đại vinh quang, lời biết ơn sâu sắc vì các bạn đang làm cho cái chết của chúng tôi giữ được đầy đủ ý nghĩa. Các bạn đang lao động quên mình cũng như chúng tôi đã chiến đấu quên mình, cho đất nước ta ngày nay tươi đẹp, cho dân ta ngày càng ấm no hạnh phúc, cho xã hội ta ngày càng dân chủ, công bằng.

Hay trong trường hợp đến 50 - 100 năm sau, thư này mới tới những người, có thể gọi là thế hệ mai sau, thì cho phép chúng tôi gởi lời chào xã hội chủ nghĩa, cho phép chúng tôi bày tỏ vui mừng tuyệt diệu vì hạnh phúc và hòa bình đang tràn ngập hành tinh chúng ta mà chúng tôi trở thành những hạt bụi có ích - Và hơn nữa nếu được, cho chúng tôi gởi lời chào niềm nở nhất đến những con người ở các vì sao xa xôi, những người bạn mới giữa các hành tinh.

Mùa xuân giữa rừng miền Đông Nam bộ.

Vũ - Chí - Dũng.

Ghi chú: Vũ và Chí của tôi đều đã đi rồi khi tôi viết những dòng cuối cùng này. Trước khi ký ba chữ Vũ - Chí - Dũng, tôi nhìn lên mặt hai bạn: Một vẻ bình thản thần diệu đẹp như mặt nước hồ thu trong trẻo êm đềm và bầu trời cao xanh sáng tuyệt vời, nét mặt các bạn tươi thắm như mỉm cười tựa các thiên thần trong giấc ngủ. Nó đã động viên tôi hoàn thành việc bảo quản bản viết với chút sức tàn gắng gượng. Rồi tôi sẽ nằm ngay ngắn trên võng y như các bạn, noi gương các bạn lòng thanh thản và tự hào đi vào cõi mông lung vô tận”


  1. Thượng tướng Trần Văn Trà. Bức thư gửi lại người đang sống. 2016. URL: https://baobinhduong.vn/tim-kiem/B%E1%BB%A9c%20th%C6%B0%20g%E1%BB%ADi%20l%E1%BA%A1i%20ng%C6%B0%E1%BB%9Di%20%C4%91ang%20s%E1%BB%91ng.html?p=1&t=0&sd=&ed=&c=0&ci=0&ts=3&l=vi (visited on 2024-09-04).