Bài viết được sự cho phép của tác giả Nguyễn Hoàng Phú Thịnh Chuyện là nhà mình có cái xô bể, chắp vá cũng được 7-8 lớp. Về bản chất, nó vẫn đựng nước được. Nhưng ngoài điểm đó ra, nó trông như đồ bỏ. Mẹ mình thì vẫn khoái dùng cái xô này, và không nỡ vứt nó đi :3 Nhưng mỗi lần về quê mình lại chẳng muốn dùng nó tí nào? Kỳ cục zậy đó? Cùng là một cái xô bể, nhưng có người muốn dùng, có người không. Đó là vấn đề của Quality of Service. Ánh xạ qua thế giới phần mềm, nó chính là Non-Functional Requirement 😎 1. Các loại requirement trong một dự án phần mềm Như anh em đã biết, hoặc chưa biết: một giải pháp, một sản phẩm, hay một phần mềm nào đó đều có các yêu cầu cụ thể (requirement) cho các giải pháp, sản phẩm hay phần mềm đó. Là một người làm Business Analyst, chúng ta sẽ làm [...]
Read more →Bài viết được sự cho phép của tác giả Duy Phan Đây là một khái niệm rất quan trọng trong Functional Programming. Ở đây mình sẽ cho ví dụ dựa trên Javascript, cụ thể là TypeScript, do đó mình hi vọng các bạn đã có một số kiến thức nhất định về JS trước. Điều này sẽ giúp bạn nắm bắt nội dung bài viết dễ dàng hơn. Higher order Function là gì? Higher order function không không phải là một khái niệm mới. Nó khá đặc thù và phổ biến trong Functional Programming. Concept đơn giản ở đây là một Function nhận một hoặc nhiều function khác làm tham số, sau đó trả về giá trị hoặc một function mới. Ví dụ, Javascript có hàm Array.filter. Đây là một higher order function, do nó nhận một function làm tham số. const qrCodes: string[] = ['QR1', 'QR222', 'QR3333', 'QR4444', 'QR5555'] const qrCodesV3: string[] = qrCodes.filter((qrCode) => qrCode.length > 5) console.log(qrCodesV3) //['QR3333', 'QR4444', 'QR5555'] Javascript cũng có một hàm khác Array.slice. Tuy nhiên, đây không phải là higher order function, [...]
Read more →Bài viết được sự cho phép của tác giả Tống Xuân Hoài Vấn đề Tôi năm nay đã 26 tuổi, maintain cũng dăm ba dự án rồi mà đôi lúc tôi cũng hay gặp những trường hợp mà một số bạn trong team hay làm thế này: function convertBirthdayToAges (person) { const year = new Date().getFullYear(); // 2021 return person.map(p => p.age = year - p.year); } ... const persons = [{name: 'Nguyễn Văn A', year: 2000}]; convertBirthdayToAges(persons); console.log(persons); // [{name: 'Nguyễn Văn A', year: 2000, age: 21}] Thoạt nhìn cách viết hàm như trên có vẻ bình thường nhưng bạn hãy để ý sau khi persons đi qua hàm convertBirthdayToAges thì nó đã bị gắn thêm một attribute age. Hay một ví dụ khác kiểu như là: let year = 2020; function afterManyYear(num) { return year + num; } afterManyYear(5) // 2025; .... year = 2025; afterManyYear(5) // 2030; Ở ví dụ trên, ban đầu khi gọi hàm afterManyYear(5) kết quả là 2025 nhưng sau đó, do year bị thay đổi thành 2025 thì afterManyYear(5) lúc này lại trả về 2030. Điều này có vẻ cũng bình thường nhưng hãy tưởng tượng trong giai đoạn bảo trì khi bạn không biết year bị thay đổ [...]
Read more →Consultant là thuật ngữ dùng để chỉ đội ngũ tư vấn viên của một doanh nghiệp có trách nhiệm đưa ra nhận xét, đánh giá, lời khuyên dựa trên nghiệp vụ và chuyên môn. IT Consultant là vị trí có vai trò quan trọng như trên với chuyên ngành liên quan đến hệ thống công nghệ thông tin, đòi hỏi cao về kinh nghiệm chuyên môn và các kĩ năng giao tiếp với khách hàng. Với yêu cầu đòi hỏi cao nên vị trí IT Consultant luôn có mức đãi ngộ rất hậu hĩnh và được xem như là đích đến của các kỹ sư IT nói chung. Bài viết hôm nay chúng ta cùng tìm hiểu danh sách những câu hỏi phỏng vấn vị trí IT Consultant này nhé. Công việc của một IT Consultant là gì? IT Consultant hay Technical Consultant là người lắng nghe những vấn đề về nghiệp vụ, kinh doanh từ doanh nghiệp khách hàng, sau đó đề xuất giải pháp giải quyết vấn đề. Công việ [...]
Read more →Bài viết được sự cho phép của tác giả Tống Xuân Hoài Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp Giới thiệu về composition function Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo. Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy. Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3. Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này: const add = (a, b) => a + b; const mult = (a, b) => a * b; add(1, mult(2, 3)); Oh! hàm chạy rất tố [...]
Read more →Bài viết được sự cho phép của tác giả Lê Nhật Thanh Trong thế giới kiếm hiệp Kim Dung, Trương Tam Phong là nhân vật có võ công cao nhất (theo Kim Dung). Bởi vì ông sở hữu bộ võ công Thái Cực Quyền và Thái Cực Kiếm. Tinh hoa võ công khác hẵn hoàn toàn với thế giới võ công đương đại. Lấy nhu khắc cương. Thế giới lập trình cũng vậy. Lập trình hướng đối tượng (OOP) luôn được xem là tinh hoa của võ công. Các bạn tiếp cận với OOP rất sớm, ngay lúc mới bắt đầu học lập trình. Có rất nhiều người cho rằng OOP là mô hình để thiết kế phần mềm tốt nhất. Và mình xin nhắc lại, OOP là mô hình lấy đối tượng (object) làm gốc. Mình ví OOP như là thế giới võ công đương đại trong Kim Dung. Vậy Thái Cực Quyền trong thế giới lập trình là gì? Bạn đã bao [...]
Read more →Bài viết được sự cho phép của tác giả Trần Hữu Cương 1. Functional Interface là gì? Functional Interface là interface có duy nhất 1 method trừu tượng (có thể có thêm các method không trừu tượng bằng từ khóa default trong Java 8) Ví dụ: Comparable là 1 Functional Interface với method trừu tượng duy nhấtcompareTo; Runnable là 1 Functional Interface với method trừu tượng duy nhất run… Về annotation @FunctionalInterface: nó được dùng ở trước mỗi interface để khai báo đây là 1 functional interface. @FunctionalInterface public interface Runnable { public abstract void run(); } Việc dùng annotation @FunctionalInterface là không bắt buộc nhưng nó giúp đảm bảo cho quá trình compile. Ví dụ bạn khai báo @FunctionalInterface nhưng trong interface lại có nhiều hơn 2 method trừu tượng thì nó sẽ báo lỗi. [irp posts="50412" name="Giới thiệu về GraphQL. Cách giải quyết những hạn chế của RESTful API"] [irp posts="45721" name="Refactoring Design Pattern với tính năng mới trong Java 8"] 2. Functional Interface API trong Java 8 Java 8 xây dựng sẵn một số functional interface và nó được dùng nhiều trong các biểu thức lambda: 2.1. java.util.function.Consumer [...]
Read more →Bài viết được sự cho phép của tác giả Huy Trần Như đã có lần mình đề cập, việc đọc paper cũng khá là quan trọng, vì bên cạnh việc được đọc từ những nguồn kiến thức "sạch", và chất lượng, chúng ta còn sẽ xây dựng được cho mình một kĩ năng khác, là kĩ năng đọc sâu và kĩ năng nghiên cứu, khá là quan trọng trong thời đại thông tin tràn lan trên Internet, khi mà chúng ta tiếp xúc với một lượng lớn thông tin nhưng không có thời gian để lãnh hội hết, dẫn tới một thói quen hết sức tai hại đó là đọc một cách hời hợt (shallow reading). Nằm trong hoạt động nghiên cứu của nhóm rbvn/algorithm, tuần này mình đọc một paper khá thú vị đó là Why Functional Programming Matters của John Hughes. Dưới đây là một vài ghi chép của mình trong quá trình đọc, share lên để giúp cho các bạn có cái nhìn [...]
Read more →Bài viết được sự cho phép của tác giả Lưu Bình An Currying function là một kỹ thuật viết function, thay vì nhận nhiều tham số cùng lúc, thành nhiều function nhỏ, trên từng function nhỏ cho ta truyền vào tuần tự các tham số Có thể đọc lại bài này của mình const add = (a, b) => a + b console.log(add(1,2)) // viết thành currying const add = a => b => a + b console.log(add(1)(2)) Câu hỏi là tại sao mình lại viết như thế này ta? Ví dụ chúng ta có một mảng const list = [ { id: 1, name: 'Steve', email: 'steve@example.com' }, { id: 3, name: 'Pamela', email: 'pam@example.com' }, { id: 4, name: 'Liz', email: 'liz@example.com' } ] Chúng ta muốn xóa phần tử có name=John const noJohn = list.filter(item => item.name !== 'John') Tưởng tượng chúng ta có function filter kiểu như vậy ở nhiều nơi trong code, để đảm bảo DRY, chúng ta sẽ viết riêng một function [irp posts="44846" name="Ứng dụng của Currying Function"] [irp posts="8783" name="1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++"] Xem thêm nhiều việc làm Javascript [...]
Read more →Bài viết được sự cho phép của tác giả Kiên Nguyễn Chuyện từ xửa xừa xưa, có anh chàng lập trình viên nọ rất thích viết FUNCTIONS, bất cứ khi nào có thể viết ra function mới thì anh ta đều viết. Đối với cha này thì functions là BẤT TỬ, là TUYỆT VỜI NHẤT. Hàm, hàm khắp mọi nơi. Tuy nhiên, không như e ve ri bo đi nghĩ, gã ta viết functions cực kì tệ hại, tên không rõ ràng, comment không có, dài lê thê tới cả vài trăm dòng. Bỗng một ngày đẹp trời, anh ta đọc được Clean Code của Uncle Bob. Bùm, “mặt trời chân lý chói qua chim“. Anh ta đã ngộ ra được tứ trụ chân lý về function. Rút đi rút lại, đúc kết ra 4 bí kíp tàng kinh để truyền lại cho hậu thế, tránh lãng phí thời gian đi vào vết xe đổ của anh ta. [irp posts="8783" name="1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++"] [irp posts="20655" name="5 điểm khác nhau [...]
Read more →Bài viết được sự cho phép của tác giả Lưu Bình An Để chạy một chuỗi các async function theo thứ tự (tuần tự như chạy tiếp sức) cố định, nếu không để ý chúng ta sẽ có những kết quả không như mong đợi. Luôn dùng for...of Không sử dụng .forEach nếu bên trong callback chứa các hàm cần await. Luôn luôn dùng for..of nếu muốn nó đúng thứ tự [irp posts="853" name="6 Lý do Async/Await của Javascript đánh bại Promises"] [irp posts="37765" name="RxSwift 3: Thuật ngữ về lập trình bất đồng bộ (Asynchronous programming glossary)"] Xem thêm các việc làm JavaScript lương cao trên TopDev async function asyncProcessing(ms) { return new Promise(resolve => setTimeout(function() { console.log('wait:', ms); resolve(ms); }, ms)); } async function forOf() { const timeouts = [10, 600, 200, 775, 125, 990]; let result = []; for (const timeout of timeouts) { result.push(await asyncProcessing(timeout)) } return result; } // Kết quả wait: 10 wait: 600 wait: 200 wait: 775 wait: 125 wait: 990 Nếu thay vòng lặp for...of bằng timeouts.forEach(async timeout => { const a = await asyncProcessing(timeout); result.push(a); }) // kết quả nhận được wait: 10 wait: 125 wait: 200 wait: 600 wait: 775 wait: 990 Hoặc dùng Array.reduce Một lựa chọn [...]
Read more →Bài viết được sự cho phép của BQT Kinh nghiệm lập trình Bài viết hôm nay mình sẽ chia sẻ cách fix lỗi “RDP Authentication Error Has Occurred – The Function Requested Is Not Supported” khi remote tới Windows Server. Một ngày đẹp trời, tự nhiên bạn không thể remote tới Server như bao ngày. Màn hình xuất hiện thông báo như sau: Remote Desktop Connection An authentication error has occurred. The function requested is not supported. Remote computer: computer_name Nguyên nhân gây ra lỗi trên? Thực tế là các bản cập nhật bảo mật mới nhất (được phát hành sau tháng 5 năm 2018) được cài đặt trên máy tính của bạn. Các bản cập nhật này khắc phục lỗ hổng nghiêm trọng trong giao thức CredSSP (Nhà cung cấp hỗ trợ bảo mật thông tin xác thực) được sử dụng để xác thực trên các máy chủ RDP (CVE-2018-0886 –RDP authentication error: CredSSP Encryption Oracle Remediation). Các bản cập nhật này không được cài đặt ở phía má [...]
Read more →Bài viết được sự cho phép của tác giả Trần Hữu Cương Function trong Python là gì? Tạo Function trong Python Function trong Python là gì? Trong Python, function là một nhóm các câu lệnh (khối code) liên quan tới nhau, nhằm mục đích thực hiện một công việc nào đó. Function giúp chia nhỏ chương trình thành các module nhỏ hơn. Chương trình càng lớn thì function càng nhiều. Function giúp sử dụng lại các đoạn code. Tránh lặp lại các đoạn code trùng nhau. Xem thêm việc làm python tuyển dụng từ các công ty lớn trên TopDev Cú pháp của Function, cách tạo Function Cấu trúc function: def function_name ( arg1, arg2, ...) : ...... # function body ...... Từ khóa def đánh dấu bắt đầu function header Tên của một function phải là duy nhất Dấu hai chấm : đánh dấu kết thúc function header Phần body mô tả công việc của function Các function có thể có từ khóa return để trả về một kết quả sau khi function [...]
Read more →Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng Function là gì? Function là một phần tất yếu của mọi phần mềm. Một chương trình (Python) không bắt buộc phải có function, nhưng nó là cách làm cơ bản, phổ biến nhất, tương tự như những ngôn ngữ lập trình khác. Về bản chất, function là một khái niệm / cơ chế để dùng lại code. Thay vì viết một đoạn code nhiều lần mà mỗi lần chỉ thay đổi chút chút, ta viết một function, nhận vào các tham số khác nhau. [irp posts="8783" name="1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++"] [irp posts="21368" name="5 kinh nghiệm khi viết arrow function"] Đầu vào và đầu ra Chuyện một function nhận đầu vào, xử lý và trả về đầu ra thì ai cũng biết. Phần đầu vào luôn phải được định nghĩa rõ ràng đầy đủ (trừ *args và **kwargs - thì có chúa mới biết function nhận những cái gì!), nhưng phần đầu ra thì [...]
Read more →Bài viết được sự cho phép của tác giả Nguyễn Hữu Đồng function_score Khi search trong elasticsearch, đôi khi chúng ta mong muốn sẽ chấm điểm dựa trên những điều kiện đã đặt ra để lấy ra một danh kết quả chính xác. Ví dụ khi bạn search những người có tên có chứa cụm từ “ste" và mong muốn nếu first_name tên đó là “steph " thì + thêm 3 điểm hoặc nếu first_name của tên đó là “stephen" thì + 5 điểm, …vv, lúc này bạn chắc hẳn sẽ dùng đến function-score để custom hàm chấm điểm. GET /_search { "query": { "function_score": { "query": { "match_all": {} }, "boost": "5", "functions": [ { "filter": { "match": { "test": "bar" } }, "random_score": {}, "weight": 23 }, { "filter": { "match": { "test": "cat" } }, "weight": 42 } ], "max_boost": 42, "score_mode": "max", "boost_mode": "multiply", "min_score" : 42 } } } Như hình trên mỗi function-score là một kiểu “query", chỉ là nó hơi đặc biệt, trong function-score, field “query" quy định điều kiện để mỗi index được chấm điểm như đoạn code trên. "query": { "match_all": {} } Điều này có nghĩa là mọi index sẽ được chấm điểm dựa, hoặc nếu như đoạn code đưới thì nếu [...]
Read more →