Một nền tảng kiểm thử trên một ngôn ngữ lập trình được thiết lập để cho ngôn ngữ lập trình biết phương thức nào là phương thức kiểm thử (testing method), lớp nào là lớp kiểm thử (testing class), kết quả như thế nào là đúng (Passed), như thế nào là sai (Failed)….
Từ khoá chính trong PyUnit
testcase: Từ khoá này được dùng để mô tả cho Python biết lớp đang tương tác là một lớp kiểm thử. Ex: class A(unittest.TestCase):
setup: Từ khoá này được dùng bên trong một lớp kiểm thử. Nó dùng để tạo một phương thức, và phương thức này sẽ được chạy trước khi thực thi mã trong phương thức kiểm thử (Pre-condtion). Ex: def setUp(self):
teardown: Từ khoá này được dùng bên trong một lớp kiềm thử. Nó dùng để tạo một phương thức, và phương thức này sẽ được chạy sau khi thực thi mã trong phương thức kiểm thử (Post-condition). Ex: def tearDown(self):
Chúng ta không có từ khoá để xác định phương thức nào là phương thức kiểm thử. Để làm điều này, chúng ta phải đặt tên cho phương thức với tiền tố “test_”. Ex: def test_demo(self):
Thực thi kịch bản kiểm thử
Để thực thi kịch bản kiểm thử với Python, chúng ta có 2 cách như sau.
Sau khi mình đọc được đâu đó bản dịch cũng từ nguồn trên thì cảm thấy có gì đó không ổn, phát hiện ra là bài viết tiếng Anh được bê nội dung vào “Gu-gồ” dịch sau đó thì đưa lên làm bài viết. Google dịch giờ thì cũng đã sát nghĩa và đỡ lôm côm rồi, nhưng mà nhiều chỗ cần giải thích, có những đoạn dùng từ hơi đặc thù nên nếu không diễn giải, sử dụng từ phù hợp hơn thì nó vẫn rất là “buồn cười” nhưng nghe vẻ bạn dịch bài viết kia đã không để ý hoặc bạn không quan tâm nên Google dịch thế nào bạn lấy về dùng y như thế khiến mình nghĩ là mình sẽ dịch thử xem sao.
Đúng là dịch rồi thì mới thấy là hơi mông lung =)) các bạn đọc rồi góp ý cho mình với nhé. Có những đoạn thì mình đoán ý người viết rồi viết ra theo cách hiểu của mình. Đây là bài học và kinh nghiệm khi kiểm thử chức năng tìm kiếm cho các ứng dụng web có tính năng này. Mình cũng hi vọng bài viết có ý nghĩa cho tất cả các bạn mới tìm hiểu và làm về kiểm thử.
——–
Hiện nay hầu hết các ứng dụng đều cung cấp chức năng tìm kiếm cho phép người dùng có thể tương tác, tìm kiếm nội dung trên trang web đó. Số lượng các kịch bản kiểm thử cho trường tìm kiếm này có thể nói là vô kể, vì thế việc xác định các yếu tố phù hợp và đảm bảo tính hiệu quả khi thực hiện kiểm thử là một việc rất cần thiết. Bài viết này đưa ra một số gợi ý lớn cần lưu ý cho bạn khi kiểm thử chức năng tìm kiếm.
1. Chuẩn bị tài liệu trước khi kiểm thử
1.1. Tạo một tài liệu để lưu trữ tất cả các dữ liệu đầu vào sẽ được dùng để nhập vào ô tìm kiếm
1.2. Xác định các lớp tương đương và các giá trị biên.
1.3. Xác định rõ các khả năng mà chức năng này có thể đáp ứng khi tìm kiếm, như tìm kiếm tài liệu, tìm kiếm từ trong một tài liệu nào đó, hay là tìm kiếm hình ảnh…
1.4. Các kết quả tìm kiếm có hiển thị kích thước của các hình ảnh, tài liệu hay không?
1.5. Có thể sử dụng các tính năng tìm kiếm nâng cao như tìm kiếm theo phân loại như loại tài liệu hoặc loại hình ảnh hay không?
1.6. Lưu ý một số cặp dữ liệu đầu vào thông thường như:
Giả lập các trường hợp để xác định, phát hiện các lỗi liên quan đến bảo mật như XSS, SQL, JavaScript, HTML injections
Khi vào các trang thương mại điện tử hoặc trang web của các cửa hàng online, có thể thấy rằng tìm kiếm là một trong những tính năng chính quan trọng luôn được hiển thị phía trên đầu của ứng dụng, những vị trí rất dễ nhìn thấy. Đây là một trong những tính năng rất hữu ích đối với người dùng. Chúng ta sẽ cùng thử đưa ra những trường hợp có thể được dùng để kiểm tra khi thực hiện kiểm thử cho chức năng tìm kiếm này nhé!
2. Thiết kế chức năng
2.1. Kiểm tra việc hiển thị của khối tìm kiếm này trên trang web như: có thể dễ dàng nhìn thấy mà không cần phải cuộn trang lên xuống, trên các loại màn hình, máy tính xách tay với độ phân giải khác nhau, kể cả với những màn hình có độ phân giải thấp.
2.2. Khối tìm kiếm này về mặt thiết kế có tương tự với các trường tìm kiếm thông dụng trên các công cụ tìm kiếm khác như Google, Yahoo, Bing hay không?
2.3. Tùy theo mô tả yêu cầu của hệ thống, ta cũng cần kiểm tra xem khối tìm kiếm có xuất hiện ở tất cả các trang của ứng dụng không hay chỉ hiển thị ở một số màn hình thôi?
2.4. Tiếp theo là kiếm tra hiển thị bố cục của khối tìm kiếm này. Một khối tìm kiếm sẽ thường bao gồm:
Trường dữ liệu cho phép nhập vào các dữ liệu tìm kiếm
Dữ liệu được nhập vào ô tìm kiếm
Nút “Tìm kiếm”
Khối lựa chọn dữ liệu tìm kiếm
Thông tin về câu truy vấn tìm kiếm
2.5. Bên cạnh đó cũng cần kiểm tra xem số lượng từ tối đa có thể nhập vào trường tìm kiếm là bao nhiêu từ? Có ràng buộc hay giới hạn gì hay không?
3. Hoạt động của chức năng
3.1. Kiểm tra trường tìm kiếm có cho phép lựa chọn tìm kiếm theo các nhóm tiêu chí cụ thể hay không? Ví dụ như theo loại sản phẩm, theo bài biết, hay theo đánh giá…
3.2. Có hiển thị thông báo về những hạng mục được tìm thấy, số lượng mặt hàng là bao nhiêu không?
3.3. Thông thường ở ô tìm kiếm mặc định sẽ hiển thị sẵn một gợi ý nho nhỏ như là “Tìm kiếm”, “Tìm sản phẩm” … như ở Lazada thì có hiển thị là “Tìm kiếm trong Lazada”, vậy thì mình sẽ kiểm tra cái gì ở đây, bạn cần kiểm tra khi gõ từ khóa tìm kiếm vào thì những từ mặc định kia sẽ tự động mất đi mà không chèn vào cùng với từ vừa được nhập vào, và khi xóa từ khóa vừa gõ thì ô tìm kiếm lại hiển thị dòng thông tin mặc định tương ứng.
3.4. Khi tìm kiếm ta có thể thay đổi các từ khóa tìm kiếm khác nhau được không?
3.5. Chức năng có đưa ra các gợi ý tùy thuộc vào khu vực tìm kiếm hay không? Ví dụ như khi bạn gõ một từ khóa tìm kiếm nào đó, nó có thể gợi ý cho bạn biết rằng mặt hàng, hay thông tin tìm kiếm này nằm trong một vài nhóm, hoặc danh mục cụ thể nào đó, bạn có thể tùy chọn tìm kiếm mặt hàng này trong một số nhóm gợi ý vừa hiển thị ra. Ví dụ như khi bạn tìm “Kính bơi” nó sẽ hiển thị gợi ý cho bạn để bạn có thể tìm mặt hàng này trong danh mục nhóm đồ “Thể thao” hoặc danh mục nhóm đồ “Bơi lội”.
3.6. Trường hợp gõ nhầm tên sản phẩm hoặc từ khóa tìm kiếm, có gợi ý được sản phẩm đúng, liên quan nhất hay không? Ví dụ như khi muốn tìm kiếm “Kính bơi” nhưng bạn lại gõ nhầm thành “KInh bơi” hay “Kín bơi” thì nó có tìm được hoặc gợi ý thành Kính bơi hay không?
3.7. Kiểm tra việc hỗ trợ tự động hoàn thiện từ khóa khi nhập một số từ trong từ khóa dựa vào bộ từ điển được định nghĩa và các kết quả tìm kiếm liên quan đã được tìm thấy trước đó – tính năng này giống như bạn tìm kiếm trên Google ấy, khi bạn gõ một từ bất kỳ, nó sẽ gợi ý cho bạn những từ tiếp theo có thể xuất hiện trong cụm mà bạn muốn tìm kiếm.
3.8. Kiểm tra việc sắp xếp các gợi ý hỗ trợ tìm kiếm theo tần xuất được tìm kiếm của từ khóa và mức độ cạnh tranh của mặt hàng. Ví dụ như khi tìm kiếm hàng trên Tiki, thì nó sẽ gợi ý cho bạn những mặt hàng với từ khóa liên quan được tìm kiếm nhiều nhất, hay bán chạy nhất… kiểu thế.
3.9. Kiểm tra xem việc đưa ra dự đoán về số lượng kết quả tương ứng có thể tìm ra khi nhập từ khóa tìm kiếm. Ví dụ như mình tìm 1 sản phẩm là Kính, nó sẽ đếm nhanh và hiển thị kiểu như có 200 kết quả liên quan chẳng hạn.
3.10. Kiểm tra xem việc tìm kiếm có cung cấp thông tin về giá cả của mặt hàng được tìm thấy hay không?
3.11. Việc tìm kiếm mặt hàng có cung cấp và hiển thị thông tin mặt hàng đi kèm một hình ảnh nhỏ nhỏ tương ứng với mặt hàng đó hay không?
3.12. Có đưa ra thông tin về những mặt hàng không được bán/ không còn bán trên hệ thống hay không?
4. Giao diện hiển thị kết quả
4.1. Kiểm tra để đảm bảo rằng các kết quả tìm kiếm cần được hiển thị rõ ràng và không bị lẫn lộn bởi các loại quảng cáo khác có trên trang.
4.2. Kết quả tìm kiếm này được hiển thị trong một khối có cấu trúc và thường bao gồm các thông tin sau:
Hiển thị thông tin được tìm kiếm: như bạn đã tìm kiếm cái gì, ở mục nào… Ví dụ như: Tìm “Kính bơi” trong Dụng cụ thể thao ….
Danh sách các kết quả tìm kiếm được sẽ hiển thị như thế nào?, được sắp xếp theo trình tự ra sao? Ví dụ như hiển thị dạng lưới (grid), dạng bảng, hay danh sách, được sắp xếp theo độ phổ biến, theo giá hay theo số lượng người mua, theo đánh giá của mặt hàng…
Việc hiển thị tên nhóm chủng loại của hàng hóa có được cung cấp hay không?
Có hiển thị thông tin gợi ý, khuyến nghị cho người dùng không? Ví dụ như “Có 5000 người cũng tìm kiếm sản phẩm này”, “Có 3000 người khác cũng mua kèm sản phẩm này”…
Việc hiển thị các thông tin thêm để người dùng có thể hiểu hơn về mô tả của các mặt hàng có được cung cấp hay không?
5. Chức năng hiển thị kết quả
5.1. Đối với trường hợp từ khóa tìm kiếm nhập vào bị lỗi chính tả hay lỗi chủ quan do người dùng nhập vào có được điều chỉnh khi tìm kiếm và hiển thị kết quả truy vấn chính xác hay không?
5.2. Kết quả tìm kiếm có bao gồm số lượng kết quả tìm kiếm được hay không? Ví dụ, khi bạn với từ khóa “Mũ bơi” ở phần hiển thị danh sách kết quả tìm kiếm nó sẽ hiển thị kiểu như tìm được 2000 kết quả chẳng hạn.
5.3. Kết quả tìm kiếm có cung cấp số lượng các sản phẩm tìm thấy được phân nhóm theo một số tiêu chí không? Các tiêu chí đó có thể là Nhóm sản phẩm, Thương hiệu… etc
5.4. Mỗi kết quả tìm thấy có bao gồm thông tin ngắn về sản phẩm, giá, hình ảnh và một nút mua hoặc thêm vào giỏ hàng hay không?
5.5. Trong kết quả tìm kiếm, những mặt hàng được gắn thẻ đặc biệt như Ưu đãi, khuyến mãi, hay Hàng mới thì những thông tin này cũng sẽ được hiển thị đi kèm với các thông tin mô tả ngắn về mặt hàng được hiển thị theo mục kế trên.
5.6. Kết quả tìm kiếm có bao gồm các tùy chọn nâng cao như có thể mở sản phẩm cụ thể nào đó để xem chi tiết, hoặc mở xem thông tin trong một tab khác hay không?
5.7. Có thêm tùy chọn tìm kiếm nâng cao hay không? Ở đây kiểm tra việc có thể bổ sung thêm một số các tiêu chí tìm kiếm khác cho danh sách kết quả này.
5.8. Đường dẫn địa chỉ tìm kiếm có thể được thay đổi mỗi khi tiêu chí lọc mới được thực hiện hay không?
5.9. Các trang kết quả tìm kiếm và bộ lọc có được đóng bởi các công cụ tìm kiếm hay không? (Đoạn này chưa hiểu lắm)
5.10. Ở danh sách hiển thị kết quả tìm kiếm này có hiển thị thông tin về lịch sử tìm kiếm trước đó hay không? Ví dụ ở phía cuối danh sách kết quả nó hiển thị thông tin là vừa trước đó bạn đã tìm cái gì?
6. Các trường hợp tìm kiếm không hợp lệ
6.1. Trong trường hợp không có kết quả tìm kiếm phù hợp với tiêu chí tìm kiếm thì có phản hồi như thế nào? Có thể hiển thị một dòng thông tin cho người dùng biết như “Không tìm thấy sản phẩm nào”.
6.2. Có cung cấp những gợi ý tìm kiếm khác liên quan đến từ khóa tìm kiếm không?
6.3. Có cung cấp các tùy chọn tìm kiếm khác không? Ví dụ như thay vì tìm theo tên mặt hàng có thể có tùy chọn để có thể tìm kiếm theo thương hiệu, cửa hàng, bài viết…
6.4. Hoặc có đưa ra các gợi ý tìm khác dựa vào mục đích tìm kiếm hoặc các tìm kiếm khác trước đây đã được thực hiện hay không?
7. Tổng hợp kết quả tìm kiếm và các thông tin chi tiết khác
7.1. Không bỏ qua các kết quả đã hiển thị trên danh sách kết quả tìm kiếm được, nghĩa là chúng ta vẫn cần phải kiểm tra kết quả này, vì có thể kết quả đó chẳng liên quan gì đến từ khóa mà ta đang tìm kiếm cả.
7.2. Kiểm tra số lượng kết quả tìm kiếm hiển thị trên mỗi trang
7.3. Kết quả tìm kiếm được có hiển thị đúng theo một số tiêu chí cụ thể nào đó hay không? Ví dụ mức độ phổ biến, được xem nhiều nhất, hoặc theo thứ tự bảng chữ cái….
7.4. Trong trường hợp không có kết quả tìm kiếm nào được tìm thấy thì nội dung tin nhắn tương ứng hiển thị có đúng hay không?
7.5. Thời gian dành cho mỗi phiên truy vấn là bao nhiêu? Có mất nhiều thời gian không?
7.6. Việc tìm kiếm có phân biệt trường hợp người dùng đăng nhập hay khách không?
Các bạn có thể tham khảo bài viết gốc nếu như không thích bản tam sao này của mình, hi vọng các cao thủ dịch thuật có lạc vào đây và phát hiện ra điểm gì chưa đúng, hay chưa sát nghĩa thì để lại cho mình đóng góp nhé, những đóng góp của các bạn chính là niềm vui vô cùng to lớn đối và động lực mạnh mẽ để mình có thể tiếp tục phát huy hơn nữa =)) Trân trọng cảm ơn!!!
Trước tiên để biết PCF (Pivotal Cloud Foundry) là gì? Tôi sẽ giới thiệu sơ lượt về kiến thức phân loại Cloud Service. Như hình bên dưới thì ta thấy có 3 loại Cloud Service hiện nay:
IaaS: Người developer tạo ra app thì phải dựng OS, Môi trường run time,… và cuối cùng deploy app để test các kiểu.
PaaS: Người developer tạo ra app thì phải bấm nút deploy app để test các kiểu.
SaaS: Người developer tạo ra app bấm nút là có bản report mọi thứ đã khai xong.
PCF là gì?
PCF – Pivotal Cloud Foundry (https://pivotal.io/about) là điện toán đám mây được phát triển bởi Pivotal. PCF cung cấp một Platform as a Service (PaaS) giúp giảm tải quá trình phát triển và triển khai các ứng dụng. Nên developer không phải quan tâm nhiều đến server mà chỉ việc develop thôi, còn triển khai từ development -> Staging -> Production vô cùng nhanh. Và đã có nhiều công ty sử dụng PCF để phát triển công nghệ, thông qua Pivotal CF để xây dựng một nền tảng điện toán đám mây dựa trên mã nguồn mở.
PCF được triển khai với mục đích:
Quá trình phát triển và triển khai ứng dụng được nhanh chóng.
Khả năng mở rộng và khả năng hữu dụng của ứng dụng luôn luôn được cao nhất.
Giúp quy trình DevOps được thuận lợi và dễ dàng
Giảm thiểu sai sót do con người gây ra.
Tiết kiệm chi phí sử dụng.
PCF vận hành như thế nào?
Trước khi biết vận hành ra sao thì ta cần biết về tổ chức trong PCF. Để dễ dàng quản lý thì PCF chia thành các phần sau và người dùng hoàn toàn có thể quản lý nó thông qua Cloud Foundry Command Line Interface (cf CLI)
Sơ đồ tổ chức trong PCF
Orgs: khi tạo organizations bạn có thể quản lý quota về dung lượng… Nó chứa các spaces.
Spaces: spaces chứa các apps.
Apps: applications bạn có toàn quyền scale, bind apps vào services, manage environment variables, routes, view logs và xem thông tin, start và stop apps và xóa apps.
Services: có thể bind services vào apps, unbind services từ apps, chọn và sửa service plans, đổi tên và xóa service instances.
Users: Bạn có thể thêm user vào org, roles, và xóa users.
Quy trình vận hành PCF
Theo sơ đồ thì user chỉ cần gửi command từ nơi chứa app để push app cùng cấu hình lên PCF.
Kế tiếp, PCF sẽ tiến hành deploy, binding services cần thiết và scale app từ cấu hình push lên.
Khi deploy PCF sẽ hoạt động như thế nào?
Infrastructure thì bạn có thể dùng các cloud như Google Cloud Platform, Azure, Amazon, VMware,… nói chung là server đảm bảo vận hành tốt là có thể để triển khai hệ thống PCF.
PCF Platform sẽ quản lý scalling theo nhu cầu khi deploy app và các database, cache, store đều đươc xem là services chũng sẽ binding vào app trong lúc deploy.
Run time: Quá trình vận hành đầu tiên khi push code vào PCF.
Routing: Khi nhận lệnh push routing sẽ điều phối các domain trỏ vào đúng container.
Service discovery: là bước tiếp theo tiến hành binding các service vào app.
Container: Sẽ upload source code vào 1 container mới.
Configuration: Sẽ scalling container cho phù hợp thông qua manifest.xml config và buid pack config.
Application framework: Deploy framework phù với source và đã có build pack hỗ trợ. Và thực hiện chu trình destroy container cũ và start container mới.
Logging & Metrics: Trong lúc deloy thì hệ thống log sẽ listen PCF xử lý và ghi log và số liệu.
Messaging: Sau các tiến trình thì PCF sẽ thông báo.
Services: các service mà PCF cung cấp như database, cache,….
Chia sẻ về PCF Architechture
PCF Architechture on Azure
PCF Achitechture on AWS
Lời kết
PCF được xây dựng trên mô hình PaaS. Hiện nay, đang được các công ty lớn áp dụng nhằm tối ưu thời gian phát triền và triển khai ứng dụng lên các platform. Bạn có thể tìm hiểu tại đây https://docs.pivotal.io
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Cuối cùng Java 9 và bộ công cụ phát triển cho nó (Java Development Kit -JDK 9) cũng đã chính thức ra mắt người dùng và các nhà phát triển Java trên toàn thế giới.
Java 9 tuy có một số tính năng mới quan trọng tuy còn gây tranh cãi, nhưng đây là phiên bản cuối cùng trong chuỗi phát hành của Java 9.
Vậy bạn sẽ chuẩn bị những gì để tham gia vào cộng đồng phát triển Java trong những năm sắp tới?
Oracle đã đăng tải phiên bản này cùng các tài liệu cho phép các nhà phát triển tải về tại địa chỉ: http://jdk.java.net/9
Những tính năng mới quan trọng
Xuất hiện sau Java SE 8 tới gần ba năm, Java SE 9 có một vài thay đổi chủ chốt trong kiến trúc, cũng như hàng loạt cải tiến.
Thay đổi cách chơi bằng tính mô-đun
Khả năng mô-đun hóa – tính năng mới và gây tranh cãi, được dựa trên dự án Jigsaw, chắc chắn sẽ gây ra nhiều sự chú ý bởi của cả hai phe tiến bộ và bảo thủ.
Tính mô-đun – lấy chữ mô-đun trong “Java Platform Module System” – phân chia JDK thành một tập các mô-đun dành cho thực thi, biên dịch hoặc buid time. Đây được xem như một thay đổi xuyên suốt cho phép hiểu các phụ thuộc thông qua các mô-đun.
Tính mô-đun của Java 9 hỗ trợ các nhà phát triển dễ dàng tập hợp và bảo trì các ứng dụng phức tạp. Ngoài ra, nó cũng khiến Java trở nên tốt hơn trong việc thu nhỏ quy mô xuống các thiết bị nhỏ gọn trong khi vẫn cải thiện được bảo mật và hiệu suất.
Khía cạnh mô-đun của Java 9 thể hiện ở nhiều mặt, trong đó có cách đóng gói chương trình, sự mô-đun hóa bản thân JDK, và tổ chức mã nguồn thành các mô-đun. Hệ thống build được nâng cấp để biên dịch các mô-đun và duy trì ranh giới giữa các mô-đun trong lúc build. Các ảnh (chạy trong máy ảo Java) của JDK và JRE được tái cấu trúc để xử lý các mô-đun. Ngoài ra các thư viện JavaFX UI và các CSS API cũng được thay đổi để phù hợp với lối lập trình mới.
Tính mô-đun đi kèm với một loạt các cấu hình được hỗ trợ; dẫn tới sự cải thiện về khả năng mở rộng, bảo mật và hiệu suất của các ứng dụng. Mô-đun cũng giúp việc triển khai chương trình Java trên các thiết bị nhỏ trở nên dễ dàng hơn, đây là động lực chính trong nỗ lực đưa tính mô-đun vào Java.
Với tính mô-đun, các nhà phát triển sẽ có khả năng xây dựng và bảo trì các thư viện cũng như chương trình lớn cho cả Java SE cũng như Java EE. Tuy vậy, trong quá trình xây dựng Java 9, Oracle, IBM, Red Hat và một vài tổ chức đã có những bất đồng quan điểm lớn đối với sự thay đổi cơ bản trong nền tảng. Hệ thống mô-đun thật ra đã bị từ chối hồi Tháng 5, và chỉ được chấp thuận vào cuộc bỏ phiếu lần hai vào Tháng 6, sau khi dự án Java 9 đã được khởi động.
Ngay cả như thế, những tranh cãi vẫn tiếp diễn. Một số chuyên gia đã nói không với tính mô-đun, bất kể sự thực rằng Java 9 đã được phát hành.
Để giúp việc chuyển đổi mã nguồn cũ sang dạng mô-đun được dễ hơn, Java 9 cho phép truy cập trái phép những reflection trên class path, để JRE có thể tìm tới các lớp và tập tin tài nguyên. Mặc dù vậy, trình biên dịch sẽ đưa ra cảnh báo về những reflection này, và chúng sẽ không được hỗ trợ ở những phiên bản Java tiếp theo.
Trình biên dịch được cải tiến cho mã nguồn của Java 9
Dẫn đầu trong số những tính năng mới trong trình biên dịch của Java 9 là khả năng biên dịch trước (ahead-of-time compilation – AoT). Tính năng này vẫn đang trong giai đoạn thử nghiệm – nó cho phép các lớp của Java được biên dịch sang mã máy trước khi được gọi khởi chạy trong máy ảo. AoT compilation giúp cải thiện thời gian khởi động của tất cả các ứng dụng từ nhỏ đến lớn, trong khi ít hạn chế đến hiệu suất cao điểm.
Những trình biên dịch JIT (Just-in-time) hoạt động nhanh hơn, nhưng trong thực tế những chương trình Java hiện tại thường lớn tới mức mà phải mất một thời gian khá lâu để được biên dịch toàn bộ, hệ quả là trình biên dịch thường để lại một vài phương thức không được biên dịch, và dẫn tới giảm hiệu năng. AoT compilation được áp dụng là để giải quyết vấn đề này.
Thế nhưng Dmitry Leskov, giám đốc marketing của Excelsior – đối tác công nghệ Java, lo lắng rằng AoT chưa đủ trưởng thành và mong muốn Oracle đợi tới phiên bản Java tiếp theo cho tính năng này.
Oracle cũng triển khai giai đoạn hai của tính năng “biên dịch thông minh”, liên quan tới việc cải thiện tính ổn định và di động vào công cụ javac vì vậy nó có thể được sử dụng mặc định cho JVM (Java Virtual Machine). Công cụ này cũng được tổng quát hóa để có thể được dùng cho các dự án lớn vượt ra ngoài phạm vi của JDK. Ngoài ra, nó còn có thể biên dịch các chương trình được viết dưới Java 9 thành dạng có thể chạy trên những phiên bản Java cũ hơn.
Một tính năng mới khác cũng được đem vào triển khai thử nghiệm là JVMCI – Giao diện Biên dịch mức-Java cho JVM. Giao diện này cho phép một trình biên dịch được viết bằng Java có thể được dùng như một trình biên dịch động cho JVM. API của JVMCI cung cấp cơ chế để truy cập các cấu trúc của VM, cài đặt mã đã biên dịch và kết nối vào hệ thống biên dịch JVM. Nhờ đó các nhà phát triển có thể viết ra và sử dụng những trình biên dịch chất lượng cao và dễ dàng hơn trong việc bảo trì hay cải tiến các trình biên dịch hiện tại được viết bằng ngôn ngữ C hay C++. Hiện đã có một số nỗ lực được bỏ ra cho mục đích đó, như dự án Graal hay Metropolis.
Ngoài ra, trình biên dịch mới cũng cho phép các nhà phát triển điều khiển trình biên dịch theo ngữ cảnh ở từng phương thức, ngay tại thời điểm chạy, mà không ảnh hưởng tới hiệu năng. Công cụ cũng cho phép xử lý các lỗi trình biên dịch JVM.
Java cuối cùng cũng có REPL
Công cụ REPL đã quá quen thuộc với các nhà phát triển Ruby, Python, NodeJS… nhưng chưa bao giờ xuất hiện cho ngôn ngữ Java. Việc thiếu vắng REPL là một trong số những lý do các trường học từ chối sử dụng Java để giảng dạy. Nhà sáng lập của Scala – Martin Odersky đã từng đặt ra những câu hỏi tính hữu ích của một REPL, và ông đã phát biểu “Java thì hướng câu lệnh, trong khi đó các REPL thì hướng biểu thức”.
Nhờ những nỗ lực sau một dự án dài hơi, REPL cũng đã xuất hiện ở Java 9 dưới tên thương mại jShell. Ngoài khả năng tương tác với các câu lệnh khai báo và các biểu thức, giúp cho các nhà phát triển có thể nhận được phản hồi của một chương trình trước khi biên dịch chỉ bằng cách nhập vào một số dòng mã, jShell còn có thể hỗ trợ hoàn thiện câu lệnh/biểu thức và tự thêm những dấu chấm phẩy cần thiết. Nó cũng có một API để các IDE cũng như các công cụ khác có thể khai thác.
Những cải tiến trên Streams API
Các stream trong Java cho phép dữ liệu được khai thác song song một cách hiệu quả. Trong Java 9, Streams API được bổ sung những phương thức để lấy và cắt bỏ các phần tử từ Stream theo điều kiện, duyệt qua các phần tử của Stream, và tạo một stream từ một giá trị nullable.
Hỗ trợ JavaScript thông qua dự án Nashorn
Dự án Nashorn được theo đuổi để cung cấp một máy chạy Javascript cho Java, đã được cải tiến ở JDK 9. Nhiều nỗ lực đã được bỏ ra để Nashorn có hiệu năng cao nhưng vẫn đủ nhỏ. Nashorn cho phép nhà phát triển nhúng mã Javascript vào chương trình Java. Một Javascript REPL cũng đã đóng gói vào JDK.
Các phần được đóng gói còn có một API để giao tiếp với chương trình cây cú pháp ECMAScript của Nashorn, cho phép các công cụ cũng như IDE có thể phân tích mã Javascript mà không bị phụ thuộc vào chương trình thực thi của Nashorn.
HTTP/2 client API
HTTP/2 client API bản beta đã được bổ sung vào JDK 9, triểm khai những nâng cấp cho giao thức HTTP. Ở API này, WebSocket cũng đã được hỗ trợ.
API HTTP/2 client có thể thay thế cho API HttpURLConnection vốn có thể gặp sự cố, có nhiều giao thức không còn được hoạt động, quá trừu tượng, và khó sử dụng.
Cải thiện công cụ Javadoc
Trong JDK 9, công cụ tạo tài liệu Javadoc đã được cải tiến để tạo ra mã HTML5 cũng như hỗ trợ bảng mã Unicode 8.0, với nhiều ký tự và mã mới được bổ sung.
API bảo mật DTLS
Cho mục đích bảo mật, Java 9 bổ sung API cho giao thức DTLS (Datagram Transport Layer Security). Giao thức này được thiết kế để ngăn chặn nghe trộm, giả mạo và ngụy tạo thông điệp trong giao tiếp giữa máy khách và máy chủ. API cho giao thức này cung cấp những giao diện để dùng cho cả máy khách lẫn máy chủ.
Những gì được loại bỏ?
Java 9 ngưng sử dụng cũng như loại bỏ một số tính năng không còn phù hợp. Dẫn đầu trong số đó là API Applet, bị ngừng sử dụng, kéo theo đó là công cụ appletviewer. Hầu hết các nhà sản xuất trình duyệt hiện tại đều có ý thức loại bỏ sự hỗ trợ cho Java plugin. Thị trường đã chuyển sang sử dụng HTML và Java Web Start (để khởi chạy ứng dụng từ một trình duyệt).
Java 9 cũng ngưng sử dụng bộ dọn rác Concurrent Mark Sweep (CMS). Mục đích là để đẩy nhanh sự phát triển của các công cụ dọn rác trong máy ảo HotSpot. Một trong số đó là bộ dọn rác G1.
Đồng thời, các tổ hợp bộ dọn rác bị ngưng sử dụng ở Java 8 cũng được loại bỏ ở Java 9. Đa số là các tổ hợp hiếm khi sử dụng cũng như làm tăng độ phức tạp của việc dọn rác.
Java 9 cũng lược bớt những cảnh báo trên những lệnh import những thư viện bị ngưng sử dụng, để giúp các dự án lớn bớt đi các dòng cảnh báo khi chạy linter.
Ngoài ra, khả năng chọn JRE tại thời điểm thực thi cũng được loại bỏ. Tính năng này hiếm khi được sử dụng trong khi đó lại làm phức tạp việc khởi chạy chương trình, hơn nữa, nó cũng chưa bao giờ được cung cấp tài liệu đầy đủ kể từ khi xuất hiện lần đầu tiên trong JDK 5.
Oracle cũng đã loại bỏ hprof và jhat (những công cụ theo dõi và phân tích Heap) khỏi bộ công cụ JVM Tool Interface. Chúng đã lỗi thời cũng như đã được thay thế bởi những công cụ cao cấp hơn.
Java 9 là phiên bản cuối cùng trong chuỗi phát hành của nó
Kể từ sau Java 9, một chuỗi phát hành mới của Java sẽ được bắt đầu. Java sẽ được phát hành phiên bản mới sau mỗi sáu tháng, vào tháng 3 và tháng 9. Các đánh số phiên bản sẽ tương tự như cách mà Canonical sử dụng với Ubuntu – là sự kết hợp giữa 2 số cuối của năm phát hành và tháng phát hành phiên bản. Ví dụ, phiên bản đầu tiên của chuỗi phát hành này sẽ là Java 18.3, và phiên bản tiếp theo sẽ là Java 18.6.
Nhịp phát hành này cũng nói lên rằng Java 9 không được thiết kế để hỗ trợ dài hạn. Phiên bản LTS tiếp theo đã được ấn định sẽ là Java 18.9. Các nhà phát triển có thể bỏ qua Java 9 và các mô hình “chưa trưởng thành” của nó và chờ tới phiên bản mới.
Cách trả lời ưu điểm và nhược điểm là phần quan trọng đối trong mọi cuộc phỏng vấn. Nhà tuyển dụng sẽ đặt ra các thách thức tuyển dụng khó nhằn. Và việc yêu câu bạn phải chai sẻ các ưu nhược điểm khi phỏng vấn là điều tất nhiên phải có. Liệu bạn đã có những cách trả lời ưu nhược điểm phù hợp, ứng biến linh hoạt hay chưa?
Khía cạnh về giới thiệu bản thân khi phỏng vấn rất quan trọng. Nó chi phối nhiều yếu tố và rất có thể là ảnh hưởng không lớn đến kết quả phỏng vấn cuối cùng của bạn. Và bạn biết không, trong quá trình phỏng vấn thì cách trả lời ưu nhược điểm lại cực kỳ quan trọng. Những đánh giá chung nhất sẽ được nhà tuyển dụng xem xét về khả năng đồng hành của bạn tại doanh nghiệp/tổ chức đó. Cùng TopDev tìm hiểu bài viết sau đây để có nắm bắt được cách trả lời ưu nhược điểm hiệu quả nhất khi phỏng vấn nhé!
Ưu điểm là gì?
Thuật ngữ ưu điểm hay điểm mạnh khá gần gũi nhưng trước tiên, cùng xem nó có ý nghĩa thế nào. Ưu điểm (Advantage) hay điểm mạnh (Strengths) là những đặc tính tốt nổi trội, những thế mạnh của bạn về tố chất, các kỹ năng, kinh nghiệm hoặc trình độ chuyên môn nổi trội của bạn tương ứng trong giới hạn khả năng được vận dụng vào cuộc sống, quá trình thực hiện công việc của bạn.
Mỗi người chúng ta đều có những điểm mạnh khác nhau, khó trộn lẫn. Và tùy vào tình huống thực tế, những ưu điểm đó sẽ được phát huy, cân bằng một cách tốt nhất. Những ưu điểm cơ bản mà bạn có thể biết bao gồm:
– Năng lực chuyên môn giỏi
– Tính trung thực cao
– Có trách nhiệm – ý thức cao trong công việc; nhiệt huyết và niềm đam mê công việc
– Trình độ ngoại ngữ tốt (Đạt tiêu chuẩn giao tiếp quốc tế – Tiếng Anh, Tiếng Nhật, Tiếng Trung,…
– Khả năng học hỏi, ứng biến linh hoạt với môi trường, nhạy bén với cái mới
– Sức sáng tạo
– Tinh thần kỷ luật cao, có đạo đức nghề nghiệp
– Sự kiên nhẫn
– Hòa đồng – thân thiện với mọi người xung quanh
– Mức độ quyết tâm hoàn thành công việc
– Kỹ năng mềm
– Làm việc có nguyên tắc, đúng giờ, chuyên nghiệp
– Sự năng động
– Kỹ năng lên kế hoạch và giải quyết vấn đề tốt
– Thành thạo kỹ năng tin học
– Sở hữu những năng khiếu về nghệ thuật (ca hát, làm MC. diễn xuất,…)
Vậy thế nào là điểm yếu? Cùng TopDev tiếp tục theo dõi trong bài viết
Nhược điểm là gì?
Nhược điểm, khuyết điểm hay điểm yếu (Weaknesses) là những điểm hạn chế, những điểm mà bản thân bạn, còn thiếu sót hay cảm thấy không tự tin về chúng. Cũng có thể hiểu một phần nó không phải trường chính mà bạn ứng dụng vào công việc lẫn cuộc sống.
Nhược điểm, khuyết điểm hay điểm yếu là gì?
Điểm yếu thường bao gồm:
– Kỹ năng hay năng lực chuyên môn nghề nghiệp chưa tốt
– Chưa có sự định hướng hay mục tiêu rõ rãng trong công việc
– Trình độ ngoại ngữ chưa đảm bảo tiêu chuẩn cơ bản (Đọc, viết, giao tiếp, nghe)
– Kỹ năng tin học văn phòng chưa tốt
– Kỹ năng giao tiếp chưa hoàn thiện, còn sợ và e dè – không tự tin trước đám đông
– Những thói quen tích cực ảnh hưởng đến các tính trách nhiệm, ý thức tự giác, tình thần làm việc,…
Trình bày ưu nhược điểm trong CV – Đâu là những điều cần lưu ý?
Đề làm nổi bật được nội dung điểm mạnh điểm yếu của bản thân trong CV, bạn cần chú ý những vấn đề sau:
Tập trung trình bày các ưu điểm gắn với công việc, không nên lan man. Đừng kể lể quá nhiều sẽ làm nhà tuyển dụng cảm thấy bạn không đáng tin. Trình bày ưu điểm với những từ ngữ đơn giản, tránh việc “bày vẽ” quá nhiều thứ sẽ khó tạo được những thiện cảm cho nhà tuyển dụng.
Nói như vậy, không cò nghĩa là bạn chị tập trung vào việc trình bày điểm mạnh. Bạn hạy khôn khèo và cân bằng việc đưa các điểm yếu của mình vào CV. Tuy nhiên, hãy gắn nó với những cách thức giúp bạn vượt qua hoặc khắc phục tốt nhất những nhược điểm ấy. Đó là một cách thức thật sự thông minh dành cho bạn.
Một điều quan trọng nữa mà bạn cần lưu tâm chính là phải thật sự trung thực với những gì mình chia sẻ với nhà tuyển dụng. Không nên nói quá nhiều về điểm mạnh. Vì nếu thế, dường như bạn chỉ đang khoe khoang hoặc đang “thùng rỗng kêu to”. Nhà tuyển dụng họ là những người có cái nhìn tổng quan lẫn chi tiết nhất. Vì thế, việc kiểm chứng tính xác thực về những gì bạn trình bày là một điều hoàn toàn dễ dàng dối với họ.
Những câu hỏi thách thức trong buổi phỏng vấn của bạn
Thách thức tuyển dụng luôn là điều mà mọi ứng viên cần phải trải qua. Và để có thể đồng hành cùng các doanh nghiệp/tổ chức, bạn cần vượt qua những thách thức ấy trong chính buổi phỏng vấn của mình. Và cụ thể là việc cách bạn trả lời câu hỏi: “Anh chị hãy nói về điểm mạnh và điểm yếu của mình”.
Nhiều thách thức được đặt ra trong chính quá trình giới thiệu bản thân khi phỏng vấn. Việc của ứng viên là cần bình tĩnh để xử lý các thách thức. Bạn không nên hoang mang để rồi cảm thấy bị bế tắc trong chính những thách thức ấy. Hãy có cách ứng xử thông mình, hiệu quả phỏng vấn hầu như đạt mức tuyệt đối. Tuy nhiên, nhiều câu trả lời dường như chỉ tập trung vào việc đào sâu các vấn đề nhạy cảm liên quan đến công việc. Cụ thể, nhiều ứng viên sẽ đề cập đến mức lương và các chế độ thuộc về mặt quyền lợi của nhân viên. Từ đây, các ý kiến khác nhau được bàn luận. Hãy cẩn trọng để không phải mắc phảicấm kỵ khi đi phỏng vấn nhé!
Trên thực tế, bạn nên nhận ra một mấu chốt quan trọng rằng, có những “điểm yếu” nhưng ẩn đàng sau là một ưu điểm. Việc bạn hiểu rõ sẽ tạo ra cách tiếp cận phù hợp nhất dành cho bạn trong định hướng trả lời của mình. Hãy cố gắng hiểu nó một cách rộng ra, suy nghĩ đơn giản và đừng đi xa quá giới hạn cho phép.
Ví dụ, việc bạn cố gắng chạy dự án, đảm bảo kpi và đạt được hiệu suất tốt nhất. Điều đó, khiến cho sức khỏe của bạn bị ảnh hưởng đôi chút. Vậy điểm yếu của bạn sẽ là quá nhiệt tình trong công việc chăng? Đây thật sự là một cách đáp trả khá khôn ngoan dành cho nhà tuyển dụng của bạn.
Vậy có nên trả lời thành thật những mặt hạn chế về bản thân?
Mặt hạn chế thì tất nhiên ai trong chúng ta cũng đều có cả. Vì không ai hoàn hảo về mọi khía cạnh. Việc bạn thành thật với những khuyết điểm của mình là một điều tốt. Có thể đó lại là một sự tích cực. Tuy vậy. hãy chắc chắn rằng bạn không nói những yếu tố liên quan đến kỹ năng mà bạn phải dùng trong vị trí bạn đang ứng tuyển. Do vậy, hãy thành thật nhưng cũng thật cẩn trọng. Hãy ưu tiên trình bày mọi thứ theo hướng tích cực dù cho nó là những điểm yếu của cá nhân bạn nhé!
Không nên trả lời các kiểu như: Tôi là…
+ hoàn toàn không có bất kỳ điểm yếu nào cả
+ tham công tiếc việc lắm
+ người cầu toàn/ người không có điểm yếu nào cả
+ rất hoàn hảo
Điểm mạnh của bạn là gì?
Bạn hãy tự tin nếu ra các điểm mạnh mà bản thân mình có. Đó có thể là những cảm nhận thực tế của bạn sau quá trình dài trải nghiệm việc rèn luyện.
Tự tin khác với tự cao. Vì vậy, đừng chia sẻ về những điểm mạnh mà bản thân bạn còn hạn chế nhé! Các điểm mạnh đó có thể tập trung về: kiến thức, kinh nghiệm, kỹ năng, năng lực, giao tiếp,…
Đồng thời nêu ra một số dẫn chứng cụ thể về điểm mạnh của bạn thay vì chỉ trình bày bằng những lời nói. Đôi khi các số liệu thực cũng là một trong những minh chứng quan trọng cho thấy tính hiệu quả mà điểm mạnh của bạn đã giúp bạn tạo ra chúng.
Đây là một câu hỏi không thể không có trong buổi phỏng vấn. Trước hết là nhà tuyển dụng muốn biết bạn suy nghĩ và đánh giá về bản thân mình như thế nào? Cách tiếp cận và xử lý tình huống thử thách tuyển dụng ra làm sao? Do vậy, bạn hãy bình tĩnh và trả lời một cách chuyên nghiệp để tạo được ấn tượng tốt nhé.
Bạn muốn mình là ai và như thế nào trong 5 năm tới?
Nhiều ứng viên đã trình bày các kế hoạch không một tí liên quan gì đến công việc như: mua nhà, đi du lịch, kinh doanh,…
Hoặc thậm chí, ứng viên bộc lộ nhiều sự cường điệu trong cách dẫn dắt câu chuyện. Chẳng hạn như việc chia sẻ rằng họ sẽ là một người có đam mêvới công việc nhiều nhất; làm việc chăm chỉ nhất. Tồi tệ hơn là có nhiều ứng viên chỉ cười trừ vì không biết phải trả lời như thế nào. Vậy đâu làlỗi khi đi phỏng vấn,gây ấn tượng lúc phỏng vấn?
Bạn phải thật sự cẩn trọng trong cách trả lời của mình. Nếu không, bạn sẽ thất bại về vấn đề tri nhận các yêu cầu phản hồi thông điệp. Dù bạn cố tình hay vô tình (thiếu sự trải nghiệm), bạn cũng không nên khiến mình thiếu chuyên nghiệp.
Em mong muốn mức lương bao nhiêu? Theo em tự đánh giá, với năng lực hiện tại thì mức lương cụ thể nào phù hợp với em?
Nhiều ứng viên đã đánh giá về mức lương. Họ chê mức lương hoặc đề nghị một mức lương cao hơn. Tất nhiên, câu chuyện về quyền lợi thì bất cứ ứng viên nào cũng đều quan tâm. Nhưng họ cần biết, nếu là một ứng viên thông minh và nhạy bén, ít ai lại “cò kèo” lương với nhà tuyển dụng. Vậy đâu làlỗi khi đi phỏng vấn,gây ấn tượng lúc phỏng vấn?
cách trả lời ưu nhược điểm
Một cách phản hồicấm kỵ khi đi phỏng vấn nữa đó là ứng viên than vãn hoặc đòi hỏi quá nhiều về “giấc mơ doanh nghiệp”. Ví dụ họ muốn có một môi trường làm việc tốt, một người sếp biết quan tâm, các kế hoạch cho sự thăng tiến,… Đây mới thật sự là những gì họ quan tâm.
Đừng lặp lại những thông tin trong CV
Chắc chắn nhà tuyển dụng sẽ không hề mong muốn nghe lại những chia sẻ của bạn suy quanh chiếc CV. Đơn giản vì họ đã nghe xem xét và nắm bắt những thông tin chung quanh bạn rồi. Bạn có thể đề cập đến thời gian bắt đầu sự nghiệp; một số công việc đã trải nghiệm và vai trò gần đây nhất của bạn. Nhưng việc lặp lại các khía cạnh sâu như những gì họ thấy trong CV là một điều hoàn toàn không nên.
Cách trả lời ưu nhược điểm của bản thân bằng tiếng anh
Phỏng vấn tiếng anh hiện nay không còn là một cách thức quá xa lạ. Tuy nhiên, bạn sẽ giải quyết thế nào khi phải trả lời câu hỏi: “Điểm mạnh và điểm yếu của em là gì” bằng tiếng anh. Đừng lo lắng vì và hãy thật bình tĩnh nào. Sẽ có hai nhiệm vụ quan trọng mà bạn cần nắm trong trường hợp này. Thứ nhất chính là tư duy thật nhanh về các điểm yếu của mình trước. Sau đó suy nghĩ cách trả lời thật ngắn gọn chúng bằng tiếng anh.
Bản thân bạn có thể trả lời câu phỏng vấn với ý khái quát chung, chưa cần quá chi tiết vì đó cũng không phải điều mà nhà tuyển dụng muốn khai thác.
Hãy nhớ, sự bình tĩnh trong việc đưa ra sự trình bày trước các câu hỏi tiếng anh là điều quan trọng nhất. Bạn chỉ cần kiểm soát tốt cảm xúc, trình bày rõ ràng, rạch mạch, bạn sẽ thành công. Đừng để bản thân hoảng sợ và mất đi cơ hội. Cố gắng lên nào! Họ không quá chú trọng đến việc đúng ngữ pháp, từ ngữ chuyên môn của bạn. Cái họ quan tâm vẫn là khả năng thích ứng và giải quyết vấn đề thách thức của bạn từ câu hỏi tiếng anh. Vì vậy, hãy cứ trả lời bằng khả năng của chính bạn.
Lời kết
Cách trả lời ưu nhược điểm sẽ còn phụ thuộc rất nhiều vào khả năng của bạn. Hi vọng với những chia sẻ, TopDev đã giúp bạn đọc có thêm nhiều thông tin bổ ích về cách trả lời ưu nhược điểm khi phỏng vấn. Đồng thời, bạn cần quan tâm hơn đến việc rèn luyện các kỹ năng; tính chân thật trong lời chia sẻ; cũng như trình bày thông tin về cá nhân trong CV của mình. Mong rằng, các bạn sẽ chinh phục được những thách thức tuyển dụng; và có một hành trình nghề nghiệp đầy thú vị.
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products
Bài viết được sự cho phép của BQT Kinh nghiệm lập trình
Việc chọn ngành học cũng như chọn việc làm, liên quan tới những kỳ vọng tài chính và sự phát triển năng lực lâu dài, do vậy, sự lựa chọn này cần được cân nhắc nghiêm túc.
– Không biết mình thích gì, có năng khiếu về gì, không hiểu bản thân mình.
– Chọn trường/ ngành theo mong muốn áp đặt của bố mẹ, theo truyền thống gia đình, do có ô dù sẵn, không cần lo nơi chốn sau này
– Chọn theo đám đông, theo trend, theo bạn bè, theo người yêu…
– Chọn nơi an toàn, dễ học, nhiều công việc liên quan
– Chọn nghề “HOT” mà không xem xét năng lực của mình
– Chọn theo may rủi, tin nghe bói toán, theo phong trào
– Không có sự tham khảo nghiên cứu thị trường lao động
– Không tinh toán tới điều kiện, nguồn lực của bản thân, gia đình
– Không có tinh thần, trách nhiệm với quyết định của mình
…
LÀM THẾ NÀO ĐỂ CHỌN ĐÚNG?
– Xác định sở thích, đam mê, năng khiếu, mục tiêu của mình
– Xác định năng lực bản thân và các nguồn lực
– Xác định lộ trình cho mình (đi học hay đi làm trước rồi đi học sau, học ở mức độ nào, trong bao lâu…)
– Xác định con đường, cách thực hiện: đi học, đi làm, làm chủ, làm thuê…
– Nghiên cứu các trường, công việc mình lựa chọn: lĩnh vực, nơi chốn, chi phí, lợi ích, chi phí cơ hội…
– Nghe lời khuyên từ người đúng đắn, người có chuyên môn, có kinh nghiệm, cập nhật thông tin thị trường, hiểu về năng lực và nguồn lực của bạn.
…
Bonus:
Từ kinh nghiệm của tôi thì tôi thấy lớp 12, đa số đều chẳng biết thi trường quái gì đâu, tôi thì tôi ở miền núi, hồi đó no phone, no internet. Nhưng bây giờ, các bạn học sinh ở thành phố điện thoại Ip8 4G cả ngày thì vẫn bị rơi vào tình trạng mơ hồ như bình thường. Các bạn sinh viên sắp ra trường cũng không ít bạn như vậy. Người đi làm 5-7 năm vẫn phải hỏi “Chuyển việc gì, có nên đổi nghề không”. Điều này là quá phổ biến.
Các bạn lớn thì tự chịu trách nhiệm, còn các bạn học sinh, sinh viên thì các bạn có quyền hỏi, tham khảo người có kinh nghiệm. Các bạn cần thiết phải làm như vậy.
Và các phụ huynh, giáo viên cũng phải thể hiện được đúng vai trò của mình trong trường hợp này. Hãy tương tác và đồng hành cùng các bạn nhỏ trong giai đoạn chuyển đổi của các bạn ấy.
Ngày nay thì các trang web là một phần không thể thiếu của Internet, đến nỗi nhiều người còn lầm tưởng Website chính là Internet. Cũng dễ hiểu thôi bởi vì website hầu như là công cụ để giao tiếp với người dùng Internet hiệu quả nhất.
Trong bài viết hôm nay, mình sẽ hướng dẫn các bạn cách deploy static website lên Firebase Hosting. Cùng bắt đầu thôi!
Youtube Video
Tạo project Firebase và thiết lập Firebase CLI
Đầu tiên thì các bạn cần truy cập vào console.firebase.google.com, tạo một project mới, bạn có thể xem lại bài viết này của mình để biết cách tạo project firebase. Tiếp theo, chúng ta cần tạo project Firebase trên máy mình.
Để tạo được project firebase trên máy, cần sử dụng Firebase CLI, các bạn mở command line, gõ lệnh “npm install -g firebase-tools”, lưu ý là máy bạn cần phải có nodejs trước nha. Nếu bị fail, các bạn mở lại command line với quyền admin và chạy lên câu lệnh trên.
Sau khi cài đặt xong, các bạn kiểm tra bằng cách chạy lệnh “firebase –version”, nếu trả ra kết quả là phiên bản Firebase CLI thì bạn đã cài đặt thành công. Lưu ý là lúc các bạn đọc blog này có thể Firebase đã có phiên bản mới nên các bạn không cần bận tâm nếu version khác mình nha.
Sau khi đã cài đặt Firebase CLI rồi, chúng ta cần phải đăng nhập vào tài khoản Google đã tạo project trước đó. Các bạn chạy tiếp lệnh “firebase login”, nó sẽ hỏi bạn có muốn Firebase thu thập thông tin sử dụng, lỗi hay không, bạn có thể chọn có để cho phép (y) hoặc không (n), nhấn enter để tiếp tục.
Sau đó, một cửa sổ trình duyệt sẽ mở ra, bạn hãy đăng nhập tài khoản mà bạn đã tạo project firebase vào hoặc chọn tài khoản đó nếu đã đăng nhập.
Tiếp tục, bạn cần phải cấp quyền cho Firebase CLI truy cập Google Cloud, Firebase Data của bạn, bấm Allow để chấp nhận cho phép truy cập.
Khi nhìn thấy màn hình Successful nghĩa là bạn đã đăng nhập Firebase CLI thành công, bạn có thể tắt cửa sổ trình duyệt đi.
Tạo project Firebase Hosting
Giờ thì chúng ta đã xong các bước thiết lập Firebase CLI, việc tiếp theo cần làm là tạo một project Firebase Hosting trên máy, sau đó liên kết nói với project Firebase đã tạo lúc đầu.
Đầu tiên bạn cần tạo một thư mục chứa project của bạn, sau đó mở nó với command line. Tiếp theo, bạn chạy lệnh “firebase init hosting”, nó sẽ hỏi bạn xác nhận tạo project firebase, bạn nhấn “y” và enter để tiếp tục.
Vì mình đã tạo project Firebase lúc đầu rồi, giờ bạn sẽ chọn “Use an existing project”, dùng các phím lên, xuống để di chuyển và enter để chọn mục đó. Nó sẽ liệt kê các project mà bạn đang có, bạn chọn cái mà bạn tạo lúc đầu và enter để tiếp tục.
Tiếp đến nó sẽ hỏi bạn tên thư mục mặc định cho public, bạn cứ để nó mặc định là public (không cần gõ gì hết và nhấn enter), tiếp theo nó hỏi bạn có muốn chuyển hướng toàn bộ URL vào index.html hay không, bạn chọn No (gõ “n” và enter), tiếp đến là setup automatic build với Github, mình sẽ chọn no luôn vì ở đây mình chỉ demo cho các bạn xem thôi. Như vậy là đã xong phần setup rồi.
Hãy cùng nhìn qua một chút cấu trúc project nhé. Ở đây bạn cần chú ý file firebase.json và thư mục public thôi. Thư mục public là nơi chứa toàn bộ source của website, hiện tại nó có sẵn 1 file index.html và 1 file 404.html. File firebase.json là chứa các settings cho project hiện tại.
Bây giờ bạn có thể chạy thử hosting bằng cách chạy lệnh “firebase serve –only hosting”, một hosting được mở ở port 5000, bạn truy cập http://localhost:5000 để xem kết quả.
Và đây cũng chính là nội dung của file index.html. Bây giờ mình sẽ thử thêm 1 file about.html, sau đó truy cập localhost:5000/about.html. Kết quả sẽ được như hình bên dưới.
Bạn có thể vào firebase.json, bên dưới mục hosting, thêm vào “cleanUrls”: true để không cần phải ghi rõ đuôi mở rộng của file. Sau khi sửa vì bạn vào command line lúc nảy, nhấn ctrl + C để dừng, sau đó chạy lại “firebase serve –only hosting” để mở lại hosting. Bây giờ khi truy cập localhost;5000/about, chúng ta vẫn có thể thấy được nội dung như ảnh trên.
Giờ việc còn lại chỉ là deploy lên Firebase Hosting. Đơn giản, bạn chỉ cần sử dụng lệnh firebase deploy, sau đó mọi thứ hãy để Firebase lo. Sau khi deploy thì bạn sẽ nhận được url đến mà website, thường nó sẽ có dạng <projectid>.web.app và <projectid>.firebaseapp.com. Như của mình là khiemledemoapp.web.app và khiemledempapp.firebaseapp.com.
Lưu ý là có thể bạn sẽ phải đổi plan sang Pay as you go để có thể deploy được. Tuy nhiên đừng lo lắng, nó sẽ chỉ trừ tiền mỗi khi website vượt mức free mà thôi. Một lưu ý khác là Google chỉ chấp nhận thẻ credit thôi.
Ai lại muốn dùng static website
Không như bạn nghĩ đâu, ngày nay, hầu hết các website đều dùng client side rendering, điều này nghĩa là các site đó đều có nội dung tĩnh cả, việc lấy dữ liệu về và render ra sẽ là nhiệm vụ của javascript (hoặc các library, tùy bạn).
Do đó, các bạn hoàn toàn có thể build 1 cái API, sau đó dùng Firebase Hosting để lưu trữ website, trong web thì dùng ajax, XMLHTTPRequest để fetch data và render ra. Đây chính là cách mà mình dùng với project Single File của mình mới deploy.
Có thể bạn nghĩ là có host để làm API thì sao không dùng host đó để lưu website luôn. Well, cái hay của Firebase Hosting là nó thuộc hệ sinh thái của Firebase và Google Cloud, bạn có thể dùng Cloud Functions để trigger http request và response data về, dùng firestore để lưu data… và bạn không cần biết setup server làm gì cả.
Firebase Hosting sẽ hỗ trợ bạn có SSL miễn phí, add custom domain miễn phí, có global CDN, chỉ trả phí mỗi khi web của bạn được thật sự sử dụng.
Lời kết
Vậy là qua bài viết này, mình đã hướng dẫn mọi người cách thiết lập project Firebase Hosting, deploy nó. Nếu bạn thấy static website quá chán, đừng lo, sắp tới mình sẽ có bài viết hướng dẫn các bạn dùng Cloud Functions để build dynamic website cùng với Firebase Hosting.
Nếu bạn thấy bài viết này hay đừng quên chia sẻ nó cho mọi người, đừng quên để lại bình luận nếu bạn có bất kỳ thắc mắt nào. Cảm ơn mọi người đã đọc bài viết!
Lựa chọn ngôn ngữ để phát AI: Python, C++, R, Lisp, Prolog, Java, Julia, Haskell
Lựa chọn ngôn ngữ để phát triển Robotics: Python, C/C++, Java, C#/.NET, MATLAB, LISP, BASIC/Pascal, Assembly Language
Lựa chọn ngôn ngữ để phát triển Machine Learning: Python, C++, Javascript, Java, C#, Julia, Shell, R, TypeScript, Scala
Lựa chọn ngôn ngữ để phát triển game: C++, C#, Java, Python, Objective-C
Lựa chọn ngôn ngữ để phát triển Web: HTML, CSS, Javascript, PHP, ASP.NET, Python, Java, Ruby, SQL, XML
Lựa chọn ngôn ngữ để phát triển phần mềm, ứng dụng: C, C++, C#, Java, Ruby, VB.SCRIPT, Python, SQL
Tùy theo mong muốn sự nghiệp mà mình chúc các bạn lựa chọn được ngôn ngữ lập trình phù hợp cho mình. Chứ nhiều ngôn ngữ lắm. Không thể ôm hết được đâu. Hãy chọn đúng và làm thật tốt một ngôn ngữ là đủ để cho bạn thành công rồi.
Bài viết được sự cho phép của tác giả Võ Xuân Phong
Trong bài viết này, mình sẽ trình bày cho anh em về Graceful Shutdown với ngôn ngữ lập trình Golang. Chúng ta sẽ đi tìm hiểu về Graceful Shutdown là gì? Tại sao chúng ta lại cần áp dụng nó và nó có mang lại lợi ích gì hay không?
Hãy tưởng tượng rằng, chúng ta đang có một web service đang tiếp nhận yêu cầu (request) của các client để truy xuất dữ liệu từ database, vì dữ liệu truy xuất lớn nên phản hồi (response) phải mất một thời gian mới truy xuất xong. Trong khi đó anh em lại muốn tắt web service đó đi để bảo trì hệ thống hoặc triển khai (deploy) mới, bằng các thao tác kill ứng dụng web service đang chạy, có thể là câu lệnh stop của docker, câu lệnh kill process bằng PID hay Ctrl + C chúng ta vẫn thường hay dùng .v.v. Ngay lập tức những yêu cầu mà service xử lý chưa xong bị buộc ngưng giữa chừng.
Ngoài ra những kết nối khác như kết nối với database không được kiểm soát và đóng lại đúng cách gây hao tốn tài nguyên của server. Những điều nói trên làm chúng ta phải dừng lại và suy nghĩ về nó phải không?
Điều chúng ta muốn là khi service bị buộc dừng thì nó sẽ:
Không đón nhận những yêu cầu (request) mới.
Xử lý và và phản hồi những yêu cầu (request) cũ.
Cuối cùng là đóng các kết nối, sau đó mới dừng service hoàn toàn.
Áp dụng Graceful Shutdown trong Golang.
Để thiết lập Graceful Shutdown cho ứng dụng web service của chúng ta, anh em cần thực hiện các bước sau:
Cho ứng dụng của chúng ta chạy background trong 1 Goroutine.
Thiết lập một channel để lắng nghe tín hiệu dừng từ hệ điều hành, ở đây chúng ta lưu ý 2 tín hiệu (signal) là SIGINT (The interrupt signal là loại tín hiệu khi user nhấn Ctrl + C để kết thúc chương trình) và SIGTERM (The termination signal là loại tín hiệu khi một ứng dụng muốn dừng tiến trình của một ứng dụng khác, như từ câu lệnh stop của Docker hoặc câu lệnh delete pods của Kubernetes)
Thiết lập một khoản thời gian (Timeout), để dừng hoàn toàn ứng dụng và đóng tất cả kết nối.
Folder structure.
Chúng ta sẽ có folder structure như sau, tùy vào cách xây dựng structure của project anh em như thế nào anh em có thể refactor theo ý mình muốn.
response.go
File này chứa các hàm tiện ích hỗ trợ cho việc phản hồi cho người dùng kết quả dạng JSON.
Khi yêu cầu được gửi đến api /test-graceful-Shutdown thì hàm testGracefulShutDown bên trong xử lý nhiều công việc, sau 10 giây mới trả kết quả về cho client.
package main
import("context""log""os""os/signal""syscall""time""graceful-shutdown/internal/app")funcmain(){
timeWait :=15* time.Second
application := app.New()
signChan :=make(chan os.Signal,1)//1. Cho ứng dụng của chúng ta chạy background trong 1 Goroutinegofunc(){if err := application.Start(); err !=nil{
log.Printf("%v", err.Error())}}()//2. Thiết lập một channel để lắng nghe tín hiệu dừng từ hệ điều hành, // ở đây chúng ta lưu ý 2 tín hiệu (signal) là SIGINT và SIGTERM
signal.Notify(signChan, os.Interrupt, syscall.SIGTERM)<-signChan
log.Println("Shutting down")//3. Thiết lập một khoản thời gian (Timeout) để dừng hoàn toàn ứng dụng và đóng tất cả kết nối.
ctx, cancel := context.WithTimeout(context.Background(), timeWait)deferfunc(){
log.Println("Close another connection")cancel()}()
log.Println("Stop http server")if err := application.Stop(ctx); err == context.DeadlineExceeded {
log.Print("Halted active connections")}close(signChan)
log.Printf("Completed")}
Kết quả.
Chúng ta thực hiện việc run service và gửi một request http với method GET tới api test-graceful-Shutdown, sau đó ấn Ctrl + C để dừng service, và kết quả thu được là chương trình sẽ xử lý xong yêu cầu của người dùng sau đó mới đóng các kết nối và dừng hẳn.
Chạy service.
Gửi request http trước khi dừng chương trình, api xử lý mất tầm 10 giây nhưng sau khi thực hiện dừng chương trình thì client vẫn nhận được kết quả phản hồi mong muốn.
Mình đã trình bày qua cách thiết lập Graceful Shutdown cho service của chúng ta, chúc anh em happy coding nhé, mong nhận được phản hồi tích cực từ anh em.
3 sai lầm khi làm việc các lập trình viên nên tránh
Dịch từ bài viết của tác giả: Szymon Adamiak
Giới thiệu
Bạn phải trải qua một hành trình gian nan để có được công việc mình muốn, bạn phải rèn luyện rất nhiều để trở thành một dev nhiều kinh nghiệm. Nhưng điều khó khăn hơn nữa là làm sao để duy trì được đam mê của mình với nghề? Để bản thân cảm thấy vui vẻ mỗi khi design được UI UX ấn tượng, phù hợp cho một dự án, được nhiều user đánh giá cao. Muốn thế lập trình viên cần cố gắng trau dồi nhiều kiến thức và kỹ năng hơn cũng như nên tránh những thói quen xấu ảnh hưởng đến quá trình làm việc của mình, để giữ được nhiệt huyết và hiệu quả làm việc.
3 thói quen xấu nên tránh, kể cả với kỹ thuật UI UX
Làm việc quá chăm chỉ
Mỗi ngày bạn có 8 giờ làm việc tại công ty, quá trình đi lại mất thêm vài giờ, nếu đang chạy deadline cho các dự án sắp tới, thời gian làm việc trong ngày của bạn còn nhiều hơn cả như thế. Tuy nhiên nếu bạn dành quá nhiều thì giờ một ngày cho công việc trong quãng thời gian dài lại không thật sự tốt, nó ảnh hưởng đến nhiều vấn đề trong cuộc sống của bạn.
Làm việc quá tải khiến công việc không đạt được hiệu quả tốt như mong muốn
Bạn có thể khó ngủ hơn do quá nhiều áp lực, tâm trạng khó chịu và mất tập trung do công việc nhiều. Thậm chí sức khỏe sẽ suy giảm nếu bạn tiếp tục làm việc không khoa học. Kết quả cuối cùng là công việc bạn hoàn thành cũng không đạt được hiệu quả như mong muốn. Nhất là với những dev làm các công việc liên quan đến UI UX, bạn phải luôn giữ cho mình sự tỉnh táo, sáng suốt trong cả quá trình làm việc cho đến lúc trình bày dự án, thuyết phục khách hàng của mình.
Do đó, bạn cần đặt ra giới hạn thời gian làm việc mỗi tuần của mình, sao cho bạn cảm thấy hợp lí nhất. Hãy học cách nói không với công việc mới nếu bạn đang làm việc quá sức. Có thể vì bạn quá hào hức với mọi việc mà sếp giao khiến sếp hiểu nhầm hoặc không biết rằng lịch trình của bạn đã dày đặc rồi. Trong trường hợp này hãy biết cách từ chối một cách khéo léo và lịch sự. Hoặc có thể sếp vẫn cố tình muốn giao cho bạn nhiều task hơn dù biết bạn đã quá bận rộn và bạn không thể giải quyết tình huống đó thì nghỉ việc cũng là một lựa chọn! Đừng khiến bản thân trở nên mệt mỏi quá mức cần thiết.
Ngoài ra, hãy cố gắng dành thêm thời gian cho các hoạt động ngoài trời, rèn luyện thể chất hay đọc sách để nâng cao kinh nghiệm cho bản thân trong công việc lập trình như đọc thêm về ngôn ngữ lập trình khác, tìm hiểu thêm về lợi ích của UI UX,… cũng là giải pháp không tồi đâu.
Bạn ngồi vào bàn làm việc, chuẩn bị viết những dòng code đã suy nghĩ được thì chợt nhớ ra sáng nay bạn chưa uống cà phê. Bạn ra pantry và pha cà phê thưởng thức cho tỉnh táo làm việc. Sau đó, bạn chuẩn bị sửa lỗi mà mình vừa phát hiện trong code thì nhận được tin nhắn của sếp gọi vào phòng họp. 30 phút trôi qua, bàn quay trở lại bàn làm việc và cảm thấy hơi khó chịu, phải lướt mạng xã hội một chút để thư giãn. Một lúc sau, bạn bắt đầu làm việc thì nhận được tin nhắn của đồng nghiệp yêu cầu trợ giúp, vậy là bạn lại quay sang hướng dẫn họ. Cứ như thế, mỗi ngày sẽ có hàng tá việc khác nhau kéo bạn ra khỏi sự tập trung với công việc chính của mình. Để duy trì hiệu quả công việc và tránh lãng phí thời gian, bạn nên học cách bảo vệ quỹ thời gian và tránh bị xao nhãng bởi những tác động bên ngoài.
a. Hãy khiến người khác tôn trọng thời giờ của bạn
Hãy cho đồng nghiệp của bạn biết rằng khi nào thì bạn có thể giúp đỡ họ và khi nào thì bạn cần thời gian để làm việc của mình. Nói với họ rằng bạn sẽ không nhận cuộc gọi, kiểm tra email hay sử dụng tính năng trò chuyện trong thời gian tập trung làm việc. Đừng quên đeo tai nghe – ngay cả khi bạn không nghe bất cứ thứ gì – chỉ để nhắc nhở người khác rằng bạn đang tập trung cho công việc của mình.
Bạn có thể sẽ cảm nhận được sự khó chịu của đối phương trong lúc đầu nhưng qua thời gian, họ sẽ quen với điều đó và hiệu suất công việc của bạn cũng sẽ tăng lên đáng kể nếu áp dụng hiệu quả cách làm này. Tuy nhiên bạn cũng nên dành một ít thời gian để giúp đỡ hoặc teamwork cùng đồng nghiệp để đạt KPI tốt hơn. Chẳng hạn như với các UI UX designer, họ cần thời gian tập trung nhiều hơn để có thể tìm được giải pháp tối ưu cho giao diện cũng như phát hiện ra các lỗi sai, dù là chi tiết nhỏ nhất. Hoặc với các dev đang là Junior/Senior Tester chẳng hạn, bạn thật sự cần tập trung tối đa để đảm bảo có thể xử lý tất cả các vấn đề có thể xuất hiện.
Bạn phải là người làm chủ những hành động của mình. Đừng để mạng xã hội, mail rác hay bất cứ thứ gì khác khiến bạn xao nhãng. Một trong những cách hay ho mà tôi hay áp dụng để không phí thời gian làm việc là log out khỏi các tài khoản mạng xã hội, để điện thoại ở chế độ im lặng, làm việc trong không gian yên tĩnh hoặc nghe nhạc. Không nhất thiết phải là bài hát yêu thích mà đó có thể là bất kì thể loại nhạc nào có thể giúp bạn tập trung.
Hiện tại có một kỹ thuật làm việc được nhiều người áp dụng khá bổ ích với dân IT, kể cả trong lĩnh vực UI UX, đó là kỹ thuật Pomodoro. Với quy tắc này, bạn nên chia các khoảng thời gian làm việc của mình từ 25 – 90 phút, sau đó là một thời gian ngắn để nghỉ ngơi, sẽ giúp bạn làm việc hiệu quả hơn rất nhiều. Hoặc bạn có thể sử dụng chế độ Zen của trình soạn thảo khi làm việc. Việc chuyển sang chế độ làm việc toàn màn hình và ẩn các giao diện không cần thiết sẽ giúp bạn tập trung hơn khi coding.
Các dev nên cố gắng hạn chế việc mắc phải những sai lầm này để công việc “dễ thở” hơn
Xây dựng tư duy phát triển cho bản thân, nhất là UI UX designer
Bạn cảm thấy dù bản thân đã cố gắng làm việc rất nhiều nhưng vẫn không thể đạt được thành tựu như những người khác, không thể nâng cao được năng lực của bản thân. Bạn không thể bắt kịp với sự thay đổi liên tục của công nghệ, xung quanh bạn đều là những dev giỏi và dù cố gắng đến đâu vẫn không thể đạt được những gì bạn muốn. Theo Carol Dweck – nhà tâm lý học người Mỹ, bạn đã bị ảnh hưởng bởi tư duy cố định.
Tư duy cố định là suy nghĩ cho rằng những phẩm chất, khả năng của con người là không thể thay đổi, dù có cố gắng hơn nữa thì cũng không đạt được điều tốt hơn. Còn nếu bạn giỏi hơn, chuyên môn cao hơn thì đó lại là do may mắn. Với những công việc đòi hỏi nhiều sáng tạo và tư duy sâu như UI UX, đây được xem là tư duy nguy hiểm, ảnh hưởng đến sự phát triển của bạn trong công việc hàng ngày.
Tư duy cố định có thể sẽ là sai lầm chí mạng với các lập trình viên, vì IT là lĩnh vực đòi hỏi rất cao tình thần học hỏi và thích nghi với cái mới. Nếu bạn luôn nghĩ rằng mình không đủ giỏi, không đủ tốt, bạn chắc chắn sẽ bị tụt lại phía sau. Hãy chuyển tư duy cố định sang tư duy phát triển – với niềm tin rằng bạn có thể thay đổi và phát triển bằng những nỗ lực không ngừng của mình, chỉ có như vậy mới khiến bạn trở nên tốt hơn.
Kết luận
Học hỏi và không ngừng trau dồi sẽ giúp các dev có tay nghề chuyên môn cao hơn, tìm kiếm được những công việc trong những môi trường chuyên nghiệp như tại Gear Inc… Cũng như biết cách tránh những sai lầm không đáng có sẽ giúp bạn đạt được hiệu suất làm việc tốt hơn rất nhiều.
Vậy nhưng nếu thử hỏi một lập trình viên sử dụng ngôn ngữ lập trình bất kỳ hãy viết một đoạn code sắp xếp những cái tên sau theo thứ tự của tiếng Việt:
Vậy sorted hoàn toàn không sai, nó sắp xếp các chữ cái theo thứ tự các xuất hiện trong bảng mã Unicode (codepoint). Chữ “ư” nằm ở vị trí 432, đứng trước chữ “ậ” với vị trí 7853.
sorted đã đúng, nhưng đây không phải cách sắp xếp chúng ta mong muốn.
Vậy điều gì ảnh hưởng đến thứ tự khi sắp xếp của các chữ cái? Rõ ràng nếu theo chuẩn của người Mỹ, người ta sẽ sắp xếp như trên, nhưng trong bảng chữ cái tiếng Việt, thứ tự lại khác. Những thứ liên quan đến ngôn ngữ địa phương như vậy được biểu diễn lên máy tính bằng khái niệm “locale”.
Locale là gì /ləʊˈkɑːl/
English: a place where something happens or is set, or that has particular events associated with it
Vietnamese: mội nơi mà điều gì đó xảy ra hoặc có những sự kiện gắn liền với nó.
Một chương trình hỗ trợ locale là chương trình tôn trọng sự lựa chọn dựa trên nền tảng văn hoá của người dùng, như bảng chữ cái, cách sắp xếp và cách viết số (người Việt Nam thường dùng dấu , trong số thực: 1,5. Người châu Mỹ lại dùng dấu .: 1.5) (Dịch theo tài liệu của Postgresql)
Một locale là một bộ luật ngôn ngữ và văn hoá. (theo manpage của Ubuntu)
Locale không chỉ là khái niệm của riêng ngôn ngữ lập trình nào mà đòi hỏi là hỗ trợ của toàn hệ thống. Các hệ điều hành (OS) đều hỗ trợ đặt các và sử dụng locale khác nhau.
Cách biểu diễn một locale
Một locale thường được biểu diễn ở dạng “ngônngữ_quốcgia”:
en_US (U.S. English)
fr_CA (French Canadian)
vi_VN (Vietnamese Vietnam)
Trên hầu hết các hệt thống UNIX (Ubuntu, OSX …), có thể liệt kê các locale đang hỗ trợ trên máy bằng lệnh locale -a:
$ locale -a | head -n3
C
C.UTF-8
en_AG
$ locale -a | tail -n3
POSIX
vi_VN
vi_VN.utf8
Các locale có thể được cài thêm, ví dụ trên Ubuntu 16.04, locale Việt Nam không được cài sẵn, phải cài thêm package language-pack-vi để có locale vi_VN:
apt-get install -y language-pack-vi
Nếu có nhiều hơn một bộ ký tự cho một locale, có thể chỉ rõ ra nó ở dạng: “ngônngữ_quốcgia.bộkýtự”: Ví dụ:
Khi không có locale nào được set, locale mặc định là C hay POSIX.
Locale categories
Đôi khi, người ta lại muốn dùng bảng chữ cái của Việt Nam, nhưng đơn vị tiền tệ của Mỹ, thời gian theo format của Anh, những nhu cầu lẫn lộn này được đáp ứng bởi locale sẽ chia nhỏ thành “locale subcategories” và mỗi category sẽ điều chỉnh một khía cạnh của luật locale:
LC_COLLATE: thứ tự sắp xếp string /kəˈleɪt/, ảnh hưởng đến các function strcoll, strxfrm
LC_CTYPE: phân nhóm chữ cái (đâu là một chữ cái, chữ cái dùng 1byte hay nhiều bytes? chữ viết hoa tương ứng của mỗi chữ là chữ nào?)
LC_MESSAGES: ngôn ngữ của message
LC_MONETARY: format (định dạng) của tiền
LC_NUMERIC: format của số
LC_TIME: format của ngày tháng
LC_TELEPHONE: format số điện thoại
… còn nhiều
LANG: default cho các LC_*
LC_ALL: tất cả các category nói trên.
Thứ tự xử lý locale
Các locale category thường được set làm biến môi trường.
Nếu LANG không null thì giá trị của LANG được sử dụng làm default cho tất cả các giá trị không được set / null khác.
Nếu LC_ALL được set, không null, thì giá trị của LC_ALL sẽ được sử dụng, thay cho tất cả các giá trị khác.
Nếu biến nào được set không null thì biến đó được sử dụng. Vậy mức ưu tiên là: LC_ALL > LC_* > LANG
Chú ý: bài viết thực hiện trên Ubuntu, trên Windows 10 dùng vi thay vì vi_VN
In[1]:importlocaleIn[3]:locale.getlocale(category=locale.LC_CTYPE)# LC_TYPE là category mặc địnhOut[3]:('en_US','UTF-8')In[4]:locale.getlocale()Out[4]:('en_US','UTF-8')In[5]:locale.setlocale(locale.LC_ALL,'vi_VN')---------------------------------------------------------------------------ErrorTraceback(mostrecentcalllast)<ipython-input-5-7ee8baa2ff04>in<module>()---->1locale.setlocale(locale.LC_ALL,'vi_VN')/Users/hvn/python3/lib/python3.5/locale.pyinsetlocale(category,locale)593# convert to string594locale=normalize(_build_localename(locale))-->595return_setlocale(category,locale)596597defresetlocale(category=LC_ALL):Error:unsupportedlocalesetting# Do máy không có locale vi_VN# set locale cho tất cả category sử dụng giá trị mặc định (thường lấy trong biến môi trường LANG)In[6]:locale.setlocale(locale.LC_ALL,'')Out[6]:'en_US.UTF-8'# Trả về database của các convention hiện tạiIn[7]:locale.localeconv()Out[7]:{'currency_symbol':'$','decimal_point':'.','frac_digits':2,'grouping':[3,3,0],'int_curr_symbol':'USD ','int_frac_digits':2,'mon_decimal_point':'.','mon_grouping':[3,3,0],'mon_thousands_sep':',','n_cs_precedes':1,'n_sep_by_space':0,'n_sign_posn':1,'negative_sign':'-','p_cs_precedes':1,'p_sep_by_space':0,'p_sign_posn':1,'positive_sign':'','thousands_sep':','}# Đổi locale sang C, ở locale này không có đơn vị tiền tệ.In[15]:locale.setlocale(locale.LC_ALL,'C');locale.localeconv()['currency_symbol']Out[15]:''# Khi đổi lại về locale default (thường lấy từ LANG), ở đây là en_US.UTF8, ký hiệu đơn vị tiền tệ là $.In[16]:locale.setlocale(locale.LC_ALL,'');locale.localeconv()['currency_symbol']Out[16]:'$'
Trên một máy có locale vi_VN, có thể thay đổi và xem đơn vị tiền tệ:
Chú ý việc set này chỉ có tác dụng tại phiên làm việc hiện thời. Để thay đổi locale của toàn hệ thống (Ubuntu), phải thay đổi trong /etc/default/locale
Đã nữa năm 2019 trôi qua vậy mà tôi vẫn chưa làm được bất cứ thứ gì cho những mục tiêu đã đề ra. Thời gian qua nhanh thật, thật đáng tiếc cho những cơ hội bỏ lỡ và cực kì thất vọng về bản thân khi đã không thể cố gắng và quyết tâm với những gì đã đặt ra.
Và vô tình tôi đọc được một bài viết từ blog của bạn Huydx được viết cách đây một năm, cảm thấy bài viết hay nên tôi xin chia sẽ lại bài viết như sau. (Bài viết gốc: xem ở đây)
Bạn hay được dạy từ sách vở, hay các blog về phát triển bản thân, rằng việc quyết định mục tiêu là rất quan trọng, rằng mục tiêu là thứ sẽ quyết định rằng bạn có thành công hay không. Bạn học theo và đặt ra rất nhiều mục tiêu trong cuộc sống: bạn muốn trở thành giám đốc công nghệ, bạn muốn được lương vài ngàn mĩ kim, bạn muốn vân vân và vân vân rất nhiều thứ. Một công ty, hay một dự án cũng cần có mục tiêu để có thể tồn tại lâu dài, cũng như để thành công.
Tôi cũng có thói quen đặt mục tiêu cho hàng năm, hàng tuần, hay thậm chí là hàng ngày. Tuy nhiên cho đến gần đây tôi nhận thấy đó không thực sự là cách làm tốt nhất.
Mục tiêu biến bạn trở nên không hạnh phúc khi bạn không đạt được nó. Bạn sẽ cảm thấy “mình chưa đủ tốt” khi đạt được cái đã đặt ra, cũng như ngay cả khi bạn đã đạt được nó rồi, thì hạnh phúc của bạn cũng không kéo dài quá lâu. Gần đây tôi có đọc một bài blog khá thú vị nói về vấn đề này Why are smart people so miserable
Vậy kết luận là chả cần mục tiêu gì cả, sống tới thôi?
Tất nhiên là không phải vậy, thay vì tập trung vào mục tiêu, thì chúng ta hãy tập trung vào quá trình (hay là thói quen) hàng ngày, để hướng đến mục tiêu đó.
Nếu mục tiêu của bạn là trở thành cầu thủ giỏi, hãy tập trung vào việc tập đá bóng hàng ngày 10 giờ.
Nếu mục tiêu của bạn là một lập trình viên giỏi, hãy tập trung vào việc hàng ngày phải code đủ XX giờ, hàng tuần phải đọc sách về một lĩnh vực hẹp mình đang thay đổi…
Thực ra khoảng cách giữa mục tiêu và quá trình (thói quen) là không nhiều, có khác chăng chính là 2 điểm chính: tính liên tục là khả năng đạt được. Khả năng đạt được của một thói quen (hàng ngày lập trình XX giờ) sẽ cao hơn nhiều mục tiêu là trở thành một Jeff Dean thứ hai, hay là mức lương vài trăm ngàn mĩ kim. Việc đó cũng khiến cuộc sống của bạn trở nên hạnh phúc hơn, với những hạnh phúc nhỏ nhoi hàng ngày.
Có một điểm tôi muốn nhấn mạnh là, tôi không nói là mục tiêu không quan trọng. Mục tiêu là một thứ dài hạn hơn, và thiếu nó thì bạn sẽ không biết phải đặt ra quá trình, cũng như những thói quen mà bạn nên có là gì. Chỉ có là đừng coi mục tiêu đó là một thứ giống như thắng thua, rằng không đạt được thì bạn là một kẻ thất bại hay bất tài, hãy coi nó như là định hướng cho những gì bạn sẽ làm hàng ngày, vậy thôi.
Khác với các công ty startup, ở các công ty lớn hơn, thì đa phần vì policy của công ty nên máy tính do công ty cấp đều cài sẵn các phần mềm theo dõi hoặc kiểm soát internet traffic, và đủ thứ hầm bà lằng các kiểu, cho nên best practice mà nhiều người recommend là sử dụng 2 máy tính riêng biệt, một máy chỉ để làm việc và một máy chỉ để làm những việc cá nhân (như duyệt web, xem phim heo, ngân hàng, chơi game, code side project các kiểu).
Thế là mình làm một quả mini PC chạy Windows, vừa đủ xài. Quay trở lại Windows sau bao nhiêu năm “xa xứ”, mình rất ấn tượng vì cái độ chất của nó, mặc dù nó đi kèm với đủ thứ hầm bà lằng mà mình phải tắt bớt, nhưng nhìn chung là đầy đủ đồ chơi, thứ gì cũng có, setup môi trường dev trong WSL, code bằng vim hoặc VS Code đều được,…
Vì sao là Windows mà không phải là Linux? Vì mình lười config =)) Ngày trước tốn bao nhiêu công sức để setup xong bán bà nó cái máy. Nhưng tính ra xài Windows rất tiện vì vẫn có thể xài WSL để có môi trường Linux, lại có thể thoải mái cài game hay các phần mềm khác chỉ có trên Win.
Nhưng xài 2 máy thì việc chuyển đổi qua lại giữa 2 máy khá là phiền phức, bạn nào thử rồi chắc sẽ hiểu. Nên giải pháp là KVM.
KVM, viết tắt của Keyboard, Video and Mouse Switch, là các phần mềm hoặc thiết bị giúp chia sẻ chuột và bàn phím cho 2 hoặc nhiều máy tính khác nhau. Có 2 loại KVM là Hardware KVM và Software KVM.
Hardware KVM tất nhiên sẽ connect trực tiếp các thiết bị vào mỗi máy tính, và việc switch qua lại giữa các máy tính thường sẽ được thực hiện thông qua một hành động vật lý ví dụ như bấm nút, hoặc giật dây, hoặc hiện đại hơn thì có thể là voice command, ưu điểm của hardware KVM là các thiết bị được kết nối trực tiếp với máy tính nên đảm bảo về độ trễ (input delay), không lỗi vặt, không giới hạn về hệ điều hành. Nhưng nhược điểm cũng nằm ở chính việc phải switch bằng một tác động vật lý, không linh hoạt như các giải pháp dùng phần mềm.
Software KVM thì ngược lại, thường được implement bằng cách kết nối 2 hoặc nhiều máy tính với nhau thông qua giao thức TCP hoặc UDP, trong đó 1 máy tính làm server, sẽ kết nối trực tiếp tới các thiết bị input, các máy tính khác sẽ là client, để switch qua lại giữa các máy với nhau thì thường sẽ dùng chuột move đến các cạnh màn hình hoặc bấm phím tắt để di chuyển, nên việc switch diễn ra linh hoạt và thoải mái hơn (tưởng tượng có 3 màn hình cho 3 máy tính, chỉ cần move qua lại giữa các màn hình là chuột và phím sẽ tự động đc switch qua). Cơ chế hoạt động thì đọc tới đây hẳn là ai cũng hiểu, nó bắt tín hiệu input từ máy server và gửi về cho client nào đang được active. Cho nên sẽ gặp vấn đề về độ trễ nếu đường truyền không đảm bảo, mặc dù đa số các case sử dụng đều là trong cùng 1 mạng LAN, độ trễ sẽ ko đáng kể, còn lag thì có, tuy nhiên vấn đề lớn nhất nằm ở chuyện security policy của mấy cái hệ điều hành, nhất là mấy cái OS đỏng đảnh như macOS.
Software KVM mà reliable nhất thì có thể kể đến Flow của Logitech, rất dễ sử dụng và cấu hình, hoạt động ổn định, latency gần như ko nhận thấy được, ít lag, nhưng tiếc là chỉ hoạt động với đồ của Logitech. Chuột thì dễ vì chuột Logitech cũng xịn, nhiều người dùng, còn anh em IT đa phần xài bàn phím 50k mua ngoài chợ trời hoặc mech, nên sẽ ko work với Flow.
Các sản phẩm thay thế thì có hàng trả phí như ShareMouse (49 USD cho bản standard, nhưng nếu anh em xài 2 màn hình thì phải mua bản Pro giá 139 USD), Synergy (giá 29 USD cho bản basic đủ xài), xài cũng ổn.
Open source thì có Barrier, là một bản fork từ Synergy khi nó chuyển sang close source. Đang gặp vấn đề về notarize app trên macOS nhưng có thể giải quyết được. Latency khá thấp, ít lag.
Nói về cách setup, nếu chọn máy macOS làm server và Windows làm client thì phần lớn sẽ gặp lỗi về keyboard (như là gõ trên máy win thì máy mac vẫn nhận được phím,…), cho nên cách tốt nhất là chọn máy win làm server còn máy mac là client.
Nếu có thể, thì bạn nên kết nối hai máy tính với nhau thông qua một cáp ethernet, như vậy độ trễ sẽ rất thấp và hầu như không bị lag (với máy mac thì [không cần xài cáp bấm chéo](, chỉ cần xài cáp ethernet tiêu chuẩn vẫn có thể kết nối được với nhau) vẫn có thể kết nối được với nhau).
Setup hiện tại của mình như sau:
Kết nối:
Máy PC kết nối với máy Macbook do công ty cấp, thông qua một sợi cáp ethernet (mình dùng dock station nên có cổng ethernet, với những bạn không có cả cổng ethernet lẫn dock thì có thể mua một cái Thunderbolt hoặc USB Ethernet Adapter).
Lúc này sẽ có 2 IP khác nhau cho máy PC, một IP là của đường kết nối trực tiếp từ PC đến Mac, và một IP khác là IP trong mạng nội bộ của hệ thống Wifi trong nhà.
Thiết bị:
Chuột và bàn phím cắm trực tiếp vào PC
Software KVM:
Mình dùng Barrier
Máy PC làm server
Máy Macbook làm client, trên Barrier client, cấu hình để nó connect tới máy PC thông qua IP address của Ethernet connection chứ không phải IP trong mạng Wifi.
Vấn đề tương thích:
Khi sử dụng setup này, trên máy Mac, phím Cmd sẽ được map thành phím Windows của bản phím, các phần mềm KVM khác có khả năng cấu hình lại, tuy nhiên Barrier thì không, nên giải pháp là cài một phần mềm map lại bàn phím trên Windows, ví dụ mình xài SharpKeys để map luôn phím Windows thành L-Alt, và L-Alt thành Windows.
Nói về trải nghiệm, thì cảm giác di chuyển qua lại giữa hai máy tính hoàn toàn không có, cứ như là vẫn đang ngồi trên 1 máy tính vậy, rất tự nhiên, ngoại trừ việc phải xài phím Cmd trên mac và Ctrl trên Windows.
Khi nào có thời gian mình sẽ thử setup tương tự trên Linux, nhưng hiện tại thì mình cảm thấy khá hài lòng với WSL trên Windows nên ngày đó chắc còn xa lắm, anh em nào có nhu cầu, thử setup rồi chia sẻ nào 😀
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Trong những bài viết trước mình đã giới thiệu với các bạn về cách đọc properties files trong Spring sử dụng đối tượng PropertyPlaceholderConfigure, namespace util hay namespace context. Vậy làm thế nào để sử dụng những properties này trong tập tin cấu hình của Spring? Trong bài viết này, mình sẽ hướng dẫn các bạn làm điều đó!
Ở đây, mình đã khai báo sử dụng namespace context để đọc file configuration.properties.
Để sử dụng các properties trong tập tin cấu hình của Spring, chúng ta cần khai báo các properties này với cú pháp như sau:
${property_name}
Với khai báo này, Spring sẽ tự động ingest giá trị của property vào trong các bean mà chúng ta khai báo trong tập tin cấu hình của Spring.
Ví dụ bây giờ, mình sẽ khai báo bean cho đối tượng HelloWorld trong tập tin cấu hình của Spring với thuộc tính name của đối tượng này lấy từ property name trong tập tin configuration.properties, như sau:
Các bạn hãy chú ý là: nếu một property được khai báo trong nhiều tập tin properties thì giá trị cuối cùng của property đó sẽ là giá trị nằm trong tập tin properties được khai báo sau cùng nhất.
Giả sử bây giờ mình thêm một tập tin properties nữa tên là configuration-override.properties
với nội dung như sau:
name=Huong Dan Java
và khai báo sử dụng tập tin này trong namespace context:
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh
Memory Leaks trong Closure
Nếu bạn chưa xem phần 1, vui lòng xem ở đây:
Khi chúng ta tạo giá trị 1 closure nó cần giữ 1 tham chiếu mạnh tới các biến mà nó cần thuộc controller.
Chúng ta tạo 1 hàm biến optional closure có kiểu () -> Int và gán trong ViewDidLoad. Closure cần a và b để chạy nó. a và b được capture bởi nó và thuộc ViewDidLoad – bên ngoài nó.
Đầu tiên, chúng ta nói self.someClosure là 1 tham chiếu mạnh.
someClosure = { return self.a + self.b }
Cả ViewController và Closure đều tăng RC = 1.
Khi Controller này push vào navigation controller, nó sẽ tạo 1 tham chiếu mạnh RC = 1 tới controller này. Và đồng thời closure cần a và b để capture cho nên class fererences này có RC = 2.
Khi bạn pop ViewController này thì nó bị xóa bởi navigation, đồng thời RC = 1.
Lý tưởng là khi đó ViewController sẽ bị hủy tuy nhiên chúng ta tạo ra 1 retain cycle.
ARC thấy RC của cả 2 đều là 1 nên không thể giải phóng được.
Giải pháp
Tạo ra 1 tham chiếu yếu thay thế tham chiếu mạnh.
Như hình trên closure capturing 1 giá trị yếu. Do đó lúc này a, b là kiểu optional cho nên chúng ta cần guard để unwrap 2 giá trị này lại.
var someClosure: (() -> Int)?
self.someClosure = { [weak self] in guard let `self` = self else { return 0 return self.a + self.b}
Khi tạo SecondViewController thì RC của nó = 1. Closure có capture weak cho nên RC vẫn là 1.
Khi navigation remove ViewController này thì RC là 0
ARC kiểm tra thấy và xóa ViewController này ra ngoài
closure có RC = 0 nên cũng bị xóa luôn
Sự khác nhau giữa weak và unowned
Unowned
Giống như 1 tham chiếu yếu, 1 Unowned không giữ tham chiếu mạnh tới nó, và sẽ gỡ được ratain cycle.
Tuy nhiên 1 Unowned được sử dụng khi các references tới chính nó có thời gian sống bằng hay lớn hơn nó.
Ví dụ, chúng ta chắc chắn là quá trình đóng ViewController sống lâu hơn quá trình chạy closure, nếu không thì ứng dụng sập. hoặc là self có thời gian sống hơn closure.
Chạy ứng dụng, nso thấy 1 màn hình với 1 nút. Bấm vào nút sẽ đẩy SecondViewController lên.
Trong hàm ViewDidLoad, nó chạy someMethodThatTakeClosure mất 4s. Giả sử chúng ta bấm đóng Controller này trước 4s đó, ứng dụng sẽ sập(crash)!
Cách fix
Sử dụng weak self thay thế.
Quy tắc dùng weak và unowned
Sử dụng weak khi bạn không chắc chắn self hay closure có thời gian sống lâu hơn trong mọi trường hợp.
Sử dụng unowned khi bán chắc chắn self sẽ chắc chắn luôn tồn tại khi closure được thực thi.
Luật 2
Khi bạn muốn truy cập thứ gì bên trong closure thì hãy biến nó thành self weak/ unowned
Trường hợp không xảy ra leak 1
Khi someMethod chạy, newSomeClosure cũng chạy và sau đó mới gọi tới hàm TakeClosure thì trong trường hợp này sẽ không xảy ra.
Naviagation CV giư tham chiếu tới SecondViewController có RC = 1
Closure capture 1 giá trị trong nó nên RC = 2
newSomeClosure tham chiếu mạnh tới Closure nên có RC = 1
Khi pop ViewControoler này ra:
SecondViewController có RC = 1
Khi closure chạy, closure sẽ có RC = 0
Khi đó SecondViewController có RC = 0 nên nó bị xóa ra khỏi bộ nhớ
Trường hợp không xảy ra leak 2
Một static method capture thì không tạo ra memory leak. Như hình trên self không static class nhưng static class closure capturing self bằng liên kết mạnh.
Static Class → Closure → Self (không thể xảy ra memory leaks)
Memory Leak
Quy tắc:
Khi bạn truy cập vào Singleton/ Static class và giữ 1 closure trong class đó, thời gian mà nó giữ closure sẽ leaks trong thời gian này.
Chúng ta có 1 singleton class, giữ 1 closure someSingletonMethod, chạy sau khi thực thi closure, method này sẽ kết thúc và closure sẽ giải phóng bộ nhớ khi mà biến local nó nắm giữ tham chiếu mạnh bị xóa:
SingletonClass.shared.someSingletonMethod(self.a) { (value) in
self.execute()
}
Chúng ta có 1 singleton class giữ 1 hàm closure someSingletonMemoryLeakMethod, và hàm này tham chiếu mạnh tới 1 biến trong lớp này, và sau khi closure thực thi, nó sẽ. không được giải phóng vì lớp Singleton luôn nằm trong bộ nhớ và closure tạo ra 1 leak memory. Trong trường hợp này tạo ra memory leak:
Memory Leak = SingletonClass → Closure → Self
Khi Singleton Class vẫn trong bộ nhớ, self(ViewController) vẫn nằm trong bộ nhớ.
Khi pop controller này ra thì nó vẫn giữ tham chiếu mạnh được giữ trong Singleton class:
SingletonClass.shared.someSingletonMemoryLeakMethod(self.a) { (value) in
self.execute()
}
Xin chào các bạn, như các bạn đã biết Instagram là phương tiện tuyệt vời để chia sẻ hình ảnh trực tuyến. Nó cung cấp những bộ lọc tuyệt vời và các công cụ để “Retouch” hình ảnh. Hôm nay mình xin chia sẻ 10 tài khoản Instagram nổi tiếng về design, các bạn có thể theo dõi để có cảm hứng cũng như lấy ý tưởng thiết kế.
Trên đây là 10 tài khoản Instagram về lĩnh vực design, mỗi người 1 phong cách đẹp và lạ, hy vọng bài viết này sẽ giúp các bạn có cảm hứng và có ý tưởng thiết kế. Một số tài khoản phía dưới mình không ghi thông tin, các bạn có thể tự tìm hiểu. Nếu biết những tài khoản instagram thú vị các bạn có thể chia sẽ bên dưới!.
Bài viết được sự cho phép của BQT Kinh nghiệm lập trình
Hi mọi người, mình trở lại rồi đây. Hôm nay mình chia sẻ 1 trick siêu siêu nhỏ nhưng lại vô cùng hữu ích nhất là khi chúng ta chẳng may gặp phải tình huống này nhé. Chả là đôi khi chúng ta cần fix 1 cái gì đó, install thêm cái nọ cái kia mà sau khi hỏi bác Gu Gồ, anh em đồng đảng bảo cần bật SQL SERVER INSTALLATION CENTER lên rồi làm abc, xyz… Nhưng ô hay, bật nó lên ở đâu nhỉ????
Sau khi mày mò đủ kiểu và tìm đủ mọi nơi, cuối cùng cũng tìm được chỗ ẩn náu của nó anh em ạ. Mọi người chỉ cần truy cập đường dẫn bên dưới và khởi chạy SQL SERVER INSTALLATION CENTER thủ công nhé.
Để hỗ trợ tính năng Theme, cho phép người dùng lựa chọn kiểu giao diện mà họ thích, trong React, bạn sẽ có thể tiếp cận 1 trong 2 cách dùng CSS-in-JS hoặc dùng CSS variable (tất nhiên không có hỗ trợ với IE)
Nếu dùng CSS-in-JS bạn sẽ có thể làm được nhiều thứ hơn, bạn có một bộ công cụ đủ các đạo cụ để mua mai trong JS. Bài viết này sẽ chỉ ra tại sao bạn nên dùng CSS variable cho nhu cầu làm theme
Nếu dùng CSS-in-JS, trong React bạn sẽ tổ chức một ThemeProvider bằng React Context, dùng hook useTheme để lấy giá trị trong ThemeProvider, sẽ như thế này
import*asReactfrom'react'import styled from'@emotion/styled'import{ThemeProvider}from'emotion-theming'const themes ={
light:{
colors:{
primary:'deeppink',
background:'white',},},
dark:{
colors:{
primary:'lightpink',
background:'black',},},}constPrimaryText= styled.div(({theme})=>({
padding:20,
color: theme.colors.primary,
backgroundColor: theme.colors.background,}))functionThemeToggler({theme, onClick}){const nextTheme = theme ==='light'?'dark':'light'return(<button onClick={()=>onClick(nextTheme)}>
Change to {nextTheme} mode
</button>)}functionApp(){const[theme, setTheme]=React.useState('light')return(<ThemeProvidertheme={themes[theme]}><PrimaryText>This text is the primary color</PrimaryText><ThemeTogglertheme={theme}onClick={(nextTheme)=>setTheme(nextTheme)}/></ThemeProvider>)}exportdefaultApp
Nếu dùng CSS variable, chúng ta khai bao một bộ các biến cần dùng, rồi chèn thêm data-theme cho thẻ body
Phần implement của React component lúc này sửa lại
import*asReactfrom'react'import'./css-vars.css'import styled from'@emotion/styled'constPrimaryText= styled.div({
padding:20,
color:'var(--colors-primary)',
backgroundColor:'var(--colors-background)',})functionThemeToggler(){const[theme, setTheme]=React.useState('light')const nextTheme = theme ==='light'?'dark':'light'React.useEffect(()=>{document.body.dataset.theme= theme
},[theme])return(<button onClick={()=>setTheme(nextTheme)}>
Change to {nextTheme} mode
</button>)}functionApp(){return(<div><PrimaryText>This text is the primary color</PrimaryText><ThemeToggler/></div>)}exportdefaultApp
Thẳng thắn mà nói, cả 2 cách làm này đều cho kết quả như nhau về mặt trãi nghiệm sử dụng, dùng CSS-in-JS sẽ có chút cảm giác hơi quá đà kỹ thuật, từ chuyên ngành là over-engineering.
Về hiệu năng thì sao?
ThemeProvider
CSS variable
Cũng không nhất thiết phải nhìn vào con số mili giây phải tốn cho việc render, vì simple này khá là bé. Bạn cứ hình dùng nếu một cây React Component với hàng trăm component con lồng ghép nhau, khi thay đổi giá trị trong ThemeProvider, tất cả những component đều bị render lại thì sẽ như thế nào? Việc dùng CSS variable sẽ mang lại hiệu quả hơn nhiều vì trình duyệt không phải làm quá nhiều thứ như cách 1.
Có một lý do mà mình cho là hơi ngụy biện khi khăng khăng đòi dùng JS-in-CSS theo mình đoán là các bạn thật sự chưa đủ tự tin cũng như “trình” để viết CSS hiện đại, bạn chuyên tâm nâng tầm JS của mình mà quên mất việc nâng tầm CSS, vón đã phát triển rất xa từ cái thời bạn dùng float
Làm thế nào để tuyển được những nhân tài DevOps phù hợp nhất?
Khác với suy nghĩ của nhiều người về công việc của DevOps, đây là vị trí không hoàn toàn giống như là một người vận hành. Khi tuyển dụng DevOps, nhà tuyển dụng đương nhiên cũng hiểu được các kỹ sư DevOps sẽ không giống như một nhà phát triển phần mềm hoặc một kỹ sư QA. Thay vào đó, các chuyên gia DevOps là sự kết hợp của ba mức độ trong hoạt động để giải quyết các thách thức về quy trình làm việc và hiệu quả chất lượng trong một nhóm kỹ thuật.
Về vị trí DevOps
Các chuyên gia DevOps giúp quản lý và tối ưu hóa kết quả đầu ra của nhóm phát triển, từ việc hợp tác hóa hợp lý, đến thực hiện QA, tự động hóa các quy trình quan trọng,… Nói cách khác: chúng giúp các nhóm phát triển vận hành công việc có mức yêu cầu chất lượng cao một cách nhất quán và nhanh chóng hơn.
DevOps là gì?
Các chuyên gia DevOps hay còn được biết đến với những cái tên như là Kiến trúc sư DevOps, Kỹ sư DevOps, Kỹ sư cơ sở hạ tầng hoặc thậm chí là Kỹ sư vận hành. Tên gọi như thế nào tùy thuộc vào người bạn yêu cầu đến từ một nhóm các nhà phát triển đa dạng có cả nền tảng phần mềm và hệ thống. Họ sẽ chịu trách nhiệm cho những công việc nào, đó cũng là cách để quyết định xem bạn nên gọi họ bằng cái tên nào. Theo nghĩa đó, việc tuyển dụng một DevOps phù hợp sẽ phụ thuộc vào nhu cầu của công ty, cấu trúc của nhóm cũng như các dự án mà họ đang làm việc.
Không có cái gọi là một tiêu chuẩn phù hợp với tất cả cho vị trí này và không phải tất cả các điểm dưới đây đều có thể áp dụng cho tất cả các vị trí DevOps. Những đặc điểm được đưa ra ở đây sẽ giúp ích phần nào đó cho công việc tuyển dụng một DevOps. Bạn nên trao đổi với người quản lý công việc tuyển dụng để họ có thể đưa ra các tiêu chuẩn ưu tiên nên có ở một ứng viên mà thôi.
Nếu đang tìm kiếm các Mid-level DevOps, bạn nên lưu tâm đến các đặc điểm sau!
Chuyên môn
Có kinh nghiệm trong lĩnh vực kỹ thuật công nghệ liên quan (ví dụ: phát triển phần mềm, kỹ thuật mạng hoặc vận hành).
Theo dõi hồ sơ về việc duy trì giám sát hệ thống thường xuyên và báo cáo cho cấp trên.
Nắm chắc các phương pháp vận hành tốt nhất trong quá trình phát triển phần mềm (liên quan đến bảo mật, sao chép và dự phòng dữ liệu, mở rộng quy mô,…).
Sẵn sàng học hỏi các công nghệ mới một cách nhanh chóng.
Áp dụng thái độ “làm việc thông minh hơn, không chăm chỉ hơn” trong công việc, tập trung vào việc tối đa hóa hiệu quả.
Vậy đâu là giải pháp tốt nhất để tìm kiếm một DevOps phù hợp?
Một DevOps đôi khi phải đảm nhận nhiều nhiệm vụ khác nhau cho cùng một công việc và có thể đến từ một nhóm nền tảng có tính chuyên nghiệp cao. Do đó, việc ứng viên phải có khả năng đồng bộ hóa – thích ứng với nhu cầu của nhóm là điều bắt buộc.
Và cách tốt nhất để bạn đánh giá một ứng viên có phù hợp hay không là hãy kiểm tra họ qua các tiêu chuẩn đã được đưa ra như trên. Bên cạnh đó, có thể cân nhắc thêm với tình hình công việc hiện tại của công ty bạn để đưa ra các yêu cầu tuyển dụng phù hợp nhất.
Với đời sống phát triển và phụ thuộc vào công nghệ như hiện nay, hàng ngày ta truy cập vào internet mà đã quên đi tính an toàn khi sử dụng. Proxy ra đời để đảm bảo quá trình truy cập mạng diễn ra mượt mà và bảo mật. Cùng TopDev tìm hiểu Proxy là gì, các tính chất cũng như cách sử dụng Proxy như thế nào.
Proxy là gì?
Proxy (còn được gọi là Proxy server) là máy chủ trung gian, đóng vai trò như một cổng kết nối giữa người dùng và internet. Proxy có chức năng tương tự như một bức tường lửa (firewall) hay một bộ lọc truy cập trang web, đảm bảo các kết nối được an toàn khi sử dụng.
Cách hoạt động của Proxy
Khi một người dùng gửi yêu cầu truy cập tài nguyên từ một trang web, yêu cầu đó sẽ được gửi đến máy chủ proxy trước, thay vì trực tiếp đến trang web đích. Sau đó, máy chủ proxy sẽ gửi yêu cầu đến trang web, nhận phản hồi và chuyển đáp án về cho người dùng. Như hình minh họa dưới đây:
Phân loại Proxy Server chính
Proxy có thể được phân loại theo nhiều tiêu chí khác nhau. Dưới đây là một số phân loại phổ biến
Phân loại Proxy theo loại kết nối
Forward proxy
Forward Proxy đại diện cho các máy clients. Nó đại diện cho clients gửi request tới các webserver, sau đó nó nhận dữ liệu mà các target site trả về và chuyển tới clients nếu hợp lệ.
Chúng ta xem xét ví dụ sau:
Chúng ta có 3 máy tính: X, Y, Z.
X: là clients
Y: proxy server
Z: target site
Bình thường, sẽ có kết nối trực tiếp từ X –> Z. Trong thực tế, tốt hơn nên để kết nối có dạng Y –> Z, ở đây Y đại diện cho X. Kết nối đầy đủ sẽ là X –> Y –> Z. Trong trường hợp này, Z có thể biết hoặc không biết X là ai tùy vào loại proxy của Y.
Forward Proxy chia thành 2 loại
Anonymous proxy: sẽ che giấu thông tin của các requester bằng cách ẩn IP trước khi gửi request tới target server. Tuy nhiên, địa chỉ IP của các proxy này thường có trong backlist công khai vì vậy khi dùng anonymous proxy bạn sẽ bị giới hạn một số chức năng (bản chất là bị một số target site nó block).
High Anonymity Proxy (Elite Proxy): nó có chức năng của anonymous proxy nhưng ẩn danh còn tốt hơn cả anonymous proxy. Bản thân anonymous proxy bị ảnh hưởng nhiều bởi blacklist, còn high anonymous proxy thậm chí không xuất hiện trong blacklist này. Nó có cơ chế che giấu thông tin định danh của chính mình, nghĩa là nó không cho ai biết mình là một proxy.
Transparent proxy: public thông tin của các requester với target site trong khi truy cập tới chúng.
Distorting Proxy: là loại proxy sẽ thay đổi IP gốc của các requester khi đẩy request tới target server.
Tại sao chúng ta phải dùng Forward Proxy
Admin của X không muốn X truy cập tới những trang web gây hại cho tổ chức của họ.
Các công ty sẽ muốn chặn trang familypostcards2008.com vì ở đó có virus
Ví dụ khác, một số công ty sẽ chặn facebook.com để nhân viên yên tâm công tác =))
Trường cấp 1 thì chặn playboy.com :”>
Chính phủ thì chặn các trang mạng chứa thông tin không hay về họ
Admin của Z muốn block X
Admin của Z nhận ra X có giấu hiệu hacking, vì vậy anh ta đã block địa chỉ IP của X.
Z là một forum website, X là một spammer thì Z cũng block X.
Reverse proxy
Chúng ta xem xét ví dụ sau:
Chúng ta có 3 máy tính: X, Y, Z.
X: là clients
Y: proxy server
Z: target site
Bình thường, kết nối sẽ là X –> Z. Trong thực tế, admin của Z không cho phép những truy cập trực tiếp tới Z mà phải thông qua Y trước. Trong góc nhìn của X, kết nối sẽ là X –> Y nhưng thực tế là X –> Y –> Z bởi vì X không thể nhìn thấy Z. Y ở đây đóng vai trò che giấu thông tin của các target server.
Tại sao chúng ta phải dùng Reverse Proxy?
Z muốn tất cả request tới mình phải thông qua Y trước
Z muốn dùng Y để cân bằng tải, đưa request tới target server đang rảnh hơn những cái khác.
Z muốn tối ưu thời gian phản hồi của mình thông qua Y, Y sẽ chuyển request tới CDN gần với X nhất.
Tạo cơ chế cache để giảm thời gian phản hồi các request.
Thực hiện những authentication tasks. Z lo lắng về những dữ liệu mình đang chứa và không cho phép các truy cập trực tiếp. Thông qua Y, Z có thể block những request gây hại cho mình và cho phép những request hợp lệ đi qua.
Phân loại Proxy theo mức độ ẩn danh
Có 4 loại proxy chính phân biệt theo mức độ ẩn danh, bao gồm:
Transparent Proxy (Proxy trong suốt)
Transparent Proxy không ẩn địa chỉ IP thực của người dùng, thường được sử dụng trong các mạng nội bộ.
Ví dụ: Proxy được sử dụng trong các công ty, trường học để kiểm soát và giám sát truy cập internet của nhân viên/học sinh.
Anonymous Proxy (Proxy ẩn danh)
Anonymous Proxy sẽ giấu địa chỉ IP thực của người dùng, nhưng vẫn có thể bị phát hiện bởi một số trang web thông qua các kỹ thuật phát hiện proxy.
Ví dụ: Các proxy như HideMyAss, Kproxy, Proxysite.com, … Người dùng có thể truy cập internet mà không bị lộ địa chỉ IP thực, nhưng vẫn có thể bị một số trang web phát hiện ra đang sử dụng proxy.
Distorting proxy (Proxy mạo danh)
Proxy mạo danh thực hiện chức năng giống với máy chủ ẩn danh nhưng bằng cách gửi sai địa chỉ IP cho máy chủ web, nghĩa là ta sẽ truy cập web với một địa chỉ IP mạo danh mà không bị phát hiện.
High Anonymity Proxy (Proxy Ẩn Danh Cao)
High Anonymity Proxy sẽ thay đổi địa chỉ IP liên tục giúp địa chỉ IP của người dùng hoàn toàn được bảo mật, rất khó để phát hiện ra người dùng đang sử dụng proxy.
Ví dụ: Các proxy như Tor, I2P, Freenet, … Đây là những proxy có khả năng ẩn danh rất cao, cung cấp lớp bảo vệ bổ sung để che giấu thông tin về địa chỉ IP và định danh của người dùng.
Tính năng của máy chủ Proxy
Firewall và Filtering
Proxy Server hoạt động tại Tầng thứ 7 của mô hình OSI – Application layer, nó có khả năng lọc ứng dụng một cách độc lập. Khi được thiết lập chính xác, Proxy có thể nâng cao đáng kể tính an toàn, chặn truy cập vào các trang web hoặc nội dung không phù hợp, dựa trên các tiêu chí như địa chỉ IP, tên miền, giao thức,… So với các hệ thống tường lửa truyền thống Proxy mang lại những chức năng vượt trội hơn mà chúng không thể nào có được.
Chia sẻ kết nối Internet
Proxy Server là giải pháp chia sẻ truy cập Internet hiệu quả, bằng cách cho phép nhiều người dùng cùng chia sẻ một kết nối internet, giúp tiết kiệm băng thông và chi phí.
Khi nhiều người truy cập cùng một trang web, proxy server có thể lưu trữ bản sao trang web trong bộ nhớ cache, tăng tốc độ truy cập sau này.
Proxy và Caching
Proxy server có thể lưu trữ bản sao (cache) của các trang web, tệp tin mà người dùng truy cập.
Khi người dùng truy cập lại các nội dung đã được lưu trong cache, proxy server sẽ cung cấp nội dung từ cache thay vì tải lại từ nguồn gốc, giúp tăng tốc độ truy cập.
Caching giúp giảm tải lên máy chủ gốc, tiết kiệm băng thông và cải thiện hiệu suất.
Ngoài những tính năng trên, proxy server còn có thể được sử dụng để ẩn danh tính, kiểm soát truy cập, ghi nhật ký hoạt động và nhiều tính năng khác tùy thuộc cấu hình.
Lợi ích của Proxy Server
Bảo mật và ẩn danh: Proxy có khả năng ẩn danh địa chỉ IP thực của người dùng, giúp bảo vệ thông tin cá nhân và giảm rủi ro bị theo dõi.
Đảm bảo quyền riêng tư khi lướt web: Sử dụng các Proxy khác nhau giúp bạn tránh bị ngập trong quảng cáo không mong muốn hoặc bị thu thập dữ liệu theo địa chỉ IP. Với một proxy, việc duyệt web của bạn sẽ được bảo vệ tốt và không thể bị theo dõi.
Kiểm soát truy cập: Doanh nghiệp có thể sử dụng proxy để kiểm soát truy cập Internet của nhân viên, chặn các trang web không phù hợp và giám sát hoạt động trực tuyến.
Caching và tăng tốc độ: Proxy server có khả năng lưu trữ các nội dung truy cập thường xuyên (caching), giúp tăng tốc độ truy cập và giảm tải băng thông.
Truy cập nội dung bị chặn ở một số khu vực: Proxy có thể cho phép người dùng truy cập vào các dịch vụ hoặc nội dung bị hạn chế theo khu vực địa lý bằng cách thay đổi địa chỉ IP.
Quản lý và giám sát: Proxy giúp ghi lại các hoạt động trực tuyến và phát hiện các hành vi đáng ngờ, hỗ trợ trong việc bảo trì và bảo mật hệ thống. Hơn thế nữa, proxy có thể chặn truy cập vào các trang web thường gây phân tâm cho nhân viên như Facebook, Instagram,…
Rủi ro khi dùng Proxy Server
Rủi ro bảo mật: Nếu proxy không được cấu hình đúng cách hoặc không đáng tin cậy, dữ liệu của người dùng có thể bị rò rỉ hoặc bị xem lén.
Tốc độ kết nối: Sử dụng proxy có thể làm giảm tốc độ kết nối Internet, đặc biệt nếu máy chủ proxy đang bị quá tải.
Pháp lý và đạo đức: Việc sử dụng proxy để truy cập nội dung bị hạn chế có thể vi phạm chính sách của một số dịch vụ hoặc luật pháp địa phương.
Rủi ro từ Proxy miễn phí: Không phải tất cả các proxy đều đáng tin cậy. Nhiều dịch vụ proxy miễn phí không đảm bảo về bảo mật và có thể thu thập thông tin cá nhân của người dùng để bán cho bên thứ ba.
Phụ thuộc vào Proxy Server: Người dùng có thể gặp sự cố không thể truy cập dịch vụ mạng hoặc các tài nguyên mạng nếu Proxy xảy ra vấn đề.
Hướng dẫn cách cài đặt Proxy cho trình duyệt Chrome
Bước 1: Thao tác trên Chrome
Mở Chrome và click vào biểu tượng dấu ba chấm
Vào Setting
Chọn System
Chọn mục Open your computer’s proxy settings
Bước 2: Thay đổi Proxy
Sau bước 1, cửa sổ cài đặt của hệ thống sẽ hiện ra, thao tác lần lượt như sau (trên Windows 11):
Tại mục Manual proxy setup, ở thẻ Use a proxy server bấm Set up
Bật ON và nhập địa chỉ proxy vào ô Proxy IP address sau đó Save.
Trên đây là bài viết tổng quan của mình về Proxy và các loại Proxy. Bên cạnh đó TopDev cũng đã hướng dẫn cách set up Proxy trên Chrome. Chúc bạn thành công!