Skip to content

Instantly share code, notes, and snippets.

View tanhit243's full-sized avatar
💭
I may be slow to respond.

Vu Tuan Anh tanhit243

💭
I may be slow to respond.
View GitHub Profile
:info_neon: Chuyên mục MIL - Monday I learn - 013
Nhân tiện mượn được a Vượng cuốn sách Làm chủ các mẫu thiết kế kinh điển trong lập trình của tác giả Tạ Văn Dũng thì em cũng mang tới chương trình làm chủ các mẫu thiết kế trong 1 ngày. (Just for funs)
Singleton pattern - pattern thuộc vào nhóm khởi tạo.
Nó được nghĩ ra để giúp đảm bảo một class chỉ có một object instance duy nhất và là nơi truy cập duy nhất trong hệ thống.
Ví dụ thực tế:
Trong ứng dụng Rails có nhiều loại connection DB, Redis, ... thì chúng ta không thể cứ mỗi lần dùng lại khởi tạo một object DB, Redis để dùng. Việc này sẽ tốn tài nguyên và hiệu suất không cao. Do đó chúng ta có thể nghĩ ngay tới Singleton pattern để giải quyết vấn đề này.
Có một số lưu ý khi sử dụng Singleton: Race condition - nói nom na là việc ứng dụng chạy nhiều thread đồng thời và cùng truy cập tới tài nguyên chung. Nếu implement pattern không tốt thì 1 class có thể có nhiều hơn 1 object.
:info_neon: Chuyên mục MIL - Monday I learn - 012
Một chút tin tức mới về rails 7.1
1. Github vừa mới public một Mysql client đang được sử dụng trong Github và nó đã được thêm vào rails. Bạn có thể sử dựng nó thay thế cho mysql2.
"Trilogy is a client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding."
Ref: https://github.com/rails/rails/pull/47880
2. Thay đổi cách validate độ dài password với BCrypt. Trước sử dụng count kí tự điều này có thể không thoả mãn validate phía BCrypt là 72 byte. Sau chuyển thành kiểm tra theo byte và thêm một key cho I18n `:password_too_long`.
"This Pull Request has been created because we identified a need to improve password length validation for BCrypt compatibility in the ActiveModel::SecurePassword module. The current validation only considers the character count, which may not accurately reflect the byte size limit imposed by BCrypt."
Ref: https://github.com/rails/rails/pull/47708
:info_neon: Chuyên mục MIL - Monday I learn - 011
Cách sử dụng `with` cùng với `allow` và `allow_any_instance_of`.
Dạng allow(A).to receive(:method).and_return some_thing
Có ý nghĩa: Khi gọi method với bất kì tham số nào thì sẽ trả về some_thing
Dạng allow(A).to receive(:method).with(:some_params).and_return some_thing
Có ý nghĩa: Khi gọi method với param cụ thể :some_params thì sẽ trả về some_thing
Nếu truyền sai tham số thì sẽ bị raise lỗi.
`Please stub a default value first if message might be received with other args as well.`
@tanhit243
tanhit243 / ssh in my using ssh
Last active February 12, 2023 04:12
ssh in my using ssh
:info_neon: Chuyên mục MIL - Monday I learn - 010
Chắc hẳn mọi người không còn lạ lẫm gì với cmd ssh đúng không ạ? Trong số này em xin giới thiệu về một số kinh nghiệm sử dụng trong công việc với ssh.
1. Luôn thiết lập tập tin config trong thư mục .ssh
Ưu điểm: Truy cập đến remote server một cách nhanh chóng mà không cần nhớ user, ip, port vv...
Lưu ý: Mỗi remote server sẽ tạo riêng một cặp key. Không dùng chung 1 cặp key duy nhất cho toàn bộ remote server.
Nếu bạn không may mắn để lộ private key và một vài thông tin khác thì có thể người có ý đồ xấu sẽ vào được toàn bộ các server khác.
Ví dụ: dev => abc_dev.key, stg => abc_stg
```
:info_neon: Chuyên mục MIL - Monday I learn - 008
Nhân dịp đầu năm 2023 em xin chúc mọi người mạnh khỏe, vui vẻ và thành công ạ.
Trong số này em xin giới thiệu về một trong những ý tưởng có thể cải thiện tốc độ chạy unitest hay cụ thể rspec.
Nếu mọi người để ý thì khi sử dụng rspec thì đều chạy trên 1 process duy nhất.
Điều này có lẽ sẽ phù hợp về thời kì đầu năm 2000 vì CPU có 1 đến 2 nhân nhưng bây giờ có lẽ là hơi lạc hậu khi CPU đã có tới 4 nhân, 8 luồng và hơn thế nữa.
Việc sử dụng rspec trên 1 process duy nhất khiến thời gian chạy rất lâu và không tối ưu resource chúng ta có.
Vậy một câu hỏi đặt ra là chúng ta có thể sử dụng nhiều process hơn của CPU không?
Câu trả lời là có và một chiếc gem https://github.com/grosser/parallel_tests sẽ giải quyết giúp ta vấn đề này.
:info_neon: Chuyên mục MIL - Monday I learn - 007
Số trước em đã giới thiệu về validates_comparison_of method giúp chúng ta thêm validate kiểu so sánh với thời gian, ...
Trong tuần này mình xin giới thiệu về method includes trong RoR.
Đây là một method dạng tải dữ liệu từ DB ra và lưu trong bộ nhớ tạm để RoR sử dụng tránh vấn đề n+1 query.
Trong dự án hiện tại em thấy mọi người dùng cũng khưa khứa nên em cũng muốn chia sẻ những kiến thức và kinh nghiệm của em khi sử dụng
includes trong RoR. Bên cạnh includes mọi người có biết đến pre_load và eager_load không?
Vì bài cũng khá dài nên em xin phép link tới https://docs.google.com/document/d/1ZfmGmo79gap0H56mZ1TftjdVGNCaZRgqGrGJ7rBkw0k/edit?usp=sharing
@tanhit243
tanhit243 / comparison validator
Created October 23, 2022 15:48
comparison validator in rails 7
:info_neon: Chuyên mục MIL - Monday I learn - 006
Số trước em đã giới thiệu về each_with_object method giúp chúng ta giảm bớt được bước khai bái biến trước.
Trong tuần này mình xin giới thiệu về comparison validator mới trong rails 7.
Trước rails 7: Nếu cần một logic validation kiểu start_time không được lớn hơn end_time hoặc time > now thì chúng ta phải tự define hoặc dùng gem bên ngoài.
class Event < ApplicationRecord
validates :start_date, presence: true
validates :end_date, presence: true
@tanhit243
tanhit243 / gist:fe7a40914a26171c300c65ff06bfd0d4
Created September 25, 2022 15:28
Floating-point in ruby
:info_neon: Chuyên mục MIL - Monday I learn - 004
Số trước mình đã giới thiệu về các tìm kiếm nhanh route với rails routes -g
Trong tuần này mình xin giới thiệu về BigDecimal ruby.
Ví dụ: Nếu ở ngoài đời khi được hỏi kết quả của phép toán 0.1 + 0.2 có bằng 0.3 không thì câu trả lời luôn là có quá ez. Nhưng với máy tính thì không. Hãy bật rails c lên và thử phép toán thì kết quả trả về là false
```
irb(main):013:0> 0.1 + 0.2
=> 0.30000000000000004
irb(main):014:0> 0.1 + 0.2 == 0.3
=> false
irb(main):015:0>
@tanhit243
tanhit243 / gist:ade17417bf5d360024c8b06561855678
Created September 11, 2022 15:35
Tìm kiếm route trong rails với route -g
:info_neon: Chuyên mục MIL - Monday I learn - 003
Số MIL-002 đã giới thiệu về một hàm mới họ *sole
Vì thấy mọi người hay dùng VS code nên chắc hẳn việc tìm route trong một dự án lớn là khá vất vả. Số này mình xin giới thiệu một option trong rails routes rất hữu ích đó là -g. Đến bây giờ mới biết vì trước đó mình dùng rails routes | grep ..., cách này vẫn ổn nhưng dài hơn so với các sử dụng option.
Trước rails 7: Bạn chỉ có thể tìm kiếm được dạng rails routes -g users/:user_id/posts/:post_id hoặc rails routes -g users
Sau rails 7 (> 7.0.3):
Bạn có thể sử dụng path dễ hiểu hơn là rails routes -g users/1/posts/1. Chúng ta không phải nhớ chính xác tên symbol trong route.
Tham khảo:
https://blog.saeloun.com/2022/09/06/extend-routes-grep-functionality
@tanhit243
tanhit243 / rails http status codes
Created August 7, 2022 07:37 — forked from mlanett/rails http status codes
HTTP status code symbols for Rails
HTTP status code symbols for Rails
Thanks to Cody Fauser for this list of HTTP responce codes and their Ruby on Rails symbol mappings.
Status Code Symbol
1xx Informational
100 :continue
101 :switching_protocols
102 :processing