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

DRY không hiệu quả, hãy dùng WET

DRY không hiệu quả, hãy dùng WET

Bài viết được sự cho phép của tác giả Lưu Bình An Khi bạn học lập trình bạn sẽ được nghe tới khái niệm DRY (Don’t Repeat Yourself), bạn rất có thể đã vận dụng sai ý nghĩa của nó. "Code dễ đọc" là như thế nào? "Mẹo bỏ túi" cho dân coder mới vào nghề Trên wiki: DRY là nguyên tắc bạn đừng viết lặp lại một đoạn code Bạn: Ok, những phần code bị trùng mình sẽ chuyển thành abstraction Giải pháp trông có vẻ hiển nhiên đúng, nhưng không, abstraction của bạn thường là sai. Đây là lý do tại sao: Bạn thì code bị duplicate Bạn đưa đoạn duplicate ra thành một abstract (method, class) Bạn thay thể toàn bộ phần duplicate bằng abstraction mới Bạn nghĩ code đã hoàn hảo Thời gian trôi đi PM đưa thêm các yêu cầu mới. Bạn bắt đầu hiện thực các yêu cầu mới Với yêu cầu mới này, bạn phải chỉnh sửa vài đoạn trong abstraction, if...else các kiểu, đổi parameter, abstraction của chúng ta có thể đưa ra những action khác nhau theo những điều kiện khác nhau Giờ abstraction của trọng sẽ cho ra những kết quả khác nhau trên những case khác nhau Yêu cầu mới lại đến, thêm parameter tiếp, thêm câu điều kiện tiếp Và giờ đây đoạn code của bạn không còn dễ maintain, nói thẳng ra là một đống hầm bà lằng khó nuốt Chúc mừng, bạn đã bị over engineer và gây ra một abstract quá đỗi phức tạp Vậy thì sao? Hãy thử WET (Write everything twice) WET Như cách chơi chữ đã thể hiện, nó là trường phái đối nghịch hoàn toàn với DRY, khi bắt đầu viết code, bạn sẽ không thể nào lường trước được mọi...

By stationd
Cài đặt Spring Boot CLI

Cài đặt Spring Boot CLI

Bài viết được sự cho phép của tác giả Trần Thị Thu Hà Bài viết sẽ hướng dẫn bạn cách cài đặt Spring Boot CLI phiên bản mới nhất (1.4.0.RELEASE tại thời điểm viết bài) trên Mac OS X (El Captain 10.11.6). Bạn download file này: http://repo.spring.io/release/org/springframework/boot/spring-boot-cli/1.4.0.RELEASE/spring-boot-cli-1.4.0.RELEASE-bin.tar.gz Giao tiếp Client / Server bằng gRPC Button Bootstrap: Cách tạo các loại button trong Bootstrap THIẾT LẬP BIẾN MÔI TRƯỜNG Sau đó giải nén, các tập tin cài đặt sẽ nằm trong thư mục spring-1.4.0.RELEASE . Mở file INSTALL.txt để xem hướng dẫn. Giả sử, sau khi giải nén, thư mục chứa các tập tin cài đặt là: /Users/donhuvy/Downloads/spring-1.4.0.RELEASE thì bạn sẽ thiết lập biến môi trường như sau, gọi text editor Vim, sửa tập tin . bash_profile bằng lệnh: vi ~/.bash_profile Gõ phím i để bắt đầu chế độ insert trong Vim, chèn thêm nội dung sau vào cuối tập tin: export SPRING_HOME=/Users/donhuvy/Downloads/spring-1.4.0.RELEASE export PATH=$PATH:$SPRING_HOME/bin Để lưu tập tin và thoát khỏi Vim, bạn gõ esc , :wq! Để kiểm tra chắc chắn nội dung mới đã ghi vào đúng cách, gõ lệnh: tail -300f ~/.bash_profile Di chuyển đến cuối trang nội dung để thấy các nội dung thêm vào đã có. Để thoát khỏi lệnh tail , gõ control + C . Để biến môi trường kể trên có hiệu lực, có 2 cách: Cách 1: Gõ lệnh: source ~/.bash_profile Cách 2: Đóng tất cả các cửa sổ Terminal, thoát Terminal, sau đó mở lại. CÀI ĐẶT HỖ TRỢ AUTO-COMPLETE (khi gõ lệnh trong Spring Boot CLI) Di chuyển đến thư mục chứa tập tin cài đặt (ở bước này, trên mỗi máy khác nhau có thể sẽ khác nhau): cd /Users/donhuvy/Downloads/spring-1.4.0.RELEASE Kiểm tra chính xác thư mục hiện tại: pwd Kiểm tra các tập tin trong gói cài đặt:...

By stationd
Cách học một công nghệ mới

Cách học một công nghệ mới

Bài viết được sự cho phép của tác giả Tino Phạm Trong bài này, mình xin chia sẽ cách học của mình khi tiếp cận một công nghệ mới. Bạn có thể tham khảo và chia sẽ lại với mình về cách học của bạn. "Khi công nghệ không chỉ dành cho nam giới" - Lea Trúc, Founder của Women Meet Tech 10 bí kíp để startup và FinTech startup thành công đột phá Bước 1 : đọc và làm theo chính xác những gì người khác hướng dẫn. Làm đúng theo từng bước của họ. Đảm bảo chúng ta phải chạy được giống như những gì họ đã làm. Bước 2 : xem lại code đã viết và đặt câu hỏi tại sao? và nó có nghĩa gì? Từ đó đọc lại hướng dẫn và search google để tìm hiểu để giúp bạn hiểu rõ hơn những gì bạn đã làm. Bước 3 : đập hết mọi thứ và làm lại từ đầu. Lúc này bạn cần thống kê lại mình sẽ làm gì? , làm thế nào? . Liệt kê các bước thực hiện. Trong quá trình làm lại bạn sẽ gặp phải lỗi, bạn tìm cách fix nó, từ đó sẽ giúp bạn hiểu rõ hơn vấn đề và giúp bạn có thêm kinh nghiệm với công nghệ mới mà bạn đang học. Bước 4 : Lặp lại bước 1 tới bước 3 với nhiều projects khác nhau hoặc trên cùng một project càng nhiều càng tốt. Bước 5 : Tiến hành hoàn thiện và nâng cập cho những projects mà bạn đã thực tập (Refactor, optimize, improve code,…). Trên đây là các bước mà mình thường sử dụng khi học một công nghệ mới. Hy vọng được các bạn chia sẽ thêm về cách học của...

By stationd
Khi ta kết hợp MotionLayout và ShapeOfView…

Khi ta kết hợp MotionLayout và ShapeOfView…

Tác giả: florent champigny Bằng cách sử dụng MotionLayout, bạn có thể đưa ra một cách thiết kế hoàn toàn khác biệt và linh hoạt cho ứng dụng của mình. Quên đi màn hình tĩnh không có bất kỳ animation nào, và hãy thêm một số chuyển động nào! MotionLayout MotionLayout là một class mới có sẵn trong thư viện ConstraintLayout 2.0 để giúp các lập trình viên Android quản lý animation của chuyển động và widget trong ứng dụng. Có thể định nghĩa các thay đổi từ layout xml. Chúng ta xác định một chuyển động: một Swipe trên nút màu đỏ, và một giá trị khởi đầu: nằm bên phải của nút đó. Sau đó, chúng ta cần xác định các ràng buộc ở vị trí điểm đầu và các ràng buộc ở vị trí điểm cuối. MotionLayout sẽ tự động tính toán chuyển động và xử lý các sự kiện và animation: ayout description (xml/scene_06) MotionLayout thực sự đang ở giai đoạn alpha, nhưng bạn có thể import vào để sử dụng trong gradle như sau: implementation ' androidx.constraintlayout:constraintlayout:2.0.0-alpha2 ' ShapeOfView ShapeOfView là thư viện UI dành cho Android hiện có trên Github, có thể thay đổi hình dạng của view. Ví dụ: bạn có thể thêm một số RoundRects, Arcs hoặc diagonals vào layout. Ví dụ: có thể tạo hiệu ứng cho view, tôi có thể tạo hiệu ứng động cho phần dưới cùng bên trái của RoundRectShape này: ShapeOfView đã đư ợc animated Bạn có thể import vào để sử dụng trong gradle như sau: implementation 'com.github.florent37:shapeofview:1.4.4' MotionLayout + ShapeOfViewanimated Hãy thiết lập lại screen dưới đây: Layout này chứa 3 view: 1) Một RecyclerView 2) Một ArcView , từ ShapeOfView, có chứa một ImageView (Tháp Eiffel) 3) Một TextView : “I Love Paris” Tôi...

By stationd
Những ứng dụng tuyệt vời của Renderless component trong Vue

Những ứng dụng tuyệt vời của Renderless component trong Vue

Bài viết được sự cho phép của tác giả Lưu Bình An Để tái sử dụng component trong Vue mà không biết tới slot thì quá thiếu sót. Một vài ví dụ để bạn sử dụng slot nhiều hơn. Tạo web siêu dễ với VuePress và Github Pages Viết Unit Test cho Vue component cho người mới bắt đầu Slot Slot trong vue là dạng “đặt gạch” trong component, sau này khi sử dụng ta có thể đưa nội dung khác vào những vị trí đã đặt gạch Vue không chỉ có thể đặt một mà đặt nhiều gạch, số lượng tùy thích, viên gạch đó được Vue gọi tên là slot <!-- mother.vue --> Mẹ đặt gạch 2 chỗ header và body cho con nha <template> <div class="card"> <div class="card-header"> <slot name="header"></slot> </div> <div class="card-body"> <slot name="body"></slot> </div> </div> </template> <!-- con.vue: Cho con dùng 2 chỗ header và body bằng nội dung mới nhé--> <mother> <template #header> <h1>Special Features</h1> </template> <template #body> <div> <h5>Fish and Chips</h5> <p>Super delicious tbh.</p> </div> </template> </mother> Đây là những viên gạch có đặt tên <slot name="header"/> , có một viên gạch không cần đặt tên, chỉ cần <slot /> , khi đó component ném gạch sẽ được viết <mother> Toàn bộ phần này nằm trong slot không đặt tên </mother> Slot scope Đề truyền dữ liệu từ mẹ sang con, chúng ta bind dữ liệu muốn truyền qua slot <slot :ten-bien="du-lieu"/> <!-- mother.vue --> <template> <div class="card"> <div class="card-header"> <slot name="header" :close="close"></slot> </div> <div class="card-body"> <slot name="body"></slot> </div> </div> </template> Component con sẽ nhận dữ liệu thông qua từ khóa slot-scope <!-- con.vue--> <mother> <template #header slot-scope="{close}"> <h1>{{ close ? ‘Closed’ : ‘Open’ }}</h1> </template> <template #body> <div slot="body"> <h5>Fish and Chips</h5> <p>Super delicious tbh.</p> </div> </template> </mother> Sử dụng làm modal...

By stationd
Repository design pattern hoàn thiện trong Laravel

Repository design pattern hoàn thiện trong Laravel

Bài viết được sự cho phép của BBT Tạp chí Lập trình Trong bài viết này tôi sẽ chỉ cho bạn cách thiết lập Repository design pattern trong Laravel từ đầu. Tôi sẽ sử dụng phiên bản Laravel 5.8.3, nhưng phiên bản Laravel cũng không thực sự quá quan trọng. Trước khi chúng tôi bắt đầu code, có một vài điều bạn cần biết về repository design pattern. Repository Pattern là lớp trung gian giữa tầng Data Access và Business Logic. Repository design pattern cho phép bạn sử dụng các đối tượng mà không cần phải biết các đối tượng này được duy trì như thế nào. Về cơ bản nó là một sự trừu tượng hóa của lớp dữ liệu. Điều này có nghĩa là Business Logic của bạn không cần phải biết cách lấy lại dữ liệu hay nguồn dữ liệu là gì. Business Logic dựa trên repository để lấy dữ liệu chính xác. Một quan niệm sai lầm mà tôi thấy rất nhiều là các repository đang được thực hiện theo cách tạo hay cập nhật các bản ghi. Đây không phải là những gì mà repository nên làm. Các kho lưu trữ không nên tạo hoặc cập nhật dữ liệu, nhưng chỉ nên được sử dụng để truy xuất dữ liệu. Tuyển dụng Laravel lương cao cho bạn 18 designer hàng đầu dự đoán về xu hướng UI/ UX trong năm 2022 30 tiện ích Chrome cho designer và dev Hãy bắt tay vào việc code bây giờ. Bởi vì tôi hướng dẫn các bạn làm từ đâu, đầu tiên ta phải tạo một project laravel trước. php artisan config:clear Đối với phần hướng dẫn này, tôi sẽ tạo ra một blog nhỏ. Bây giờ chúng tôi đã tạo một project, chúng tôi cần tạo Controller...

By stationd
Inversion of Control nguyên lý của các nguyên lý

Inversion of Control nguyên lý của các nguyên lý

Bài viết được sự cho phép của tác giả Kien Dang Chung 1. Nguyên lý Inversion of Control là gì? Trước khi đến với định nghĩa Inversion of Control là gì? bạn hãy cùng tôi làm vài cốc trà đá chém gió tí. Trong ghế nhà trường có lẽ ai cũng sợ nhất môn Triết học bởi mấy lý do, khó hiểu (trìu tượng), nhiều định nghĩa cần học thuộc. Thế nhưng Triết học lại là khoa học của mọi khoa học bởi nó trìu tượng ở một tầng cao nhất. Bản thân tôi cũng đã quên tất cả những gì học được (nói đúng hơn là thuộc được) trong Triết học ngay sau khi thi xong môn này, thế nhưng sau một thời gian khá dài bộn bề lo toan với công việc và cuộc sống, những khái niệm, quy luật ngày xưa thuộc trong Triết học tự nhiên cứ lẩn vẩn trong đầu và rồi ngẫm lại, đúng thật! Điểm lại chút về 2 nguyên lý, 3 quy luật và 6 cặp phạm trù trong Triết học , có thể trong phạm vi hiểu biết của mình và những trải nghiệm đến hiện tại nó đã làm nên tất cả những gì đang diễn ra xung quanh ta. Sở dĩ viết vài câu chuyện phiếm ở đây hầu chuyện các bạn vì các khái niệm mà chúng ta bàn thảo trong bài viết này khá là trìu tượng, nó cũng như triết học là nguyên lý của các nguyên lý. Một trong những quy luật mà tôi hay chiêm nghiệm nhất là quy luật lượng chất: Những thay đổi đơn thuần về lượng, đến một mức độ nhất định, sẽ chuyển hóa thành những sự khác nhau về chất. Friedrich Engels Bạn học một cái gì đó, hoặc...

By stationd
Từ vựng kiểm thử phần mềm

Từ vựng kiểm thử phần mềm

Bài viết được sự cho phép của vntesters.com Đây là những từ dùng để report bug mà mình hay sử dụng nên muốn chia sẻ cho các bạn mới làm test, mình sẽ cố gắng hoàn thiện để có đầy đủ các từ vựng – thuật ngữ thông dụng trong kiểm thử giúp các bạn report bug tốt hơn cũng như dùng đúng từ để tester và developer dễ hiểu nhau. 04 Điều Cần Chú Ý Cho Người Mới Làm Automation Test Biện hộ: Vì sao các Developer không test phần mềm của họ? Part 1: Website Testing 01. Scrolling down / Scrolling up: động từ chỉ hạnh động dùng chuột giữa để di chuyển (lăn) trang web lên và xuống. Example: Go to Homepage, scrolling down to the footer and check contact information. 02. Click + on: Nhấp vào. Example: Click on the “Booking” button to submit the booking request. 03. Mouse hover + on: rê chuột vào (nhưng không click). Example: At the main Menu, hover on the Homepage menu and check the mouse hover color. 04. Leave the field blank: bỏ trống / không nhập gì vào trường nào đó. Example: At Contact form, leave all fields blank and click on Submit button. 05. Leave the field empty: (giống như trên) Example: At Contact form, leave all fields empty and click on Submit button. 06. Check the validation message: kiểm tra thông báo lỗi. Example: At Contact form, leave all fields blank and click on Submit button. Check the validation message color. 07. Missing / Lacking of: Thiếu…. Example: Missing (lacking of) the phone number at Contact information. 08. Are/is inconsistent: không giống nhau, không đồng nhất. Example: Option dropdown color is inconsistent. 09. Breaking / Broken: vỡ, bung. Example: The Homepage layout is breaking. 10. Overlapping...

By stationd
Làm việc với cơ sở dữ liệu trong Laravel

Làm việc với cơ sở dữ liệu trong Laravel

Bài viết được sự cho phép của tác giả Kien Dang Chung Trong rất nhiều các bài viết trước, chúng ta phải thực hiện việc cập nhật dữ liệu vào cơ sở dữ liệu một cách giả tưởng. Chờ đợi và giờ là lúc chúng ta cùng tìm hiểu làm việc với CSDL trong Laravel. Nếu như bạn đã từng lập trình PHP hoặc các ngôn ngữ khác, kết nối đến CSDL là một trong những việc quan trọng, phần lớn các project đều phải có CSDL chứa dữ liệu cho dự án. Làm việc với CSDL trong Laravel hết sức đơn giản, Laravel hiện đang hỗ trợ 4 loại CSDL phổ biến hiện nay: MySQL (Oracle) đã chuyển lên MariaDB, Postgres, SQLite, SQL Server (Microsoft). Laravel hiện chưa hỗ trợ kết nối đến CSDL Oracle, tuy nhiên có rất nhiều các gói thư viện hỗ trợ kết nối đến Oracle trên Github, tôi sẽ có một bài riêng về Làm việc với CSDL Oracle trên Laravel. Truy vấn đến CSDL trong Laravel có 3 phương thức là truy vấn SQL thuần túy, sử dụng Query Builder và sử dụng Laravel Model (Eloquent ORM). Trong bài viết này chúng ta sẽ tập trung vào cấu hình kết nối Laravel đến CSDL và sử dụng truy vấn SQL thuần túy để truy xuất dữ liệu. Tìm việc làm Laravel lương cao đến 2000 USD Thiết lập cấu hình kết nối cơ sở dữ liệu trên Laravel Trong bài viết Thiết lập cấu hình Laravel chúng ta cũng đã nói sơ qua về cấu hình kết nối CSDL, tất cả các thiết lập kết nối CSDL được đưa vào trong file config/database.php và kết hợp cùng với các biến môi trường được thiết lập trong file .env ở thư mục gốc của...

By stationd
Viết blog sử dụng markdown, pelican, github pages

Viết blog sử dụng markdown, pelican, github pages

Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng I. Markdown Markdown được nói trong bài này là cú pháp để phục vụ việc chuyển text thành HTML. Tức là khi viết bằng cú pháp markdown, đưa qua 1 chương trình xử lý, nó sẽ cho ra kết quả là HTML. 25 blogger IT nổi tiếng mà dân lập trình ai cũng phải biết Câu chuyện về cái comment tại một blog nọ Một số cú pháp hay dùng: Headers # H1 ## H2 ### H3 #### H4 ##### H5 ###### H6 Kết quả: (lưu ý, xem source html của kết quả để biết chính xác, việc trình bày có thể bị ảnh hưởng bới template của blog) H1 H2 H3 H4 H5 H6 Định dạng chữ: Chữ nghiêng: *nghiêng* hoặc _nghiêng_. (*: asterik, _: underscore) Chữ đậm: **đậm** hoặc __đậm__. Nghiêng đậm: **_nghiêng đậm_** hoặc *__nghiêng đậm__* Gạch ngang chữ: <s>gạch ngang</s> Kết quả: Chữ nghiêng: nghiêng hoặc nghiêng . (*: asterik, _: underscore) Chữ đậm: đậm hoặc đậm . Nghiêng đậm: nghiêng đậm hoặc nghiêng đậm Gạch ngang chữ: gạch ngang Link [I'm an inline-style link](http://fml.vn) [I'm an inline-style link with title](http://fml.vn "FML Academy") [I'm a reference-style link][Arbitrary case-insensitive reference text] [I'm a relative reference to a repository file](../blob/master/LICENSE) [You can use numbers for reference-style link definitions][1] Or leave it empty and use the [link text itself]. [arbitrary case-insensitive reference text]: http://fml.vn [1]: http://fml.vn [link text itself]:http://fml.vn Kết quả: I’m an inline-style link I’m an inline-style link with title I’m a reference-style link I’m a relative reference to a repository file You can use numbers for reference-style link definitions Or leave it empty and use the link text itself. Image Here's our logo (hover to see the title text): Inline-style: ![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text...

By stationd
Xây dựng nội dung trang HTML

Xây dựng nội dung trang HTML

Bài viết được sự cho phép của tác giả Kien Dang Chung Nội dung là phần quan trọng nhất của trang HTML, đây chính là phần người dùng có thể đọc được khi xem các trang web trên trình duyệt. Trong nội dung trang HTML có thể có rất nhiều các thành phần như các tiêu đề, các đoạn nội dung, hình ảnh, liên kết, các bảng thông tin… Trước khi bắt đầu tìm hiểu kiến thức các thành phần của nội dung trang HTML bạn cần nắm được cấu trúc chung của một trang HTML , vì trong bài viết này chúng ta sẽ xoay quanh nội dung nằm trong thẻ . Các thẻ HTML được giới thiệu trong bài viết này phần lớn đã có từ các phiên bản trước HTML5, chúng thường xuyên được sử dụng vì vậy bạn cần ghi nhớ chúng. Dùng Emmet để Code HTML/CSS nhanh hơn HTML cơ bản toàn tập cho người mới phần 1 1. Tiêu đề trong HTML Tiêu đề là những dòng văn bản đầu tiên bạn đọc được, nó rất quan trọng trong nội dung trang web. Một tin tức có được người dùng nhấp vào xem chi tiết hay không là ở tiêu đề. Trong HTML tiêu đề được chia thành 6 cấp độ: h1, h2, h3, h4, h5, h6. Tiêu đề h1 sẽ là quan trọng nhất và mức độ quan trọng sẽ giảm dần cho đến h6. [jsfiddle url=” https://jsfiddle.net/allaravel/r4s1jvxf/ ” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″] Mỗi thẻ tiêu đề có một kích thước mặc định khác nhau, thẻ h1 có kích thước chữ là lớn nhất và h6 là nhỏ nhất. Bạn có thể thay đổi kích thước chữ mặc định này bằng cách thiết lập thuộc tính CSS font-size thông qua thuộc...

By stationd
Tại sao nên dùng [SerializeField] thay vì biến public?

Tại sao nên dùng [SerializeField] thay vì biến public?

Cách đây độ hơn một năm, mình có viết một bài giải thích về thẻ [ SerializeField ] trong Unity C# hoạt động như thế nào. Trong bài đó, mình có nói rằng các trường dữ liệu public có thể là những mối nguy tiềm ẩn trong chương trình của bạn. Với các lập trình viên có kinh nghiệm, việc này khá là hiển nhiên, như kiểu trái đất quay quanh mặt trời vậy. Tuy nhiên, với các bạn newbie hoặc các bạn tự học lập trình tại nhà, nguy cơ đến từ các biến public có vẻ chẳng đáng lo ngại lắm. Trong bài viết này mình sẽ giải thích kỹ hơn quan điểm của mình, và bạn sẽ thấy vì sao nhiều lập trình viên khác cũng có chung quan điểm đó. “Em thấy hai cách chả khác quái gì nhau cả.” Nhìn qua thì việc dùng một biến public và một biến private + [SerializeField] có vẻ không khác gì nhau. Cả hai cách đều cho phép mọi người trong project của bạn chỉnh sửa trực tiếp giá trị của biến trong Unity Inspector. Nghĩa là dù bạn làm như thế này: public class Character : MonoBehaviour { [SerializeField] private int healthPoint; } … hay như thế này: public class Character : MonoBehaviour { public int healthPoint; // Đừng làm theo, mình khuyên thật } … thì ai cũng có thể mở script Character ra và sửa giá trị HP của nhân vật đó, ví dụ như từ 5 lên 10. Sự khác biệt có vẻ không rõ ràng lắm? Giờ thì hãy nhìn theo hướng của lập trình viên. Tưởng tượng một ngày thằng Dũng ngồi cạnh bạn sẽ dùng đám code trên cho tính năng mà nó đang xử lý. Nếu bạn dùng biến public,...

By stationd