Thứ Ba, 23 tháng 12, 2014

What is a Full Stack developer?

Thấy bài này hay nên post lại:

What is a Full Stack developer?

Is it reasonable to expect mere mortals to have mastery over every facet of the development stack? Probably not, but Facebook can ask for it. I was told at OSCON by a Facebook employee that they only hire ‘Full Stack’ developers.  Well, what does that mean?
To me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology.
Good developers who are familiar with the entire stack know how to make life easier for those around them. This is why I’m so against silos in the work place. Sure, politics and communication challenges get in the way in large organizations. I think the point Facebook is going for with their hiring policy is, if smart people use their heads and their hearts, a better product gets built in less time.

Layers of the Full Stack:

  1. Server, Network, and Hosting Environment.
    1. This involves understanding what can break and why, taking no resource for granted.
    2. Appropriate use of the file system, cloud storage, network resources, and an understanding of data redundancy and availability is necessary.
    3. How does the application scale given the hardware constraints?
    4. What about multi-threading and race conditions? Guess what, you won’t see those on your development machine, but they can and do happen in the real world.
    5. Full stack developers can work side by side with DevOps. The system should provide useful error messages and logging capabilities. DevOps will see the messages before you will, so make them count.
  2. Data Modeling
    1. If the data model is flawed, the business logic and higher layers start to need strange (ugly) code to compensate for corner cases the data model doesn’t cover.
    2. Full stack developers know how to create a reasonably normalized relational model, complete with foreign keys, indexes, views, lookup tables, etc.
    3. Full stack developers are familiar with the concept of non-relational data stores and understand where they shine over relational data stores.
  3. Business Logic
    1. The heart of the value the application provides.
    2. Solid object oriented skills are needed here.
    3. Frameworks might be needed here as well.
  4. API layer / Action Layer / MVC
    1. How the outside world operates against the business logic and data model.
    2. Frameworks at this level should be used heavily.
    3. Full stack developers have the ability to write clear, consistent, simple to use interfaces. The heights to which some APIs are convoluted repel me.
  5. User Interface
    1. Full stack developers: a) understand how to create a readable layout, or b) acknowledge they need help from artists and graphic designers. Either way, implementing a good visual design is key.
    2. Can include mastery of HTML5 / CSS.
    3. JavaScript is the up and coming language of the future and lots of exciting work is being done in the JavaScript world (node, backbone, knockout…)
  6. User Experience
    1. Full stack developers appreciate that users just want things to work.
    2. A good system doesn’t give its users carpal tunnel syndrome or sore eyes. A full stack developer can step back and look at a process that needs 8 clicks and 3 steps, and get it down to one click.
    3. Full stack developers write useful error messages. If something breaks, be apologetic about it. Sometimes programmers inadvertently write error messages that can make people feel stupid.
  7. Understanding what the customer and the business need.
    1. Now we are blurring into the line of architect, but that is too much of a hands off role.
    2. Full stack developers have a grasp of what is going on in the field when the customer uses the software. They also have a grasp of the business.

Other Pieces of the Puzzle:
  1. Ability to write quality unit tests. By the way, even JavaScript can have unit tests these days.
  2. Understanding of repeatable automated processes for building the application, testing it, documenting it, and deploying it at scale.
  3. An awareness of security concerns is important, as each layer presents its own possible vulnerabilities.

Closing Thoughts:
It is very bad practice to tightly couple code to a specific implementation (library, OS, hardware, etc). Just because a full stack developer understands the entire spectrum doesn’t mean they have license to take shortcuts. Well, actually they do if it is a build and throw away prototype.
Technology start-ups need full stack developers for their versatility!  However, as an organization matures, it needs more and more focused skills.
I’m not sure you can call yourself a full stack developer until you have worked in multiple languages, platforms, and even industries in your professional career. Full stack goes beyond a ‘senior engineer’, as it is along the same lines as a polyglot programmer but with a higher view of all the connecting pieces. Note that on my list, only items 3-5 involve writing code.

Thứ Tư, 19 tháng 3, 2014

Xây dựng ứng dụng bắt gói tin trên mạng


Mình đang muốn làm một ứng dụng bắt và xử lý gói tin tại card mạng (NIC) - ý tưởng sẽ là đặt một máy tính có 2 card mạng vào đường truyền mạng, máy tính này có vai trò như một "công tắc" đóng/mở đường truyền các gói tin. Ứng dụng được cài đặt trên máy tính "công tắc" này sẽ đọc các gói tin từ NIC 1, thực hiện phân tích và xử lý, nếu các gói tin này hợp lệ sẽ được ghi lên NIC 2 để chuyển tiếp.
Hơi có chút băn khoăn:
1- Để phục vụ nhu cầu làm một "công tắc" như trên thì ý tưởng vậy có đúng hướng và khả thi không?
2 - Nên sử dụng bộ thư viện lập trình / công cụ nào để phát triển ứng dụng dạng này cho hầu hết các nền tảng Windows, Linux, Unix (mình biết có bộ thư viện DPDK của Intel phù hợp với ứng dụng dạng này nhưng chưa thử nghiệm được vì đang lăn tăn về đường lối).

Thứ Năm, 17 tháng 5, 2012

Các bước lập kế hoạch dự án phần mềm

-->
10 BƯỚC LẬP KẾ HOẠCH DỰ ÁN PHẦN MỀM
Một số người quản lí dự án phần mềm (PM) không biết cách xây dựng bản kế hoạch dự án. Họ thậm chí không lập kế hoạch mà chỉ dùng lịch biểu được khách hàng trao cho họ. Họ không xây dựng viễn kiến cho dự án hay ước lượng nỗ lực dự án. Logic của họ là yêu cầu bao giờ cũng thay đổi, sao bận tâm tới lập kế hoạch cho cái gì đó mà sẽ thay đổi? Họ không hiểu mục đích hay ích lợi của bản kế hoạch dự án.
Bản kế hoạch dự án là tài liệu được dùng để trao đổi thông tin giữa người quản lí dự án với tổ dự án và khách hàng.
Bước thứ nhất trong xây dựng kế hoạch dự án là đặt chiều hướng cho dự án. Khi dự án bắt đầu, tổ không biết phải làm gì; họ cần "la bàn" để hướng dẫn họ. Viễn kiến dự án là la bàn chỉ cho họ về chiều hướng được người quản lí dự án lập ra. Viễn kiến này giải thích cho họ thành công sẽ là gì; dự án sẽ giải quyết vấn đề gì cho khách hàng; mục đích và mục tiêu là gì và mong đợi của khách hàng là gì. Viễn kiến giữ cho nỗ lực của tổ được gióng thẳng với yêu cầu của khách hàng và mục tiêu dự án.
Bước thứ haimô tả vấn đề mà dự án được dự định giải quyết. Các thành viên tổ cần hiểu vấn đề, cũng như giải pháp thành công có thể là gì. Họ cần biết về khách hàng và người dùng. Dự án có thể có một khách hàng hay nhiều khách hàng với các yêu cầu khác nhau. Trong trường hợp này, tổ cần biết cách giữ cân bằng nhiều yêu cầu khác nhau và vẫn đáp ứng được như cầu của khách hàng.
Bước thứ bamô tả sản phẩm phần mềm. Cách tốt nhất để làm điều này là dùng Biểu đồ hoàn cảnh, trong đó người quản lí dự án xác định cách phần mềm tương tác với khách hàng hay người dùng, và cách thông tin chảy bên trong và ngoài hệ thống. Biểu đồ này sẽ cho tổ một tổng quan về phần mềm.
Bước thứ tưmô tả chức năng mức cao của sản phẩm phần mềm. Người quản lí dự án phải mô tả từng chức năng dựa trên các yêu cầu của khách hàng. Nếu phần mềm là lớn và phức tạp, một số chức năng có thể được chia thành các chức năng con cho dễ mô tả. Điều quan trọng là người quản lí dự án kiểm nghiệm các yêu cầu chức năng này với khách hàng để đảm bảo rằng chúng là chính xác điều khách hàng cần.
Bước thứ nămchia nhỏ các yêu cầu chức năng này thành các nhiệm vụ nhỏ hơn (Cấu trúc phân việc - Work Breakdown Structure) và liệt kê những nhiệm vụ này để cho các thành viên tổ có thể thấy mọi nhiệm vụ mà họ phải làm. Vì các yêu cầu thường xuyên thay đổi do nhu cầu phụ thêm, thông tin mới, hay thỉnh thoảng khách hàng quyết định thay đổi yêu cầu. Những thay đổi này sẽ ảnh hưởng tới mọi thứ trong dự án. Do đó dự án cần có bản kế hoạch để đảm bảo rằng chỉ các yêu cầu đúng là được thực hiện. Bằng việc giữ danh sách hiện thời của mọi nhiệm vụ, thành viên tổ biết nhiệm vụ nào đã bị thay đổi hay sửa đổi, và cách chúng tác động tới công việc của họ. Khi dự án bắt đầu, các thành viên tổ không biết mọi thông tin mà khách hàng muốn cho nên họ dựa hầu hết trên danh sách các nhiệm vụ này. Điều quan trọng là giữ cho danh sách này được cập nhật dựa trên thông tin phụ thêm. Bản kế hoạch dự án sẽ xác định cách giải quyết với các thay đổi, cách thay đổi sẽ được kiểm điểm, và cách danh sách các nhiệm vụ sẽ được cập nhật để đảm bảo rằng dự án sẽ đáp ứng nhu cầu của khách hàng.
Bước thứ sáuxác định vai trò, trách nhiệm của từng thành viên tổ và phân công cho họ các nhiệm vụ dựa trên kĩ năng và kinh nghiệm của họ. Bằng việc nhận diện các thành viên tổ qua kĩ năng, người quản lí dự án sẽ biết kĩ năng nào sẵn có cho nhiệm vụ nào và kĩ năng nào được cần. Người quản lí dự án có thể nhận diện các thành viên tổ có những kĩ năng này, nếu không người đó có thể phải đi thuê người phụ với kĩ năng đặc biệt để hoàn thành dự án. Điều này là quan trọng bởi vì một số người quản lí dự án thường dựa vào số người sẵn có cho dự án thay vì kĩ năng của họ. Họ lấy cán bộ cho dự án theo số người được cần chứ không theo kĩ năng được cần. Chẳng hạn, nếu dự án cần 10 người thì họ thuê 10 người bất kể tới kĩ năng của họ. Đây là một trong các lí do mà nhiều dự án thất bại. Người quản lí dự án có kinh nghiệm bao giờ cũng lấy cán bộ cho dự án dựa trên kĩ năng chứ không trên số người được cần. Trong bước này, người quản lí dự án cũng nhận diện phần cứng, phần mềm, và trang thiết bị được cần cho dự án và cách chúng sẽ được thu nhận.
Bước thứ bẩyước lượng nỗ lực được cần để hoàn thành các nhiệm vụ này. Điều được khuyến cáo là người quản lí dự án làm việc cùng các thành viên tổ mà đã được phân công cho các nhiệm vụ để đi tới một ước lượng cho công việc của họ. Người quản lí dự án phải lấy từng nhiệm vụ và đặt chúng vào trật tự theo đó chúng sẽ được thực hiện rồi tóm tắt chúng trong thời gian được ước lượng toàn thể cần để hoàn thành mọi nhiệm vụ. Bằng việc dùng thông tin này, người quản lí dự án có thể thương lượng với khách hàng về lịch biểu dự án. Lịch biểu dự án nên căn cứ trên thoả thuận dựa trên lịch biểu mong đợi của khách hàng và tóm tắt về thời gian được ước lượng được cần để hoàn thành mọi nhiệm vụ. Người quản lí dự án có thể yêu cầu thay đổi lịch biểu nếu có khác biệt lớn về thời gian được lên lịch và thời gian được ước lượng; hay yêu cầu nhiều người hơn, hay yêu cầu giảm chức năng. Một khi thương lượng này được hoàn thành, người quản lí dự án sẽ cập nhật danh sách các nhiệm vụ và phân ngày tháng để bắt đầu và hoàn thành từng nhiệm vụ cũng như cập nhật ngân sách của dự án (tiền được cấp cho dự án).
Bước thứ támlập kế hoạch về chất lượng sản phẩm. Chất lượng không tự xảy ra; nó cần được xây dựng nên. Người quản lí dự án cần nhận diện chuẩn chất lượng theo đó dự án sẽ được đo và cách các thành viên tổ sẽ đo chúng. Chẳng hạn, chất lượng có thể được xác định như việc đáp ứng mọi yêu cầu của khách hàng; có ít lỗi (không quá 1 lỗi trên mười nghìn dòng mã); đáp ứng chi phí và lịch biểu v.v. Chất lượng phải được xác định rõ ràng và được kiểm điểm với cả khách hàng và người quản lí cấp cao để đảm bảo rằng dự án đang tạo ra sản phẩm chất lượng.
Bước thứ chínquản lí rủi ro. Vì không phải mọi thứ xảy ra bên trong dự án phần mềm đều được biết hết, mọi sự có thể xảy ra bất ngờ vì chúng không thể được dự đoán. Những điều bất định là rủi ro và chúng phải được quản lí. Người quản lí dự án cần nhận diện rủi ro dự án, khả năng xuất hiện của chúng, cách giảm nhẹ chúng và cách trao đổi về chúng cho các thành viên tổ, nếu chúng xuất hiện.
Bước thứ mườixác định tài liệu dự án. Tuỳ theo độ phức tạp và yêu cầu của khách hàng, dự án có thể được yêu cầu cung cấp tài liệu hỗ trợ như một phần của vật chuyển giao của dự án. Tài liệu bao gồm tài liệu sử dụng của người dùng, trợ giúp trực tuyến, tài liệu cài đặt, v.v.
John Vũ

Thứ Hai, 9 tháng 8, 2010

Một số lưu ý khi sử dụng Linq

1. Lưu ý khi sử dụng Linq to SQL:
1.1. Khi sửa bản ghi mà có thay đổi khóa ngoại: Thì phải chỉ rõ nó tham chiếu đến đối tượng mới nào, chứ không chỉ đổi khóa ngoại.
Ví dụ: Department(ID, Name) ---> Employee(ID,Name, DepartmentID)
Sửa nhân viên: đổi nhân viên có ID là 1 từ phòng ban cũ DepartmentID=1 sang phòng ban mới DepartmentID=2.
var context = new DataClasses1DataContext(connString);
var y = context. Employees.Single(c => c.ID == 1);
//Câu lệnh lỗi
//y.DepartmentID = 2;
//Câu lệnh đúng
y.Departments = context.Departments.Single(c => c.ID == 2);
context.SubmitChanges();

Thứ Năm, 10 tháng 6, 2010

5 cách đơn giản để được tăng lương

5 cách đơn giản để được tăng lương
(Dân trí) - Trong thời gian dài vừa qua bạn đã làm việc rất tích cực, hiệu quả công việc bạn mang lại thực sự rất đáng được nhìn nhận. Tuy nhiên lại không có một quyết định nào đáng kể liên quan đến mức thu nhập của bạn. Vậy phải làm gì để thay đổi điều đó:
Dưới đây là những cách đơn giản giúp bạn có giải quyết được bài toán của mình - tăng lương:

Liệt kê các thành quả đạt được
Mong muốn mua một căn nhà mới hoặc trả hết nợ nần không phải là một lý do hợp lý đưa ra để đàm phán tăng lương. Lí do thích hợp đưa ra chỉ có thể là những thành quả trong công việc của bạn đem về lợi nhuận cho công ty. Chẳng hạn bạn đã thiết kế ra được một website có lưu lượng truy cập tăng hơn trước rất nhiều, từ đó doanh số bán hàng của công ty tăng lên. Hoặc bạn đã trực tiếp chỉ đạo một nhóm làm việc ký được hợp đồng có trị giá hàng tỷ đồng cho công ty. Hãy thu thập những tài liệu minh chứng điều này và trình bày nó một cách có khoa học, có tổ chức. Điều này rất quan trọng, nó giúp cho người quản lý có thể nhìn nhận giá trị thật sự của bạn. Tăng lương cho bạn với họ là một việc làm tất yếu.

Nghiên cứu mức thu nhập của những người xung quanh
Nghiên cứu mức thu nhập của những người có năng lực tương đương với bạn tại công ty cũng như mức lương ở những công ty khác có cùng ngành nghề, bằng cấp như bạn. Hãy trình bày yêu cầu tăng lương kèm theo các kết quả khảo sát của bạn. Lý do yêu cầu tăng lương của bạn sẽ rất thuyết phục sếp hiểu rằng bạn đang ý thức rất rõ giá trị của mình, và bạn sẵn sàng ra đi trong một thị trường lao động mở.

Trình báo cáo định kỳ
Mặc dù đánh giá rất cao năng lực của bạn nhưng sếp vì quá nhiều việc mà không đánh giá hết được những dự án bạn đang tham gia và hiệu quả công việc bạn đạt được. Để tránh tình trạng những thành quả của bạn không bị bỏ qua, hãy xây dựng những báo cáo hàng tuần, hàng tháng, hoặc báo cáo kết thúc dự án tổng kết những công việc bạn đang tham gia, đã hoàn thành và hiệu suất của nó. Những con số biết nói sẽ giúp sếp nhận thức được rõ ràng những thành quả công việc của bạn. Đó là cơ sở để anh ta tăng thu nhập cho bạn một cách hợp lý.

Lựa chọn thời gian hợp lý
Không phải lúc nào bạn cũng có thể đề cập đến chuyện tăng lương. Thời gian thích hợp nhất là sau khi kết thúc một dự án, một kế hoạch, hay kết thúc một năm. Chẳng hạn bạn có thể đề cập vấn đề này với sếp sau khi bạn hoàn thành xuất sắc một công trình, một dự án, hay lúc cơ quan chuẩn bị bắt tay vào một dự án mới. Dĩ nhiên bạn cũng nên tránh khoảng thời gian sếp đang bù đầu với một núi công việc cần giải quyết…Khi không quá bận rộn, tâm lý của sếp cũng thoải mái hơn và dễ tính hơn trong việc chấp nhận những đề xuất của bạn.

Chuẩn bị “phương án B”
Nếu việc tăng lương không nằm trong khả năng quyết định của sếp trực tiếp của bạn, hãy lên phương án thỏa thuận những “điều khoản” khác như: xin nghỉ nhiều hơn, một lịch trình linh hoạt hơn, tiền thưởng dựa trên hiệu suất lớn hơn. Nếu những yêu cầu này lại bị từ chối, hãy hỏi sếp của bạn làm thế nào tốt nhất trong vị trí của mình để được tăng thu nhập trong tương lai và hãy nhớ thiết lập một cuộc hẹn thảo luận về vấn đề này ngay sau khi đạt được những tiến bộ.

Lan Tường
Theo Careerbuilder

Thứ Tư, 14 tháng 4, 2010

Thuật toán đối sánh mẫu (pattern matching) trên văn bản

I. Mở đầu

Dữ liệu trong máy tính được lưu trữ dưới rất nhiều dạng khác nhau, nhưng sử dụng chuỗi vẫn là một trong những cách rất phổ biến. Trên chuỗi các đơn vị dữ liệu không có ý nghĩa quan trọng bằng cách sắp xếp của chúng. Ta có thể thấy các dạng khác nhau của chuỗi như ở các file dữ liệu, trên biểu diễn của các gen, hay chính văn bản chúng ta đang đọc.

Một phép toán cơ bản trên chuỗi là đối sánh mẫu (pattern matching), bài toán yêu cầu ta tìm ra một hoặc nhiều vị trí xuất hiện của mẫu trên một văn bản.. Trong đó mẫu và văn bản là các chuỗi có độ dài N và M (M ≤ N), tập các ký tự được dùng gọi là bảng chữ cái å, có số lượng là d.

Việc đối sánh mẫu diễn ra với nhiều lần thử trên các đoạn khác nhau của văn bản. Trong đó cửa sổ là một chuỗi M ký tự liên tiếp trên văn bản. Mỗi lần thử chương trình sẽ kiểm tra sự giống nhau giữa mẫu với cửa sổ hiện thời. Tùy theo kết quả kiểm tra cửa sổ sẽ được dịch đi sang phải trên văn bản cho lần thử tiếp theo.

Trong trình bày này chúng ta sẽ quan tâm đến việc tìm kiếm tất cả các vị trí xuất hiện của mẫu trên một văn bản. Cài đặt sẽ dùng một hàm ra : Output để thông báo vị trí tìm thấy mẫu.
II. Thuật toán Brute Force

Có lẽ cái tên của thuật toán này đã nói lên tất cả (brute nghĩa là xúc vật, force nghĩa là sức mạnh). Thuật toán brute force thử kiểm tra tất cả các vị trí trên văn bản từ 1 cho đến n-m+1. Sau mỗi lần thử thuật toán brute force dịch mẫu sang phải một ký tự cho đến khi kiểm tra hết văn bản.

Thuật toán brute force không cần công việc chuẩn bị cũng như các mảng phụ cho quá trình tìm kiếm. Độ phức tạp tính toán của thuật toán này là O(n*m)


function IsMatch(const X: string; m: integer;

const Y: string; p: integer): boolean;

var

i: integer;

begin

IsMatch := false;

Dec(p);

for i := 1 to m do

if X <> Y[p + i] then Exit;

IsMatch := true;

end;



procedure BF(const X: string; m: integer;

const Y: string; n: integer);

var

i: integer;

begin

for i := 1 to n - m + 1 do

if IsMatch(X, m, Y, i) then

Output(i); { Thông báo tìm thấy mẫu tại vị trí i của văn bản }

end;


III. Thuật toán Knuth-Morris-Pratt

Thuật toán Knuth-Morris-Pratt là thuật toán có độ phức tạp tuyến tính đầu tiên được phát hiện ra, nó dựa trên thuật toán brute force với ý tưởng lợi dụng lại những thông tin của lần thử trước cho lần sau. Trong thuật toán brute force vì chỉ dịch cửa sổ đi một ký tự nên có đến m-1 ký tự của cửa sổ mới là những ký tự của cửa sổ vừa xét. Trong đó có thể có rất nhiều ký tự đã được so sánh giống với mẫu và bây giờ lại nằm trên cửa sổ mới nhưng được dịch đi về vị trí so sánh với mẫu. Việc xử lý những ký tự này có thể được tính toán trước rồi lưu lại kết quả. Nhờ đó lần thử sau có thể dịch đi được nhiều hơn một ký tự, và giảm số ký tự phải so sánh lại.

Xét lần thử tại vị trí j, khi đó cửa sổ đang xét bao gồm các ký tự y[j…j+m-1] giả sử sự khác biệt đầu tiên xảy ra giữa hai ký tự x và y[j+i-1].

Khi đó x[1…i]=y[j…i+j-1]=u và a=x¹y[i+j]=b. Với trường hợp này, dịch cửa sổ phải thỏa mãn v là phần đầu của xâu x khớp với phần đuôi của xâu u trên văn bản. Hơn nữa ký tự c ở ngay sau v trên mẫu phải khác với ký tự a. Trong những đoạn như v thoả mãn các tính chất trên ta chỉ quan tâm đến đoạn có độ dài lớn nhất.

Dịch cửa sổ sao cho v phải khớp với u và c ¹ a

Thuật toán Knuth-Morris-Pratt sử dụng mảng Next để lưu trữ độ dài lớn nhất của xâu v trong trường hợp xâu u=x[1…i-1]. Mảng này có thể tính trước với chi phí về thời gian là O(m) (việc tính mảng Next thực chất là một bài toán qui hoạch động một chiều).

Thuật toán Knuth-Morris-Pratt có chi phí về thời gian là O(m+n) với nhiều nhất là 2n-1 lần số lần so sánh ký tự trong quá trình tìm kiếm.

procedure preKMP(const X: string; m: integer;

var Next: array of integer);

var

i, j: integer;

begin

i := 1;

j := 0;

Next[1] := 0;

while (i <= m) do

begin

while (j > 0)and(X <> X[j]) do j := Next[j];

Inc(i);

Inc(j);

if X = X[j] then Next := Next[j] {v khớp với u và c¹a}

else Next := j;

end;

end;



procedure KMP(const X: string; m: integer;

const Y: string; n: integer);

var

i, j: integer;

Next: ^TIntArr; { TIntArr = array[0..maxM] of integer }

begin

GetMem(Next, (m + 1)*SizeOf(Integer));

preKMP(X, m, Next^);

i := 1;

j := 1;

while (j <= n) do

begin

{dịch đi nếu không khớp}

while (i > 0)and(X <> Y[j]) do i := Next^;

Inc(i);

Inc(j);

if i > m then

begin

Output(j - i + 1);

i := Next^;

end;

end;

FreeMem(Next, (m + 1)*SizeOf(Integer));

End;

IV. Thuật toán Deterministic Finite Automaton (máy automat hữu hạn)

Trong thuật toán này, quá trình tìm kiếm được đưa về một quá trình biến đổi trạng thái automat. Hệ thống automat trong thuật toán DFA sẽ được xây dựng dựa trên xâu mẫu. Mỗi trạng thái (nút) của automat lúc sẽ đại diện cho số ký tự đang khớp của mẫu với văn bản. Các ký tự của văn bản sẽ làm thay đổi các trạng thái. Và khi đạt được trạng cuối cùng có nghĩa là đã tìm được một vị trí xuất hiện ở mẫu.

Thuật toán này có phần giống thuật toán Knuth-Morris-Pratt trong việc nhảy về trạng thái trước khi gặp một ký tự không khớp, nhưng thuật toán DFA có sự đánh giá chính xác hơn vì việc xác định vị trí nhảy về dựa trên ký tự không khớp của văn bản (trong khi thuật toán KMP lùi về chỉ dựa trên vị trí không khớp).

Với xâu mẫu là GCAGAGAG ta có hệ automat sau

Ca

Với ví dụ ở hình trên ta có:

* Nếu đang ở trạng thái 2 gặp ký tự A trên văn bản sẽ chuyển sang trạng thái 3
* Nếu đang ở trạng thái 6 gặp ký tự C trên văn bản sẽ chuyển sang trạng thái 2
* Trạng thái 8 là trạng thái cuối cùng, nếu đạt được trạng thái này có nghĩa là đã tìm thất một xuất hiện của mẫu trên văn bản
* Trạng thái 0 là trạng thái mặc định(các liên kết không được biểu thị đều chỉ về trạng thái này), ví dụ ở nút 5 nếu gặp bất kỳ ký tự nào khác G thì đều chuyển về trạng thái 0

Việc xây dựng hệ automat khá đơn giản khi được cài đặt trên ma trận kề. Khi đó thuật toán có thời gian xử lý là O(n) và thời gian và bộ nhớ để tạo ra hệ automat là O(m*d) (tùy cách cài đặt)

Nhưng ta nhận thấy rằng trong DFA chỉ có nhiều nhất m cung thuật và m cung nghịch, vì vậy việc lưu trữ các cung không cần thiết phải lưu trên ma trận kề mà có thể dùng cấu trúc danh sách kề Forward Star để lưu trữ. Như vậy thời gian chuẩn bị và lượng bộ nhớ chỉ là O(m). Tuy nhiên thời gian tìm kiếm có thể tăng lên một chút so với cách lưu ma trận kề.

Cài đặt dưới đây xin được dùng cách đơn giản(ma trận kề)


type

TAut = array[0..maxM, 0..maxd] of integer;



procedure preAUT(const X: string; m: integer; var G: TAut);

var

i, j, prefix, cur, c, newState: integer;

begin

FillChar(G, SizeOf(G), 0);

cur := 0;

for i := 1 to m do

begin

prefix := G[cur, Ord(X)]; {x[1..prefix]=x[i-prefix+1..i]}

newState := i;

G[cur, Ord(X)] := newState;

for c := 0 to maxd do {copy prefix -> newState }

G[newState, c] := G[prefix, c];

cur := newState;

end;

end;



procedure AUT(const X: string; m: integer;

const Y: string; n: integer);

var

G: ^TAut;

state, i: integer;

begin

New(G);

preAUT(X, m, G^);

state := 0;

for i := 1 to n do

begin

state := G^[state, Ord(Y)]; {chuyển trạng thái}

if state = m then Output(i - m + 1);

end;

Dispose(G);

end;


IV. Thuật toán Boyer-Moore

Thuật toán Boyer Moore là thuật toán có tìm kiếm chuỗi rất có hiệu quả trong thực tiễn, các dạng khác nhau của thuật toán này thường được cài đặt trong các chương trình soạn thảo văn bản.

Khác với thuật toán Knuth-Morris-Pratt (KMP), thuật toán Boyer-Moore kiểm tra các ký tự của mẫu từ phải sang trái và khi phát hiện sự khác nhau đầu tiên thuật toán sẽ tiến hành dịch cửa sổ đi Trong thuật toán này có hai cách dịch của sổ:

Cách thứ 1: gần giống như cách dịch trong thuật toán KMP, dịch sao cho những phần đã so sánh trong lần trước khớp với những phần giống nó trong lần sau.

Trong lần thử tại vị trí j, khi so sánh đến ký tự i trên mẫu thì phát hiện ra sự khác nhau, lúc đó x[i+1…m]=y[i+j...j+m-1]=u và a=x¹y[i+j-1]=b khi đó thuật toán sẽ dịch cửa sổ sao cho đoạn u=y[i+j…j+m-1] giống với một đoạn mới trên mẫu (trong các phép dịch ta chọn phép dịch nhỏ nhất)

Dịch sao cho u xuất hiện lại và c ¹ a

Nếu không có một đoạn nguyên vẹn của u xuất hiện lại trong x, ta sẽ chọn sao cho phần đôi dài nhất của u xuất hiện trở lại ở đầu mẫu.



Dịch để một phần đôi của u xuất hiện lại trên x

Cách thứ 2: Coi ký tự đầu tiên không khớp trên văn bản là b=y[i+j-1] ta sẽ dịch sao cho có một ký tự giống b trên xâu mẫu khớp vào vị trí đó (nếu có nhiều vị trí xuất hiện b trên xâu mẫu ta chọn vị trí phải nhất)



Dịch để ký tự b ăn khớp với văn bản.

Nếu không có ký tự b nào xuất hiện trên mẫu ta sẽ dịch cửa sổ sao cho ký tự trái nhất của cửa sổ vào vị trí ngay sau ký tự y[i+j-1]=b để đảm bảo sự ăn khớp

Dịch khi b không xuất hiện trong x

Trong hai cách dịch thuật toán sẽ chọn cách dịch có lợi nhất.

Trong cài đặt ta dùng mảng bmGs để lưu cách dịch 1, mảng bmBc để lưu phép dịch thứ 2(ký tự không khớp). Việc tính toán mảng bmBc thực sự không có gì nhiều để bàn. Nhưng việc tính trước mảng bmGs khá phức tạp, ta không tính trực tiếp mảng này mà tính gián tiếp thông qua mảng suff. Có suff=max{k | x[i-k+1…i]=x[m-k+1…m]}

Các mảng bmGs và bmBc có thể được tính toán trước trong thời gian tỉ lệ với O(m+d). Thời gian tìm kiếm (độ phức tạp tính toán) của thuật toán Boyer-Moore là O(m*n). Tuy nhiên với những bản chữ cái lớn thuật toán thực hiện rất nhanh. Trong trường hợp tốt chi phí thuật toán có thể xuống đến O(n/m) là chi phí thấp nhất của các thuật toán tìm kiếm hiện đại có thể đạt được.

procedure preBmBc(const X: string; m: integer;

var bmBc: array of integer);

var

i: integer;

begin

for i := 0 to maxd - 1 do bmBc := m;

for i := 1 to m - 1 do bmBc[Ord(X)] := m - i;

end;



procedure suffixes(const X: string; m: integer;

var suff: array of integer);

var

right, left, i: integer;

begin

suff[m] := m;

left := m;

for i := m - 1 downto 1 do

if (i > left)and(suff < i - left) then

suff := suff

else

begin

if (i < left) then left := i;

right := i;

while (left >= 1)and(X[left] = X[left + m - right]) do

Dec(left);

suff := right - left; {X[left…right] = X[m+left-right…m]}

end;

end;



procedure preBmGs(const X: string; m: integer;

var bmGs: array of integer);

var

i, j: integer;

suff: ^TIntArr;

begin

GetMem(suff, (m + 1)*SizeOf(Integer));

suffixes(X, m, suff^); {Tính mảng suff}

for i := 1 to m do bmGs := m;

j := 0;

for i := m downto 0 do

if (i = 0)or(suff^ = i) then

while (j < m - i) do

begin

{Nếu bmGs[j] chưa có giá trị thì điền vào}

if bmGs[j] = m then bmGs[j] := m - i;

Inc(j);

end;

for i := 1 to m - 1 do bmGs[m - suff^] := m - i; {đảo lại}

FreeMem(suff, (m + 1)*SizeOf(Integer));

end;



procedure BM(const X: string; m: integer;

const Y: string; n: integer);

var

i, j: integer;

bmBc, bmGs: ^TIntArr;

begin

GetMem(bmBc, (m + 1)*SizeOf(Integer));

GetMem(bmGs, (m + 1)*SizeOf(Integer));



preBmBc(X, m, bmBc^);

preBmGs(X, m, bmGs^);

j := 1;

while (j <= n - m + 1) do

begin

i := m;

while (i >= 1)and(X = Y) do Dec(i);

if (i < 1) then

begin

Output(j);

j := j + bmGs^[1];

end

else {chọn cách dịch được lợi nhất }

j := j + Max(bmGs^, bmBc^[Ord(Y)] - m + i);

end;

FreeMem(bmBc, (m + 1)*SizeOf(Integer));

FreeMem(bmGs, (m + 1)*SizeOf(Integer));

end;



Thuật toán Boyer-Moore có thể đạt tới chi phí O(n/m) là nhờ có cách dịch thứ 2 “ký tự không khớp”. Cách chuyển cửa sổ khi gặp “ký tự không khớp” cài đặt vừa đơn giản lại rất hiệu quả trong các bảng chữ cái lớn nên có nhiều thuật toán khác cũng đã lợi dụng các quét mẫu từ phải sang trái để sử dụng cách dịch này.

Tuy nhiên chi phí thuật toán của Boyer-Moore là O(m*n) vì cách dịch thứ nhất của thuật toán này không phân tích triệt để các thông tin của những lần thử trước, những đoạn đã so sánh rồi vẫn có thể bị so sánh lại. Có một vài thuật toán đã cải tiến cách dịch này để đưa đến chi phí tính toán của thuật toán Boyer-Moore là tuyến tính. (xin tham khảo thêm trong chương trinh demo đi kèm)
VII. Thuật toán Karp-Rabin

Karp-Rabin bài toán tìm kiếm chuỗi không khác nhiều so với bài toán tìm kiếm chuẩn. Tại đây một hàm băm được dùng để tránh đi sự so sánh không cần thiết. Thay vì phải so sánh tất các vị trí của văn bản, ta chỉ cần so sánh những cửa sổ bao gồm những ký tự “có vẻ giống” mẫu.

Trong thuật toán này hàm băm phải thỏa mãn một số tính chất như phải dễ dàng tính được trên chuỗi, và đặc biệt công việc tính lại phải đơn giản để ít ảnh hưởng đến thời gian thực hiện của thuật toán. Và hàm băm được chọn ở đây là:

hash(w[i…i+m-1]) = h = (w*dm-1 + w[i+1]*dm-2 + … w[i+m-1]*d0) mod q

Việc tính lại hàm băm sau khi dịch cửa sổ đi một ký tự chỉ đơn gian như sau:

h = ((h – w*dm-1)*d + w[i+m]

Trong bài toán này ta có thể chọn d = 2 để tiện cho việc tính toán a*2 tương đương a shl 1. Và không chỉ thế ta chọn q = MaxLongint khi đó phép mod q không cần thiết phải thực hiện vì sự tràn số trong tính toán chính là một phép mod có tốc độ rất nhanh.

Việc chuẩn bị trong thuật toán Karp-Rabin có độ phức tạp O(m). Tuy vậy thời gian tìm kiếm lại tỉ lệ với O(m*n) vì có thể có nhiều trường hợp hàm băm của chúng ta bị lừa và không phát huy tác dụng. Nhưng đó chỉ là những trường hợp đặc biệt, thời gian tính toán của thuật toán KR trong thực tế thường tỉ lệ với O(n+m). Hơn nữa thuật toán KR có thể dễ dàng mở rộng cho các mẫu, văn bản dạng 2 chiều, do đó khiến cho nó trở nên hữu ích hơn so với các thuật toán còn lại trong việc xử lý ảnh.

procedure KR(const X: string; m: integer;

const Y: string; n: integer);

var

dM, hx, hy: longint;

i, j: integer;

begin

{$Q-} { Disable arithmetic overflow checking }

dM := 1;

for i := 1 to m - 1 do dM := dM shl 1;

hx := 0;

hy := 0;

for i := 1 to m do

begin

hx := (hx shl 1) + Ord(X);

hy := (hy shl 1) + Ord(Y);

end;

j := 1;

while j <= n - m do

begin

if hx = hy then

if IsMatch(X, m, Y, j) then Output(j);

{hàm IsMatch trong phần BruteForce}

hy := ((hy - Ord(Y[j])*dM) shl 1) + Ord(Y[j + m]); {Rehash}

Inc(j);

end;

if hx = hy then

if IsMatch(X, m, Y, j) then Output(j);

end;


VIII. Các thuật toán khác

Một số thuật toán nêu trên chưa phải là tất cả các thuật toán tìm kiếm chuỗi hiện có. Nhưng chúng đã đại diện cho đa số các tư tưởng dùng để giải bài toán tìm kiếm chuỗi.

Các thuật toán so sánh mẫu lần lượt từ trái sang phải thường là các dạng cải tiến (và cải lùi) của thuật toán Knuth-Morris-Pratt và thuật toán sử dụng Automat như: Forward Dawg Matching, Apostolico-Crochemore, Not So Naive, …

Các thuật toán so sánh mẫu từ phải sang trái đều là các dạng của thuật toán Boyer-Moore. Phải nói lại rằng thuật toán BM là thuật toán tìm kiếm rất hiệu quả trên thực tế nhưng độ phức tạp tính toán lý thuyết lại là O(m*n). Chính vì vậy những cải tiến của thuật toán này cho độ phức tạp tính toán lý thuyết tốt như: thuật toán Apostolico-Giancarlo đánh dấu lại những ký tự đã so sánh rồi để khỏi bị so sánh lặp lại, thuật toán Turbo-BM đánh giá chặt chẽ hơn các thông tin trước để có thể dịch được xa hơn và ít bị lặp, … Còn có một số cải tiến khác của thuật toán BM không làm giảm độ phức tạp lý thuyết mà dựa trên kinh nghiệm để có tốc độ tìm kiếm nhanh hơn trong thực tế. Ngoài ra, một số thuật toán kết hợp quá trình tìm kiếm của BM vào hệ thống Automat mong đạt kết quả tốt hơn.

Các thuật toán so sánh mẫu theo thứ tự đặc biệt

* Thuật toán Galil-Seiferas và Crochemore-Perrin chúng chia mẫu thành hai đoạn, đầu tiên kiểm tra đoạn ở bên phải rồi mới kiểm tra đoạn bên trái với chiều từ trái sang phải.
* Thuật toán Colussi và Galil-Giancarlo lại chia mẫu thành hai tập và tiến hành tìm kiếm trên mỗi tập với một chiều khác nhau.
* Thuật toán Optimal Mismatch và Maximal Shift sắp xếp thứ tự mẫu dựa vào mật độ của ký tự và khoảng dịch được.
* Thuật toán Skip Search, KMP Skip Search và Alpha Skip Search dựa sự phân bố các ký tự để quyết đinh vị trí bắt đầu của mẫu trên văn bản.

Các thuật toán so sánh mẫu theo thứ tự bất kỳ những thuật toán này có thể tiến hành so sánh mẫu với cửa sổ theo một thứ thự ngẫu nhiên. Những thuật toán này đều có cài đặt rất đơn giản và thường sử dụng chiêu ký tự không khớp của thuật toán Boyer-Moore. Có lẽ loại thuật toán này dựa trên ý tưởng càng so sánh loạn càng khó kiếm test chết
sưu tầm.

Thứ Tư, 17 tháng 3, 2010

PHÚ THỌ - Cái nôi văn nghệ thời kháng chiến chống Pháp

PHÚ THỌ -
Cái nôi văn nghệ thời kháng chiến chống Pháp -
nơi khai sinh Báo văn nghệ

ĐỖ NGỌC DŨNG


Trong cuộc kháng chiến chống thực dân Pháp, mảnh đất Phú Thọ được coi là vùng tự do. Trên địa bàn tỉnh chỉ có một số địa phương thuộc huyện Hạc Trì thời ấy là bị giặc chiếm đóng lâu dài, còn những nơi khác đều được giải phóng sau một thời gian ngắn. Là cửa ngõ của hai vùng Tây Bắc, Việt Bắc với đồi núi cây rừng rậm rạp.



Nhà thơ Tố Hữu và phu nhân, cùng các nhà thơ Xuân Sanh, Hữu Thỉnh trong chuyến trở về nguồn tới thăm Hội VHNT Phú Thọ năm 1998.



Khi kháng chiến nổ ra hai huyện Hạ Hòa và Thanh Ba của Phú Thọ có nhiều cơ quan Trung ương, Liên khu X, quân đội, trường học đóng trụ sở; nhiều người dân Hà Nội cũng tản cư về đây lập những phố nhỏ ở Hanh Cù, Vũ Ẻn, Ấm Thượng hình thành cuộc sống đô thị kháng chiến với nhiều cửa hàng cửa hiệu đông vui tấp nập.
Chính những điều kiện này mà Phú Thọ còn được là cái nôi của văn nghệ cả nước trong những năm đầu của cuộc kháng chiến:

I - NHỮNG ĐỊA DANH LỊCH SỬ

*Đoàn Văn hóa kháng chiến (làng Xuân Áng)

Cuộc kháng chiến chống Pháp diễn ra ác liệt tại Hà Nội với khẩu hiệu "Quyết tử cho Tổ quốc quyết sinh" để giữ từng con đường, từng góc phố. Tuy vậy lực lượng ta lúc này chưa mạnh Trung ương quyết định chuyển các cơ quan Trung ương lên Việt Bắc lập chiến khu cách mạng thực hiện kháng chiến trường kỳ. Trước tình hình đó Đảng chủ trương tập hợp lực lượng văn nghệ sỹ yêu nước đi theo phục vụ cho kháng chiến. Nhà văn Nguyễn Huy Tưởng được phân công làm nhiệm kỳ này. Ông đã liên hệ với Tổng bộ Việt Minh ở Phú Thọ tìm địa điểm để đóng trụ sở, rồi cử nhà văn Nguyễn Văn Mãi về Hà Nội tập hợp lực lượng, vận động văn nghệ sỹ đưa cả gia đình đi tham gia kháng chiến lúc này có Thế Lữ, Song Kim, Phan Khôi, Tô Ngọc Vân, Tô Hoài, Tạ Mỹ Duật, Bùi Huy Phồn và các gia đình Nguyễn Đình Thi, Nguyễn Xuân Khoát, Đỗ Nhuận...

Điểm đến đầu tiên của đoàn ở Bá Thá (Hà Tây) lúc này Pháp chiếm Hà Nội và đang mở rộng ra xung quanh. Đoàn khẩn trương gồng gánh đi bộ lên Sơn Tây và đi dọc sông Hồng lên Phú Thọ rồi tiếp tục đi tàu hỏa lên Vĩnh Chân. Nhà văn Nguyễn Huy Tưởng, Thành Thế Vỹ, các họa sỹ Phan Kế An, Mai Văn Hiến đón đoàn ở sân ga, nghỉ lại vài ngày cho lại sức rồi đoàn tiếp tục đi về nơi đóng trụ sở ở làng Xuân áng (Hạ Hòa). Miền đất mang đậm màu sắc Trung du dân làng quần tụ đông vui trù phú lại cách sông Thao vài cây số. Nhiều gian nhà gỗ rộng được dành làm chỗ ở và làm việc cho các văn nghệ sỹ tên tuổi như : Thế Lữ, Song Kim, Tạ Mỹ Duật, Nguyễn Xuân Khoát, Đỗ Nhuận, Phan Khôi, Bùi Huy Phồn, Tô Hoài, Thanh Tịnh, Ngô Huy Quỳnh, Nguyễn Khang,.. do họa sỹ Tô Ngọc Vân làm trưởng đoàn. Sau này ông còn đưa cả một lớp sinh viên trường Cao đẳng Mỹ thuật Đông Dương do ông dạy về đây để tiếp tục học.

Nơi đây năm 1998 Nhà văn Nguyễn Đình Thi, nhà thơ Nguyễn Xuân Sách cùng với lãnh đạo tỉnh Phú Thọ đã đặt bia kỷ niệm.

*Hội Văn nghệ Việt Nam (trụ sở Gia Điền 1947 - 1948).

Mùa thu năm 1947 Tổng Bí thư Trường Chinh trực tiếp giao nhiệm vụ cho đồng chí Tố Hữu lên Việt Bắc cùng với Nhà văn Nguyễn Huy Tưởng, Nguyễn Đình Thi phụ trách công tác văn nghệ. Thời điểm này quân Pháp mở chiến dịch lớn tiến đánh các căn cứ kháng chiến nhằm vây bắt và cô lập các cơ quan đầu não của Đảng và Chính phủ ở Việt Bắc.

Với lợi thế của một vùng đồi núi cây cối rậm rạp, tại đây còn có nhiều văn nghệ sỹ trong và ngoài quân đội đến làm việc, lãnh đạo phong trào và hoạt động sáng tác. Gia Điền (Hạ Hòa) được chọn đóng trụ sở của Hội Văn nghệ Việt Nam và trụ sở của Tạp chí Văn nghệ, cơ quan của Hội Văn nghệ Việt Nam do nhà thơ Tố Hữu làm thư ký tòa soạn. Cùng với Thế Lữ, Văn Cao, Nguyên Hồng và các cộng sự: Tô Ngọc Vân, Ngô Tất Tố, Nguyễn Đình Thi, Nam Cao, Kim Lân, Huy Cận, Hoài Thanh, Trần Văn Cẩn, Nguyễn Hữu Đang, Trần Huyền Trân, Như Phong, Chế Lan Viên, Tô Hoài, Xuân Diệu, Thép Mới, Lưu Hữu Phước, Nguyễn Huy Tưởng, Xuân Thủy, Nguyễn Xuân Khoát... Số Tạp chí văn nghệ đầu tiên ra đời tháng 3/1948. ở đây còn đóng trụ sở đầu tiên của Nhà xuất bản Văn nghệ do nhà văn Nguyễn Đình Thi làm giám đốc. Trong hoàn cảnh kháng chiến thiếu thốn nhưng với nhiệt huyết của các văn nghệ sỹ nhiều đầu sách được ra đời. Trong đó có những cuốn "Những người ở lại" của Nguyễn Huy Tưởng, "Vượt lên bão táp" của Nam Cao, "Phố mới" của Kim Lân, "Dãy người" thơ của Nguyên Hồng, "Vỡ tỉnh" của Tô Hoài, "Nhận đường" tùy bút của Nguyễn Đình Thi, "Núi yên ngựa" của Ngô Tất Tố, "Văn Lỗ Tấn" của Phan Khôi dịch... nơi đây Hội Văn nghệ Việt Nam cũng làm những công cuộc cần thiết để chuẩn bị cho Đại hội lần thứ nhất thành lập Hội Văn nghệ Việt Nam.

Tại đây, năm 1998 Liên hiệp các Hội Văn học Nghệ thuật Việt Nam cùng lãnh đạo tỉnh Phú Thọ đã đặt bia kỷ niệm.

* Đại hội Văn hóa toàn quốc (từ 16 - 20/7/1948 tại Đào Giã - Thanh Ba)

Hội Văn hóa cứu quốc thành lập năm 1943 là tiền thân của Hội Văn hóa Việt Nam đã họp Đại hội tại Hà Nội vào tháng 10/1946 có trên 80 đại biểu các vùng miền đến dự Đại hội họp trong 3 ngày thảo luận vấn đề sáng tác và bầu BCH gồm 14 người do nhà văn Đặng Thai Mai làm Chủ tịch, nhà phê bình Hoài Thanh làm Tổng thư ký cùng các Phó tổng thư ký: Nhà thơ Tố Hữu, nhạc sỹ Văn Cao, họa sỹ Nguyễn Đỗ Cung, nhà thơ Xuân Diệu, họa sỹ NguyễnVăn Tỵ, nhà thơ Chế Lan Viên, nhà văn Nguyễn Đình Thi...

Ngày 24/11/1946 Đại hội Văn hóa cứu quốc khai mạc tại nhà hát lớn có trên 200 đại biểu từ khắp đất nước về dự. Lúc này chiến sự diễn ra ở nhiều nơi; Pháp đánh Hải Phòng nên Đại hội chỉ họp trong 1 ngày, Hồ Chủ tịch đến dự và nói chuyện với Đại hội buổi chiều bầu ủy ban Văn hóa Toàn quốc.

Đại hội Văn hóa Toàn quốc họp các ngày 16, 17, 18, 19, 20/7/1948 tại Đào Giã - Thanh Ba (Phú Thọ). Đây là Đại hội có tầm cỡ và quy mô lớn bàn về văn hóa (theo nghĩa rộng) thống nhất thành lập Hội Văn hóa Việt Nam thay cho Hội Văn hóa cứu quốc không còn phù hợp với tình hình mới của cách mạng.

Đồng chí Trường Chinh đến dự và có bài phát biểu quan trọng với tiêu đề "Chủ nghĩa Mác và vấn đề Văn hóa Việt Nam". Đại hội đã bầu Hồ Chủ tịch là Hội trưởng danh dự và một BCH gồm: Ban Thường vụ Hội trưởng là Đặng Thai Mai, Tổng thư ký là Hoài Thanh, các ủy viên Nguy Nguy Kon Tum, Tô Ngọc Vân, Trần Huy Liệu, Đoàn Phú Tứ, Trần Văn Giáp và các ủy viên BCH gồm Trần Đại Nghĩa, Phạm Đình ái, Đặng Phúc Thông, Tôn Thất Tùng (ngành Khoa học tự nhiên); Nguyễn Khánh Hoài, Trần Công Tường (ngành Khoa học xã hội); Nguyễn Công Mỹ, Phạm Thiều, Bà Thục Viên (ngành giáo dục); Hoàng Xuân Nhị, Đỗ Đức Dục (ngành nghệ thuật); Thế Lữ, Nguyễn Xuân Khoát, Văn Cao, Nguyễn Cao Luyện (ngành văn học).

*Đại hội Văn nghệ toàn quốc (Yên Kỳ - Hạ Hòa).

Chuẩn bị cho Đại hội Văn nghệ toàn quốc ngày 03/10/1947 một số văn nghệ sỹ đã họp tại Đại Từ (Thái Nguyên) bàn việc thành lập Hội Văn nghệ Việt Nam và bầu BCH lâm thời gồm các ông Hoài Thanh - Tổng thư ký, Nguyễn Đình Thi, Tố Hữu, Tô Ngọc Vân, Lưu Hữu Phước.

Ngày 6/4/1948 BCH lâm thời đã mở Hội nghị lần thứ 2 thông qua Điều lệ dự thảo Hội Văn nghệ Việt Nam chuẩn bị cho việc tổ chức Đại hội và bầu ông Thế Lữ bổ sung vào BCH lâm thời.

Đại hội Văn nghệ toàn quốc lần thứ nhất được tổ chức vào các ngày 23, 24, 25/7/1948 tại xã Yên Kỳ (Hạ Hòa - Phú Thọ) có 80 văn nghệ sỹ cả nước về dự Đại hội. Đại biểu dự Đại hội gồm có: Đặng Thai Mai, Nguyễn Tuân, Nguyễn Văn Tỵ, Võ Liên Sơn, Đoàn Phú Tứ, Phạm Văn Đôn, Chu Ngọc, Xuân Sanh, Hải Triều, Lê Đại Thanh, Hoàng Công Khanh, Tô Vũ, Học Phi, Sao Mai, Trần Lê Văn, Ngô Tất Tố, Nguyên Hồng, Tạ Mỹ Duật, Thanh Tịnh, Đồ Phồn, Thế Lữ, Võ Đức Chiên, Nguyễn Xuân Khánh, Phan Duy, Bùi Công Kỳ, Đỗ Nhuận, Nguyễn Đình Phúc, Văn Cao, Trần Văn Cẩu, Trần ĐìnhTho, Phan Kế An, Nguyễn Tư Nghiêm, Dương Bích Liên, Mai Văn Hiến, Nguyễn Sáng, Lê Phả, Bửu Tiến, Trần Đăng, Ngô Quang Châu, Anh Thơ, Bắc Sơn, Phan Thanh, Phương Hoa, Nguyễn Đình Thi, Tố Hữu, Hoài Thanh, Như Phong, Xuân Thủy, Hải Như, Xuân Diệu, Tô Ngọc Vân, Hồng Tranh, Phan Khôi, Nguyễn Đình Lạp, Chu Ngọc, Thanh Tịnh, Nguyễn Công Hoan, Nguyễn Cao Luyện, Lưu Hữu Phước, Lê Hữu Kiều (Sơn Tùng) Trương Tửu cùng một số văn nghệ sỹ khác.

Đoàn Chủ tịch Đại hội gồm: Hoài Thanh, Tố Hữu, Tô Ngọc Vân;

Đoàn thư ký gồm: Lê Đại Thanh, Trần Lê Văn, Xuân Diệu.

Đại hội đã bầu 17 người vào BCH; Ban Thường vụ có Nguyễn Tuân - Tổng thư ký, Tố Hữu - Phó tổng thư ký, Võ Đức Diên (phụ trách kinh tế), Ngô Quang Chân (phụ trách quản trị,) Xuân Diệu (phụ trách tổ chức kiểm tra). Các ủy viên BCH Trần Văn Cẩn (ngành Mỹ thuật), Thế Lữ (ngành Sân khấu), Nguyễn Xuân Khoát, Lưu Hữu Phước (ngành Âm nhạc), Ngô Tất Tố (phụ trách khu I), Lê Hữu Kiều (phụ trách khu III), Trương Bửu, Lưu Trọng Lư (phụ trách khu IV), Tạ Mỹ Duật (phụ trách khu X), Nguyễn Đỗ Cung (phụ trách Nam Trung Bộ), Hoàng Xuân Nhị, Huỳnh Văn Gấm (phụ trách Nam Bộ).

Trong Đại hội còn quyết định thành lập:

Đoàn Nhạc sỹ với BCH gồm Nguyễn Xuân Khoát, Văn Cao, Lưu Hữu Phước, Nguyễn Văn Thương, Nguyễn Đình Thi.

Đoàn Sân khấu với BCH: Thế Lữ, Đoàn Phú Tứ, Phạm Văn Khoa (Thường vụ) Võ Đức Diên, Nguyễn Huy Tưởng, Chu Ngọc, Phạm Văn Đôn, Trần Hoạt, Lê Đại Thanh, Bửu Tiến, Trần Huyền Trân. Đại hội cũng quy định các khu thành lập chi hội văn nghệ, các tỉnh thành lập phân hội văn nghệ.

Năm 1998 Liên hiệp các Hội VHNT Việt Nam và Tỉnh ủy Phú Thọ đã đặt bia kỷ niệm nơi họp Đại hội.



II - NHỮNG CHUYẾN TRỞ VỀ NGUỒN



Từ những năm 1998 đến nay liên tục có
nhiều chuyến trở về thăm lại - cái nôi của nền văn nghệ Việt Nam, nơi các văn nghệ sỹ hàng đầu đất nước đã có những năm tháng sống và sáng tác trong điều kiện kháng chiến thiếu thốn. Đó là các chuyến trở về của gia đình Nhà thơ Tố Hữu, Nguyễn Đình Thi, Cù Huy Cận, Xuân Sanh, Kim Lân, Văn Cao, Đỗ Nhuận, Tô Hoài,Tô Ngọc Vân... Những chuyến trở về nguồn của các thế hệ văn nghệ sỹ sau này của Hội Văn học Nghệ thuật Phú Thọ. Đặc biệt các chuyến về nguồn của Hội Nhà văn Việt Nam tổ chức do Nhà thơ Hữu Thỉnh Chủ tịch Hội dẫn đầu cùng với các hoạt động tình nghĩa như tặng quà, sách báo, những xuất học bổng cho quỹ khuyến học cho các xã nơi đặt trụ sở đầu tiên của Hội văn nghệ Việt Nam và Báo văn nghệ.



Đoàn Báo Văn nghệ và Hội Phú Thọ tại bia di tích Trụ sở
đầu tiên Hội Văn nghệ Việt Nam và Tạp chí Văn nghệ 1948
(xã Gia Điền - huyện Hạ Hòa).


Năm 2008 này, hướng tới kỷ niệm 60 năm thành lập Hội Văn nghệ Việt Nam và Báo Văn nghệ (1948 - 2008). Trong dịp Giỗ Tổ Hùng Vương - Lễ hội Đền Hùng Mậu Tý vừa qua các văn nghệ sỹ của 14 tỉnh phía Bắc về dự trại sáng tác do Liên hiệp các Hội VHNT Việt Nam tổ chức tại Phú Thọ. Nhà văn Tùng Điển, Nhà thơ Mai Liễu phụ trách trại đã dành 1 ngày để đưa anh chị em trại viên thăm lại Xuân áng một trong những địa danh đặt trụ sở đầu tiên của Hội Văn nghệ Việt Nam
Gần đây nhất trong những ngày tháng 4 lịch sử vừa qua, 33 các nhà văn nhà thơ, cán bộ phóng viên của Báo Văn nghệ do nhà văn Nguyễn Trí Huân, Phó Chủ tịch Hội Nhà văn Việt Nam, Tổng biên tập Báo Văn nghệ dẫn đầu đã hành hương về Đất Tổ, cùng đi còn có hai Phó Tổng biên tập: Nhà thơ Trương Vĩnh Tuấn, dịch giả Thành Đức Trịnh Bảo, thư ký tòa soạn Đăng Bảy, các tác giả quen thuộc với bạn đọc của báo như: họa sỹ - nhà thơ - NSND Lê Huy Quang, Đỗ Bạch Mai, Phạm Minh Thư, Phạm Đình Ân, Hà Nguyên Huyến, Lã Thanh Tùng, Nguyễn Chí Hoan, Lương Ngọc An, Đức Dũng... các anh, các chị đã cùng với các văn nghệ sỹ của Hội Phú Thọ thăm Hạ Hòa nơi ra đời và đặt trụ sở đầu tiên của Hội Văn nghệ Việt Nam - nơi khai sinh Báo Văn nghệ.

Sau khi thắp hương tại Đền Hùng lịch sử, đúng như lịch trình đoàn có cuộc gặp gỡ và giao lưu với các văn nghệ sỹ Hội Phú Thọ. Với sự có mặt đón tiếp đoàn của các đồng chí đại diện lãnh đạo Tỉnh ủy, UBND tỉnh.

Đầu giờ chiều chúng tôi cùng về huyện Hạ Hòa, 4 chiếc xe nối đuôi nhau vào tận sân trụ sở UBND xã Yên Kỳ. Đón tiếp đoàn có các đồng chí Nguyễn Văn Quế - Phó Chủ tịch UBND huyện Hạ Hoà, chị Tuyết Mai - Phó phòng văn hoá huyện và các anh trong Đảng uỷ, HĐND, UBND xã. Sau những cái bắt tay và giới thiệu thân mật, lãnh đạo Báo Văn nghệ tặng quà và học bổng cho quỹ khuyến học của xã Yên Kỳ. Các anh, các chị đã trực tiếp đưa chúng tôi đi đến thôn Dộc Phát. Ngự trên đồi chè xanh mướt là tấm bia có ghi "Nơi họp Đại hội Văn nghệ kháng chiến toàn quốc thành lập Hội Văn nghệ Việt Nam trong các ngày 23, 24 và 25 tháng 7 năm 1948". Chính nhà thơ Tố Hữu, Hữu Thỉnh, Nguyễn Đình Thi, Nguyễn Xuân Sanh... đã đến Dộc Phát chỉ đạo dựng bia để đánh dấu nơi diễn ra sự kiện trọng đại này. Nhà văn Nguyễn Hữu Nhàn đã có nhiều bài nghiên cứu về sự ra đời của nền văn nghệ kháng chiến chống Pháp ở Phú Thọ giai đoạn 1945 - 1954", qua tìm hiểu chúng tôi được biết:

Xã Yên Kỳ cùng với các xã Văn Lang, Chuế Lưu, Minh Hạc, Đại Phạm... là những xã của huyện Hạ Hoà có phong trào khá toàn diện về mọi mặt kinh tế - xã hội. Riêng Đảng bộ Yên Kỳ nhiều năm liền đạt danh hiệu "Trong sạch vững mạnh". Những năm chống Pháp đã có lần giặc mon men vào Dộc Phát bị dân quân du kích và bộ đội địa phương đánh cho thua chạy. Được biết nhà văn Lê Minh (con cụ Nguyễn Công Hoan) cùng chồng là ông Trần Diệp Hàm lên Yên Kỳ viếng mộ cha là Lê Đức Linh. Cụ Linh là bạn dạy học và là người giác ngộ cách mạng cho nhà văn Nguyễn Công Hoan. Trước cách mạng, cụ Linh được Tổng Bí thư Trường Chinh cử ra nước ngoài hoạt động. Khởi nghĩa tháng Tám thành công cụ Linh được Trung ương điều về Tân Trào công tác. Khi cụ mất hài cốt được đưa về mai táng ở Yên Kỳ - quê ngoại nhưng là nơi sinh sống của vợ con cụ. Tổng Bí thư Trường Chinh trực tiếp về Yên Kỳ gắn bia mộ cho cụ và chỉ thị cho huyện Phù Ninh, đổi tên Phú Hộ thành xã Nhuận Chi là bí danh của cụ Linh vì ở Phú Hộ cụ lập đồn điền làm trụ sở hoạt động bí mật của Đảng...

Vì thời gian eo hẹp nên đoàn Báo Văn nghệ và Hội Phú Thọ không đến được xã Chu Hưng. Nơi đã in đậm dấu ấn đoàn kịch của Thế Lữ. Chu Hưng cũng là nơi đã tổ chức nhiều cuộc triển lãm tranh của các họa sỹ Việt Bắc. Lớp nhạc do nhạc sỹ Lưu Hữu Phước dạy ở đầm Ao Châu cũng thường xuống Chu Hưng biểu diễn. Những lớp học sinh thời ấy bây giờ đã trở thành các nhạc sỹ nổi tiếng và đã ở độ tuổi "xưa nay hiếm". Đứng trên quả đồi cao ở Chu Hưng, ta sẽ được nhìn trọn vùng đất từng là Thủ đô kháng chiến, Thủ đô văn nghệ Việt Nam hồi đầu thành lập. Phía trên là ấm Hạ, ấm Thượng, nơi có đầm Ao Châu 99 ngách in dấu chân Vua Hùng tìm đất đóng đô. Bên kia là Xuân áng, năm 1946 có khoảng một nghìn người dân Hà Nội tản cư lên. Đó cũng là trụ sở của Đoàn Văn hoá kháng chiến do họa sỹ Tô Ngọc Vân phụ trách. Các họa sỹ đã vẽ tranh, vẽ tem, vẽ các mẫu tiền và Bằng khen, Huân, Huy chương cho Chính phủ Kháng chiến tại nơi này.

Từ Xuân áng, nhạc sỹ Nguyễn Xuân Khoát đã sáng tác bài "Tiếng chuông nhà thờ" nổi tiếng. Cũng từ Xuân áng, nhà văn Bùi Huy Phồn đã viết kịch bản để Thế Lữ dàn dựng cho đoàn kịch. Diễn viên chính lại là Thế Lữ, vợ ông là NSND Song Kim rồi cùng nhà văn Bùi Huy Phồn, Thanh Tịnh và có khi cả Nguyễn Xuân Khoát cũng phải vào vai. Từ đây nhà thơ Thanh Tịnh đã sáng tạo tấu một thể loại mới của sân khấu. Chính ở vùng đầm Ao Châu đêm 19/8/1948, Đoàn kịch Kháng chiến từ Xuân áng sang đã công diễn đêm đầu tiên với hai vở "Tay người đàn bà" - kịch Bùi Huy Phồn và "Cụ Đạo ông sử" - kịch của Thế Lữ. Đoàn kịch được Đại tướng Võ Nguyên Giáp đổi tên là Đoàn kịch Quyết Thắng. Họ diễn từ Xuân áng sang Hạ Hoà, Thanh Ba đến các vùng tự do của Phú Thọ rồi đi diễn ở Tuyên Quang, Thái Nguyên đến các tỉnh Tây Bắc - Việt Bắc. Xuân áng, Hạ Hoà là đại bản doanh của Đoàn kịch Kháng chiến. Trong chuyến đi về nguồn này dù Đoàn chúng tôi không dừng chân ở Xuân Áng, nhưng năm 2006 tôi cũng đã có dịp cùng nhà văn Nguyễn Hữu Nhàn đến nơi đây tìm hiểu viết bài, gặp gỡ các nhân chứng sống là ông Đặng Văn Khai và Bùi Kim Duyệt là những cán bộ địa phương đã từng tham gia học diễn tấu với Thanh Tịnh và Đoàn kịch kháng chiến. Theo lời của ông Duyệt, ông Khai thì văn nghệ sỹ đã sống và sáng tác ở đây. Nhà ông Bùi Văn Luận là nơi gia đình hoạ sỹ Tô Ngọc Vân ở và làm việc, tận mắt nhìn thấy bàn gỗ và quả lô bằng đá nặng hàng chục ký dùng để in tranh tuyên truyền của họa sỹ Tô Ngọc Vân. Ông Luận được họa sỹ Tô Ngọc Vân nhận vào làm ở xưởng in của Đoàn Văn nghệ kháng chiến. Sau này đoàn chuyển sang Ấm Hạ và lên Thái Nguyên ông cũng lên theo. Có lần giáo sư, tiến sỹ Tô Ngọc Thanh cũng đã về thăm lại nơi này để ôn lại những kỷ niệm thời trẻ ông đã cùng gia đình mình ở đây. Người Xuân Áng thật thà chất phác. Trong kháng chiến đồng bào đã toàn tâm toàn ý theo Đảng phục vụ kháng chiến. Giờ đây Xuân Áng được Nhà nước đầu tư toàn diện, nhân dân cũng đã phát huy được nội lực phát triển kinh tế, xã hội. Đường làng Xuân Áng đã được đổ nhựa, bê tông hoá đến nhiều đường thôn. Hệ thống điện, đường, trường, trạm đã phần nào được đầu tư xây dựng cơ bản.

Đoàn cán bộ Báo Văn nghệ cùng văn nghệ sỹ Hội Phú Thọ chúng tôi tiếp tục đến xã Gia Điền được các anh trong Huyện uỷ, UBND huyện và xã đón tiếp tại trụ sở của xã, những tấm băng dôn để chào mừng đoàn đã thể hiện tình cảm của chính quyền và nhân dân địa phương dành cho đoàn. Thay mặt BBT Báo Văn nghệ, nhà văn Nguyễn Trí Huân tặng sách và quà cho xã, quỹ Khuyến học xã.

Gia Điền, cái tên nghe thân thương đối với văn nghệ sỹ lắm. Gia Điền đã đổi khác, không còn xác xơ nghèo nàn như ngày nào nhà thơ Tố Hữu về nữa. Bây giờ, đường làng, thôn bản đã cơ bản được đổ bê tông, trải cấp phối. Hệ thống điện, đường, trường trạm được Nhà nước đầu tư mạnh. Nhân dân Gia Điền đang đã thực hiện dự án chè để làm giàu cho nhân dân. Dân quanh vùng thường có câu "Lắm thóc Gia Điền, lắm tiền Chu Hưng" vì lắm thóc nên Hội Văn nghệ Việt Nam, cùng nhiều cơ quan Trung ương, Chính phủ và Liên khu X mới về đóng ở Gia Điền và quanh vùng. Hội Phụ nữ xã Gia Điền ngày ấy mở nhiều hàng quán ven đường để phục vụ không thu tiền từ cốc nước chè xanh đến hoa quả, đồng quà tấm bánh cho cán bộ và bộ đội qua làng. Chúng tôi đứng chụp ảnh trước tấm bia lịch sử dựng cạnh bãi bóng của Hội Văn nghệ Việt Nam hồi đầu năm 1947, 1948 rồi vào ngôi nhà làm trên nền cũ của nhà bà cụ Gái mà các ông Tố Hữu, Nguyễn Đình Thi, Nguyễn Huy Tưởng, Xuân Diệu, Văn Cao... đã ở từ những năm 1947. ở đây đêm đêm nghe bà cụ Gái khóc vì nhớ con trai đi vệ quốc quân, anh em đã yêu cầu nhà thơ Tố Hữu làm bài thơ "Bầm ơi" giả làm thư của con trai gửi về cho bà Gái. Bà Gái tưởng thật luôn nhờ nhà thơ đọc lại "Bức thư" này cho nghe. Và ở chiến trường các chiến sỹ cũng đua nhau chép bài thơ "Bầm ơi" gửi về cho mẹ mình. Từ nhà bà cụ Gái này nhà văn Kim Lân đã viết hoàn thành truyện ngắn "Làng" nổi tiếng. Nguyễn Huy Tưởng viết kịch "Người ở lại". Nguyên Hồng viết "ấp đồi cháy". Văn Cao hoàn thành "Trường ca Sông Lô". Bản nhạc này được nhạc sỹ Lương Ngọc Trác dàn dựng cho đoàn quân nhạc để công diễn đầu tiên ở làng Vĩnh Chân, Hạ Hoà trong đại hội tập do tướng Bằng Giang phụ trách. Cũng dịp này Đỗ Nhuận hoàn thành bản "Du kích Sông Thao" được công diễn đầu tiên ở Hạ Hoà.

Đoàn xe dừng lại ở Gốc Gạo - Gia Điền. Tại đây, được đặt tấm bia: "Tại thôn Gia Điền trong kháng chiến chống Pháp đã đóng trụ sở đầu tiên của Hội Văn nghệ Việt Nam (1948 - 1949) cùng với cơ quan Thường trực Hội, có cơ quan Tạp chí Văn nghệ và Nhà xuất bản Văn nghệ". Trong "Văn nghệ những ngày đầu" - Nhà thơ Tố Hữu có viết: "...Lại tạt qua Việt Trì lên Phú Thọ... còn văn nghệ thì vào thôn Gia Điền. Từ đây, thực sự bắt đầu công việc văn nghệ kháng chiến. Đó là một xã nghèo đói, chỉ mấy mảnh ruộng bằng tấm chiếu trải giữa những đồi cọ xác xơ. Nhà chúng tôi đến chỉ có một bà cụ già có một con trai đã vào bộ đội. Lỏng chỏng hai cái giường tre đủ cho 4 người nằm và một bộ phản gỗ làm bàn cho "Toà soạn" một Tạp chí sắp ra đời... phải ra Tạp chí Văn nghệ ngay, giấy bản còn dính cả rơm nhưng vừa đủ mấy khuân chữ bỏ cặp mang theo. Nhưng ra báo là sướng rồi. Gay nhất là bài vở thế nào cho hay anh bò ra mà viết, nhờ có gió chiến thắng, hào hứng nổi lên, có đủ tiểu luận, truyện ngắn, thơ, nhạc... Một tạp chí đã ra đời, mặt mũi khôi ngô, tinh thần rất mạnh, bắt đầu có khí sắc kháng chiến". Và những số đầu của Tạp chí Văn nghệ đã được biên tập và phát hành ở Gia Điền. Tháng 3/1948 số tạp chí Văn nghệ đầu tiên đã được biên tập xong bản thảo ở Gia Điền. Các số 2,3,4,5 cũng được biên tập ở Gia Điền do nhà thơ Xuân Diệu đi in ở Báo Cứu quốc ở đồi Gò Bông cạnh xóm Gạo xã Gia Điền.

Đoàn chúng tôi ăn tối tại UBND huyện Hạ Hoà và nghỉ đêm tại thị trấn của huyện. Đêm đầu hè yên tĩnh mọi người nghỉ ngơi sau một ngày mệt nhọc đi nhiều, gió sông Thao thổi nhẹ vi vu khiến chúng tôi liên tưởng đến những năm tháng sống và sáng tác của lớp văn nghệ sỹ hàng đầu của đất nước trong thiếu thốn và khó khăn nhưng đầy tự hào của giới văn nghệ sỹ Việt Nam. Sẽ còn vang vọng mãi những "Bà bủ", "Bầm ơi" của Tố Hữu, "Trường ca sông Lô" của Văn Cao; "Du kích Sông Thao" của Đỗ Nhuận và biết bao tác phẩm bất hủ khác.
Sáng hôm sau chia tay các anh chị ở Báo văn nghệ để tiếp tục lên Định Hoá - Tân Trào (Tuyên Quang); Đại Từ - Thái Nguyên, chúng tôi trở về Hội để bế mạc một trại sáng tác, lòng đầy tự hào về mảnh đất Phú Thọ đã từng là cái nôi của nền văn nghệ kháng chiến, nơi đã diễn ra những sự kiện lớn, có ý nghĩa lịch sử cho sự phát triển của nền văn hoá, văn học nghệ thuật nước nhà.

Người dân Phú Thọ tự hào về những năm tháng chống Pháp không chỉ là người cưu mang, che chở, giúp đỡ, nhường cơm sẻ áo cho nhiều văn nghệ sỹ nổi tiếng mà còn được thừa hưởng những giá trị văn hoá tinh thần, nâng cao trình độ hiểu biết phát triển phong trào văn nghệ phục vụ kháng chiến. Ngày nay tiếp thu và phát huy truyền thống đó, được sự quan tâm của Tỉnh uỷ, UBND tỉnh các văn nghệ sỹ Phú Thọ đã và đang gia sức phấn đấu xây dựng Hội VHNT tỉnh vững mạnh và có nhiều tác phẩm xuất sắc, góp phần vào sự phát triển nền văn học nghệ thuật Việt Nam tiên tiến đậm đà bản sắc dân tộc.

Chúng tôi thiết nghĩ trong dịp kỷ niệm 60 năm này, hơn lúc nào hết UBTQ Liên hiệp VHNT Việt Nam cần tổ chức cho đại biểu các Hội Trung ương và địa phương một chuyến trở về nguồn, thăm lại cái nôi nền văn nghệ Việt Nam thì rất có ý nghĩa vô cùng.

Đ.N.D
Nguồn http://dodungart.vnweblogs.com/post/3574/80401