Home Blog Page 104

Selenium testing – Một vài kiểu có thể áp dụng

Selenium testing – Một vài kiểu có thể áp dụng

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Selenium testing gồm những kiểu test nào?. Selenium có thể hỗ trợ được gì trong các loại test đó?. Tất cả sẽ có trong bài viết dưới đây.

Mà khoan, nếu chưa có cái nhìn tổng quan về Selenium thì đọc bài viết “Selenium là gì?” trước đã nha. Biết sơ qua rồi hẵng quay lại đọc bài này thì sẽ tốt hơn.

1. Acceptance testing – Kiểm thử chấp nhận

Gọi là kiểm thử chấp nhận vì đây là phần testing kiểm tra xem có đáp ứng được những gì khách hàng yêu cầu hay không?. Nếu release bản này thì khách hàng chấp nhận hay không?.

Ra đi làm tất nhiên mới biết, việc đáp ứng nhu cầu khách hàng nữ. Ý lộn “đáp ứng requirements” của khách hàng là yếu tố tiên quyết.

Tại sao?. Khách hàng trả tiền, khách hàng dùng sản phẩm.

Acceptance testing trong Selenium testing chỉ nhằm mục đích trả lời cho câu hỏi:

Are we building the right product?.

Chúng ta có đang tạo ra sản phẩm như khách hàng yêu cầu hay không?

Selenium Testing có thể giúp đỡ việc kiểm thử này như thế nào?

  • Viết automation tescase test các function nhỏ trên từng page
  • Viết automation testcase test flow của product
  • Viết testcase cho logic (nếu có).

Lưu ý là Acceptance testing cũng chỉ là một kiểu của Functional testing thôi nha. Giờ mới tới cái lớn nè.

2. Functional testing – Kiểm thử tính năng

It checks the system at different levels to ensure that all scenarios are covered and that the system does what’s supposed to do.

Kiểu kiểm thử này nhằm kiểm tra hệ thống ở nhiều cấp độ, đảm bảo tất cả các kịch bản (scenarios) được kiểm tra và hệ thống không gặp bất cứ lỗi nào.

Functional testing là một step quan trọng cần có. Selenium testing hỗ trợ tốt kiểm thử này bằng cách:

  • Vì là automation test nên có thể lặp đi lặp lại các thao tác nhiều lần.
  • Ngoài các thao tác bình thường của người sử dụng, automation còn giúp thực hiện các case nằm ngoài thao tác bình thường (click cùng lúc 2 button, click button trong lúc xử lý loading.
  • Đặc biệt mạnh mẽ khi kiểm thử luồng di chuyển (giữa các màn hình)

Cũng trả lời cho câu hỏi:

Are we building the product right?.

Chúng ta đang tạo ra sản phẩm đúng, chứ không sai phải không?

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  Hướng dẫn và mô phỏng thuật toán sắp xếp Selection Sort

3. Performance testing – Kiểm thử hiệu năng

Performance testing giúp kiểm thử sản phẩm trong các trường hợp đặc biệt yêu cầu performance. Đối với các production có người dùng lớn, Selenium testing tỏ ra hiệu quả khi thực hiện testcase nhiều lần, cùng lúc. Mô tả kịch bản số lượng người dùng lớn.

As its name indicates, performance tests are done to measure how well an application is performing.

Giống như cái tên, performance test kiểm tra, đo lường đọ hiệu quả một sản phẩm.

Nếu table có 100 dòng thì việc xử lý click chọn hay select all như thế nào?. Nếu có hơn 1000000 dòng thi sao?. Với tốc dộ 4G LTE tiêu chuẩn thì page load tốt, nhưng nếu với 3G low thì sao?

Kiểm thử hiệu năng chia thành hai loại chính sau đây:

3.1 Load testing

Load testing is done to verify how well the application works under different defined loads (usually a particular number of users connected at once).

Kiểm tra độ tải của sản phẩm. Có hoạt động tốt như thế nào dưới các tải được xác định khác nhau (thường là một số lượng người dùng cụ thể được kết nối cùng một lúc).

3.2 Stress testing

Không biết nên dịch title là gì nên để yên vậy

Stress testing is done to verify how well the application works under stress (or above the maximum supported load).

Stress testing kiểm tra phần mềm hoạt động như thế nào dưới các áp lực. Tốc độ mạng, độ cũ của trình duyệt

Selenium có hỗ trợ kiết test này bằng cách thiết lập tốc độ mạng hoặc sử dụng các driver cũ hơn (Internet Explorer 9, Internet Explorer 11).

4. Tham khảo thêm về Selenium testing

Cảm ơn vì đã đọc bài, nếu thấy hay hãy chia sẻ bài đọc nha. Happy coding!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Tuyển tester các tỉnh thành hấp dẫn trên TopDev

1001 câu hỏi của học sinh cuối cấp muốn theo đuổi ngành công nghệ thông tin

1001 câu hỏi của học sinh cuối cấp muốn theo đuổi ngành công nghệ thông tin

Bài viết được sự cho phép của smartjob.vn

1001 câu hỏi của học sinh cuối cấp muốn theo đuổi ngành công nghệ thông tin

Vậy là những ngày hè oi ả đã đến, chỉ còn hơn 1 tháng nữa là học sinh trên mọi miền đất nước sẽ bước vào Kỳ thi Trung học phổ thông quốc gia đầy cam go và thách thức. Đại học là cánh cửa mà rất nhiều thí sinh sẽ phải bước qua để có bằng cấp, để vươn đến những chân trời mới. Hiện nay, Smartjob đã nhận được khá nhiều câu hỏi của các bạn học sinh đang thực sự lo lắng về tương lai của mình. Chúng tôi sẽ giải đáp tất cả mọi thắc mắc của các em để giúp các em được định hướng tốt hơn, có cái nhìn sâu sắc hơn về thực trạng của các trường IT mà các em có ý định theo đuổi.

  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  10 thói quen của một lập trình viên thành công
  1. Em yêu thích công nghệ thông tin, nhưng em thấy mình không đủ năng lực thi vào các trường lớn. Vậy em nên nộp đơn vào trường nào? Em có ý định học ở Hà Nội.

Trả lời: Em nên nhớ là học sinh sẽ được nộp đơn sau khi tham dự Kỳ thi trung học phổ thông Quốc gia. Em vẫn còn rất nhiều lựa chọn và vẫn có thể tự quyết khi biết điểm của mình. Một số lựa chọn em cần lưu tâm là Đại học Công nghiệp, ĐH Nông nghiệp, ĐH Kinh doanh và Công nghệ, ĐH Quốc tế Bắc Hà, ĐH Điện Lực, ĐH Tài nguyên và môi trường, ĐH Phương Đông,… Bên cạnh đó còn Bách Khoa Aptech, Arena (chủ yếu về thiết kế đồ họa). Học ở trường top dưới e sẽ cần phải nỗ lực hơn và cơ hội để e phát triển vẫn còn rất nhiều.

  1. Học CNTT có cần giỏi tin và toán không? Em học không tốt 2 môn này nhưng rất thích tìm tòi các thứ về máy tính, web hay game.

Trả lời: Không có 1 tiêu chuẩn nào cho 1 người là dân IT hết tuy nhiên em cần biết học IT có rất nhiều thuật toán, có những kiến thức khá trừu tượng đòi hỏi em phải có tư duy tốt. Tư duy logic và cái nhìn bao quát là hai yếu tố quan trọng quyết định việc em có thành công với ngành nghề này hay không. Mà em có tìm hiểu nhiều về máy tính nên có thể thấy em chỉ không giỏi các thuật toán còn các vấn đề về máy tính hẳn em cũng thông thạo. Có rất nhiều công việc mà em ít phải dùng đến các thuật toán như: Thiết kế web, Thiết kế đồ họa, Kỹ sư mạng, Thương mại điện tử,… Đó là những ngành học mà em hoàn toàn có thể theo đuổi.

Hướng dẫn cài đặt OpenSSL trên Windows 10

  1. Học CNTT có vất lắm không, em thấy các anh chị kêu lắm.

Trả lời: Học CNTT vất với những người lười, không có đam mêm. Học CNTT không vất với những ai thực sự yêu thích và đam mê với nó. Nếu em xác định theo đuổi ngành này, hãy xác định rằng sẽ phải hi sinh nhiều cho nó, dành nhiều thời gian cho nó thì em mới có thể thành công. Nhưng mà thực sự rất vất đấy =)). Kỹ thuật, y, dược không nhàn được đâu em.

  1. Học Công nghệ thông tin Đại học Công nghệ lớp chất lượng cao thế nào anh?

Trả lời: Anh không học những lớp đó và cũng không học trường đó nhưng cũng có bạn bên đấy. Thực sự thì học những trường thuộc Đại học Quốc Gia sinh viên được thầy cô quan tâm nhiều lắm. Em có thể hỏi bất cứ vấn đề gì qua mail, thầy cô luôn sẵn sàng trả lời. Học lớp Chất lượng cao thì em còn được quan tâm hơn nữa, kiến thức luôn đầy đủ, bạn bè tốt, thầy cô nhiệt tình, học bổng thì nhiều nữa. Bên cạnh đó tiếng Anh cũng được chăm chút, các em sẽ đạt 6.0 IELTS trong năm đầu tiên và sẽ chẳng phải lo đầu ra bởi các Tập đoàn lớn luôn săn đón sinh viên năm cuối tại ngôi trường này. Hiện tại đang là thời kỳ vàng của CNTT Việt Nam nên các em cần cố gắng nếu muốn theo học tại đây. Điểm đầu vào sẽ hơi cao chút nhưng anh tin đây là nơi lý tưởng các em có thể đặt nền móng cho tương lai của mình.

  1. Anh thấy học Bách Khoa thế nào, em nghe nói học cũng bình thường mà bị đuổi nhiều lắm. Thực sự em cũng sợ sợ nếu đăng ký vào đó, sợ mình không theo nổi.

Trả lời: Câu hỏi của em anh sẽ trả lời cho cả Đại học Bách Khoa Hà Nội và Bách Khoa Tp. Hồ Chí Minh bởi anh thấy môi trường ở đó tương tự như nhau. Đại học Bách Khoa luôn là 1 trong top 10 trường về Công nghệ thông tin hàng đầu Việt Nam, là cái nôi của rất nhiều nhân tài. Tuy nhiên có một rào cản là ở đó rất nặng về kiến thức hàn lâm, sẽ thực sự nhạt nhẽo và vô bổ nếu em không phải người kiên nhẫn, chăm chỉ. Nếu muốn học ở đó em phải cố gắng rất nhiều để theo kịp chương trình, cân đối giữa học tập và sinh hoạt hàng ngày. Khổ mỗi cái là Bách Khoa toàn đực rựa, lại toàn ông bẩn bựa với nhau, muốn kiếm gái phải sang trường khác, nhất là Kinh tế gần đó chứ sang Xây dựng thì thôi rồi Lượm ơi.

  1. Anh thấy học FPT thế nào?

Trả lời: Ồ câu hỏi của em đơn giản quá, chả biết thế nào là thế nào =)). FPT thì học ở ngoại thành Hà Nội, nói chung trường rất đẹp và đầy đủ tiện nghi. Trong số các trường về CNTT thì FPT là hàng chuẩn đó em. Sinh viên FPT luôn được đánh giá cao bởi ngay khi thi đầu vào đã toàn test IQ các kiểu rồi tư duy cũng rất tốt, được đào tạo bài bản. Không chỉ thế, nếu theo học FPT em sẽ được học các môn năng khiếu như Võ, Trượt Patin, các môn thể dục khác,… Ngoài ra, các hoạt động ngoại khóa cũng khá sôi nổi, không lo buồn chán (trừ khi em tự kỷ chỉ ở nhà học). Về đầu ra thì sinh viên FPT luôn được các Tập đoàn lớn săn đón, nếu không cũng được làm cho FPT luôn. Ớn mỗi cái học phí khá chát. Nếu nhà nào không có điều kiện, sinh viên sẽ phải đi làm thêm để có tiền đóng học và theo học. Đó là tư vấn của riêng cá nhân anh sau khi được sự góp ý của một số tiền bối bên FPT. Còn tình hình thực tế sẽ thay đổi theo từng năm và chỉ sinh viên ở đó mới nắm bắt được.

Tạm thời loạt bài sẽ dừng lại ở câu hỏi thứ 6 bởi mình thấy cũng khá dài rồi. Từ giờ đến đợt Tuyển sinh  Đại học, mình và đội ngũ Smartjob sẽ tiếp tục giải đáp những thắc mắc của các em để các em có được sự chuẩn bị tốt nhất cho bước ngoặt của cuộc đời mình. Cảm ơn các bạn đã chú ý đón đọc.

Bình Phạm

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm IT Jobs for Developer hấp dẫn trên TopDev

Làm thế nào để trở thành một Technical Writer chuyên nghiệp? (Phần 1)

technical writer
Làm thế nào để trở thành một Technical Writer? (Phần 1)

Tác giả: Edidiong Asikpo

Trở thành một Technical Writer không chỉ giúp bạn chia sẻ thêm những kiến thức mình biết đến với mọi người mà còn là một cách để tự trau dồi và củng cố những gì mình đã biết!

Technical Writer là gì?

Nói một cách dễ hiểu nhất, technical writer là một cách viết bài trong đó bao gồm những lời giải thích và hướng dẫn đơn giản, dễ hiểu về một chủ đề cụ thể nào đó trong lĩnh vực kỹ thuật, công nghệ.

technical writer
Một technical writer cần những gì?

Technical Writer cần có những kỹ năng gì?

Biết cách triển khai và giải quyết vấn đề

Có vẻ đây sẽ là một khó khăn đối với những người trước nay chỉ biết đến việc coding. Technical writing là quá trình cụ thể hơn, chuyên môn hơn so với việc viết về những vấn đề mang tính chung chung. Mỗi bài viết được chia sẻ về vấn đề kỹ thuật cần truyền đạt được ý tưởng, quan điểm, hướng dẫn và đề xuất những giải pháp hợp lý về mặt kỹ thuật.

Kỹ năng đầu tiên và quan trọng nhất mà mọi technical writer cần có là khả năng truyền đạt và chia sẻ một cách trơn tru bằng ngôn ngữ chính của mình. Bạn nên nắm rõ về các vấn đề ngữ pháp câu, chính tả, diễn đạt để không tạo cảm giác khó hiểu cho người đọc.

Xác định đối tượng độc giả

Xác định, hiểu và điều chỉnh nội dung bài viết của bạn cho một đối tượng cụ thể sẽ làm cho các bài báo hoặc tài liệu của bạn trở nên nổi bật. Đó là lý do tại sao bạn cần biết chính xác đối tượng độc giả của mình là ai.

Khi hiểu rõ nhu cầu của người đọc, bạn sẽ có thể điều chỉnh bài viết của mình để đáp ứng nhu cầu của họ và tự động truyền thông điệp một cách hiệu quả nhất.

  10 bí kíp để startup và FinTech startup thành công đột phá
  Con đường để bạn trở thành tech lead

Đặt tên tiêu đề bài viết phù hợp

Tên bài viết nên mang tính mô tả về nội dung bạn định chia sẻ để tăng tính hiệu quả. Chẳng hạn bạn đừng đặt tên bài viết là “Tìm hiểu sâu về React” (khi nội dung nói về các yếu tố kết xuất trong React) vì có thể làm thất vọng những độc giả đang mong đợi tìm hiểu mọi thứ về React sau khi đọc bài viết của bạn. Thay vào đó, hãy đưa ra một tiêu đề cụ thể mô tả chính xác những gì bạn đã viết trong bài viết của mình như “Cách kết xuất các phần tử trong React”.

Phát triển kỹ năng kỹ thuật của chính bạn

Là một người chuyên viết về các vấn đề kỹ thuật, mục tiêu của bạn sẽ là giúp người đọc hiểu các quy trình hoặc khái niệm phức tạp một cách dễ hiểu.

Để đạt được điều này, bạn cần phải làm quen với chủ đề mà bạn đang viết. Điều đó đồng nghĩa với việc nếu bạn muốn viết một bài báo hoặc tài liệu kỹ thuật về React.js, bạn phải có khả năng sử dụng React cá nhân.

Technical writer đương nhiên cũng không thể biết tất cả mọi thứ. Vì vậy, mặc dù bạn có thể quen thuộc với một công nghệ, đôi khi bạn sẽ phải nghiên cứu một ngôn ngữ hoặc khuôn khổ để hiểu nó tốt hơn trước khi bắt đầu viết về nó.

Điều này sẽ đảm bảo rằng bài viết của bạn là chính xác và truyền đạt dữ liệu cần thiết một cách hiệu quả nhất. Bạn chắc chắn không muốn chia sẻ thông tin sai lệch hoặc gây nhầm lẫn.

Xây dựng cách hành văn mang dấu ấn cá nhân

Bạn đã bao giờ tự hỏi tại sao mọi người lại thả những bình luận như “wow, cuối cùng tôi đã hiểu khái niệm này nhờ bài viết của bạn” hoặc “Tôi đã đọc các bài báo khác nhưng tôi không hiểu khái niệm này cho đến khi tôi đọc của bạn, cảm ơn bạn!” trong phần bình luận của các bài viết chưa?

Câu trả lời chính là vì giọng văn độc đáo của tác giả, cách diễn đạt của họ khác biệt với những người khác. Điều đó có nghĩa là gì? Nó có nghĩa là tất cả mọi người là duy nhất.

Vì vậy, nếu hai lập trình viên cùng viết về một chủ đề, một số độc giả sẽ hiểu một trong những bài viết của họ nhiều hơn họ hiểu bài kia. Trong khi những người khác sẽ hiểu bài viết thứ hai nhiều hơn hiểu bài viết đầu tiên. Tại sao? Bởi vì cả hai đều có một giọng nói riêng sẽ phù hợp với một số người và không phù hợp với những người khác.

Phỏng dịch theo bài viết gốc tại freecodecamp.org

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Phát triển lập trình Android cùng Kotlin

Phát triển lập trình Android cùng Kotlin

Kotlin là một plug-in giúp bạn tăng tốc lập trình Android. Vì sự bất tiện của việc truy xuất các control trên giao diện nên plug-in Kotlin ra đời. Hiện nay, nhiều công ty tại Việt Nam cũng đang tìm kiếm các lập trình viên có thể lập trình Android với Kotlin.

Về chuyên gia chia sẻ

  • Anh Toàn Trần hiện hiện đang là Vice President, Mobile tại LAZADA. Đồng thời anh cũng là chuyên gia trong mảng Kotlin, được công nhận bởi Google (GDE).
  • Anh đã gắn bó với công việc Software Developer được hơn 9 năm. Anh đã trải qua quá trình làm việc với nhiều công việc khác nhau nhưng khoảng 80% thời gian làm việc cho đến hiện tại chủ yếu đều liên quan đến phát triển app Android.

Tuyển lập trình android lương hấp dẫn up to 40M

Anh có gặp khó khăn nào khi chuyển từ nghiên cứu NLP sang lập trình Android không?

Nếu bạn là người làm thuần về nghiên cứu thì sẽ dễ dàng hiểu rằng ngôn ngữ sử dụng trong AI programming chủ yếu liên quan đến việc cố gắng xử lý logic như thế nào thôi, do đó khi chuyển sang làm về ứng dụng sẽ có một vài thứ bạn cần phải bổ sung. Phần chuyển giao giữa hai yếu tố này không yêu cầu bạn cần phải thông suốt mọi thứ ngay từ đầu mà chỉ cần có đam mê và cảm thấy hứng thú thì bạn có thể dành thời gian để bổ sung dần những kiến thức mình còn thiếu.

May mắn là thời gian đầu thực hiện việc nghiên cứu mình chủ yếu làm việc với Java nên sau này chuyển giao sang làm Android thì Java vẫn là ngôn ngữ chính. Nhờ vậy, về mặt ngôn ngữ không có giới hạn gì quá lớn nên có thể xem đây là điều khá thuận lợi cho mình khi bắt đầu lộ trình lập trình Android với Kotlin.

  Có nên học Kotlin?
  Java đang ngăn cản sự phát triển của Android và Kotlin không phải là cách giải quyết

Động lực nào để anh đưa ra sự thay đổi trên?

Cá nhân mình nghĩ khi còn trẻ chúng ta có nhiều lựa chọn hơn nên có thể dễ dàng hơn trong việc đưa ra quyết định, chứ không hẳn là vì một động lực quá to tát nào khác. Lúc đó mình đã làm việc trong nhóm nghiên cứu của các thầy được một thời gian, sau đó việc chuyển giao cũng diễn ra một cách hết sức tự nhiên.

Mình có hợp tác làm chung một số projects với bạn bè cũng như các dự án freelance và thấy khá thú vị. Mình cảm thấy việc có thể kiếm thêm thu nhập và tích lũy kinh nghiệm từ các dòng code trong phát triển phần mềm là một điều rất hay ho và quyết định gắn bó với công việc này.

Anh có thể chia sẻ về công việc hàng ngày tại Lazada?

Hiện tại ở Lazada mình đang là leader của một team với khoảng 6 thành viên. Công việc chính của mình là đảm bảo toàn bộ hệ thống ứng dụng dùng trong logistics được vận hành trơn tru ở tất cả các quốc gia mà Lazada hoạt động.

Một ngày mình phải làm khá nhiều việc nhưng có thể tóm tắt lại trong hai công việc quan trọng nhất là communicate – giao tiếp và trao đổi để đảm bảo các hoạt động được thông suốt giữa các stakeholders có liên quan đến công việc của mình. Cũng như khi mọi người cần giúp đỡ thì mình sẽ đóng vai trò giúp mọi người không bị block và công việc trôi chảy hơn.

Ứng dụng thương mại điện tử có gì khác so với các ứng dụng thông thường?

Khi làm việc để phát triển những ứng dụng ở mức vài trăm đến vài nghìn users so với vài chục triệu users, đây đã là hai câu chuyện khác nhau. Bất cứ khi nào có sự cố xảy ra thì ảnh hưởng của app lên user là rất lớn. Do đó, điều cần tập trung cao độ nhất của một ứng dụng có lượng user lớn là đảm bảo tính ổn định của hệ thống. Khi hệ thống có bất kỳ vấn đề nào xảy ra mà không có khả năng giải quyết sự cố trong thời gian thật, không biết nguồn cơn của vấn đề là từ đâu thì rắc rối sẽ rất lớn.

Điều gì khiến anh yêu thích ngôn ngữ lập trình Kotlin?

Mình đến với Kotlin theo một cách khá tình cờ. Năm 2015 – 2016, khi lần đầu tiên xuất hiện Kotlin chỉ là một dạng dự án đang được nghiên cứu. Mình vô tình biết được có nhiều người đã lập trình Android với Kotlin, vì thời điểm đó mình chỉ quan tâm đến các vấn đề của android nên đó cũng là lý do mình bắt đầu tìm hiểu về Kotlin.

Khi tìm hiểu sâu hơn, mình nhận thấy Kotlin có thể giải quyết được rất nhiều thứ. Kotlin ngắn gọn, viết ít nhưng vẫn giải quyết được mục tiêu đã đặt ra. Nó cũng rất chú trọng vào vấn đề readibility của ngôn ngữ.

Chẳng hạn như khi làm việc với Java 8 (dùng trong lập trình Android), bạn sẽ phải viết khá nhiều nhưng đạt được rất ít các tính năng cơ bản của feature. Trong khi đó, khi chuyển sang Kotlin, bạn sẽ có được tính năng feature gói gọn trong data class. Rất nhiều tính năng mình phải vật vã làm việc với Java thì lại trở thành một feature rất hiển nhiên trong Kotlin, đó chính là một trong những lý do mình quyết định lựa chọn nó. Sau đó may mắn là Google quyết định lựa chọn Kotlin trở thành first class language để hỗ trợ cho Android và trở thành trending của cả cộng đồng.

Anh có nhận xét gì về cộng đồng sử dụng Kotlin tại Việt Nam?

Đối với những người mình biết và đang làm trong mảng Android, hầu hết mọi người đều chuyên lập trình Android với Kotlin. Lí do là nhờ sự thuận tiện mà Kotlin mang lại khi sử dụng. Khi bạn đang làm việc với một hệ thống được build bằng Java thì bạn không cần shut down phần làm việc vẫn có thể chuyển 100% sang Kotlin. Vừa có thể làm việc bằng Java vừa có thể làm việc bằng Kotlin.

Sự kết hợp và chuyển tiếp giữa Kotlin và Java diễn ra rất tự nhiên, bạn có thể gọi Java code từ Kotlin và gọi Kotlin code từ Java. Bên cạnh đó, có thể thấy rằng phần lớn cộng đồng tập trung hơn ở mảng Kotlin vào Android, dùng Kotlin để build ứng dụng Android. Ngoài ra, hiện tại cũng có một số dev đang cố gắng thử nghiệm Kotlin trên backend development. Chẳng hạn như Spring vài framework của backend service, nhưng hiện tại vẫn chưa thật sự phổ biến.

Xem thêm 5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin

Dự đoán của anh về ngôn ngữ này trong 5 năm sắp tới?

5 năm là khoảng thời gian khá dài, nhưng theo mình suy đoán thì mọi thứ vẫn sẽ ở đấy. Hiện tại Google đang chuyển đổi các libraries, các projects mà họ support cho Android development thành Kotlin code.

Nghĩa là toàn bộ thư viện đó sẽ được support theo feature của ngôn ngữ Kotlin, sử dụng Kotlin làm ngôn ngữ chính để lập trình Android với Kotlin. Điều đó sẽ giúp động viên cộng đồng developers cố gắng tuân theo các tiêu chuẩn của Kotlin khi sử dụng những projects mới của Google support cho developers.

Anh có thể chia sẻ bí quyết cho các bạn đang tìm hiểu về Kotlin không?

Nếu dành mỗi ngày một buổi để nghiên cứu thì sau khoảng một tuần, bạn sẽ nắm được hầu hết các feature căn bản của Kotlin. Còn để thật sự chuyên nghiệp và hiểu hết các vấn đề thì bạn phải đọc code, sử dụng code cũng như để biết được khi nào nên sử dụng feature nào, bạn phải luyện tập nhiều hơn. Sẽ phải mất ít nhất 1 – 3 tháng cho việc cải thiện kiến thức của mình về Kotlin và có thể thành thục việc lập trình Android với Kotlin.

Video demo cách tạo một ứng dụng bằng Jetpack Compose

Công việc đầu tiên về Android anh làm sau khi ra trường như thế nào?

Trong 3 tháng thực tập đầu tiên, mình chịu trách nhiệm chính trong việc assignment web với các công nghệ của Microsoft. May mắn là công ty mình làm việc lúc đó cho phép các thực tập sinh được phép chọn đường hướng phát triển công việc. Lúc đó công ty đang thiếu nhân sự tiếp nhận project mới về mobile app, và mình là người làm việc với dự án này. Sau đó mình lựa chọn đi theo con đường phát triển mobile app trên Android luôn.

Anh có thể chia sẻ kỷ niệm đáng nhớ trong quá trình làm việc của mình?

Kỷ niệm đáng nhớ nhất có lẽ là ở công việc thứ 3 của mình. Khi đó mình phải trải qua quá trình phỏng vấn với rất nhiều vòng. Đó cũng là lần đầu tiên mình được trải nghiệm khái niệm phỏng vấn hai chiều, nghĩa là người đi tìm việc đang cố gắng bán kỹ năng của mình và tìm kiếm công ty phù hợp với nhu cầu, bạn thấy công ty đó có thỏa mãn nhu cầu của mình không.

Tức là bạn cần có một bộ tiêu chuẩn riêng phù hợp với nhu cầu phát triển bản thân của mình và đồng thời bán kỹ năng mình có cho công ty đó để công ty, làm thế nào để công ty muốn mua bạn về làm việc ho họ. Quá trình phỏng vấn này của mình kéo dài 3 – 4 tháng trước khi mình ký hợp đồng chính thức.

Quan điểm của anh khi là leader có gì khác biệt so với khi còn là junior?

Mỗi công ty khác nhau sẽ có một bộ tiêu chuẩn khác nhau để định nghĩa xem bạn đang ở level nào và khi nào thì có thể đạt được level mới.

Vị trí leader đầu tiên là khi mình làm việc ở công ty software outsourcing chuyên về base startup cho các công ty bên Mỹ. Họ có một bộ tiêu chuẩn riêng về việc khi nào bạn sẽ sẵn sàng lên một vị trí mới và trở thành lead.

Trong đó tập trung làm rõ các vấn đề: thứ nhất bạn muốn trở thành một leader như thế nào? Một trong những tiêu chuẩn để thành leader là phải có khả năng giao tiếp tốt. Vì trong quá trình làm việc, bạn sẽ phải trao đổi và cộng tác liên tục với các stakeholders, với team, với nhiều thành phần khác nhau trong một công ty.

  10 tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao

Khi có vấn đề xảy ra mỗi ngày thì giao tiếp trở thành yếu tố then chốt để bạn có thể giải quyết được vấn đề, giải quyết mâu thuẫn và những bài toán hóc búa có thể xảy ra. Leader phải giải quyết được các vấn đề này để sản phẩm của công ty có thể mang lại giá trị cuối cùng hữu ích cho người dùng. Do đó, khả năng giao tiếp trở thành một trong những yếu tố then chốt mà một leader cần có.

Thứ hai là yếu tố kỹ thuật, một trong những yếu tố quan trọng là bạn cần biết mình đang nói về vấn đề gì và có thể giải thích các yếu tố này một cách rõ ràng, có thể hỗ trợ người khác để giải quyết vấn đề.

Một yếu tố khác cũng rất cần thiết là giúp đỡ các thành viên trong team phát triển, để đạt được những vị trí mới trong sự nghiệp của họ.

Với vị trí hiện tại thì công việc của anh đang thiên về kỹ thuật hay phát triển con người nhiều hơn?

Công việc của mình chịu trách với cả hai mảng này nhưng nhiệm vụ chính vẫn là quản lý team và các dự án mà team chịu trách nhiệm, đảm bảo sản phẩm hoạt động tốt và team có thể gắn kết được với phần còn lại của cả công ty.

Còn về vấn đề phát triển con người thì nhiệm vụ chính của mình là cải thiện khả năng làm việc của cả team. Mình sẽ có một hệ thống đánh giá và hỗ trợ tất cả thành viên để đảm bảo mọi người cùng follow một giá trị của engineering và cải thiện engineering base của cả team cũng như đảm bảo product được tạo ra có thể match với practice của cả team.

Đồng thời mình cũng thường xuyên training và sharing kiến thức cho tất cả mọi người trong team và chịu trách nhiệm cho việc tuyển dụng nhân sự. Mình phải dành khá nhiều thời gian cho việc quản lý team và thời gian dành cho việc coding sẽ không còn nhiều. Do đó đối với những leads vẫn muốn dành thời gian cho việc coding, bạn không nên làm việc ở những phần quá quan trọng để tránh làm gián đoạn công việc của cả team.

Anh có lời khuyên nào dành cho các bạn theo đuổi mảng này không?

Một trong những mô hình phát triển phù hợp với khá nhiều người ở nhiều domain khác nhau là mô hình chữ T. Ở giai đoạn đầu, hãy cố gắng mở rộng kiến thức của bạn càng nhiều càng tốt. Vì ở giai đoạn đầu, lúc mới ra trường nhiều khi bạn vẫn chưa thật sự xác định được bạn muốn gì và thích làm gì.

Khi đã làm quen và biết được các công việc khác nhau bạn sẽ xác định được mình muốn đi theo hướng nào nhất. Sau đó hãy bắt đầu phát triển theo chiều sâu, tập trung vào chuyên môn mà mình thích nhất. Hơn nữa, nhờ việc đã làm quen với nhiều domain khác nhau nên khi làm việc, trong quá trình cộng tác với các team khác bạn sẽ có đủ kiến thức để hiểu được và giao tiếp tốt với team khác một cách hiệu quả.

Lời khuyên của mình khi muốn đánh giá xem khả năng của bạn đang ở đâu so với thị trường là apply và đi phỏng vấn. Khi đó bạn sẽ biết được nhà tuyển dụng offer bạn cho vị trí nào và giá trị mà mình có thể mang lại đang nằm ở mức nào.

Xem thêm các vị trí tuyển dụng việc it tại Topdev.vn

Phân tách dữ liệu với DataFrame trong Python

Phân tách dữ liệu với DataFrame trong Python

Bài viết được sự cho phép của tác giả Kien Dang Chung

Video trong bài viết

Trong bài trước, chúng ta đã thu thập và làm sạch dữ liệu, nhưng với những con số như vậy thật khó để nhận ra những quy luật hoặc có ý tưởng để thực hiện những bước tiếp theo. Đây là lúc chúng ta cần đọc dữ liệu đã thu thập được và thực hiện phân tách những dữ liệu cần thiết cũng như trực quan hóa chúng thông qua các biểu đồ.

Tìm việc làm python lương cao các công ty lớn

Xử lý file csv với Python

File cost_revenue_clean.csv là file đã được làm sạch những thông tin nhiễu, không chính xác và cả định dạng lại để máy tính có thể hiểu được. Chúng ta cần đưa dữ liệu này vào máy tính để có thể sử dụng cho các mô hình dự đoán, như vậy các dữ liệu này có thể biểu thị bằng các biểu đồ, nó chứa đựng nhiều thông tin hơn một bảng dữ liệu chỉ toàn các con số.

Trước khi bắt đầu, bạn nên làm quen với Jupyter một công cụ không thể thiếu khi lập trình ngôn ngữ Python. Jupyter cho phép bạn thực hiện các đoạn code Python trực tuyến hoặc bạn có thể cài đặt trên máy tính cá nhân. Ở phần tiếp theo này, giả định bạn đã cài đặt hoặc biết cách sử dụng Jupyter trực tuyến tại Jupyter.org.

  Trải nghiệm lần đầu viết thư viện Python từ ngôn ngữ biên dịch

Đầu tiên, chúng ta tải lên các file dữ liệu cost_revenue_clean.csv với nút Upload trong trang Jupyter. Sau đó, chúng ta sẽ sử dụng module pandas để có thể đọc file dữ liệu này.

import pandas

Pandas là một thư viện Python mã nguồn mở với nhiệm vụ cấu trúc và phân tích dữ liệu. Để đọc dữ liệu từ file csv chúng ta sử dụng phương thức read_csv().

data = pandas.read_csv('cost_revenue_clean.csv')

Trong Jupyter khi code xong, để thực thi bạn nhấn tổ hợp phím Shift + Enter hoặc bấm vào nút Run trong thanh menu nhanh.

Phân tách dữ liệu với DataFrame trong Python

Dữ liệu của chúng ta khoảng hơn 5000 bản ghi, do vậy để có thể nhìn dữ liệu này dưới góc nhìn khoa học, chúng ta sử dụng câu lệnh:

data.describe()

Phân tách dữ liệu với DataFrame trong Python

Chúng ta có các thông tin thống kê như sau:

  • count: tổng số các bản ghi trong dữ liệu
  • min, max: giá trị lớn nhất nhỏ nhất trong dải dữ liệu
  • mean: giá trị trung bình

Chú ý, khi làm việc với các số liệu dạng khoa học, các con số sẽ có định dạng khoa học theo kiểu hàm mũ, thay thế một phần số đó với e +n. Ví dụ:

12345678901 sẽ được hiển thị là 1.23e +10

  Viết một chatbot đơn giản với Python3

DataFrame

DataFrame là cấu trúc dữ liệu hai chiều giống kiểu dạng bảng dữ liệu, nó cho phép áp dụng các thuật toán trên các dòng và cột. DataFrame sử dụng cho rất nhiều các kiểu nhập liệu như:

  • Danh sách
  • Thư viện
  • Series

Để sử dụng DataFrame chúng ta cần import nó dưới dạng một thành phần của pandas.

from pandas import DataFrame

Chú ý, Jupyter hỗ trợ tự động hoàn thành (autocomplete) các từ khóa, do đó chỉ cần gõ vài ký tự trong từ khóa sau đó nhấn Tab là nó tự động chèn vào từ khóa đầy đủ giúp cho chúng ta gõ code nhanh hơn và tránh được những lỗi đánh máy như viết chữ hoa – thường.

Chúng ta thực hiện lấy ra các cột dữ liệu thông qua DataFrame được gọi là bóc tách hay phân tách dữ liệu từ dữ liệu gốc.

X = DataFrame(data, columns = ['product_budget_usd'])
y = DataFrame(data, columns = ['worldwide_gross_usd'])

Bài hướng dẫn dừng lại tại đây, trong bài tiếp theo chúng ta sẽ vẽ biểu đồ dữ liệu có được khi phân tách.

Bài viết gốc được đăng tải tại allaravel.com

Có thể bạn quan tâm:

Xem thêm Việc làm it đà nẵng, hcm, hà nội hấp dẫn trên TopDev

Tìm hiểu và thực hành với PUG cơ bản

Bài viết được sự cho phép của tác giả Trần Anh Tuấn

Chắc hẳn các bạn đã nghe qua SASS SCSS hay LESS giúp cho việc code CSS được nhanh hơn, sử dụng được nhiều chức năng hay như dùng biến, mixins, functions(hàm)…. Có thể tái sử dụng code một cách hợp lý giúp cho việc code trở nên linh hoạt, nhanh lẹ tiết kiệm thời gian…

  5 bước tìm hiểu sơ lược thành phần một web HTML động
  Cách để tạo một Switch trên iPhone bằng HTML và CSS

Thì bên HTML cũng thế nó cũng có những engine như CSS giúp cho việc code trở nên nhanh chóng, tiện lợi tiết kiệm nhiều thời gian cho lập trình viên và 1 trong số đó chính là PUG. Hôm nay mình sẽ giới thiệu sơ sơ cơ bản về PUG cho các bạn biết nó là gì cũng như cách sử dụng chúng cơ bản trước nhé

# Khái niệm

PUG là một template engine cực kỳ mạnh giúp thay đổi hoàn toàn cách viết HTML với những cú pháp hoàn toàn mới, nhiều tính năng tiện ích và tất nhiên sẽ giải quyết những vấn đề mà HTML không thể làm được.

Nếu các bạn nào đã từng làm qua SASS SCSS hay LESS bên CSS thì nó cũng tương tự đó nhưng cái PUG này là dành cho HTML nà.

# Thuộc tính

Về các thuộc tính của PUG thì ở trang chủ của PUG đã trình bày rất chi tiết và kỹ càng nên mình sẽ không trình bày lại nữa. Các bạn có thể tham khảo ở đây. Ở bài viết này mình chủ yếu sẽ hướng dẫn các bạn cách sử dụng PUG đơn giản trước.

Việc code PUG sẽ giúp bạn tiết kiệm thời gian là vì trong HTML mỗi lần các bạn gõ thì các bạn phải gõ như thế này

<div class="header">
<div class="header-inner"></div>
</div>

Khi các bạn dùng PUG rồi thì nó sẽ lược bỏ bớt còn như thế này mà thôi. Và PUG sẽ render ra HTML y như đoạn code mà mình gõ ở trên.

.header
 .header-inner

Tìm hiểu và thực hành với PUG cơ bản

Trên đây là một front-end template workflow đơn giản mà mình tự tìm hiểu và xây dựng cho bản thân. Để giúp cho công việc cắt PSD một cách nhanh chóng tiện lợi bằng cách phân chia cấu trúc thư mục gọn gàng hợp lý cũng như sử dụng PUG để code HTML nhanh hơn và SCSS để code CSS lẹ hơn.

# Sử dụng

Để code thử PUG thì rất đơn giản các bạn vào Codepen thần thánh vào tạo một pen bất kỳ sau đó tại mục HTML chọn PUG như hình

DÀNH CHO BẠN:

Mình có khoá học HTML CSS từ cơ bản tới nâng cao cho người mới, nếu bạn quan tâm thì bạn có thể học thử miễn phí bằng việc nhấn vào đây nha.

Tìm hiểu và thực hành với PUG cơ bản

Và sau đó các bạn tập code thử. Các bạn có thể tham khảo Codepen mà mình code lúc tập luyện ở dưới đây

Nếu các bạn muốn xem lúc nó render ra HTML như thế nào thì các bạn nhấn vào nút mũi tên bên phải sau đó chọn View CompiledHTML thì Codepen sẽ tự động render từ PUG ra HTML cho các bạn dễ hình dung

Tìm hiểu và thực hành với PUG cơ bản

Và các bạn sẽ được kết quả như mong đợi. Nếu các bạn muốn chuyển về code PUG ban đầu thì chỉ cần nhấn View Uncomplied HTML là được nà.

Tìm hiểu và thực hành với PUG cơ bản

# Mixins

Sau khi các bạn đọc ở trang chủ của nó về những thuộc tính, điều kiện if else, vòng lặp,… thì trong số đó có một tính năng rất hay mà mình luôn dùng khi code với PUG đó là Mixins.

Bình thường khi các bạn cắt 1 template PSD chắc chắn sẽ gặp nhiều trường hợp dùng đi dùng lại cấu trúc tiêu đề giống nhau hoặc là hình ảnh, đường dẫn(link) hay là một block nhỏ nào đó thì việc dùng Mixins nó cho phép ta tạo một block trong PUG và sử dụng lại nhiều lần.

Ví dụ bạn code 3 item nào đó có cấu trúc giống nhau và trong HTML bạn code nó như thế này sau đó copy ra 3 lần và thay đổi nội dung tương ứng cho các item còn lại đúng không nào.

<div class="wrap">
<div class="item">
<h2 class="item-title">this is title</h2>
<p>Lorem ipsum</p>
<img src="demo.jpg"/>
</div><!--2 item con lai-->
</div>

Còn trong PUG thì mình sẽ code như thế này. Các bạn có thể xem thêm demo của mình tại Codepen luôn nhé

mixin item(title, desc, src)
 .item
 h2.item-title= title
 p= desc
 img(src=src)

.wrap
 +item("haha","hehe","demo.jpg")
 +item("haha2","hehe2","demo2.jpg")
 +item("haha3","hehe3","demo3.jpg")

Mình viết một cái Mixin đơn giản có tên là item với cú pháp mixin tênmixin(biến ở trong này) sau đó mình viết nội dung mà mình muốn để dùng lại cũng như là gán các biến vào các vị trí các thẻ HTML tương ứng với  dấu = để khi mình gọi nó ra bằng cú pháp +tenmixin(các giá trị tương ứng) khi tạo ở Mixin.

Nếu các bạn nào đã học JS tới phần function(hàm) thì đọc vô cái Mixin sẽ thấy nó na ná nhau và hiểu ngay. Còn bạn nào chưa dùng bao giờ thì chắc hơi bỡ ngỡ và cần phải luyện từ từ mới hiểu được hoặc học JS là sẽ hiểu liền nà.

Ngoài ra còn 2 Mixins hay khác nữa các bạn có thể tham khảo thêm tại Codepen này của mình luôn nhé. Mình có viết kèm giải thích trong Codepen cho các bạn hiểu luôn ý. Các bạn nhớ nhấn vào Codepen để xem code PUG nha

# Tạm kết

Đây chỉ mới là bước cơ bản mình hướng dẫn cho các bạn biết thôi, sau này mình sẽ hướng dẫn các bạn xây dựng hoàn chỉnh một frontend template workflow giống của mình ở trên. Sử dụng GULP để buid lên. Giúp các bạn tự tạo ra riêng cho bản thân một template để hỗ trợ cắt PSD được nhanh chóng.

Để cho mau hiểu hơn về PUG các bạn nên tham khảo code ở một số trang nước ngoài và trang chủ của PUG cũng như trên Youtube với từ khóa “pug html mixins, pug html if else, pug html tutorials….”. Cám ơn các bạn đã đọc bài viết và chúc các bạn một ngày tốt lành nhé..

Bài viết gốc được đăng tải tại evondev.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Trong bài này mình sẽ tạo file .key, .pem, .crt để làm certificate chạy https

(Lưu ý: Với server chạy bằng Java bạn cần chuyển file pem, private key sang p.12 (PKCS#12))

(xem thêm: Hướng dẫn tạo certificate SSL trên ubuntu (file key, pem))

  Hướng dẫn tạo certificate SSL trên ubuntu (file key, pem)

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Windows không tích hợp sẵn lệnh openssl do đó ta cần phải cài đặt openssl trước.

(Xem lại: Hướng dẫn cài đặt OpenSSl trên Windows)

1. Tạo file .key

openssl genrsa -des3 -out {ten_file.key} {do_dai_key}

Ví dụ:

openssl genrsa -des3 -out cert.key 2048

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Khi generate private key, hệ thống sẽ yêu cầu nhập pass phrase, bạn nhập và nhớ pass phrase để generate public key nhé.

Kết quả:

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

2. Tạo file .pem

openssl req -x509 -new -nodes -key {ten_file.key} -sha256 -days 1024 -out {ten_file.pem}

Ví dụ:

openssl req -x509 -new -nodes -key cert.key -sha256 -days 1024 -out cert.pem

Nhập lại pass phrase mà bạn đã sử dụng để generate private key ở trên.

Sau đó nhập các thông tin của certificate

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Kết quả:

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Bạn cũng có thể tạo file .crt, chỉ cần đổi đuôi .pem thành đuôi .crt là được

Demo:

Đây là thông tin SSL Certificate hiển thị trên trình duyệt khi mình dùng 2 file trên apply cho website của mình:

Hướng dẫn tạo certificate SSL trên Windows (file key, pem)

Okay, Done!

References: https://zeropointdevelopment.com/how-to-get-https-working-in-windows-10-localhost-dev-environment/

Bài viết gốc được đăng tải tại stackjava.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Software Architecture – Tìm hiểu Layers Pattern

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Chúc mừng nha, đã tìm kiếm tới Layers Pattern tức là có quan tâm tới Architecture của phần mềm. Lúc này trình đã lên một tầm cao mới. Hầu hết những ông đã mang danh kĩ sử (Engineer) đều biết về kiến trúc của chuyên nghành mà mình đang theo.

Nghề CNTT cũng vậy, người kĩ sư phần mềm (Software Engineer) cần phải có cái nhìn sâu sắc, hiểu biết am tường về kiến trúc phần mềm. Yên tâm, series architecture ở Kieblog có đủ cả, chỉ mất công đọc thôi

  Mô hình 3 lớp (three-layer) có gì hay?

1. Cực kì phổ biến

Layers Pattern là một trong những mẫu thiết kế phổ biến nhất trong giới tinh hoa phần mềm (Architecture Pattern). Còn được biết tới với cái tên n-tier Architecture Pattern, tier ở đây cũng được hiểu là một lớp. Gọi là n-tier vì có thể có nhiều lớp.

Hầu như các program hay application phát triển từ Java EE đều tuân theo kiến trúc này. Đối với các ứng dụng business đơn thuần hoặc không quá phức tạp, hầu như ở công ty phần mềm nào cũng có thể tìm ra một sản phẩm có kiến trúc Layers Pattern.

Software Architecture – Tìm hiểu Layers Pattern
Hầu như các Kỹ sư phần mềm có kinh nghiệm đều đã trải qua ít nhất một dự án thiết kế kiểu Layers Pattern

Phổ biến là vậy, có gì ở kiến trúc này khiến nó trở nên rộng khắp như vậy?. Ưu nhược điểm là gì?. Đây, câu trả lời dưới đây.

Xem tuyển dụng software developer đãi ngộ tốt trên TopDev

2. Có gì ở Layers Pattern

Layers Pattern là được phân vào loại Modules trong Kiến trúc phần mềm (Software Architecture). Các lớp sẽ đảm nhận một chức năng riêng biệt, tuy vậy lớp (Layer) lại không thể hoạt động độc lập.

Rõ ràng, vì cả khi 3 modules cùng hoạt động thì mới có Software, mới có Application để dùng. Tuy nhiên, việc phát triển (development) và kiểm thử (testing) lại có thể diễn ra độc lập.

Phần module kết nối với database có thể testing bằng cách gọi request (Postman), chạy automation test với Selenium, …

Software Architecture – Tìm hiểu Layers Pattern

Ví dụ như sử dụng Java để phát triển một ứng dụng (application):

  • Layer 1 – Phần view (screen) có thể dùng (JSF) Java Server Faces
  • Layer 2 – Các object trong bean có thể dùng Spring bean hoặc EJB3 bean
  • Layer 3 – Data access objects có thể là POJO’s (Plain Old Java Objects) Mybatis, JDBC, …

3. Điểm mạnh, điểm yếu

3.1 Điểm mạnh

Đầu tiên, điểm mạnh dễ nhìn nhận nhất là dễ hiểu. Hầu hết các hệ thống có thiết kế kiểu Layers pattern thường có kiến trúc 3 lớp.

Hơn nữa, việc áp dụng pattern này khi thiết kế còn có các ưu điểm sau:

Thứ nhất, về khả năng kiểm thử (Testability), vì các lớp có thể được hoàn thành độc lập nên khả năng kiểm thử mô hình này tương đối tốt. Nếu phần database layer cần test, ta có thể test ngay. Nếu phần view (screen) cần test layout, độ dài hoặc dữ liệu, có thể tạo mockup database hoặc response giả.

Thứ hai, về Ease of development (độ dễ để phát triển), do phân thành các lớp độc lập nên dễ dàng để nắm bắt và hiểu rõ.

Ngoài ra, do một lớp chủ yếu liên hệ với các lớp lân cận kế bên, nên lúc đọc hay viết source cũng đơn giản và dễ nắm bắt hơn.

Hơn nữa

Promotes maintainability, portability, reusability, testability, design time modifiability. Conceptually simple to implement. Layers can be made visible in the code.

Thúc đẩy khả năng bảo trì, tính di động, khả năng sử dụng lại, khả năng kiểm tra, sửa đổi thời gian thiết kế. Khái niệm đơn giản để thực hiện. Có thể dễ dàng hiểu nội dung các lớp khi đọc source.

3.2 Điểm yếu

Tuy thiết kế theo hướng Modules, nhưng kiến trúc kiểu Layers Pattern cũng tồn tại không ít điểm yếu. Có thể liệt kê 3 điểm yếu trong thiết kế kiểu này lần lượt như sau:

Thứ nhất, vì kiến trúc lớp phân tầng các lớp (layer) nên trường hợp có thay đổi ở các lớp, sẽ khó khăn để hiểu và cập nhật ở các lớp khác. Chính vì ở tính Overall agility (Khả năng nhanh chóng thay đổi về mặt tổng thể) của kiến trúc này không quá nhanh.

Thứ hai, về tính mở rộng (Scalability)

Because of the trend toward tightly coupled and monolithic implementations of this pattern, applications build using this architecture pattern are generally difficult to scale.

Do thiết kế chặt chẽ trong liên kết giữa các lớp, việc triển khai phải đồng bộ theo khối nên các ứng dụng xây dựng sử dụng mẫu kiến ​​trúc này thường khó mở rộng.

Thứ ba, về hiệu suất (Performance), trường hợp phần mềm sử dụng thiết kế kiểu này, nhưng có quá nhiều lớp (xử lí ở các lớp phức tạp, chiếm nhiều thời gian) sẽ ảnh hưởng về mặt tổng thể tới hiệu năng, thời gian phản hồi của cả hệ thống.

Hơn nữa

Layers above are allowed to use layers below, but this relation only goes one way. The allowed to use relation can be limited so the current layer may only use the layer immediately below it. Cyclical dependencies are not permitted.

Các lớp ở phía trên được phép sử dụng các lớp ở phía dưới, nhưng mối liên hệ này chỉ đi theo một chiều. Việc sử dụng mối quan hệ này có thể bị giới hạn, vì vậy lớp hiện tại đôi khi chỉ sử dụng được lớp ngay dưới nó. Không có chu kì ở đây

4. Tham khảo

Giả thích về Layers Pattern

Cảm ơn vì đã đọc bài, nhớ like page và chia sẻ bài viết nha. Happy coding!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm việc làm Developer hấp dẫn trên TopDev

Bí kíp tìm dự án cho anh em mới vào nghề freelancer thiết kế website wordpress

Bài viết được sự cho phép của tác giả Võ Quang Huy

WordPress ngày càng trở nên phổ biến. Anh em làm nghề thiết kế website wordpress thì ngày càng đông và tất nhiên độ cạnh tranh ngày càng cao.

Vì vậy để tìm một khách hàng trong thời kỳ này cũng không phải là một chuyện đơn giản, đặc biệt là đối với các bạn mới quyết định dấn thân vào con đường này.

  1001 lý do mỗi doanh nghiệp cần có một website riêng cho mình
  15 thư viện slider jquery miễn phí cho dự án website của bạn

Với kinh nghiệm 5 năm trong nghề hôm nay mình sẽ moi gan, móc ruột chia sẻ cho anh em vài bí kíp để get dự án (Tìm khách hàng) sao cho hiệu quả nhé. Dươí đây là các phương pháp get dự án của cá nhân mình và các ý kiến phía dưới cũng hoàn toàn là ý kiến cá nhân nha.

Bí kíp tìm dự án cho anh em mới vào nghề freelancer thiết kế website wordpress

Tạo website giới thiệu dịch vụ thiết kế website wordpress

Đây là một trong những việc quan trọng nhất bạn cần phải làm. Hãy tạo ngay cho mình một website để giới thiệu dịch vụ thiết kế website.

Website này thông thường sẽ trình bày những hạn mục sau:

  • Dịch vụ bên bạn đang cung cấp
  • Các dự án hay website mẫu bạn đã làm
  • Bảng giá của các hạn mục trên
  • Thông tin liên hệ

Có website sẽ giúp bạn tăng uy tín, cũng như show các skill bạn có thể làm được. Có website từ đó bạn có thể viết các bài viết liên quan đến dịch vụ thiết kế web để seo trên google cũng nhưng dễ dàng chạy quảng cáo…

Tóm lại hãy show những gì tốt nhất của bạn lên website để khách hàng biết.

Bí kíp tìm dự án cho anh em mới vào nghề freelancer thiết kế website wordpress

Ví dụ đây là website giới thiệu dịch vụ thiết kế web bên mình

Tham gia, support trong các group về wordpress, theme wordpress…

WordPress cũng như các framework php khác hầu như đều có các group để thảo luận. Trên các group này ngoài việc support lẫn nhau thì cũng có 1 lượng không nhỏ khách hàng vào các group này để tìm người làm website.

Vì vậy khi tham gia vào các group này ngoài việc trao đổi về kỹ thuật các bạn còn có thể tiếp cận 1 lượng khách hàng nhất định

Một số group facebook về wordpress ở việt nam các bạn có thể tham gia:

Các bạn có thể tìm hiểu thêm một số cộng đồng hay group khác. Nhớ là tích cực support những người hỏi nha. Nó sẽ giúp bạn tăng uy tín cũng như giúp nhiều người biết đến bạn

Bí kíp tìm dự án cho anh em mới vào nghề freelancer thiết kế website wordpress

Bí kíp tìm dự án cho anh em mới vào nghề freelancer thiết kế website wordpress

Bí kíp tìm dự án cho anh em mới vào nghề freelancer thiết kế website wordpress

Một số hình ảnh mình chụp từ group, rất nhiều người cần thiết kế web trong các group…

Tích cực chia sẻ các vấn đề liên quan đến thiết kế website

Các bạn biết đến mình thông qua kênh nào? Chắc 90% là nhờ website huykira.net này phải không?

Đây là một ví dụ cho việc chia sẻ sẽ nhận lại nhiều hơn, ở website này mình chia sẻ rất nhiều thứ như:

  • Theme wordpress do mình tự viết
  • Các plugin hay do mình tự viết
  • Các kiến thức về lập trình wordpress
  • Mình hay share code cho cộng đồng

Khi chia sẻ thì sẽ nhiều người biết đến mình nhiều hơn vì thế cơ hội tiếp cận với khách hàng của mình cũng nhiều hơn.

Đặt biệt: Khi website của bạn có một lượt view cố định thì mình sẽ có nhiều cách để tiếp cận với khách như:

  • Mình sẽ code website mẫu rồi share code bản free kết hợp với bán bản pro
  • Mình share code html và bán bản wordpress theme
  • Bán mẫu web trực tiếp trên blog

Gây ám ảnh cho đối phương :))

Hồi mới vào nghề mình hay gây ám ảnh cho mọi người… kiểu như thế này:

Thấy thằng bạn mở quán điện thoại: “Ê bạn. Mở của hàng đt hả? Thế mi có website chưa ta làm cho :))

Thấy con bạn bán hàng online: “Ê mi. Bán hàng online rứa có website để chạy quảng cáo chưa

Nghe bạn nói Anh của ta mới mở trung tâm gia sư: “Rứa ổng có website chưa ????

Mấy đứa bạn post hình ảnh khai trương 1 cửa hàng hay quán cafe gì đó lập tức nhảy vào comment: “Khai trương rứa có website chưa :))

Đại loại thế đi đâu, gặp ai mình cũng khoe là mình có thiết kế website. Cứ như vậy lâu ngày mọi người bị ám ảnh cmn luôn. Cứ thế mọi người chung quanh cứ nhắc đến website là nhớ đến Huy Kira :)))

Vì thế hầu như bạn bè mình, anh chị, đồng nghiệp có mối làm website thì nhớ đến mình và mình cũng nhận được rất nhiều dự án nhờ kiểu giới thiệu như thế này 😀

Tổng kết:

Trên đây là những bí kíp của mình sử dụng và mình thấy hiệu quả, chắc chắn sẽ còn nhiều cách khác nhau để tiếp cận khách hàng. Bạn nào có độc chiêu khác, có thể comment phía dưới để anh em tham khảo nha.

Đây là bài viết đầu tiên trong năm 2021 này, Chúc các bạn năm mới sức khỏe, get được nhiều dự án thiết kế website wordpress trong năm nay…

Chào thân ái và quyết thắng!

Bài viết gốc được đăng tải tại huykira.net

Có thể bạn quan tâm:

Xem thêm Tuyển lập trình WordPress hấp dẫn trên TopDev

Kinh Nghiệm Phỏng Vấn BrSE

Kinh Nghiệm Phỏng Vấn BrSE

Bài viết được sự cho phép của tác giả Nguyễn Văn Trọng

Trước khi tiếp nhận dự án mỗi ứng viên BrSE sẽ được khách hàng phỏng vấn (sau khi xem CV) để kiểm tra 2 yếu tố : kỹ năng và ngoại ngữ. Đây là rào cản lớn nhất mà các bạn phải vượt qua. Bài viết này dành cho các tân BrSE mới chập chững vào nghề, còn các cao nhân đã có kinh nghiệm rồi thì .. cũng đọc cho vui ^^. Mình đã từng trượt phỏng vấn và rút được nhiều thứ từ thất bại nên mong các bạn né được những ổ gà trên bước sắp tới. Hôm nay mình sẽ chỉ 1 số cách để mọi người vượt qua nó dễ dàng hơn.

Sau khoảng thời gian gõ code mòn bàn phím, tích lũy kinh nghiệm về kỹ thuật và quy trình phần mềm, cùng với tiếng Nhật đã được tôi rèn trong mấy năm khổ ải thì các cu đơ (tester, QA …) sẽ tiến lên 1 bưới mới trong sự nghiệp : kỹ sư cầu nối.

Nhưng để được qua Nhật thì điều quan trọng nhất là phải chứng minh được năng lực với các bác khách hàng để các bác ấy tin tưởng rước anh chị em qua. Vậy phải mần răng ?

Tuyển dụng Kỹ sư cầu nối không yêu cầu kinh nghiệm tại Topdev.

Hiểu Rõ Khách Hàng Cần Gì

Kinh Nghiệm Phỏng Vấn BrSEPhải nắm được Scope của dự án.

Các bạn không phải chỉ hiểu khơi khơi là dự án làm về ngôn ngữ abc, framework xyz, mà còn cần nắm được họ cần mình qua để mần cái chi. Hãy nắm scope (phạm vi),  làm từ mô đến mô (thường thì từ design đến UT) – cái ni hỏi sếp hoặc account manager phụ trách khách hàng là sẽ rõ ngay. Khi nắm được mục đích là mình qua phát triển module, design, hay chỉ là qua học nghiệp vụ để về triển khai, thì sẽ nhấn mạnh nó trong phần tự giới thiệu bản thân và trả lời được gần như toàn bộ những câu hỏi chính xoáy về kỹ năng – kinh nghiệm. Như vậy bạn đã pass 50% rồi đó 🙂

Những Câu Hỏi Thường Gặp Và Cách Ứng Phó:

Tôi đã xem CV của bạn và thấy bạn làm dự án về xxxbạn cho tôi biết bạn làm gì trong dự án đó ? Hãy chuẩn bị trước để nói 1 cách mạch lạc “Tôi chịu trách nhiệm về …trong thời gian … tháng”

Bạn đã bao giờ làm công đoạn design chưa ? nếu rồi thì hãy nói cụ thể mình làm basic hay detail, làm mới hay modify. Nếu chưa thì có thể nói “Mặc dù chưa làm nhưng đã đọc nhiều design trong quá trình code/test nên hiểu được cách để tạo ra design là như thế nào và cần những gì…bla .. bla..”, hoặc nếu hỏi về 1 vài công đoạn khác như Test (UT, AT, IT) thì cứ chém những gì mình biết và đừng bao giờ nói KHÔNG. Trường hợp mà ko biết cái gì luôn thì phải thêm từ “NHƯNG” vào “nhưng tôi có khả năng nắm bắt nhanh nên nếu được các bác giúp đỡ giai đoạn đầu thì …”

Bạn đã sử dụng Framework này bao giờ chưa ? (các bác Nhật ít khi hỏi mấy câu chi tiết ngôn ngữ , 1 phần họ tôn trọng mình ko muốn kiểm tra mấy cái lặt vặt nên thường chỉ hỏi về Framework). Nếu mình làm rồi thì cứ nói cho các bác ấy yên tâm, còn nếu chưa thì hỏi lại “FW ấy được tạo mới hoàn toàn hay là dựa trên FW phổ biến nào không ?” (Thông thường các dự án JP thường sẽ được phát triển dựa trên 1 FW customize lại trên nền tảng 1 hay nhiều FW khác, ví dụ bên Java thì hay kết hợp Spring – Struts, bên JavaScript thì kết hợp Jquery vs 1 FW khác như Knockout, AngularJS)

Ngoài ra có 1 vài câu hỏi dễ trả lời khác như : bạn có thể làm thêm giờ không ? Nếu dự án kéo dài (1 vài năm) thì bạn có theo đến cuối không, bạn có ngại khi phải di chuyển nhiều không, đã từng đi Nhật chưa, đã biết gì về văn hóa Nhật, ưu nhược điểm của bạn về abc là gì, có biết Maria là ai không … ?

Giữ Thái Độ Bình Tĩnh

Kinh Nghiệm Phỏng Vấn BrSEHãy thật bình tĩnh.

Hồi bữa lần đầu đi phỏng vấn mình run đến độ vào phòng cái khúm núm chào xong ngồi cái phịch xuống ghế mà quên nói “tôi xin phép được ngồi”. Hay như lúc mấy bác bên kia hỏi (qua video) thì lóng ngóng trả lời câu trước quên mie nó câu sau. Rồi còn họp xong cũng quên luôn cảm ơn các bác đã dành thời gian phỏng vấn mình nữa chớ.

Lý do của ấp úng là bị bất ngờ, lóng ngóng thì tại không biết làm gì – nói gì. Để tránh phạm những sai lầm mình đã gặp, các bạn hãy chuẩn bị thật chu đáo những thứ sau để bình tĩnh trong suốt buổi phỏng vấn nhé.

  • Kịch bản phỏng vấn : Chào – xin phép ngồi – tự giới thiệu bản thân (khi được yêu cầu) – trả lời phỏng vấn – Cảm ơn.
  • Bài tự giới thiệu bản thân (không quá 15 dòng – nói trong 3p)
  • Soạn trước những câu hỏi thường gặp và câu trả lời.
  • Chú ý cả trang phục, ngủ đủ giấc, ăn uống đầy đủ nữa nhé.
  Những kỹ năng cần có của 1 BrSE

Suy Nghĩ Kỹ Trước Khi Trả Lời

Ngày xưa, lúc vừa học khóa tiếng nhật tập trung (N4 -> N2) xong, mình được sếp ưu ái tiến cử đi onsite cho 1 dự án. Nhưng buổi phỏng vấn không suôn sẻ lắm, mình đã bị trượt mà hồi đó không rõ lý do. Sau này nghiệm lại mới thấy dại. Hồi đó khách hàng cần người design và development. Mặc dù các bác ấy khá hài lòng với khả năng kỹ thuật, nhưng khi được đến phần design thì mình đã trả lời bậy.

Khách hàng : Em đã từng làm design chưa ?

Bạn T : dạ em chưa nhưng em có đọc design trong các dự án đã làm nên hiểu được phần nào cách làm ah (nghe rất bài bản)

Khách hàng : Thế bây giờ cho em làm 1 cái design thì em mất bao lâu để hoàn thành (quả này mới đắng)

Bạn T: Dạ khoảng 1 tháng ah. (Trời đất – ngố gì đâu á)

Khách hàng : Bác chỉ biết câm nín nghe tiếng em khóc …

Phân tích cái sai : Không suy nghĩ kỹ mà trả lời bừa. Đầu tiên chưa hiểu được “1 cái design” đó là basic hay detail, cho 1 màn hình hay cho 1 flow (1 flow thường gồm khởi tạo – nhập giá trị – validate – confirm – finish), nếu 1 màn hình thì bao nhiêu Item, màn hình đó chức năng gì (tùy chức năng mà design nhiều hay ít). Đáng lẽ phải hỏi cặn kẽ thì mình trả lời kiểu cho có – không dựa trên cơ sở gì … tèo tèo tèo.

Các bạn nhớ đừng lặp lại nhé. Khi chưa rõ câu hỏi, hoặc đã rõ nhưng chưa đủ căn cứ thì hãy hỏi lại kỹ, KH sẽ đánh giá cao vì bạn làm việc chắc chắn. Còn nếu như hỏi han đủ kiểu mà vẫn không dám chắc thì hãy trả lời kiểu : tôi nghĩ là …, theo kinh nghiệm của tôi thì … Họ sẽ không nói mình sai đâu, bởi vì công việc sắp tới chắc gì đã giống hoàn toàn với những việc mình đã làm trước đây ?

Hãy Giữ Bí Mật Thông Tin Về Các Dự Án Mình Đã Làm

Cái này rất nhiều bạn đã phạm phải. Rất rất rất nguy hiểm. Có thể làm cho nỗ lực của mình đổ sông đổ biển chỉ vì 1 câu nói. Vì nếu như bạn tiết lộ thông tin về KH trước thì chắc gì bạn sẽ không tiết lộ thông tin KH đang phỏng vấn trong những lần sau ?

Khi được hỏi về kinh nghiệm thì mình chỉ nói về : Ngôn ngữ, Framework (FW public), domain (làm về y tế, giáo dục, telecom, thương mại …), khách hàng nước nào (Nhật, Úc, Mỹ …) hay về role đã đảm nhận, khó khăn, thuận lợi, đóng góp. Chỉ vậy thôi.

Những thông tin cần giữ bí mật : Tên khách hàng, Tên dự án, Tên Framework của KH (FW customize), Địa chỉ khách hàng hoặc bất kỳ thông tin gì có nguy cơ khiến người nghe biết được KH đó là ai.

Về Ngoại Ngữ

Hãy Sự Dụng Kính Ngữ Đúng Lúc Và Đúng Cách.

Kinh Nghiệm Phỏng Vấn BrSEKính ngữ nâng bạn lên tầm cao

Lúc nào và cách gì thì có quá nhiều page viết rồi nên mình không nhai lại nữa. Mình có quen 2 đứa em, 1 trai 1 gái onsite cho 1 dự án ở Osaka. chú em này tiếng Nhật nghe nói đỉnh hơn em gái kia nhiều nhưng KH lại đánh giá em kia ngon hơn mới đau. Lý do đơn giản là em í biết dùng kính ngữ đúng lúc và đúng cách. Cũng dễ hiểu thôi, ai cũng muốn được tôn trọng.

Còn gì nữa không nhỉ ? thôi tạm tổng kết ở đây vậy. Nếu có câu hỏi tình huống nào thì hãy post ở phần comment nhé, nếu mình không trả lời được sẽ nhờ cao nhân trả lời cho các bạn.

Tổng Kết

  • Biết khách hàng cần mình làm gì
  • Chuẩn bị chu đáo trang phục, tác phong, câu nói cửa miệng, bài tự giới thiệu bản thân.
  • Giữ bình tĩnh trong suốt quá trình phỏng vấn
  • Suy nghĩ kỹ trước khi đưa ra câu trả lời
  • Giữ bí mật về KH trước đã từng làm.
  • Về ngoại ngữ : hãy dùng kính ngữ đúng lúc và đúng cách

Bài viết gốc được đăng tải tại kysubrse.com

Có thể bạn quan tâm:

Xem thêm Việc làm cntt hấp dẫn trên TopDev

Indexeddb là gì? – Tất cả những điều cần biết

Indexeddb là gì? – Tất cả những điều cần biết

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Hôm nay lại rảnh task nên ngồi lò mò tìm hiểu IndexedDB. Trước do ngồi test API với Postman nên có thấy ở phần Storage. Cũng tò mò là ngoài những thằng phổ biến khác, sao ta lại cần thêm thằng này?.

  Những điều cần biết về z-index trong css
  System Design Cơ Bản - Phần 5: Indexes
Indexeddb là gì? – Tất cả những điều cần biết
Thấy nó nằm chình ình ở đây thì cũng phải tìm hiểu thôi

Nhiều khi cũng thấy lạ, chẳng hiểu sao cứ hay tò mò, chắc là máu developer ngấm vào trong nên vậy. Thôi kệ.

Quất ngay và luôn thôi cho nóng nha mấy ba!

1. Khái niệm Indexeddb

Theo như định nghĩa ghi ở Mozilla thì:

IndexedDB là database lưu trữ ở phía client, trên browser của người sử dụng. IndexedDB là NoSQL Database, ngoài ra nó cũng hộ trợ các thao tác getput và transactions.

Chi tiết hơn

IndexedDB is a low-level API for client-side storage of significant amounts of structured data, including files/blobs. This API uses indexes to enable high performance searches of this data.

IndexedDB là low-level API cho việc lưu trữ phía client, bao gôm cả files và blobs. API này sử dụng indexes để tăng hiệu năng khi tìm kiếm dữ liệu.

Tại sao lại cần thằng cu này để lưu trữ?.

Câu trả lời là càng ngày việc lưu trữ các thông tin càng ngày càng nhiều. Số lượng thông tin lưu trữ lớn, LocalStorage thì chỉ lưu trữ có giới hạn (tối đa 5MB), nên ta cần một công cụ khác hỗ trợ lưu trữ trên browser khác.

Đó chính là lý do ta cần tới indexedDB

2. Sử dụng – usage

Nếu đã tiếp xúc với các hệ cơ sở dữ liệu khác như Oracle hay PostgreSQL thì không khó để nắm bắt cách thức làm việc với IndexedDB.

Cụ thể, có thể chia thành 5 bước như sau

  1. Open a database – Mở kết nối với database
  2. Create an object store in the database  – Lưu trữ các object vào database
  3. Start a transaction and make a request to do some database operation, like adding or retrieving data – bắt đầu một transaction và gửi request tới database, thêm hoặc nhận data
  4. Wait for the operation to complete by listening to the right kind of DOM event – chờ actions hoàn thành thông qua việc lắng nghe trên DOM
  5. Do something with the results (which can be found on the request object).

2.1 Các thành phần

Để hiểu rõ hơn, bắt buộc ta phải nắm các khái niệm sau:

This is the highest level of IndexedDB. It contains the object stores, which in turn contain the data you would like to persist. You can create multiple databases with whatever names you choose, but generally there is one database per app.

Database là cấp cao nhất của IndexedDB. Nó bao gồm các object, thứ được trả về khi ta query. Ta có thể tạo nhiều database với tên bất kì, nhưng thông thường thì chỉ có một database trên một app.

Index – khái niệm index cũng giống như các hệ cơ sở dữ liệu khác, dùng để lấy ra một record bất kì

For example, if you’re storing people, you may want to fetch them later by their name, age, or favorite animal.

Ví dụ, nếu ta lưu trữ đối tượng người, ta có thể muốn lấy tên người đó, tuổi người đó, con vật mà họ thích. Lúc này index sẽ giúp đỡ rất nhiều.

Cursor – con trỏ chắc không còn là khái niệm xa lạ, dùng để di chuyển giữa các record (khi ta có nhiều record)

Transaction – là thứ cần phải có và phải nắm bắt ở mọi hệ cơ sở dữ liệu (để đảm bảo tính toàn vẹn của dữ liệu). Không có chuyện hai người cùng lúc truy xuất để xóa một record trong DB.

3. Đồng bộ (Synchronous) và bất đồng bộ (Asynchronous)

Vì là loại database hoạt động ở phía client nên IndexedDB hoạt động theo cả cơ chế bất đồng bộ (Asynchronous) và đồng bộ (Synchronous).

Hoạt động theo cơ chế bất đồng bộ không những giúp việc thực thi trở nên linh động, nó còn tránh các vấn đề khi đang query thì block client của user (kiểu như not responding).

Đây cũng là một vấn đề cần lưu ý khi làm việc với hệ cơ sở dữ liệu này, lưu ý tới tính bất đồng bộ. Còn về cơ chế đồng bộ:

The synchronous API was intended for use only with Web Workers but was removed from the spec because it was unclear whether it was needed

Synchronous API chỉ được sử dụng với Web Workers nhưng đã bị xóa đi vì không rõ có cần thiết hay không.

Chỗ cần thiết này thì tôi chưa hiểu lắm, nên cũng không biết giải thích sao cho mấy ông, chắc phải để bài viết sau.

4. Ưu, nhược điểm

Về ưu điểm, dễ dàng nhận ra ưu điểm của IndexedDB là nó không có giới hạn. Đối với LocalStorage, thông thường là 5MB, nếu cần lưu ở phía client nhiều hơn 5MB, indexed tất nhiên không phải là lựa chọn tồi.

Indexeddb là gì? – Tất cả những điều cần biết
Vì mỗi cái 5MB mà muốn lưu gì bự bự cái cũng không được

Ưu điểm thứ hai là lưu trữ có cấu trúc.

Structured storage; you can store objects in IndexedDB object stores and query for those objects by their fields.

Là lưu trữ có cấu trúc, ta có thể lưu trữ các object trong IndexedDB và truy vấn các objects đó chỉ với những field mà chúng có.

Về nhược điểm, indexed là loại hình storage mới trên phía client, nên ở một số trình duyệt cũ có thể không sử dụng được.

5. Khi nào nên sử dụng?

Tuy là hệ cơ sở dữ liệu lưu trữ ở phía client, nhưng không phải lúc nào cũng sử dụng IndexedDB.

Nếu ứng dụng hoặc website ta muốn phát triển yêu cầu chạy ở tất cả các browser cũ và mới, không nên sử dụng indexed.

Ngoài ra, nếu lớn thì viết API query, còn nhỏ thì dùng LocalStorage, nên đôi khi indexed trở nên lỡ cỡ.

6. Tham khảo thêm

Nốt công tìm hiểu về các hình thức lưu trữ phía client thì ngại gì mà không tìm hiểu Cookies

Cảm ơn vì đã đọc bài, nếu hay thì nhớ chia sẻ bài viết nha. Happy coding!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Tại sao lập trình viên thường làm việc vào ban đêm?

Tại sao lập trình viên thường làm việc vào ban đêm?

Bài viết được sự cho phép của smartjob.vn

Khi hỏi một lập trình viên khoảng thời gian nào tốt nhất để làm việc, chắc chắn bạn sẽ nhận được câu trả lời là ban đêm.

Các lập trình viên cho rằng khoảng thời gian làm việc cho hiệu suất cao nhất chính là ban đêm. Họ chính là những cỗ máy biến cafe thành code hay các dòng lệnh. Tại sao vậy? Lý do đưa ra thật đơn giản, đó là khoảng thời gian yên tĩnh nhất, tránh phiền nhiễu xung quanh. Nhưng để tránh những điều đó họ chỉ cần đóng cửa lại là được. Phải chăng ban đêm còn có điều gì đặc biết thu hút các lập trình viên đến vậy?

  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

Nghề lập trình viên là một nghề mang tính chất sáng tạo, vì vậy có thể gói gọn vào những điều sau:

1. Lịch làm việc của lập trình viên

Lịch làm việc của những người chuyên làm công việc mang tính sáng tạo đòi hỏi phải tập trung toàn bộ tâm trí, chỉ cần vài phút sao nhãng là mất cả giờ đồng hồ làm việc quý giá. Công việc của lập trình viên cần đầu tư rất lớn về trí não và thời gian. Đây chính là lý do vì sao các lập trình viên rất khó chịu khi bị quấy rầy. Công việc của họ chỉ được thực hiện vào ban đêm khi người khác đã đi ngủ, bởi ban ngày công việc bị gián đoạn vì các lý do như đi gặp khách hàng, trả lời email hay điện thoại.

Indexeddb là gì? – Tất cả những điều cần biết

Ban đêm là thời điểm làm việc lý tưởng của lập trình viên

2. Cơ chế nghỉ ngơi của não bộ

Dù làm nghề gì thì đều cần được đi ngủ vào ban đêm và họ sẽ cảm thấy tỉnh táo hơn vào ban ngày. Lập trình viên cũng thế, họ không phải siêu nhân khi thức thâu đêm suốt sáng. Vậy tại sao họ không làm việc lúc cơ thể tỉnh táo nhất? Tại sao phải làm việc lúc não bộ cần nghỉ ngơi? Khi mệt mỏi não bộ cần phải tập trung và khi đó sự mệt mỏi sẽ giúp các lập trình viên tập trung cao hơn.

Khi uống các chất kích thích, não bộ trở nên hiếu động hơn và lúc đó lập trình viên thường dễ sao nhãng công việc của mình, thay vào đó họ lại chuyển sang đọc tin tức, kiểm tra email hoặc nghe nhạc. Trên thực tế, khi tràn trề năng lượng, não bộ lại không thể tập trung làm việc được. Ngược lại khi mệt mỏi, lập trình viên sẽ tập trung toàn bộ sức lực còn lại để viết code.

3. Ánh sáng từ màn hình máy tính

Ánh sáng xanh được tích hợp vào màn hình giúp người dùng nhìn thấy nội dung hiển thị trên đó được rõ hơn. Khi tiếp xúc quá lâu với ánh sáng xanh từ màn hình vào đêm, não sẽ tự động ngưng sản xuất melatonin, một loại hormone điều tiết giấc ngủ. Chỉ cần nhìn chằm chằm vào một nguồn sáng trong buổi tối là giấc ngủ bị trì hoãn. Lập trình viên có thể quên đi mệt mỏi cho đến tận 3h – 4h sáng bởi lúc đó mắt họ đang dán chặt vào cái màn hình máy tính. Với sự lặp đi lặp lại như vậy, các lập trình viên đã vô tình tạo cho mình một giờ sinh học khác.

Các lập trình viên thường làm việc vào ban đêm vì bộ não khi đó không có xu hướng tìm kiếm những điều phiền nhiễu xung quanh, ánh sáng của màn hình máy tính sẽ làm họ tỉnh táo hơn và vì họ không muốn bị áp đặt thời gian. Vẫn biết rằng làm việc ban đêm sẽ tập trung và đạt hiệu quả cao hơn. Tuy nhiên về lâu dài sẽ ảnh hưởng không nhỏ đến sức khỏe. Vì vậy dù công việc có cần sự yên tĩnh thế nào đi nữa thì các coder cũng nên dành vài tiếng ban đêm để nghỉ ngơi và thư giãn nhé.

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Cách chuyển nhanh toàn bộ công thức MathType sang Equation

Cách chuyển nhanh toàn bộ công thức MathType sang Equation

Bài viết được sự cho phép của blogchiasekienthuc.com

Trong bài viết chuyển đổi công thức qua lại giữa MathType và Equation Office mình đã hướng dẫn với các bạn khá chi tiết về cách chuyển đổi công thức MathType sang công thức Equation rồi.

Tuy nhiên, phải công tâm mà nói thì cách làm này còn khá là thủ công và nó chỉ áp dụng được với Word 2019 hoặc các phiên bản mới hơn mà thôi…

  7 lý do bạn không nên sử dụng TypeScript
  Học kiến thức căn bản TypeScript chỉ trong 30 phút

Biết được nhược điểm này nên mình đã giành khá nhiều thời gian và công sức để tìm hiểu thêm. Và cuối cùng, vào một ngày đẹp trời thì thần may mắn đã dơ tay và mỉm cưới với mình :))

Về cách làm thì chúng ta sẽ thực hiện “đánh lừa” Windows và Word là MathType không được cài đặt trên hệ thống. Khi đó hộp thoại Convert Equation to Office Math sẽ xuất hiện.

Hộp thoại này sẽ hỗ trợ chúng ta chuyển nhanh toàn bộ công thức MathType sang Equation một cách tự động hoàn toàn .

NOTE: Bài viết này được mình hướng dẫn trên hệ điều hành Windows 10, phiên bản Office 2019 và phần mềm MathType 7.4. Các bạn cũng có thể áp dụng tương tự đối với các phiên bản khác nhé !

#1. Các bước thực hiện chuyển công thức MathType sang Equation

+ Bước 1: Tắt hoàn toàn MathType nếu bạn đang mở và đóng luôn MathType chạy ngầm trong Taskbar nhé các bạn.

Trên thanh Taskbar, bạn hãy mở rộng các icon đang ẩn trên thanh Taskbar ra => nháy chuột phải vào icon biểu tượng MathType => và chọn Exit

cach-chuyen-cong-thuc-mathtype-sang-equation (1)

+ Bước 2: Tùy chỉnh hiển thị phần mở rộng của tệp tin.

Thực hiện: Bạn mở File Explorer ra (nhấn tổ hợp Windows + E) => chọn View => đánh dấu chọn vào dòng File name extensions..

Nếu không thực hiện được thì bạn có thể xem các bước hướng dẫn chi tiết trong bài viết này nhé: Làm thế nào để hiển thị đuôi file trên Windows XP/ 7/ 8/ 10

cach-chuyen-cong-thuc-mathtype-sang-equation (2)

+ Bước 3: Tìm đến file thực thi MathType.exe

  • Cách 1: Nháy chuột phải vào icon biểu tượng MathType trên màn hình Desktop => chọn Open file location

cach-chuyen-cong-thuc-mathtype-sang-equation (3)

  • Cách 2: Trường hợp biểu tượng MathType của bạn không xuất hiện trên màn hình nền thì bạn có thể tìm theo đường dẫn sau: This PC hoặc Computer (Windows + E) => System (C:) => Program Files (x86) => MathType =>..

cach-chuyen-cong-thuc-mathtype-sang-equation (4)

Trong đó thì:

  • System ở đây là tên ô C – ổ chứa hệ điều hành của mình.
  • Nếu không tìm thấy thư mục Program Files (x86) thì bạn hãy chọn thư mục Program File

+ Bước 4: Nháy chuột phải vào file MathType.exe => chọn Rename => thay đuôi exe thành txt như hình bên dưới.

cach-chuyen-cong-thuc-mathtype-sang-equation (5)

+ Bước 5: Nhấn phím Enter trên bàn phím => hộp thoại Rename xuất hiện với giao diện như hình bên dưới

Nội dung chính của hộp thoại là: Nếu bạn thay đổi phần mở rộng tên tệp, tệp có thể không sử dụng được. Bạn có chắc chắn muốn thay đổi nó không?

=> Nhấn chọn Yes để xác nhận việc thay đổi.

cach-chuyen-cong-thuc-mathtype-sang-equation (6)

+ Bước 6: Khởi động tệp tin *.docx có công thức mà bạn muốn chuyển đổi => nháy đúp chuột vào một công thức bất kì => hộp thoại Convert Equation to Office Math xuất hiện, khi đó bạn hãy đánh dấu chọn vào dòng Apply to all equations => chọn Yes là xong.

cach-chuyen-cong-thuc-mathtype-sang-equation (7)

Quá trình chuyển đổi sẽ tự động diễn ra, nhanh hay chậm thì sẽ phụ thuộc vào số lượng công thức và cấu hình máy tính của bạn. Đây kết quả sau khi chuyển vẫn đẹp và vẫn đúng theo các quy ước Toán học quốc tế.

cach-chuyen-cong-thuc-mathtype-sang-equation (8)

#2. Khôi phục lại MathType về mặc định

MathType hiện tại đã bị vô hiệu hóa (vì chúng ta đã đổi file *.exe thành *.txt), nên chúng ta không thể sử dụng nó để soạn thảo công thức được. Muốn sử dụng được bạn bạn khôi phục lại trước đã.

Cách thực hiện rất đơn giản bạn thôi, chỉ cần tìm đến tệp tin MathType.exe.txt => nháy chuột phải chọn Rename => và đổi lại thành định dạng *.exe là xong.

cach-chuyen-cong-thuc-mathtype-sang-equation (9)

#3. Lời kết

Như vậy là mình đã hướng dẫn xong cho bạn cách chuyển nhanh toàn bộ công thức MathType sang Equation một cách tự động rồi nhé. Rất là hữu ích phải không nào 🙂

Công thức được soạn bằng MathType là rất tốt, nó hoàn toàn đáp ứng được các quy ước và tiêu chuẩn Toán học của quốc tế

Vậy một câu hỏi được đặt ra là tại sao chúng ta cần phải chuyển công thức MathType sang công thức Equation? Câu trả lời rất đơn giản, việc chuyển đổi này chỉ diễn ra khi chúng ta cần sao chép công thức sang PowerPoint.

Nếu không chuyển công thức sang Equation thì khi dán vào PowerPoint trông nó sẽ rất xấu. Cụ thể thì công thức không tự động đồng bộ với Template. Ngoài ra, nếu cần định dạng lại màu chữ, cỡ chữ thì các thao tác thực hiện cũng khá phức tạp..

Okay, hi vọng là bài viết này sẽ hữu ích đối với bạn. Xin chào tạm biệt và hẹn gặp lại các bạn trong những bài viết tiếp theo !

Nhựt Nguyễn – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Selenium: Chọn ngày tháng từ calendar

Selenium: Chọn ngày tháng từ calendar

Bài viết được sự cho phép của tác giả To Thi Van Anh

Sau một thời gian trôi nổi qua các chủ đề, hôm nay mình lại quay lại Selenium đây 😀 thỉnh thoảng đảo gió cho có thêm nguồn năng lượng mới cái!.

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  Selenium là gì? Giới thiệu chi tiết về Selenium Automation Testing

Có một loại element bạn sẽ rất hay gặp ở một số trang như đặt vé máy bay hoặc là đặt phòng khách sạn nhà hàng, vầng đó là chọn ngày tháng năm. Trên trang web sẽ có một hay một vài trường khi mà bạn click vào đó nó sẽ hiện ra một bảng ngày tháng (gọi là calendar), việc của bạn là chọn một giá trị ngày tháng bất kì nào đó, và thay vì bạn chọn bằng tay lần này qua lần khác, thì bây giờ sẽ là viết code selnium để nó chọn cho bạn mỗi lần bạn chạy test. Bạn sẽ làm như thế nào?

calendar_ex

Tìm hiểu vấn đề

Lướt sơ qua một số các nhập dữ liệu kiểu này, thì có thể có hai trường hợp và thực hiện như sau:

1. Bạn có thể sendkey trực tiếp vào trường ngày tháng đó một giá trị bất kỳ nào đó đúng format quy định là được.

2. Click vào trường đó, thực hiện next, back tháng tùy ý, sau đó chọn 1 giá trị ngày bất kỳ nào đó của tháng, dữ liệu sẽ được fill theo đúng giá trị bạn vừa chọn vào ô text.

Với cách đầu tiên thì quá đơn giản rồi, mình không nói đến nữa, vì nếu làm cách đó thì việc duy nhất bạn cần phải chú ý chỉ là nhập đúng format của ngày tháng cho trường đó là được, nhưng phải lưu ý là không phải chỗ nào cũng dùng cách đó được đâu nha, vì vậy trước khi quyết định phải xem các thuộc tính, kiểu html của trường dữ liệu trước đã nhé! 😀

Với cách thứ hai, cũng có nhiều hướng giải quyết, nhưng hôm nay mình sẽ chia sẻ với các bạn một cách mà mình nghĩ rằng nó cũng khá ổn, thông qua ví dụ cụ thể dưới này.

Giải quyết vấn đề

Để minh họa cho cách làm thứ hai, mình sẽ sử dụng trang web về du lịch có link nhu sau: https://www.path2usa.com/travel-companions

Đầu tiên, thực hiện click vào trường Date với cú pháp:

driver.findElement(By.id("travel_date")).click();

Tiếp theo, nhấn next chọn tháng – ở đây mình sẽ giả định trường hợp là chúng ta sẽ chọn ngày tháng sau ngày tháng hiện tại nên chỉ thực hiện nhấn next thôi, đối với các trường hợp khác thì bạn có thể kế hợp thêm một số các điều kiện cụ thể nào đó, để back, next cho phù hợp thôi.

Inspect element, ta có html, cssClass như phía dưới:

date

Và giờ sẽ làm gì với chỗ này, ta có thể lấy thông tin tháng đang hiển thị trên trang để thực hiện so sánh với giá trị tháng ta muốn chọn. Nếu giá trị lấy ra này không bằng giá trị mong muốn thì ta sẽ thực hiện nhấn next cho đến khi đúng thì thôi 😀

Mình muốn chọn tháng đi là tháng 5 (May) – lưu ý trên web hiển thị như thế nào thì mình sử dụng giá trị với kiểu viết như thế nha, ở đây các tháng hiển thị theo tên tiếng anh thì mình sẽ dùng đúng tên tiếng anh của tháng 5 – May.

Mình sẽ thực hiện nhấn next cho đến khi nào giá trị tháng mong muốn lấy ra đúng thì thôi, nên là mình sẽ dùng vòng lặp while. Đơn giản dễ hiểu hơn đó là: vòng while cứ lặp đi lặp lại, và nếu như đoạn text lấy ra được vẫn khác May sau mỗi lần lặp thì lại click nút next 1 lần, sau đó lại getText rồi lại so sánh:

While (!driver.findElement(By.cssSelector 
         (".datepicker-days .datepicker-switch")).getText().contains("May"))
{
   btnNext.click();
}

Vòng lặp này sẽ dừng khi mà nó tìm được đúng tên tháng của mình ở trên kia – là May. 😀

Sau khi chọn được tháng rồi, thì chọn ngày trong tháng đó. Các bạn xem html dưới này nhé:

day

Ta có thứ, tuần nằm trong thẻ <tr>, và với ngày cụ thể sẽ nằm trong thẻ <td> tương ứng với <tr>. Các bạn có thể thực hiện inspect trực tiếp trên trình duyệt của các bạn để xem cho trực quan.

Công việc của chúng ta ở bước này chỉ là thực hiện click vào một ngày cụ thể nào đó, tuy nhiên vấn đề là không có id duy nhất cho từng ngày, mà chỉ có thông tin về class thôi. Muốn chọn được một ngày duy nhất nào đó, các bạn có thể sử dụng xpath tuyệt đối của nó, nhưng mình không khuyến khích cách này đâu! 😀

Ở đây thì mình sẽ thực hiện như sau:

1. Ta sẽ lấy ra danh sách các ngày của tháng này theo cssClass:

List<WebElement> dates = driver.findElements(By.cssSelector(".day"));
int count = dates.size();

2. Sau đó duyệt qua tất cả các ngày lấy được, so sánh với giá trị ngày mong muốn, nếu nó đúng là ngày cần lấy rồi thì thực hiện click vào ngày đó, như phía dưới này của mình là ngày 10 – các bạn cũng có thể sử dụng biến và cho nó ra ngoài, rồi thay bằng giá trị khác tùy ý:

for (int i = 0; i < count; i++){ 
    String text = driver.findElements(By.cssSelector(".day"))
        .get(i).getText();
    if (text.equalsIgnoreCase("10")){
         driver.findElements(By.cssSelector(".day")).get(i).click();
         break;
     }
}

Khi đã tìm được rồi thì không cần phải tìm tiếp nữa, nên sẽ dùng break để ra khỏi vòng lặp for luôn nhé!

Code đầy đủ thì bạn chỉ cần copy theo từng đoạn trên này rồi ghép lại, thêm thư viện là chạy được thôi ah. 😀

Vậy là chỉ với những bước đơn giản như trên bạn đã có thêm một cách để chọn ngày tháng từ calendar rồi, 😀 Hi vọng bài viết này hữu ích trong quá trình thực hành và sử dụng selenium cho tất cả các bạn! hehe

Tuần mới nhiều niềm vui nhé!

Bài viết gốc được đăng tải tại vananhtooo.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Gọi các object của Autowired Collections theo thứ tự trong Spring Framework

Gọi các object của Autowired Collections theo thứ tự trong Spring Framework

Bài viết được sự cho phép của smartjob.vn

Đây là tính năng mới bổ sung từ phiên bản 4.0 của Spring Framework. Chúng ta có một Collections chứa các bean (mỗi bean này đều được gán annotation @Autowired ). Để xếp thứ tự xử lý khởi tạo object từ bean, ta gán Annotation @Order  đứng trước bean kèm theo số thứ tự được gọi đến. Số thứ tự này không nhất thiết phải theo tuần tự 1,2,3…. chúng ta có thể gán thứ tự 1, 5, 9, 42, v…

  04 Điều Cần Chú Ý Cho Người Mới Làm Automation Test
  Automation skills cho tester già mà lười

Chúng tôi sử dụng các công cụ, thư viện mới nhất tại thời điểm viết bài, cùng với định hướng sử dụng các best-practice khi viết mã nguồn.
Công cụ
– IntelliJ IDEA 2016.1.2
– Gradle build system 2.13

Thư viện:
– Spring Framework version 4.2.6.RELEASE (spring-core, spring-context)

Khởi tạo project:

Khai báo GAV (Group – ArtifactId – Version) cho ứng dụng đang thực hiện

Thiết lập các tùy chọn liên quan đến Gradle build system

Khuôn mẫu project sử dụng Gradle build system mà bạn thấy là chưa đầy đủ. Bạn cần tạo thêm 7 thư mục mới (src, main, test, java, resources) theo cấu trúc quy ước như sau:

Bởi vì bạn làm đúng theo quy ước, nên sau khi thêm thư mục mới vào project, các icon thư mục tự chuyển sang hình icon khác, trực quan, tương ứng với mục đích sử dụng.

Sửa lại file build.gradle trở thành:

  • Tại dòng 1, Khai báo ứng dụng autowiredOrder thuộc nhóm các ứng dụng do SmartJob.vn sản xuất.
  • Tại dòng 2, Khai báo phiên bản ứng dụng autowiredOrder là 1.0.0 và đang trong quá trình phát triển. Hậu tố -SNAPSHOT nhắc nhở build system (Gradle hoặc Maven) rằng luôn phải gọi ra autowiredOrder (với tư cách là một dependency) mới mỗi lần sử dụng (không sử dụng dữ liệu cache), do ứng dụng đang trong quá trình phát triển.
  • Tại dòng 6, Khai báo môi trường thực thi ứng dụng là Java 8, nếu môi trường thực thi (server, PC) sử dụng Java 7 chẳng hạn, ứng dụng autowiredOrder sẽ không chạy được. Và tất nhiên, khi môi trường thực thi là Java 8 thì bạn phải sử dụng Java từ phiên bản 8 trở lên để biên dịch cũng như đóng gói ứng dụng.
  • Tại dòng 13 và 14, ứng dụng sử dụng dependency spring-core và spring-context với phiên bản mới nhất hiện tại 4.2.6.RELEASE

class Company . Một công ty sẽ đăng tuyển nhiều job. List job được gán annotation @Autowired để Spring Framework nhận diện đối tượng được Autowire, được gọi ra ở dòng 11 trong class App : Company company = applicationContext.getBean(Company.class);

Class Job

Mỗi job sẽ được sắp xếp, phân nhóm theo các chuyên môn khác nhau. Dưới đây chúng ta tạo 3 loại job là JavaJob , PHPJob , CsharpJob . Các job đều có điểm chung nhất định và kết thừa từ abstract class Job .

Class JavaJob

Class PHPJob

Class CsharpJob

Như đã nói trong bài viết Kỹ thuật Autowiring sử dụng annotation trong Spring Framework, có 3 cách để Autowire bean. Trong bài viết này chúng ta cấu hình sử dụng code Java bởi class có tên là   Config  (cách đặt tên là tùy chọn)

Class ứng dụng chính App

Chúng ta thấy thứ tự xuất hiện là: CsharpJob, JavaJob và cuối cùng là PHPJob, tương ứng với giá trị Order  của chúng là 2, 3 và 42.

Download source code: autowiredOrder hoặc clone/fork từ GitHub: https://github.com/SmartJobVN/autowiredOrder

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Jobs Developer hấp dẫn trên TopDev

The solution for Nearest Neighbors Search – Part 1

The solution for Nearest Neighbors Search – Part 1

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Nearest Neighbors Search (Tìm kiếm người hàng xóm gần nhất trong khu dân cư) là bài toán phổ biến được nhiều người biết tới. Vấn đề đặt ra trong bài toán này cũng là vấn đề mà các hãng gọi xe lớn như Grab, Uber, GoJerk đã giải quyết.

Đặt xe ở vị trí A, tìm tài xế gần nhất trong phạm vi 3km hoặc mở rộng hơn nếu không có tài xế.

  Cài đặt Elasticsearch trên CentOS
  Function-Score trong Elasticsearch

Giải quyết tốt bài toán này cho ta phương án hoàn hảo để thiết kế các hệ thống lớn như đặt xe với Uber hay Lift. Phát triển các ứng dụng hẹn hò dựa theo vị trí như Tinder, …

1. Về Nearest Neighbors Search

Nearest Neighbors Search is the optimization problem of finding the point in a given set that is closest (or most similar) to a given point. Closeness is typically expressed in terms of a dissimilarity function: the less similar the objects, the larger the function values.

Nearest Neighbors Search là bài toán tối ưu tìm kiếm một điểm gần nhất (hoặc tương tự như vậy) khi đã có một điểm xác định trước. Mức độ tìm kiếm thường được thể hiện dưới dạng hàm không giống nhau: các đối tượng càng ít giống nhau, giá trị hàm càng lớn.

Nearest Neighbors Search

Về độ rộng của square tìm kiếm, có thể là circle (tròn) hoặc rectrangle (vuông). Tìm kiếm một hoặc tất cả các điểm trong phạm vi đã được định sẵn. Solution cơ bản nhất để giải quyết bài toán này là tìm kiếm theo hệ trục tọa độ x,y

Nearest Neighbors Search

Tìm kiếm tất cả các điểm nằm trong khoảng từ x1 -> x2 và từ y1 -> y2.

2. SQL Database và Binary Search Tree

Trường hợp sử dụng SQL Database relation, ta có thể lưu toàn bộ x,y với table id

id || X || y
unique || lattitude || longitude

Lúc này, nếu muốn tìm kiếm một point trong circle hay retrangle, có thể sử dụng SQL BETWEEN. Cách làm này ổn với điều kiện dữ liệu tìm kiếm không quá lớn. Nếu tập dữ liệu tìm kiếm lớn và không gian tìm kiếm rộng, slowdown peformance là chuyện đương nhiên và có thể nhìn thấy trước được.

SELECT id FROM table WHERE x BETWEEN x1 AND x2 AND y BETWEEN y1 AND y2

Một cách khác có thể sử dụng cho bài toán Nearest Neighbors Search là sử dụng Binary Search Tree (BST).

Nearest Neighbors SearchNguồn ảnh / Source: geeksforgeeks.org

Với BST, bài toán chuyển thành Find the closest element. Tìm node có giá trị gần nhất với giá trị input.

// For above binary search tree
Input : k = 4
Output : 4

Input : k = 18
Output : 17

Input : k = 12
Output : 9

Áp dụng Sort trên BST, ta có phương án giải quyết

  • If target value K is present in given BST, then it’s the node having minimum absolute difference.
  • If target value K is less than the value of current node then move to the left child.
  • If target value K is greater than the value of current node then move to the right child.
  • Nếu giá K tồn tại trên BST, thì bản thân Node đó là node có độ sai lệnh nhỏ nhất
  • Nếu K nhỏ hơn giá tị Node hiện tại, di chuyển nó về phía bên trái của cây BST
  • Nếu giá trị K lớn hơn giá tị Node hiện tại, di chuyển nó phía bên phải của cây BST

3. Giải pháp khác?

Cả hai solutions SQL Database và Binary Search Tree đều là giải pháp cơ bản để giải quyết bài toán Nearest Neighbors Search. Tuy nhiên, với lượng dữ liệu lớn và tần suất tìm kiếm cao.

Rõ ràng ta cần một giải pháp tốt hơn để giới hạn không gian tìm kiếm. Giới hạn được không gian tìm kiếm sẽ tăng tốc thời gian phản hồi. Giải pháp khác được đề cập tới ở đây là R-Trees (Range Querying).

Solution sử dụng R-Trees sẽ được viết ở bài viết thứ hai trên Kieblog.

4. Tham khảo

My pleasure when you’re here to read – Have a good mood – Happy Coding!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

4 vấn đề của React mà ở trường có thể không dạy bạn

react developing
4 vấn đề của React mà ở trường có thể không dạy bạn

Tác giả: Reed Barger

1. Trạng thái React – React state thực sự được cập nhật như thế nào?

Là một React devs, bạn biết rằng trạng thái đó có thể được tạo và cập nhật với useStateuseReducerhook.

Nhưng điều gì sẽ xảy ra chính xác khi bạn cập nhật trạng thái của một thành phần bằng một trong số các hooks? Trạng thái được cập nhật ngay lập tức hay được thực hiện sau đó?

Tìm việc làm lập trình viên React

Hãy xem đoạn code sau, đây là một ứng dụng truy cập rất đơn giản. Như bạn mong đợi, bạn có thể nhấp vào nút và bộ đếm tăng lên 1.

import React from 'react';

export default function App() {
  const [count, setCount] = React.useState(0)

  function addOne() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>Count: {count}</h1> {/* 1 (as we expect) */}

      <button onClick={addOne}>+ 1</button>
    </div>
  );
}

Nhưng điều gì sẽ xảy ra nếu chúng ta cố gắng thêm một dòng bổ sung, dòng này cũng cập nhật số lượng của chúng ta? Khi bạn nhấp vào nút, số lượng hiển thị của chúng tôi sẽ tăng lên một hay hai?

import React from 'react';

export default function App() {
  const [count, setCount] = React.useState(0)

  function addOne() {
    setCount(count + 1);
    setCount(count + 1);
  }

  return (
    <div>
      <h1>Count: {count}</h1> {/* 1?! */}

      <button onClick={addOne}>+ 1</button>
    </div>
  );
}

Nếu chạy đoạn code này, nó chỉ tăng lên một! Mặc dù đã cố gắng tăng số lượng lên một hai lần, với hai bản cập nhật trạng thái riêng biệt.

Tại sao bộ đếm này hiển thị 1, mặc dù trạng thái tăng rõ ràng 1 hai lần?

Lý do là khi React developing việc lên lịch thực hiện cập nhật trạng thái khi chúng ta cập nhật trạng thái lần đầu tiên. Bởi vì nó chỉ được lên lịch và không được thực hiện ngay lập tức (không đồng bộ), count không được cập nhật trước khi chúng tôi cố gắng cập nhật nó lần thứ hai.

Nói cách khác, bởi vì cập nhật trạng thái được lên lịch, không được thực hiện ngay lập tức, lần thứ hai gọi setCount, count vẫn chỉ là 0, không phải 1.

Cách mà chúng ta có thể sửa lỗi này để cập nhật trạng thái một cách đáng tin cậy, mặc dù các cập nhật trạng thái là không đồng bộ, là sử dụng hàm bên trong có sẵn trong hàm useState setter.

Điều này cho phép chúng ta lấy trạng thái trước đó và trả về giá trị mà chúng ta muốn nó ở trong phần thân của hàm bên trong. Khi sử dụng mẫu này, bạn sẽ thấy rằng nó tăng lên hai như mong muốn ban đầu

import React from 'react';

export default function App() {
  const [count, setCount] = React.useState(0)

  function addOne() {
    setCount(prevCount => prevCount + 1); // 1
    setCount(prevCount => prevCount + 1); // 2
  }

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={addOne}>+ 1</button>
    </div>
  );
}
  3 bước tối ưu hiệu năng React App bằng các API mới của React
  5 dự án React buộc phải có trong porfolio của bạn

2. Sử dụng nhiều hiệu ứng để có kết quả tốt hơn

Khi sử dụng một hiệu ứng, hầu hết khi React developing, các developer sẽ chỉ sử dụng một useEffect và cố gắng thực hiện nhiều hiệu ứng khác trong cùng một hàm hiệu ứng. Bạn có thể quan sát điều đó thông qua đoạn code dưới đây

import React from "react";

export default function App() {
  const [posts, setPosts] = React.useState([]);
  const [comments, setComments] = React.useState([]);

  React.useEffect(() => {
    // fetching post data
    fetch("https://jsonplaceholder.typicode.com/posts")
      .then((res) => res.json())
      .then((data) => setPosts(data));

    // fetching comments data
    fetch("https://jsonplaceholder.typicode.com/comments")
      .then((res) => res.json())
      .then((data) => setComments(data));
  }, []);

  return (
    <div>
      <PostsList posts={posts} />
      <CommentsList comments={comments} />
    </div>
  );
}

Thay vì cố gắng nhồi nhét tất cả các hiệu ứng phụ vào các chi tiết của một hiệu ứng chính, cũng như có thể sử dụng một hook trạng thái nhiều lần, bạn có thể sử dụng nhiều hiệu ứng hơn. Việc này sẽ giúp React hooks mang lại so với việc sử dụng các phương thức vòng đời – lifecycle methods trong các thành phần lớp.

Ví dụ với hàm componentDidMount, cần phải bao gồm bất kỳ hành động nào mà bạn muốn thực hiện sau khi các thành phần được gắn kết. Bạn không thể chia nhỏ các hiệu ứng phụ của mình thành nhiều phương thức – mỗi phương thức vòng đời trong các class có thể được sử dụng một lần và chỉ một lần.

Lợi ích chính của React hooks là có thể chia nhỏ code dựa trên những gì nó đang làm. Nó không chỉ có thể tách các hành động mà còn đang thực hiện sau khi kết xuất thành nhiều hiệu ứng mà còn có thể đồng định vị trạng thái của mình

import React from "react";

export default function App() {
  const [posts, setPosts] = React.useState([]);
  React.useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/posts")
      .then((res) => res.json())
      .then((data) => setPosts(data));
  }, []);

  const [comments, setComments] = React.useState([]);
  React.useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/comments")
      .then((res) => res.json())
      .then((data) => setComments(data));
  }, []);

  return (
    <div>
      <PostsList posts={posts} />
      <CommentsList comments={comments} />
    </div>
  );
}

3. Không tối ưu hóa các chức năng cập nhật trạng thái (useState, useReducer)

Một nhiệm vụ phổ biến bất cứ khi nào chúng ta truyền một hàm gọi lại từ thành phần mẹ sang thành phần con là ngăn nó được tạo lại, trừ khi các đối số của nó đã thay đổi.

Có thể thực hiện việc tối ưu hóa này với sự hỗ trợ của useCallback hook.

useCallback được đặc biệt tạo ra cho các hàm gọi lại được chuyển cho các thành phần con, để đảm bảo rằng chúng không được tạo lại một cách không cần thiết, điều này dẫn đến việc ảnh hưởng đến hiệu suất đối với các thành phần bất cứ khi nào có kết xuất lại.

Điều này là do bất cứ khi nào parent component kết xuất lại, nó sẽ khiến tất cả các child components cũng hiển thị lại. Đây là nguyên nhân khiến các hàm callback được tạo lại trên mỗi lần hiển thị.

Tuy nhiên, nếu chúng ta đang sử dụng một hàm setter để cập nhật trạng thái mà chúng ta đã tạo bằng hook useState hoặc useReducer, chúng ta không cần kết thúc điều đó với useCallback.

Nói cách khác, không cần phải làm điều này:

import React from "react";

export default function App() {
  const [text, setText] = React.useState("")

  // Don't wrap setText in useCallback (it won't change as is)
  const handleSetText = React.useCallback((event) => {
    setText(event.target.value);
  }, [])

  return (
    <form>
      <Input text={text} handleSetText={handleSetText} />
      <button type="submit">Submit</button>
    </form>
  );
}

function Input({ text, handleSetText }) {
  return(
    <input type="text" value={text} onChange={handleSetText}  />
  )
}

4. useRef hook có thể duy trì trạng thái qua các lần hiển thị

Là các React devs và khi thực hiện việc lập trình với React developing sẽ rất hữu ích khi có thể tham chiếu đến một phần tử React nhất định với sự trợ giúp của một ref. Chúng tôi tạo các ref trong React với sự trợ giúp của useRef hook. Tuy nhiên, điều quan trọng cần lưu ý với useRef là không chỉ hữu ích cho việc tham chiếu đến một phần tử DOM nhất định.

Có một số lợi ích nhất định để có thể lưu trữ và cập nhật các giá trị useRef. Nó cho phép lưu trữ một giá trị không có trong bộ nhớ mà sẽ không bị xóa khi hiển thị lại.

Nếu muốn theo dõi một giá trị qua các lần hiển thị với sự trợ giúp của một biến đơn giản, nó sẽ được khởi động lại mỗi khi thành phần hiển thị. Tuy nhiên, nếu bạn sử dụng một tham chiếu, giá trị được lưu trữ trong đó sẽ không đổi trong các lần hiển thị thành phần.

import React from "react";

export default function App() {
  const [count, setCount] = React.useState(0);
  const ref = React.useRef({ hasRendered: false });

  React.useEffect(() => {
    if (!ref.current.hasRendered) {
      ref.current.hasRendered = true;
      console.log("perform action only once!");
    }
  }, []);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Count: {count}</button>
    </div>
  );
}

Bài viết gốc đăng tải tại freecodecamp.org

Có thể bạn quan tâm:

Xem thêm Việc làm React hấp dẫn trên TopDev

Observer pattern là gì? – Nhất trụ kình thiên

Observer pattern là gì? – Nhất trụ kình thiên

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Hôm rồi có đứa em đi phỏng vấn, câu hỏi về Observer Pattern. Không có gì để nói nếu tới cái “main content” của pattern này nó cũng không nắm được. BỨC XÚC QUÁ!

Ngồi viết bài này chia sẻ với các “chư vị đồng môn”. Thứ nhất là về Observer pattern, hai nữa là cách học một pattern, áp dụng thực tiễn. Một số ông vừa mới nghĩ tới Design Pattern thôi đã toát mồ hôi hột, đi phỏng vấn được hỏi câu hỏi về Design Pattern run cầm cập, trả lời ú ớ.

  Design pattern là gì? Tại sao nên sử dụng Design pattern?
  Giới thiệu Abstract Factory Pattern

Nhưng thực chất người phỏng vấn không hề yêu cầu cao tới mức lên bảng cầm bút implement một design pattern hoàn chỉnh, cái người interview cần là cái concept của design pattern đó. Nắm được để biết trong tình huống (situatation) nào thì dùng pattern nào cho phù hợp. Còn lúc implement thì research, chả sao cả, gõ đúng keyword thôi.

Tại sao một Software Engineer tầm cỡ lại cần biết hết Design Pattern?. Vì nó là những mẫu thiết kế chuẩn mực đã được đúc kết từ trước, qua rất nhiều lần implement sai, những hệ thống “banh xa lông”, người ta mới rút ra được pattern đó.

1. Bắt đầu từ cái tên

Observer pattern – tách ra thành hai cái, ob và serverOb ở đây là object (đối tượng). Còn server?, server ở đây là hướng về cái đối tượng trung tâm, ví như server. Mấy cái rìa rìa là client bên ngoài

Cũng là Behavior Pattern, nhắc tới là nhớ ngay cái pattern đó làm gì?, điển hình là cái Iterator Pattern – Đôi điều thú vị từ Kieblog. Nhìn cái chữ Iterator thôi là nhớ cái main content là loop, cái pattern này chắc chắn design ra để hỗ trỡ cái việc loop.

Đấy, chỉ cần nhớ cái concept vậy thôi là chả bao giờ sợ quên design pattern.

2. Định nghĩa về Observer pattern

Nhớ mãi không quên cái tên pattern rồi. Giờ đi vào detail, chứ nhớ không vậy thì cũng không ổn. Phải nắm rõ 2 thứ:

  • Khi nào sử dụng?, sử dụng như thế nào?
  • Điểm mạnh, điểm yếu

Observer Pattern là dạng pattern hành vi (Behavior Pattern). Định nghĩa:

Observer is a behavioral design pattern that lets you define a subscription mechanism to notify multiple objects about any events that happen to the object they’re observing.

Observer là pattern hành vi, giúp chúng ta xác định cơ chế đăng kí để thông báo tới nhiều object về bất kì sự kiện nào xảy ra với đối tượng mà chúng đang đăng kí

Hơn nữa, do là Behavior Pattern nên Observer là mối quan hệ one to many relationship. Một ông ở giữa trụ, một trụ chống trời!

2.1 Bài toán thực tế

Bài toán thực tế. Có 10 người trong một khu dân cứ muốn mua iPhone 12 ở cửa hàng trung tâm khu dân cư.

Nếu cửa hàng không có cơ chế gì thông báo qua phone, qua mail, mỗi người sẽ tới hỏi cửa hàng một vài lần. Câu trả lời là có, chưa có, có chưa có. Không ổn!

Nếu cửa hàng gửi thông báo cho tất cả 10 người về việc có iPhone mới?. Ổn, nhưng gửi thông báo iPhone 11 cho cả 10 người thì người ta chửi sml. Ông X giàu tổ bố, nên chỉ thích 12, 11 đ’ đủ tuổi. Ông Y mẹ bán vàng, gia cảnh nghèo hơn, chỉ thích 8 Plus, nên thông báo về 12 ổng cũng la bm.

Từ bài toán thực tế này (chém thế chứ méo biết có phải không), Observer Pattern ra đời. Chỉ gửi notification cho những người đăng kí quan sát đối tượng (Objects) đó, ngoài ra không gửi, không mang tiếng spam.

2.2 Hiện thực ý tưởng

Đã có ý tưởng thế, pattern này chia thành hai thành phần chính là Publisher và Subscribers

  • Publisher: quản lý sự kiện mới (có notifi, có object mới). Sẽ publish thông tin đó ra cho subscribler.
  • Subscribers: ông này thì dễ hiểu rồi, như subscribers Youtube (ấn chuông), khi nào có video mới thì nó bắn notification lên. Chuẩn bài dễ hiểu!

Chi tiết hơn nha.

Đầu tiên, thằng Publisher. Trong Observer Pattern thì thằng Thằng này có 3 method: đăng kí (subscribe), bỏ đăng kí (unsubscribe) và thông báo (notify).

// Source code: refactoring.guru - observer pattern
public class EventManager {
Map<String, List<EventListener>> listeners = new HashMap<>();

public EventManager(String... operations) {
for (String operation : operations) {
this.listeners.put(operation, new ArrayList<>());
}
}

public void subscribe(String eventType, EventListener listener) {
List<EventListener> users = listeners.get(eventType);
users.add(listener);
}

public void unsubscribe(String eventType, EventListener listener) {
List<EventListener> users = listeners.get(eventType);
users.remove(listener);
}

public void notify(String eventType, File file) {
List<EventListener> users = listeners.get(eventType);
for (EventListener listener : users) {
listener.update(eventType, file);
}
}
}

Thằng Subscriber chỉ là một interface, tất cả những thằng nào đăng kí với Publisher đều implement cái interface này.

// Source code: refactoring.guru - observer pattern
package refactoring_guru.observer.example.listeners;

import java.io.File;

// Chỉ là interface, ông nào đăng kí thì implement interface này
public interface EventListener {
void update(String eventType, File file);
}

The Subscriber interface declares the notification interface. In most cases, it consists of a single update method.

Subscriber interface sẽ định nghĩa notification interface. Trong hầu hết các trường hợp, nó chỉ có duy nhất một method update.

Cuối cùng là ông Concrete Subscribers – ông này là người đăng kí cuối cùng. Ông này thì implement interface Subscribers. Ngoài ra còn override method update, tùy cơ ứng biến cho từng trường hợp. Khá linh động

// Source code: refactoring.guru - observer pattern
public class EmailNotificationListener implements EventListener {
private String email;

public EmailNotificationListener(String email) {
this.email = email;
}
// Override lại method update, tùy cơ ứng biến khi có thay đổi từ Publisher
@Override
public void update(String eventType, File file) {
System.out.println("Email to " + email + ": Someone has performed " + eventType + " operation with the following file: " + file.getName());
}
}

Ta cũng có ông Editor để implement các method sẽ gọi notify(), thông báo tới tất cả Subscriber

// Source code: refactoring.guru - observer pattern
package refactoring_guru.observer.example.editor;

import refactoring_guru.observer.example.publisher.EventManager;

import java.io.File;

public class Editor {
public EventManager events;
private File file;

public Editor() {
this.events = new EventManager("open", "save");
}
// Actions method đăng kí gọi notify
public void openFile(String filePath) {
this.file = new File(filePath);
events.notify("open", file);
}
// Actions method đăng kí gọi notify
public void saveFile() throws Exception {
if (this.file != null) {
events.notify("save", file);
} else {
throw new Exception("Please open a file first.");
}
}
}

Cuối cùng, main method chỉ việc đăng kí các event và gọi actions.

public class Demo {
public static void main(String[] args) {
Editor editor = new Editor();

// Đăng kí loại event và các actions muốn làm với event đó
editor.events.subscribe("open", new LogOpenListener("/path/to/log/file.txt"));
editor.events.subscribe("save", new EmailNotificationListener("admin@example.com"));

try {
// Gọi tới notify để thông báo tới các subscriber
editor.openFile("test.txt");
editor.saveFile();
} catch (Exception e) {
e.printStackTrace();
}
}
}

3. Ưu nhược điểm

Ưu điểm lớn nhất ở Observer Pattern là khi có thay đổi ở Subscribler sẽ không ảnh hưởng tới Publisher. Cái này vô cùng quan trọng, mỗi channel trên Youtube đôi khi tới cả triệu lượt theo dõi.

Nếu một thay đổi ở Subscriber đều cần update tới Publisher thì toang, toang thật sự.

Open/Closed Principle. You can introduce new subscriber classes without having to change the publisher’s code.

Có thể thêm mới một class subscriber mà không cần phải thay đổi gì code ở publisher.

Ngoài ra

You can establish relations between objects at runtime.

Với pattern này, ta còn có thể khởi tạo mối liên hệ giữa các object trong lúc runtime

4. Tham khảo

Đối với Java, trên Java 9 có thể sử dụng java.util.Observer. Trên Python thì sử dụng thông qua Pip pip install pattern-observer.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Kỹ thuật Autowiring sử dụng annotation trong Spring Framework

Kỹ thuật Autowiring sử dụng annotation trong Spring Framework

Bài viết được sự cho phép của smartjob.vn

Có 3 cách để autowiring trong Spring là:
– Sử dụng annotation
– Sử dụng code Java
– Cấu hình trong file XML.

  Bảo mật ứng dụng Java web bởi Spring Security
  10 Frameworks tốt nhất hiện nay cho PHP

Trong bài viết này giới thiệu đến các bạn kỹ thuật autowiring dùng annotation. Đây là cách autowiring nhanh, dễ thực hiện nhất, do chỉ cần đặt annotation @Autowired  trước phương thức set (dùng cho việc khởi tạo Object) (*) và đặt annotation @Service  trước class chứa phương thức (*).

Ví dụ dưới đây minh họa một giao dịch ngân hàng: chuyển tiền giữa 2 tài khoản.

Chuẩn bị công cụ:
– JDK 8 update 92 [1]
– IntelliJ IDEA 2016.1.2 [2]
– Maven 3.3.9 [3]
– Apache Tomcat 8.0.35 [4]
– Trình duyệt web (Google Chrome, Mozilla Firefox, v.v..)

Khởi tạo project:

Chọn project Maven từ archetype:

Khai báo 3 tham số GAV khởi tạo project (GAV: Group – ArtifactId – Version)

GroupId: vn.smartjob.demo
ArtifactId: demoSpring
Version: 1.0.0-SNAPSHOT (bạn nên dùng hậu tố -SNAPSHOT).

Đặt tên project và chọn thư mục lưu project:

Bạn sửa lại file pom.xml như sau:

Các dependency quan trọng đã được highlight trong mã nguồn bên trên (dòng 22, 27, 32, 37, 42). Thư viện đã được import tự động

Do project được tạo ra từ Maven archetype, do đó cần chỉnh sửa thêm. Bạn tạo thư mục java  để chứa mã nguồn.

Bạn cần thao tác này để IntelliJ IDEA nhận diện thư mục java là thư mục chứa source code.

Bạn sẽ tạo package (chứa các class Java) vào thư mục java vừa tạo ở trên.

Tạo thực thể tài khoản là Account:

Interface AccountDAO dùng làm khuôn dạng cho các phương thức truy vấn dữ liệu:

Triển khai class DAO thực tế:

Chúng ta có 2 tài khoản ngân hàng: Hoàng Thế Anh có 8 triệu đồng trong tài khoản (id = 1). Nguyễn Đức Hải có 4 triệu đồng trong tài khoản (id = 2). Để đảm bảo ví dụ minh họa không quá phực tạp, chúng ta không truy vấn vào cơ sở dữ liệu thực, mà sử dụng cơ sở dữ liệu mô phỏng, dạng HashMap. Các phương thức không liên quan đến CRUD (Creat- Read – Update – Delete) nguyên tử (mức nhỏ nhất của một truy vấn), sẽ xử lý bởi AccountService  và AccountServiceImpl .

File xml khai báo:

Tạo file beans.xml  trong thư mục resources:

Ứng dụng chính:

Dòng code 13 và 21 rất quan trọng, nó được highlight để bạn chú ý.

Download source code: annotation-based-autowiring . Bạn cũng có thể clone/fork từ Github: https://github.com/SmartJobVN/annotation-based-autowiring

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Jobs IT for Developer hấp dẫn trên TopDev

Trình duyệt ẩn danh có thực sự an toàn như bạn nghĩ?

Trình duyệt ẩn danh có thực sự an toàn như bạn nghĩ?

Bài viết được sự cho phép của blogchiasekienthuc.com

Internet và mạng xã hội đang ngày càng phát triển, kéo theo đó là nguy cơ dữ liệu cá nhân của người dùng dễ bị đánh cắp một cách bất hợp pháp.

Đồng ý là mạng xã hội nói riêng hay Internet nói chung là sự hòa nhập của cả thế giới, nhưng như thế không có nghĩa là chúng ta không có quyền giữ kín những thông tin cá nhân riêng tư !

  8 câu hỏi phỏng vấn dành cho các lập trình viên Mobile app
  Mười điều răn dành cho lập trình viên

Để đáp ứng cho nhu cầu đó thì rất nhiều trình duyệt web đã thêm tính năng lướt web ẩn danh cho người dùng, hay những phần mềm hỗ trợ ẩn danh trên Internet. Và thực tế thì chế độ ẩn danh này cũng đã xuất hiện từ rất lâu rồi.

trinh-duyet-an-danh-co-an-toan-khong (2)

#1. Trình duyệt web ẩn danh là gì?

Chế độ ẩn danh về bản chất là sẽ không lưu lại lịch sử duyệt web, cũng như dữ liệu cookie trên máy tính của bạn.

Nếu bạn nào có chút kiến thức về máy tính thì đều biết rằng, khi duyệt web ở chế độ thông thường thì những dữ liệu này sẽ nằm trên máy tính và có một thư mục nhất định để chứa nó. Mục đích là để giúp bạn lướt web nhanh hơn, thuận tiện hơn..

Việc không lưu lại dữ liệu duyệt web trên máy tính sẽ hạn chế tối đa việc các phần mềm gián điệp đang ngầm thu thập dữ liệu mà người dùng vô tình dính phải.

trinh-duyet-an-danh-co-an-toan-khong (1)

#2. Trình duyệt web ẩn danh liệu có thực sự an toàn?

Như mình đã nói ở trên, trình duyệt web ẩn danh chỉ đơn giản là không lưu lại dữ liệu trên máy tính của bạn.

Nhưng điều này không đồng nghĩa với việc nó sẽ không bị thu thập bởi các bên thứ ba: như là nhà mạng, các nhà quảng cáo hay thậm chí là chính trình duyệt web bạn đang sử dụng.

trinh-duyet-an-danh-co-an-toan-khong (1)

Về cơ bản thì khi bạn duyệt web, những đối tượng sau có thể biết được những dữ liệu duyệt web của bạn:

1. Nhà mạng: Nghe thì có vẻ hơi vô lý và có phần đổ oan cho nhà mạng nhỉ – nhưng thực tế là như vậy !

Nhà mạng hoàn toàn có thể truy được IP mà bạn đang sử dụng đã từng duyệt web như thế nào, thậm chí là làm gì trên đó. Điều này là hoàn toàn có thể !

Hãy nhớ rằng, các nhà mạng Việt Nam đã không ít lần chặn các trang web nước ngoài để người dùng không truy cập được, vậy nên việc nắm rõ mọi thông tin sử dụng của bạn trên Internet là điều hoàn toàn có thể.

Và thông qua những việc xử lý tội phạm công nghệ cao trên Internet thì bạn cũng đủ hiểu được vấn đề rồi đúng không 🙂

Tuy nhiên, mình chỉ dám khẳng định là họ nắm rõ thôi, còn họ có sử dụng nó cho mục đích gì khác hay không thì mình chịu nhé 😀

2. Plugin (tiện ích mở rộng) cài trên trình duyệt: Như đã nói, ẩn danh chỉ ngăn dữ liệu không lưu trên máy tính, còn bản thân các Plugin thì đa số đều chạy qua hệ thống online, vậy nên vẫn có thể truy cập vào dữ liệu người dùng khi duyệt web.

3. Phần mềm được cài trên máy: Chắc hẳn các bạn đã không ít lần gặp trường hợp đột nhiên máy tính chạy chậm lại, hay việc lướt web bị chậm đi đáng kể, hoặc thậm chí là xuất hiện những quảng cáo vô cùng lạ…

Hãy cẩn thận với những trường hợp này và ngay bây giờ, bạn hãy cài đặt phần mềm diệt virus đi nhé. Bởi máy tính của bạn rất có thể đã dính phần mềm quảng cáo độc hại và nó đang sử dụng đường truyền Internet của bạn đấy.

#3. Có cách nào để không bị lộ thông tin trên Internet không?

Nhiều bạn cho rằng nếu thực hiện Fake IP, hay thay đổi DSN…..là có thể thoát được. Nhưng mình xin khẳng định là bạn có làm gì đi chăng nữa thì bạn cũng không thoát được đâu.

trinh-duyet-an-danh-co-an-toan-khong (3)

Nói đơn giản thế này cho các bạn dễ hiểu nhé, đôi lúc chúng ta sẽ thấy báo đài thông tin về việc điều tra các hacker tấn công vào các web chính phủ, và kết quả như thế nào thì các bạn cũng đều đã biết rồi, họ đã truy ra được nhóm nào, thậm chí là ở khu vực nào…

Đấy! các bạn thấy không, hacker có trình độ cao như vậy, thậm chí được nuôi bởi chính phủ mà vẫn bị truy vết thì không có gì là không được với dân đen chúng ta cả, những người mà kiến thức máy tính chỉ ở mức độ rất cơ bản.

Nói chung là sẽ truy vết được, vấn đề là ở mức độ nào mà thôi, họ có thực sự muốn truy ra bạn hay không thôi. Nhưng vềcơ bản thì việc Fake IP sẽ giúp cho những người dùng phổ thông an toàn hơn trên Internet.

Để hạn chế việc bị lộ thông tin thì về mặt lý thuyết, chúng ta hãy hạn chế cài những tiện ích mở rộng không an toàn, cài những phần mềm không rõ nguồn gốc, những phần mềm/ ứng dụng c.r.a.c.k…

Nhưng tất nhiên, đó chỉ là giải pháp tạm thời để tránh những thông tin của mình bị bên nào đó lợi dụng cho mục đích xấu mà thôi.

Nếu ví Internet như một con dao thì phần đông chúng ta đang cầm phần dao sắc nhọn, còn các nhà mạng đang cầm phần chuôi. Chúng ta chỉ có thể tuân thủ theo luật chơi do họ tạo ra mà thôi !

Có chăng, điều an ủi nhất là nếu không làm việc gì trái pháp luật thì những thông tin đó vốn biết cũng chẳng để làm gì cả (ý mình là đang nói nhà mạng nhé), còn với những kẻ có chủ đích xấu thì chúng ta cũng đành chịu.

#4. Lời Kết

Vâng, trên đấy là những quan điểm của mình về việc chế độ ẩn danh trên trình duyệt liệu có an toàn như chúng ta nghĩ hay không.

Có thể kết luân lại là, một khi đã tham gia vào môi trường Internet thì không thể giấu giếm hết những thứ riêng tư được – mà thay vào đó bạn hãy hạn chế tối đa việc để những thứ riêng tư lên Internet, vậy thôi !

Điều này cũng là lý do mà một số người nổi tiếng không sử dụng bất kì một mạng xã hội nào, vì họ hiểu rõ không thể nào giấu được nếu tham gia.

Lê Đinh Hoàng Vũ – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm tuyển dụng các it giỏi hấp dẫn trên TopDev