Công Nghệ
Review và giải thích sâu về framework, ngôn ngữ, AI, blockchain… ngắn gọn, dễ hiểu, cập nhật liên tục như git pull ‑‑rebase.
1826 bài viết

YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java)
Bài viết được sự cho phép của tác giả Trần Hữu Cương YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java) Cũng giống như KISS , YAGNI và DRY là 2 nguyên tắc quan trọng để lập trình. 1. DRY DRY: “ D on’t R epeat Y ourself” – Đừng bao giờ lặp lại code. Bạn cũng có thể đã nghe về sự so sánh: DRY cod vs WET code ( Don’t Repeat Yourself and Write Everything Twice) Bạn đã bao giờ viết các đoạn code giống nhau nằm ở các phần, module khác nhau của project? bạn đã bao giờ có 2 màn hình giống nhau nhưng lại dùng tới 2 đoạn code để hiển thị 2 màn hình đó? OK, Nguyên tắc DRY chính là đang nói về vấn đề này. Đừng lặp lại code ở đây là không lặp lại các đoạn code giống nhau, các method thực hiện chức năng như nhau, cố gắng gom chúng lại 1 cách gọn gàng và có thể dùng lại khi cần. Ví dụ 1 Ta có 2 method public void print ( User user ) { System . out . println ( "first name: " +user. getFirstName ( ) ) ; System . out . println ( "last name: " +user. getLastName ( ) ) ; System . out . println ( "age: " +user. getAge ( ) ) ; System . out . println ( "email: " +user. getEmail ( ) ) ; System . out . println ( "address: " +user. getAddress ( ) ) ; System . out . println ( "gender: " +user. getGender ( ) ) ; System . out . println ( "exprience: " +user. getExperience ( ) ) ; // do something: print user info } public void preview ( User...

Khi mình cố gắng code mọi thứ hoàn hảo
Bài viết được sự cho phép của tác giả Phạm Bình Chào các bạn, Con người chúng ta sinh đã luôn thích cái đẹp: người đẹp, tâm hồn đẹp, nhà đẹp, xe đẹp, quần áo đẹp và… Code đẹp – một quan niệm về cái đẹp chỉ có ở các lập trình viên. Mình cũng vậy, mình cũng như các bạn, rất thích cái đẹp, và rất thích code đẹp. Code thế nào được coi là code đẹp? Mỗi người lại quan điểm về cái đẹp khác nhau, hơn nữa “code đẹp” lại là một khái niệm chưa có trong từ điển Tiếng Việt, thế nên phần này mình xin trình bày quan điểm của mình thế nào là code đẹp nha: Code chạy đúng trong mọi trường hợp : Nghĩa là cho dù sản phẩm của bạn có phát triển lớn tới cỡ nào, thì cũng vẫn là đoạn code đấy chạy. Sản phẩm của bạn có 1 người dùng cũng chạy đúng mà 10 triệu người dùng cũng vẫn chạy đúng, vẫn đáp ứng được hiệu năng. Code chuẩn Style Guide : Style Guide là những quy ước về cú pháp, cách đặt tên biến, tên hàm, tên hằng trong dự án. Code chuẩn style guide là code tuân theo các quy ước này. Code áp dụng các design pattern phù hợp : Design Pattern hiểu nhanh nó là một mô hình giúp các bạn giải quyết vấn đề, áp dụng design pattern chuẩn sẽ giúp code của bạn trong sáng và dễ hiểu, dễ tái sử dụng. Code áp dụng các công nghệ tiên tiến nhất : Tất cả những gì tiên tiến nhất sẽ phải hội tụ trong dự án của bạn. Code không bị dư thừa : Không dư thừa các các hàm không dùng...

Cài đặt Kibana trên CentOS
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Kibana là một công cụ giao diện dùng để search và hiển thị log được cung cấp bởi Elasticsearch. Trong bài viết này, mình sẽ hướng dẫn các bạn cài đặt công cụ này trên CentOS các bạn nhé! 10 Công cụ Go-To Tech dành riêng cho các Software Developer 10 tips để trở thành Java Developer xịn hơn Đầu tiên, cũng giống như khi cài đặt Elasticsearch , vì mặc định CentOS không chứa package cài đặt của Kibana, nên các bạn cần thêm repository của Kibana vào. Nếu các bạn đã cài đặt Elasticsearch trước đó rồi sử dụng repo với baseUrl là https://artifacts.elastic.co/packages/7.x/yum thì không cần làm bước này các bạn nhé. Nếu các bạn chưa cài đặt Elasticsearch thì các bạn cần thêm Kibana public signing key vào máy của mình để package manager trust package từ Kibana repository: sudo rpm -- import https : //artifacts.elastic.co/GPG-KEY-elasticsearch Kết quả của mình như sau: Tiếp theo, các bạn cần tạo mới một tập tin để thêm Kibana repository: sudo vi / etc / yum . repos . d / kibana . repo rồi thêm vào tập tin này nội dung như sau: [ kibana - 7.x ] name = Kibana repository for 7.x packages baseurl = https : //artifacts.elastic.co/packages/7.x/yum gpgcheck = 1 gpgkey = https : //artifacts.elastic.co/GPG-KEY-elasticsearch enabled = 1 autorefresh = 1 type = rpm - md Bây giờ thì các bạn có thể chạy câu lệnh sau để cài đặt Kibana rồi: sudo yum install kibana Nhập “Y” để tiếp tục các bạn nhé! Kết quả cài đặt: Các bạn cần start Kibana lên sau khi cài đặt xong, bằng câu lệnh: sudo systemctl start kibana Nếu muốn start nó khi khởi động...

Hướng dẫn build java project, maven project trên Jenkins
Bài viết được sự cho phép của tác giả Trần Hữu Cương Hướng dẫn build java project, maven project trên Jenkins Trong ví dụ này mình sẽ thực hiện clone 1 maven project từ github và thực hiện build nó thành file jar. Tất cả sẽ được thực hiện tự động bằng Jenkins. 10 Java Web Framework tốt nhất 10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết Yêu cầu: Đã cấu hình JDK cho Jenkins Đã cấu hình Maven cho Jenkins Trong ví dụ này mình sử dụng 1 project maven trên github có url: https://github.com/stackjava/spring-boot-hello . Đây là 1 ví dụ về spring, đã được cấu hình chạy trên port 8081 . Các bạn có thể fork/clone về account github của các bạn để dùng. (Xem lại: Code ví dụ Spring boot Hello World ) Hướng dẫn build java project, maven project trên Jenkins Đầu tiên, ta tạo 1 plan build bằng cách click vào New Item Chọn Maven Project và nhập tên cho plan build Ở đây mình dùng source code từ github nên mình sẽ chọn Git (khi build, jenkins sẽ clone source từ github về) Để Jenkins clone được source code, ta cần cấu hình account git cho nó. Nhập username/password của tài khoản github mà bạn sử dụng để clone source code. (nếu bạn dùng bitbucket, gitlab… thì cũng nhập username/password tương ứng) Nhập repository URL của project git. Phần Credentials chọn account git mà bạn vừa thêm. Click Save. Sau khi Save, ở màn hình chính chúng ta sẽ thấy plan build vừa tạo. Click vào icon build để build project. Ở menu bên trái sẽ có trạng thái build của project. Click vào đó để xem. Click vào Console Ouput để xem log realtime của quá trình...

Lập trình IOS: Triển khai MVVM cho project swift(phần 3)
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh Hello guys! Lại là mình đây Trong bài trước , chúng ta đã học cách viết 1 lớp network layer rất chuyên nghiệp để call API, clear và simple. Hôm nay chúng ta sẽ tinh chỉnh cho app chuyên nghiệp hơn. Lập trình IOS: Làm sao để viết code swift đúng chuẩn thế giới? 5 bài học quí giá về việc phát triển ứng dụng iOS Thêm indicator và search more Vậy chúng ta sẽ làm gì hôm nay: Thêm phần loading cho search Sửa API theo ducument Thêm phần load more khi scroll table view OKey, vậy chúng ta hãy cùng bắt đầu nhé. Đầu tiên như các bài trước bạn hãy checkout source code tại đây: https://github.com/codetoanbug/MVVMSample.git Vui lòng đọc cách chuyển sang branch bai3 dựa vào các bài trước để xem code nhé. Hãy cùng bắt đầu nhé Thêm phần loading cho search Như các bạn thấy, thì các mục search trên các ứng dụng như facebook, google, họ thường hay thêm indicator hiển thị loading để người dùng chờ đợi. Vì thế mà ứng dụng của chúng ta cũng nên có cái này để tăng trải nghiệm người dùng. Chứ mà không có thì ai biết ứng dụng có đang working hay không. Phần loading sẽ show khi người dùng bắt đầu search, và sẽ ẩn đi khi đã kết thúc tác vụ search. Vì thế chúng ta sẽ sửa lại giao diện như sau: Thêm indicator Trong hình trên, chúng ta sẽ thêm 1 indicator ở dưới ô search và trên ô table. Tôi đưa indicator và tableview vào 1 stack view vì khi indicator show/hide, thì tableview sẽ tự động full màn hình. topIndicator: Show lên khi người dùng nhập text để...

Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC
Bài viết được sự cho phép của tác giả Giang Phan Trong bài này tôi sẽ hướng dẫn các bạn sử dụng kết nối vào database sử dụng Java JDBC. Hibernate là gì? Sao phải dùng nó thay JDBC? 10 Java Web Framework tốt nhất JDBC là gì? JDBC (Java Database Connectivity) là một API chuẩn dùng để tương tác với các loại cơ sở dữ liệu quan hệ (database relationship). JDBC bao gồm một tập hợp các class và các interface dùng cho ứng dụng Java có thể giao tiếp với các cơ sở dữ liệu (database) khác nhau. JDBC có thể làm việc với bất kỳ cơ sở dữ liệu ( MySQL , PostgreSQL , Oracle , SQL Server , …) dựa vào một Driver được cung cấp. JDBC API bao gồm hai package chính: java.sql : là một phần của Java standard. javax.sql : là một phần của Java enterprise. Các thành phần của JDBC DriverManager : là một class quản lý danh sách các Driver (database drivers). Các yêu cầu kết nối từ ứng dụng Java sẽ được class này tìm kiếm Driver phù hợp đầu tiên để thiết lập kết nối với cơ sở dữ liệu. Driver : là một interface dùng để xử lý các giao tiếp với cơ sở dữ liệu. Thông thường ứng dụng Java sẽ không giao tiếp trực tiếp với class này mà thông qua DriverManager. Connection : là một interface cung cấp tất cả các method cần thiết cho việc giao tiếp với database. Interface này chứa nhiều phương thức đa dạng để tạo kết nối với một Database. Tất cả các thông tin giao tiếp với cơ sở dữ liệu chỉ có thể thông qua đối tượng Connection. Một Connection đại diện cho một phiên (session) làm việc...

Fix Lỗi: “405 – HTTP Verb Used To Access This Page Is Not Allowed”
Bài viết được sự cho phép của BQT Kinh nghiệm lập trình Dấu hiệu lỗi Không thể sử dụng các phương thức HTTP DELETE, PUT hoặc PATCH với các tệp .php hoặc API Web. Thông báo lỗi sau xuất hiện trong trình duyệt: 405 - HTTP verb used to access this page is not allowed. The page you are looking for cannot be displayed because an invalid method (HTTP verb) was used to attempt access Nguyên nhân Khai báo các phương thức của PHP chưa được xác định, chúng ta cần khai báo lại. Trong bài viết này mình sẽ hướng dẫn fix trên IIS Server. Fix Lỗi "RDP Authentication Error Has Occurred – The Function Requested Is Not Supported" Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded" Phương án xử lý Remote vào server sử dụng Remote Desktop Connection Chọn Internet Information Services (IIS) Manager at Windows Start > All Programs > Windows Administrative Tools . Trong IIS Manager, chọn vào SERVERNAME > Sites >Click đúp vào site của bạn. Trong màn hình chính, Chọn Handler Mappings > chọn tiếp PHP-php (hoặc ExtensionlessUrl-Integrated-4.0 nếu là Web API) > chọn Request Restrictions > chuyển qua Verbs tab. Thêm các phương thức PHP (DELETE, PUT or PATCH) vào field sau đó click OK . Nếu vẫn chưa được thì chú ý mục “Executable (Optional)”. Đặt đường dẫn trong ô đó vào trong dấu “ “. Click OK. -> Restart website của bạn. kinhnghiemlaptrinh.com Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.com Có thể bạn quan tâm: HTTP status code là gì? Danh sách đầy đủ HTTP status code Fix Lỗi FTP Client Windows Server “Current Security Settings Do Not Allow This File To Be Downloaded” Sử dụng aria trên site eCommerce, vấn...

Phân quyền người dùng với Laravel Authorization
Bài viết được sự cho phép của tác giả Kien Dang Chung Bất kể hệ thống website nào cũng có người dùng và đi kèm với nó là việc xác thực (authentication) và phân quyền (authorization) với từng người dùng. Xác thực trong Laravel là khá đơn giản với Laravel Authentication , chúng ta cũng có thể tận dụng các hệ thống khác như mạng xã hội để xác thực, ví dụ xác thực người dùng bằng Facebook , Google , Twitter … Bên cạnh đó, chúng ta cũng rất cần phân quyền cho người dùng để đảm bảo các vấn đề về bảo mật và tuân thủ các chính sách từng hệ thống. Ví dụ như có những người dùng được phép chỉnh sửa hoặc xóa một tài nguyên nhưng cũng có những người dùng chỉ được phép đọc thông tin. Từ phiên bản Laravel 5.1 trở về trước, công việc này phải thực hiện thông qua các gói ACL (Access Control List) như Entrust, Sentinel hay Laravel-ACL thì hiện nay Laravel đã có hỗ trợ trực tiếp trong core của framework. Với việc sử dụng các gói ACL ở ngoài, các quyền cho người dùng chỉ là các cờ, nếu muốn các nghiệp vụ phức tạp trong phân quyền, bạn sẽ rất khó khăn và phải đưa vào Controller. Sử dụng Laravel Gate tránh được một số các nhược điểm của việc sử dụng các gói ACL ngoài như sau: Sử dụng Laravel Gate cho bạn sự tự do, bạn có thể sử dụng cho các trường hợp cực phức tạp tùy ý do nó không bắt buộc phải implement trong các model. Bạn có hoàn toàn tự chủ về các chính sách phân quyền, với Laravel Gate các xử lý truy cập có thể tách biệt với...

Fix Lỗi “RDP Authentication Error Has Occurred – The Function Requested Is Not Supported”
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áy chủ RDP / RDS của bạn và NLA (Network Level Authentication) được bật để có thể remote vào server. 10 lời khuyên để giảm thiểu mối đe doạ an ninh nội bộ 24 code ES6 tân tiến để khắc phục các lỗi thực hành JavaScript NLA sử dụng các cơ chế CredSSP để xác thực trước người dùng RDP qua TLS / SSL hoặc Kerberos. Máy tính của bạn chỉ cần chặn kết nối máy tính từ xa đến một máy chủ sử dụng phiên bản bảo mật kém của CredSSP. Cách fix? Có những cách fix sau đây: Cách chuẩn xác nhất và tốt nhất bạn cần thực hiện là cài đặt “Windows security updates” trên server của bạn. Cách 2: Tắt NLA (Network Level Authentication) trên...

9 công cụ siêu tiện lợi cho cả Developer và Designer
Tiếp nối sự thành công của bài viết 30 tiện ích Chrome cho designer và developer , chúng ta sẽ lại tiếp tục điểm qua những công cụ tiện dụng có thể giúp ích rất nhiều cho công việc thiết kế và lập trình của bạn. Atom Atom là text editor nguồn mở do Github phát triển. Hỗ trợ nhiều tính năng toàn diện, nổi bật là package manager built-in, auto-completion thông minh, và theme siêu đẹp. Được phát triển từ Sublime, package manager chính là một làn gió mới. Với Atom, Bạn có thể dùng APM hoặc giao diện GUI. Chả cần phải điều chỉnh file config cứ thích thì dùng thôi. Thông tin thêm về vấn đề hiệu năng. Khi mới ra mắt, Atom chậm như sên, nhưng giờ lại trái ngược hoàn toàn, chỉ bị chậm khi mở file quá mức lớn mà thôi. DragDis Là designer, tôi phải luôn luôn tìm nguồn cảm hứng. DragDis là công cụ cho phép tôi lưu lại bất kỳ nguồn cảm hứng nào mình tìm được. Dễ dùng lắm, chỉ việc cài đặt tiện ích mở rộng Chrome và bắt đầu thả kéo thôi. DragDis folder của tôi được sắp xếp theo tuần. Mỗi tuần tôi sẽ tạo một inspiration folder mới. Đây là một cách rất hay để theo dõi sự thay đổi trong “thị hiếu nghệ thuật” của bản thân. DragDis còn có giao diện grid full-page, cơ sở tuyệt vời cho moodboards. iTerm 2 iTerm là công cụ thay thế đẹp cho Terminal. iTerm 2 có rất nhiều tính năng hay, có thể kể đến split panels không giới hạn, hình ảnh nội dòng, và search. Tuy Terminal có nhiều tính tương tự, nhưng iTerm 2 vẫn đang liên tục cải tiến. Muzli Muzli là tiện ích...

Chạy database migration khi deploy, nên hay không?
Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm Có một thủ pháp thường hay được sử dụng khi deploy app là chạy database migration ngay khi deploy, nhưng liệu đó có phải là một good practice (tam dịch: cách làm tốt) hay không? Tất nhiên, để đảm bảo tính khách quan, mình giữ lập trường “ câu trả lời vẫn luôn là còn tùy ”, nhưng 99.9999% trường hợp là KHÔNG . Xem thêm các việc làm database hấp dẫn tại Station D Giả sử ta có một app cần phải đổi tên cột dob của bảng users thành date_of_birth . Dễ ợt như a ă â đúng không, ta chỉ cần một đoạn code migration như sau. def change rename_column "users" , :dob , :date_of_birth end Và trong đoạn code trả về cho người dùng. # trước khi sửa render_json({ id: user.id, date_of_birth: user.dob}) # sau khi sửa render_json({ id: user.id, date_of_birth: user.date_of_birth}) Như đầu đề, ta sẽ chạy migration code cùng lúc với deploy. Có thể nó khá phức tạp tùy theo từng app nhưng chung quy lại gồm 3 bước: a) Kéo code mới từ SCM về b) chạy đoạn code migration ở trên và c) restart lại ứng dụng để áp dụng mã mới. Vậy thì vấn đề của cách làm trên là ở đâu? Vấn đề Có thể bạn sẽ để ý được là ở khoảng thời gian sau b) cho tới khi c) kết thúc, phần API đọc và ghi users của bạn sẽ bị lỗi không ngừng nghỉ với rate là 100%, lý do là vì lúc đó cột dob đã bị gỡ khỏi database nhưng code mới thì chưa được release lên. Đương nhiên bạn có thể đảo ngược thứ tự giữa b) và c) nhưng vấn đề...

React Props Cheatsheet: 10 Patterns mà bạn nên biết (Phần 2)
Tác giả: Reed Barger 6. Cập nhật giá trị của React prop thông qua thanh trạng thái Để chuyển một giá trị prop cho một thành phần, trong các thành phần của hàm đó cần cố gắng thay đổi ngay lập tức giá trị của prop. Giá trị prop phải là giá trị thuần túy. Nói cách khác, chúng không thể bị biến dạng hoặc thay đổi trực tiếp. Trong React nếu chúng ta muốn thay đổi các giá trị theo thời gian, thì phương tiện thích hợp để làm điều đó là với status – trạng thái. Nếu chúng ta muốn chuyển một giá trị prop vào một thành phần và thay đổi nó sau này, có thể đưa nó vào một hook React trạng thái để lưu trữ giá trị đó dưới dạng một biến. Sau đó, cập nhật bằng cách sử dụng chức năng setter thích hợp. Ví dụ, chúng ta có thể làm như vậy với useStatehook hoặc useReducerhook . Tuyển dụng lập trình viên React 7. React props có thể phân bố một cách độc lập Điều gì sẽ xảy ra nếu chúng ta có một đối tượng gồm các thuộc tính mà chúng ta muốn chuyển xuống dưới dạng các giá trị prop độc lập? Tuy nhiên, đối tượng này có rất nhiều thuộc tính. Chúng ta có cần tạo thủ công các đạo cụ riêng lẻ và đặt giá đỡ thành object.propertyName không? Thay vì làm điều đó cho mọi thuộc tính, chúng ta có thể rất dễ dàng lấy đối tượng và trải rộng các thuộc tính của nó xuống một thành phần dưới dạng các giá trị chống đỡ riêng lẻ bằng cách sử dụng toán tử mở rộng đối tượng {...myPropObject} . Bằng cách sử dụng cú pháp này –...