Xem Nhiều 12/2022 #️ Làm Quen Với Ext Js / 2023 # Top 16 Trend | Tvzoneplus.com

Xem Nhiều 12/2022 # Làm Quen Với Ext Js / 2023 # Top 16 Trend

Cập nhật thông tin chi tiết về Làm Quen Với Ext Js / 2023 mới nhất trên website Tvzoneplus.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất.

Ext Js là gì?

Ext Js (Extended Javascript) là một framework Javascript thuần túy để xây dựng các ứng dụng Web tương tác bằng cách sử dụng các kỹ thuật như Ajax, DHTML và DOM. Phiên bản đầu tiên là một thư viện mở rộng của YUI được xây dựng bởi Jack Slocum, bao gồm các khả năng tương tác với Jquery và Prototype. Bắt đầu từ phiên bản 1.1, Ext Js được phát triển thành 1 thư viện độc lập Tham khảo các demo tại:

Những điều cần lưu ý

Ext Js sử dụng giấy phép GPL (từ phiên bản 2.1 trở đi), điều này có nghĩa khi bạn muốn sử dụng thư viện Ext Js miễn phí, dự án của bạn phải là dự án cá nhân, giáo dục hoặc phi lợi nhuận.

Tài liệu nghiên cứu

Các bài viết cũng như sách vở về Ext Js còn ít và không phong phú bằng các thư viện Javascript khác. Cách tốt nhất để học Ext Js là bạn hãy lên trang

Ext Js (Extended Javascript) là một framework Javascript thuần túy để xây dựng các ứng dụng Web tương tác bằng cách sử dụng các kỹ thuật như Ajax, DHTML và DOM. Phiên bản đầu tiên là một thư viện mở rộng của YUI được xây dựng bởi Jack Slocum, bao gồm các khả năng tương tác với Jquery và Prototype. Bắt đầu từ phiên bản 1.1, Ext Js được phát triển thành 1 thư viện độc lậpTham khảo các demo tại: http://www.extjs.com/deploy/dev/examples Ext Js sử dụng giấy phép GPL (từ phiên bản 2.1 trở đi), điều này có nghĩa khi bạn muốn sử dụng thư viện Ext Js miễn phí, dự án của bạn phải là dự án cá nhân, giáo dục hoặc phi lợi nhuận.Các bài viết cũng như sách vở về Ext Js còn ít và không phong phú bằng các thư viện Javascript khác. Cách tốt nhất để học Ext Js là bạn hãy lên trang chúng tôi để tham khảo các tài liệu hướng dẫn. Cụ thể là trang: http://docs.sencha.com/ext-js/4-1

Ext Js 6 Của Sencha / 2023

Những người đọc lâu năm có thể nhớ rằng tôi đã bắt đầu sử dụng Ext JS khoảng 3 năm trước. Vào thời điểm đó, tôi đang sử dụng phiên bản 4.2.2. Gần đây tôi đã bắt đầu một hợp đồng mới, nơi họ đang sử dụng Ext JS 6.0.1. Tôi phải nói rằng, phiên bản này giải quyết rất nhiều vấn đề kiến ​​trúc tôi gặp phải với loạt 4.x. Nhưng, vẫn còn vấn đề.

Vì tôi đã cung cấp đánh giá về Angular 2 và React JS , tôi nghĩ rằng việc cung cấp đánh giá về phiên bản Ext JS hiện tại sẽ phù hợp vì ba người này dường như là những người chơi chính trong thế giới doanh nghiệp.

Ảnh tín dụng: sanbeiji qua Visual Hunt / CC BY-SA

Ext JS – Tốt

MVVM

Tôi đã luôn có ba khiếu nại lớn về Ext JS. Trong ba, thực tế là Ext JS gần như không thể kiểm tra là thứ đã đẩy tôi đi. Trên thực tế, tôi gần như không phỏng vấn cho hợp đồng mà tôi có bây giờ vì họ đang sử dụng Ext JS. Điều này là do phiên bản 4.2 mà tôi đang sử dụng đã triển khai cái mà họ gọi là khung MVC. Vấn đề là, khung MVC mà họ triển khai không phải là thứ mà Gang of Four sẽ nhận ra. Khi tôi nhận ra rằng những gì họ gọi là MVC không thực sự là MVC, tôi có thể học cách sử dụng sản phẩm tốt hơn nhiều.

Nhưng, là anh chàng TDD, tôi luôn cảm thấy thất vọng khi họ triển khai MVC vì để kiểm tra bất cứ điều gì trong Trình điều khiển, tôi phải có sẵn chế độ xem. Và, trong khi tôi đã thử một vài cách để giảm thiểu vấn đề này, tôi không bao giờ hoàn toàn hài lòng với giải pháp. Tôi phải có thể kiểm tra trình điều khiển của mình mà không có chế độ xem, hoặc, nếu tôi phải có chế độ xem, thì đó phải là một dạng xem giả mạo hoặc có thể kết xuất thành một DOM giả như React JS.

Nhưng trong Ext JS 6, họ đã cung cấp một khung thay thế. Lần này, nó cũng được đặt tên chính xác hơn. Họ đã cung cấp một triển khai MVVM. Trong Chế độ xem, bạn cung cấp bố cục, cú pháp khai báo để truy cập trạng thái của Chế độ xem từ ViewModel và để chỉ định trình xử lý sự kiện, bạn sử dụng các khối trình nghe cho biết chế độ xem sẽ gọi phương thức nào trong lớp ViewContoder được liên kết.

Trong ViewContoder, các phương thức của bạn có thể truy cập ViewModel bằng cách gọi getModel () và có thể đặt trạng thái của chế độ xem bằng cách gọi phương thức set () của ViewModel. Khi điều này được thực hiện, Chế độ xem có thể cập nhật bằng trạng thái mới của ViewModel.

Điều này có nghĩa là để kiểm tra là tôi có thể kiểm tra mà không cần View bằng cách ghi đè phương thức ViewContoller.getModel () để trả về ViewModel. Sau đó, tôi chỉ chạy thử nghiệm cho một phương thức và kiểm tra trạng thái của ViewModel. Nhìn Ma, không có View!

Tất cả mọi thứ bạn cần

Một trong những điểm bán hàng lớn nhất để sử dụng Ext JS là mọi thứ bạn cần đều được cung cấp cho bạn trong một sản phẩm. Không giống như Angular hay React JS nơi một dự án cung cấp khung và các dự án (hoặc dự án) khác cung cấp (các) thành phần, gần như mọi thứ bạn cần cho ứng dụng của bạn sẽ được cung cấp ngoài hộp. Điều này không có nghĩa là không có nhà cung cấp bên thứ ba nào cho Ext JS, nhưng nhu cầu đối với họ rất hạn chế.

Kết xuất nhất quán

Một trong những điểm thu hút chính mà Ext cung cấp là bạn không cần phải lo lắng về các vấn đề kết xuất trình duyệt chéo. Nếu bạn vẫn cần hỗ trợ các trình duyệt thực sự cũ, đây vẫn có thể là một điểm bán hàng lớn cho bạn. Tôi nghĩ rằng điều này sẽ ít quan trọng hơn trong tương lai khi các trình duyệt tiếp tục ổn định xung quanh các tiêu chuẩn.

Đáp ứng / Thích ứng

Mặc dù Ext JS sử dụng một cách điều khiển kết xuất không chuẩn (xem bên dưới) nhưng chúng vẫn quản lý để đạt được các thiết kế Thích ứng và Phản hồi.

Khả năng kiểm soát thao tác DOM

Cuối cùng, nếu bạn gặp khó khăn trong việc đạt được hiệu suất với cách hiện tại mà bạn đang hiển thị các thay đổi DOM, bạn sẽ rất vui khi biết rằng Ext JS cung cấp cách hiển thị cho DOM trong khi bạn thực hiện tất cả các thay đổi và sau đó bật lại làm kết xuất cuối cùng. Nhưng, ít nhất lần sử dụng cuối cùng của tôi cho thấy nó không thực sự tắt TẤT CẢ thao tác DOM. Nếu bạn đang chèn các phần tử DOM mới, chúng sẽ xuất hiện trên màn hình. Tất cả Ext JS thực sự làm là tắt mã bố cục của chúng.

Ai Ya Gonna gọi?

Một trong những lý do mạnh nhất mà nhiều tổ chức chọn Ext JS là vì giá của giấy phép cho phép bạn truy cập vào hỗ trợ của Sencha. Các công ty tôi từng làm việc đã sử dụng điều này cho tất cả mọi thứ từ “Mã của tôi không hoạt động, tôi đang làm gì sai?” và thực sự nhận được câu trả lời cho “Tôi nghĩ rằng bạn có một lỗi ở đây” và đã sửa lỗi này. Đó là một StackOverflow riêng tư với quyền truy cập trực tiếp vào các lập trình viên đã viết khung.

Ext JS – Xấu

Khóa lại

Nếu bạn quyết định sử dụng Ext JS, bạn thực sự đang thực hiện một cam kết quan trọng hơn nhiều so với việc bạn chọn sử dụng Angular hoặc React. Với một trong hai điều đó, tôi có thể viết JavaScript chuẩn và tôi có thể trộn và kết hợp nhiều khung công tác hiện có khác nhau. Vì mọi thứ trong Ext JS đều là độc quyền, nên việc trộn và kết hợp không chỉ được tán thành mà còn cảnh báo chống lại điều đó. Nếu bạn đang sử dụng Ext JS, bạn sẽ sử dụng ALL of Ext JS cho mọi thứ.

Sử dụng nghiêm ngặt

Tiêu chuẩn thực hành tốt nhất của JS khuyến nghị nên đặt “sử dụng nghiêm ngặt”; ở đầu khối IIFE của bạn để bảo vệ bạn khỏi những sai lầm ngu ngốc. Thật không may, bạn không thể làm điều này trong mã Ext JS của mình mà không phải giải quyết các vấn đề mà nó tạo ra.

Dựa trên chuỗi

Ext JS có lẽ là ngôn ngữ dựa trên chuỗi nhất mà tôi từng thấy. Mặc dù hiện tại họ có các plugin cho một số IDE phổ biến giúp giảm thiểu rủi ro mà mã này áp dụng cho mã của bạn, nhưng về mặt JavaScript tốt, có nhiều cách viết mã tốt hơn nhiều so với những gì Ext JS buộc bạn phải làm.

Vấn đề làm tổ

Như tôi đã đề cập ở trên, Ext JS cung cấp các bố cục riêng để đạt được một bản trình bày trông giống nhau bất kể nó đang chạy trên trình duyệt nào. Tuy nhiên, chi phí của việc này là nếu bạn lồng các thành phần quá sâu, việc hiển thị chế độ xem hoặc thay đổi đối với chế độ xem của bạn sẽ mất nhiều thời gian hơn bất kỳ ai sẵn sàng chờ đợi. S0, để giải quyết vấn đề này, cuối cùng bạn sẽ viết mã tối ưu phụ từ mọi nguyên tắc mã hóa đang tồn tại. Cụ thể, DRY và SRP rất khó đạt được bằng cách sử dụng các khung nhìn Ext JS.

Phiên bản X.0.0 luôn bị hỏng

Tôi đã phàn nàn về điều này trước đây. Nhưng, dường như đối với tôi (và tất cả những người khác mà tôi nói chuyện đã sử dụng Ext JS) rằng mọi phiên bản .0.0 đều có lỗi. Những thứ được sử dụng để làm việc trong phiên bản trước không còn hoạt động. Bất chấp khẳng định từ Sencha rằng họ có hàng ngàn bài kiểm tra, tôi luôn tự hỏi họ có loại bảo hiểm mã nào và liệu họ có kiểm tra bao gồm mọi tính năng cho mọi thành phần mà họ đã ghi lại.

Ext JS – Xấu xí

HTML xấu

Có rất nhiều điều xấu về Ext JS, nhưng không có gì xấu hơn rõ ràng so với HTML mà nó tạo ra. Điều này là do, để tạo ra một chế độ xem sẽ hiển thị trên bất kỳ trình duyệt nào, họ đã sử dụng các bảng HTML để bao bọc mọi điều khiển tiêu chuẩn. Điều này đang trở nên tốt hơn. Có ít HTML được tạo ra trong Ext JS 6 hơn so với Ext JS 4, nhưng nó vẫn tương đối xấu.

Và, toàn bộ vấn đề lồng nhau có thể biến mất vào ngày mai nếu họ từ bỏ việc cố gắng kiểm soát kết xuất của chế độ xem thông qua JavaScript. Tại sao với JavaScript, CSS được thiết kế để làm gì và làm tốt hơn nhiều ?!

SASS không phải là SASS

JavaScript không chuẩn

Nhưng trong tất cả các vấn đề tôi gặp phải với Ext JS 6, vấn đề khiến tôi lo lắng nhất là khung công tác của họ cung cấp một cái gì đó chạy trên JavaScript nhưng thực sự không phải là JavaScript. Họ có cách khai báo riêng về một lớp học. Cách riêng của họ để bắt đầu một lớp học. Riêng họ đòi hỏi động cơ. Công cụ bó và thu nhỏ của riêng họ.

Và, vì tôi thậm chí không thể sử dụng “sử dụng nghiêm ngặt” trong những gì họ có bây giờ, một thứ gì đó đã tồn tại đủ lâu để nó được hỗ trợ bởi mọi khung công tác được sử dụng nghiêm túc trong sự tồn tại. chúng tôi sẽ không thể sử dụng vì Sencha nghĩ rằng họ có ý tưởng tốt hơn.

Tôi có thể sử dụng từ khóa “lớp” trong tương lai thay vì Ext.define () không?

Công cụ xây dựng không chuẩn

Ext JS không chỉ sử dụng JavaScript không chuẩn, mà họ còn sử dụng các công cụ xây dựng độc quyền của riêng mình để triển khai các ứng dụng cuối cùng. Cùng với việc sử dụng phiên bản SASS của riêng họ, họ cũng có cách triển khai gói và thu nhỏ riêng. Tại sao không sử dụng Gulp hoặc Grunt và cho phép chúng tôi đóng gói các ứng dụng theo cách của chúng tôi? Ồ, đúng, họ cũng có yêu cầu thực hiện riêng của họ. Và, bây giờ họ muốn bán cho chúng tôi các công cụ kiểm tra độc quyền.

Phần kết luận

Vì vậy, là Ext JS cho bạn? Đó là một câu hỏi hay. Bạn sẽ cần phải đánh giá nếu phần tốt hơn phần xấu. Nó không giống như Angular hay React có tất cả mọi thứ. Không có sự lựa chọn hoàn hảo. Chỉ có sự lựa chọn tốt nhất cho bạn và tổ chức của bạn.

Ext Js Và Bài Học Về Mã Nguồn Mở / 2023

Cách đây ít ngày một thư viện JavaScript/Ajax mà tôi rất thích dùng, Ext JS, đột ngột chuyển giấy phép sử dụng từ LGPL (một phiên bản của GPL cho phép sử dụng phần mềm mã mở trong các dự án thương mại) sang GPL v3 (một giấy phép mã mở chặt chẽ bắt buộc các dự án muốn dùng phần mềm mã mở cũng phải là mã mở) sau khi công bố một bản nâng cấp nhỏ. Điều này đã làm dấy lên một làn sóng phản đối, công kích trong khắp cộng đồng người dùng và phát triển.

Tôi đã dùng Ext JS ngay từ khi nó chỉ là một thư viện mở rộng của YUI. Đây là một thư viện rất tốt, đặc biệt nó cung cấp những gói UI rất đẹp và dễ sử dụng — chỉ cần vài dòng code JavaScript bạn đã có thể tạo nên một giao diện chuyên nghiệp cho ứng dụng web của mình. Lúc này thư viện có tên là YUI-Ext và được phân phối dưới giấy phép BSD như YUI.

Sự kiện Ext JS chuyển giấy phép sử dụng thành GPL (từ phiên bản 2.1 trở đi) đã gây sốc cho công đồng mã nguồn mở vì nhiều lý do. Không hẳn vì chúng ta sẽ phải trả tiền cho Ext. Với giấy phép thương mại hiện tại bạn chỉ cần mua một bản (cho 1 lập trình viên) là có thể triển khai không hạn chế trên nhiều máy chủ (chính xác hơn là trên số CPU không giới hạn). Những lý do chính khiển cộng đồng phát triển không hài lòng là:

Vấn đề đạo đức: Ext JS khởi đầu là một dự án “ăn theo” YUI, họ nhận được nhiều quan tâm vì danh tiếng của YUI. Sau khi xác lập đựơc vị trí, họ bỏ giấy phép tự do và bắt đầu theo đuổi giấy phép chặt chẽ hơn. Là một dự án mã mở, họ nhận được rất nhiều đóng góp từ cộng đồng và đổi lại cộng đồng phát triển ngày lại càng bị thu hẹp phạm vi sử dụng.

Vấn đề lòng tin: Bạn có thể tin được một công ty thay đổi giấy phép thường xuyên theo hướng càng kiếm được nhiều tiền càng tốt hay không? Điều gì sẽ xảy ra nếu một ngày đẹp trời nào đó, sau khi triển khai ứng dụng trên hàng chục máy chủ (tức là vài chục CPU), Ext JS đổi giấy phép thương mại từ “unlimited” sang “per-CPU”? Bạn sẽ phải chấp nhận trả một khoản phí “trên trời rơi xuống” hay bỏ mặc ứng dụng của mình không được nâng cấp hay vá lỗi?

Vấn đề phạm vi giấy phép: Điểm khác biệt giữa LGPL và GPL là giờ đây dự án nào muốn dùng Ext JS miễn phí thì cũng phải là “nguồn mở” theo đúng giấy phép GPL v3. Có ba vấn đề gây tranh cãi là: (1) Vì Javascript được chuyển từ server qua browser người dùng, thì việc này có được coi là “phân phối” mã nguồn và do đó chịu sự rằng buộc của GPL hay không? (2) Việc nén, obfuscate các thư viện Ajax theo GPL có hợp lệ hay không khi người được phân phối (tức là người dùng ứng dụng) không xem được toàn bộ mã nguồn? (2) Theo Jack, mã server-side (Java, PHP…) của dự án cũng phải là nguồn mở mới được dùng Ext JS trong khi một số chuyên gia về giấy phép mã mở cho rằng điều đó là không đúng vì mã JavaScript không có mối liên kết tĩnh (statical link) nào với mã server (?).

Vấn đề thích hợp: Vì những rắc rối nói trên mà bản thân giấy phép GPL v3 không “bao phủ” được hoàn toàn nên hầu hết các thư viện JavaScript đều chọn các giấy phép nguồn mở tự do hơn như BSD hay Apache 2. Việc Ext JS chọn GPL sẽ để lại các “lỗ hổng” có thể dẫn tới việc tranh tụng trong nhiều trường hợp hay nói cách khác chúng giống như những cái bẫy tiềm năng khiến cho việc sử dụng thư viện này theo hướng mã mở hoặc không thể thực hiện được hoặc không hiệu quả.

Nhiều người nói rằng dùng mã nguồn mở là hướng đi rẻ tiền, dễ dàng cho các công ty Việt Nam nhưng câu chuyện trên chỉ là một phần nhỏ trong rất nhiều vấn đề mà các giấy phép mã nguồn mở đặt ra. Tại Mỹ, muốn có lời khuyên đúng đắn bạn sẽ phải nhờ tới các luật sư có kinh nghiệm trong lĩnh vực này và không thực sự có nhiều luật sư như vậy (chắc chắn Jack đã không có được một luật sư tốt).

Giấy phép sử dụng (mã mở hay thương mại) có thể bị thay đổi bất kỳ lúc nào. Mặc dù việc thay đổi giấy phép không áp dụng ngược với các phiên bản trước nhưng bạn sẽ phải đối mặt với vấn đề “trả tiền để được nâng cấp, hỗ trợ hay bỏ mặc phần mềm đó“. Vì thế nên dùng phần mềm mở do các công ty có uy tín bảo trợ vì thường họ rất ít khi thay đổi giấy phép nếu không có lý do chính đáng.

Khi dùng mã nguốn mở, bạn phải đánh giá được mức độ rủi ro có thể gây ra do việc đổi giấy phép và chấp nhận mức độ rủi ro này.

Không phải tất cả các giấy phép mã mở đều giống nhau. Hiểu hết các “ngõ ngách” trong đống ngôn từ của các giấy phép này là việc của các chuyên gia và dù vậy bạn vẫn có thể dính vào kiện tụng do sự diễn dịch khác nhau giữa các bên và khi ấy quyền phán quyết nằm ở tòa án.

Nếu bạn định phân phối phần mềm của mình dưới giấy phép mã nguồn mở thì hãy suy nghĩ và tìm hiểu thật kỹ về phạm vi của các giấy phép này. Tất nhiên, vì là phần mềm của bạn nên bạn có quyền thay đổi giấy phép bất kỳ lúc nào cho các phiên bản mới, nhưng nếu không có lý do chính đáng cộng đồng mã mở sẽ cho rằng bạn đang lợi dụng mã mở để chuộc lợi và bạn sẽ nhanh chóng bị tẩy chay. Trong thế giới đầy cạnh tranh, bạn sẽ biến mất nhanh hơn bạn tưởng.

Ext JS và cá nhân Jack đang chịu nhiều sức ép từ phía cộng đồng. Có thể việc thay đổi giấy phép là bắt buộc nhằm kiếm tiền từ dự án để trả lương cho các lập trình viên nhưng người dùng không khỏi có cảm giác bất mãn khi đã bỏ công sức xây dựng các ứng dụng dựa vào thư viện này rồi đột nhiên nhận thấy nó sẽ không thích hợp nếu sử dụng vào các dự án thương mại hay mã đóng như dự kiến. Quan trọng hơn, việc đổ vỗ lòng tin khiến cho những người dùng nghiêm túc phải suy nghĩ lại về quyết định của mình khi đặt niềm tin lâu dài vào Ext JS.

Comments:

Bài viết được. Chỉ có một lỗi nhỏ (hay gặp) là bồ đã đánh đồng “phần mềm thương mại” (commercial software) với “phần mềm nguồn đóng” (closed source or proprietary software). Hai khái niệm đó không tương đồng với nhau. Phần mềm thương mại vẫn có thể là phần mềm nguồn mở hay tự do. Phần mềm thương mại vẫn có thể sử dụng các thành phần nguồn mở hay tự do trong mã nguồn của chúng. Phần mềm nguồn đóng thì không thể làm được chuyện đó.

Bản thân tôi cho rằng, không thể trách nhóm Ext JS. Ext JS là của họ, họ có toàn quyền quyết định sẽ sử dụng giấy phép nào.

Nếu cộng đồng không thích và nếu cộng đồng đủ mạnh, họ hoàn toàn có thể lấy phiên bản cuối cùng của Ext JS phát hành với license LGPL mà phát triển lên tiếp.

Còn nếu cộng đồng không thể làm chuyện đó, chứng tỏ rằng, phần lớn công sức phát triển Ext JS là của nhóm của Jack, nên họ xứng đáng kiếm được nhiều tiền hơn từ công sức mà họ bỏ ra.

Nếu có ai đó phải trách, tôi nghĩ chính là những người sử dụng Ext JS mà không có những nghiên cứu cần thiết về rủi ro hoặc chỉ chăm chăm muốn *bốc lột* công sức của người khác mà không muốn trả tiền.

———————————————————————–

@Tác giả. Bài viết hay. Open Source, Open content còn cần một chặng đường dài để điều chỉnh và phát triển. Tuy vậy, một khi triết lý đã đúng, thì dù gặp vài trục trặc, cuối cùng phong trào mở vẫn sẽ chiến thắng.

@Thái. Đồng ý với bạn về việc cộng đồng nếu không thích có thể sử dụng bản cuối cùng để phát triển lên tiếp. Tuy vây, khi nhóm Jack đã sử dụng cộng đồng để phát triển nên sản phẩm này thì họ cũng có nghĩa vụ tham khảo và tôn trọng ý kiến cộng đồng trước khi đưa ra các quyết định quan trọng ảnh hưởng tới nhiều người như thay đổi License từ GPL sang GPL3.

———————————————————————–

@Thai: Hình như mình không đề cập gì tới những khái niệm như phần mềm thương mại (commercial software – CS), phần mềm mã đóng (closed source software – CSS). Đây là một vấn đề khá phức tạp, tuy nhiên, để chúng ta không nhầm lẫn về ngữ nghĩa, mình xin làm rõ những điểm này:

+ Phần mềm thương mại: là những phần mềm được làm ra để cho mục đích thương mại (nói nôm na là để bán lấy tiền). Nghĩa là, trong phần lớn trường hợp, bạn sẽ phải phân phối nó cho khách hàng. Thường thì phần mềm thương mại là mã đóng (closed source) và thuộc sở hữu của một cá nhân hay tổ chức (proprietary software). Một số phần mềm thương mại là mã mở, trong trường hợp này nó sẽ có ít nhất hai loại giấy phép (dual license): giấy phép thương mại và giấy phép mã mở.

+ Giấy phép mã mở chủ yếu chi phối việc bạn có được phân phối lại trong các dự án thương mại hay không. Cụ thể LGPL, BSD hay Apache cho phép điều này (với các điều kiện khác nhau một chút), ngược lại GPL thì tuyệt đối không.

+ Vì thế bạn có thể dùng phần mềm mã mở (kể cả loại giấy phép GPL như MySQL) tự do, kg phải trả phí miễn là bạn không có ý định phân phối lại nó (thí dụ, dùng MySQL trong các dự án web của công ty bạn ngay cả dự án đó lớn như FaceBook). Đây là đọan trích từ Giấy Phép Mã Mở của MySQL:

“Free use for those who never copy, modify or distribute. As long as you never distribute the MySQL Software in any way, you are free to use it for powering your application, irrespective of whether your application is under GPL license or not.”(Source: http://www.mysql.com/about/legal/licensing/opensource-license.html)

+ Khi phân phối lại các phần mềm mã mở (nếu được phép) bạn phải kèm theo giấy phép và giữ nguyên tham chiếu xuất xứ để người dùng biết được bạn đang dùng các phần mềm mã mở nào, có thể tham khảo mã ở đâu…

+ Nếu bạn mua giấy phép thương mại của một phần mềm mã mở (như của Ext JS hay của MySQL) thì nó sẽ cho phép bạn triển khai trên một số CPU nhất định và/hoặc sử dụng cho số lập trình viên nhất định. Nếu bạn phân phối lại một phần mềm có giấy phép thương mại (thường là dạng thư viện – library) thì tùy trường hợp giấy phép sẽ đòi bạn trả phí thêm cho mỗi bản phân phối (royalty fee) hay kg có rằng buộc này (royalty free). Đương nhiên bạn không cần kèm giấy phép sử dụng và tham chiếu tới các phần mềm bạn mua trong bản phân phối của mình dù nó là mã mở.

Trường hợp các thư viện JavaScript/Ajax như Ext JS khá đặc biệt. Các thư viện này được “phân phối” từ máy chủ tới browser của người dùng (ít nhất theo lập luận của Jack) nên khi nó chuyển qua giấy phép GPL thì đòi hỏi cả dự án web dùng nó phải là nguồn mở. Đây là điểm gây nhiều tranh cãi:

1. Liệu việc sử dụng một ứng dụng web có bị coi là phân phối lại phần mềm hay không?

2. Việc sử dụng một thư viện JavaScript dưới giấy phép GPL có buộc cả dự án phải là mã mở hay không (vì mối liên kết giữa JavaScript và mã server-side có thể chưa đủ mạnh để bị coi là có “liên kết tĩnh” theo định nghĩa của GPL)?

3. Có được phép nén, obfuscate một thư viện JavaScript dùng giấy phép GPL hay không?

Nếu xảy ra tranh chấp và tòa án phán quyết rằng việc sử dụng ứng dụng web không bị coi là phân phối lại phần mềm (nhất là việc phân phối lại các mã JavaScript) thì có nghĩa là chúng ta sẽ có thể dùng Ext JS trong các dự án tương tự như dùng MySQL.

Còn nhiều vấn đề xung quanh câu chuyện này, nhưng hy vọng các bạn sẽ hiểu hơn về các giấy phép mã mở và phạm vi chi phối của chúng.

Share this:

Twitter

Facebook

Like this:

Số lượt thích

Đang tải…

Posted by donghoqualac on Tháng Chín 22, 2008 at 7:38 sáng

Làm Quen Với Multithreading Trong C++ / 2023

Trước hết chúng ta cùng tìm hiểu xem MultiThread là gì? Về cơ bản Multi Thread là một khả năng của một nền tảng (hệ điều hành, máy ảo vv) hoặc các ứng dụng để tạo ra một quá trình bao gồm nhiều Thread được thực thi. Một Thread thực hiện là chuỗi nhỏ nhất của hướng dẫn lập trình có thể được quản lý một cách độc lập bởi một lscheduler . Những Thread có thể chạy song song và nó có thể làm tăng hiệu quả của chương trình.

Trong các hệ thống đa lõi và đa xử lý thì đa luồng tức là các thread được thực hiện cùng lúc trên lõi hoặc bộ vi xử lý khác nhau.

Đối với hệ thống lõi đơn thì đa luồng chia thời gian giữa các thread. System sẽ gửi 1 số lượng nhất định các hướng dẫn từ mỗi Thread để xử lý. Các Thread không được thực hiện đồng thời. System chỉ mô phỏng thực hiện đồng thời của chúng. Tính năng này của System được gọi là đa luồng.

Multithreading được sử dụng khi thực hiện song song 1 số nhiệm vụ dẫn đến việc tận dụng hiệu quả hơn các tài nguyên của hệ thống.

Trong C++11 được xây dưng header thread.h để tạo ra các multithreaded C++ programs.

Đầu tiên dĩ nhiên cần include header thread vào class.

Khi muốn khởi tạo 1 thread, bạn tạo 1 thread object:

thread t_empty;

Như bạn thấy, hàm khởi tạo mặc định của thread class được sử dụng. Chúng ta không chuyền bất cứ 1 thông tin nào vào thread. Tức là không có gì được chạy trong thread này. Chúng ta phải khởi tạo thread. Nó có thể được hoàn thành bằng cách khác. Khi bạn tạo 1 thread, bạn có thể truyền 1 con trỏ hàm vào khởi tạo của nó. 1 thread được khởi tạo, function sẽ bắt đầu chạy, nó chạy trong 1 thread riêng biệt:

Bạn có thể thử chạy đoạn code trên, biên dịch không có vấn đề gì, tuy nhiên bạn sẽ lập tức đối mặt với 1 runtime error: WHYYYYYY?

Thực tế thì câu trả lời khá đơn giản: Main thread tạo 1 thread mới là funcTest1 với paramaters threadFunc. Main thread không đợi funcTes1 huỷ. Nó tiếp tục hoạt động và sẽ kết thúc, nhưng funcTest1 vẫn chạy. Nó sẽ dẫn đễn lỗi. TẤT CẢ CÁC THREAD PHẢI HUỶ TRƯỚC KHI MAIN THREAD HUỶ. Vậy làm các nào khắc phục vấn đề này?????

Thread class cung cấp method join(), hàm này chỉ return khi tất cả các thread kết thúc, điều đó có nghĩa là main thread sẽ đợi đến khi tất cả các thread con hoàn thành công việc của nó. Add thêm đoạn call hàm joind vào sample trên và chạy lại

Bây giờ khi run lại chương trình sẽ không còn lỗi nữa (ngon)

Sau khi hàm join return, thread trở lên không thể join lại. 1 joinable thread là 1 thread mà đại diện cho 1 execution mà chưa join.

1 thread không là joinable khi nó được khởi tạo mặc định hoặc được moved/assigned tới 1 thread khác hoặc joind hoặc detach hàm đã được họi Not joinable thread có thể huỷ 1 cách an toàn. Hàm joinable để checks thread có là joinable thread hay không.

bool joinable()

Nên sử dụng hàm này trước khi call hàm join();

This function returns true if the thread is joinable and false otherwise. It’s better to check if the thread is joinable before join() function is called:

Như đã nhắc ở trên, thread trở thành not joinable sau khi hàm detach được gọi.

void detach()

Hàm này tách 1 thread từ 1 thread cha, nó cho phép thread cha và thread con được chạy ngay lập tức từ cái còn lại. Sau khi call detach functon, các thread sẽ không đồng bộ trong bất kỳ cách nào.

Bạn sẽ nhận thấy mainthread không đợi các thread con bị huỷ!

Bạn có thể khởi tạo thread không chỉ với 1 function mà có thể dùng với 1 object hoặc 1 function của class.

class myFunctor { public: void operator()() { cout << "This is my function object" << endl; } };

Bây giờ bạn có thể khởi tạo thread bằng cách truyền object của class myFunctor vào hàm khởi tạo của thread:

myFunctor myFunc; thread functorTest(myFunc); if (functorTest.joinable()) functorTest.join();

Nếu bạn muốn khởi tạo thread với 1 public function của class, bạn phải định nghĩa function và truyền object của class định nghĩa function đó:

void publicFunction() { cout << "public function of myFunctor class is called" << endl; }

Bây giờ có thể khởi tạo thread với hàm publicFunction của myFunctor class:

myFunctor myFunc;

Trong ví dụ trên chúng ta chỉ sử dụng hàm và đối tượng mà không phải truyền thêm các argyments vào các hàm và object. Chúng ta có thể sử dụng function vớ các paramaters cho khác hàm khởi tạo thread. Vd:

void printSomeValues(int val, char* str, double dval) { cout << val << " " << str <<" " << dval << endl; }

Có thruyền pointer tới function. Để truyền các arguments Để thấy function này có 3 arguments. Nếu bạn muốn khởi tạo với function này, trước hết bạn phải truyền con trỏ tới hàm.

char* str = "Hello"; thread paramPass(printSomeValues, 5 , str, 3.2); if (paramPass.joinable()) paramPass.join();

Khi bạn khởi tạo 1 thread với 1 object có params, chúng ta phải add list các param tương ứng vào. When you want to initialize a thread with an object with parameters, we have to add corresponding parameter list to the overloading version of operator ():

class myFunctorParam { public: void operator()(int* arr, int length) { cout << "An array of length " << length << "is passed to thread" << endl; for (int i = 0; i != length; ++i) cout << arr[i] << " " << endl; cout << endl; } };

Bạn có thể thấy, operator () có 2 paramaters:

void operator()(int* arr, int length)

Khởi tạo thread với 1 object trong trường hợp này giống như sử dụng hàm với các paramater:

Có thể sử dụng 1 hàm của class như params của thread. Add 1 public function vào myFunctorParam class:

void changeSign(int* arr, int length) { cout << "An arrray of length " << length << "is passed to thread" << endl; for (int i = 0; i != length; ++i) cout << arr[i] << " "; cout << "Changing sign of all elements of initial array" << endl; for (int i = 0; i != length; ++i) { arr[i] *= -1; cout << arr[i] << " "; } }

Truyền argument vào member function:

int arr2[5] = { -1, 3, 5, -7, 0 };

… Đến đây tạm thời kết thúc phần 1: Các bạn đã hiểu cơ bản về các khái niệm khởi tạo, sử dụng thread. Trong phần tiếp theo chúng ta sẽ lần lượt về Thread ID, name space, Concurrent , mutex… Và các cách quản lý thread trong Android/ IOS.

All Rights Reserved

Bạn đang xem bài viết Làm Quen Với Ext Js / 2023 trên website Tvzoneplus.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!