$ today_i_learn
Biển học vô cùng
Đây là 3 kiến trúc phổ biến cho một ứng dụng.
Monolith đóng gói tất cả chức năng trong một process. Mọi thứ xảy ra trong đó. Đây là kiến trúc phổ biến, cổ truyền.
SOA tách các chức năng chính ra thành các process riêng độc lập và giao tiếp với nhau. Từ monolith phát triển sang SOA khi hệ thống cần tính cô lập, đơn nhiệm, dễ phát triển những chức năng quan trọng, hay nặng đô hơn. Nhưng cũng nảy sinh nhiều vấn đề như giao tiếp giữa các service, bảo mật, deploy,… Microservice cũng là một dạng SOA.
Sau này còn có Serverless là các chức năng đơn giản mà người ta chỉ quan tâm cách nó hoạt động và điều gì trigger nó mà không quan tâm nhiều về server (chứ không phải là không cần server).
Kế thừa như là uỷ quyền trả lời message. Nếu object không thể thực hiện message thì nó sẽ tìm trong cây phả hệ các lớp cha xem có kiến thức gì về message này không.
Dùng kế thừa khi có nhiều kiểu mang cùng điểm tương đồng, kiểu như một dạng chuyên biệt của một cái gì đó chung chung hơn ví dụ như xe đạp thì có nhiều loại như xe địa hình, xe đi trong phố, xe em bé,… người dùng thì có khách, admin, nhân viên,…
Tạo kế thừa theo kiểu đẩy trừu tượng từ lớp chuyên biệt lên lớp cha.
Phải luôn nhớ, phụ thuộc khiến các đối tượng dính vào nhau, làm cho việc thay đổi khó khăn hơn và dễ bị ảnh hưởng qua lại. Khi cảm thấy lớp con phụ thuộc quá nhiều vào lớp cha ví dụ khi khởi tạo nó phải gọi tới super (biết lớp cha làm gì) thì có thể dùng template pattern hoặc hook.
Ví dụ trong initialize của lớp con có gán vài thuộc tính chuyên biệt của nó và gọi super để gán thuộc tính chung thì có thể dùng hook post_initialize để gán những thuộc tính chuyên biệt này. Lớp con giờ không cần biết lớp cha khởi tạo như thế nào nữa, cái gì của riêng nó thì nằm trong hook.
Khi tạo lớp con mới thì chỉ cần làm theo các lớp con có sẵn và tạo method tương ứng là được, không bị lỗi, không cần nhiều kiến thức, dễ thay đổi.
tính bằng cách chia Vốn chủ sở hữu cổ đông công ty mẹ* cho *số lượng cổ phiếu lưu hành.
Vốn chủ sở hữu cổ đông công ty mẹ = Tổng vốn chủ sở hữu trừ đi lợi ích cổ đông không kiểm soát.
Ví dụ với BCTC quý I của FMC: - Tổng vốn chủ sở hữu (Mã 400): 2.665.442.424.383 - Lợi ích Cổ đông không kiểm soát (Mã 429): 291.998.863.240 - Cổ phiếu đang lưu hành (Cổ phiếu phổ thông): 65.388.889
=> BVPS = (2.665.442.424.383 - 291.998.863.240) / 65.388.889 = 36.297
Giá ngày 21/04/2026 là 39.200 => P/B = 39.200 / 36.297 = 1,08. Cổ phiếu FMC đang giao dịch gần bằng với giá trị tài sản ròng của công ty.
Doanh thu giảm nhưng lợi nhuận lại tăng so với cùng kì năm ngoái. Vùng nuôi tôm thu được tốt làm tăng biên lợi nhuận. Đúng với mục tiêu không mở rộng ồ ạt mà đi sâu vào giá trị.
Vay nợ giảm mạnh. Tiền gửi ngân hàng tăng thu lãi. Vì được ưu đãi lãi vay nên đem tiền đo gửi ngân hàng lại lời hơn. Tiền mặt cuối kì 1.900 tỉ.
Chi phí xây dựng dở dang giảm mạnh báo hiệu máy móc đi vào hoạt động làm tăng năng suất. Kì tới sẽ bùng nổ.
Dự định mua thêm 2000 cổ ở vùng giá 38~40 hiện tại.
Ma trận đảo là biến đổi đảo ngược không gian về ban đầu sau khi biến đổi gốc. Để giải hệ phương trình tuyến tính 3 biến ta quy về Ax = v. Để tính x ta nhân ma trận đảo của A ở 2 vế được x = A(đảo)v.
Đó là khi det khác 0. Nếu det = 0 thì ta không thể đảo ngược không gian từ đường thẳng thành mặt phẳng được. Column space là span của các vector cột trong ma trận. Khi det = 0 column space của 2D là một đường thẳng.
Rank là số chiều của column space. Nếu det khác 0 thì rank là số chiều không gian. Và không gian cột bao trùm số chiều theo rank.
Null space là không gian mà sau transform bị nén về toạ độ gốc. Ở 2D nếu rank là 2 thì null space là 0, nếu rank là 1 (đường thẳng) thì null space là 1 (cũng là một đường thẳng). Để ý rank + null space = Số chiều không gian gốc.
Với 3D, nếu sau transform rank là 2 (mặt phẳng) thì null space là 1 đường thẳng, nếu rank là 1 thì null space là mặt phẳng.
Khi không gian bị thay đổi nó làm thay đổi grid và dẫn tới thay đổi diện tích trên không gian đó. Determinant là mức độ scale trên không gian. det = 2 nghĩa là diện tích các hình trên không gian đó tăng lên gấp đôi. Nếu det là số âm có nghĩa là không gian bị đảo, bình thường j mũ nằm bên trái i mũ, sau khi transform j mũ nằm bên phải i mũ, det là số âm.
Tính det của ma trận [a b, c d] = ad - bc.
Nếu det = 0 nghĩa là không gian bị nén lại về chiều thấp hơn và không thể bị đảo được hoặc có thể về gốc. Nói cách khác span có thể là đường thẳng hoặc i và j phụ thuộc tuyến tính.
det(M1M2) = det(M1)det(M2)
Khi transform không gian thành M2 rồi transform M1 tiếp được không gian mới có det(M1M2) chính bằng 2 lần biến đổi M1 M2 với det nhân lại. det(M1M20) = 6 thì có thể là det(M1) lần đầu scale không gian lên 3 lần, scale (M2) tiếp từ đó (M1) lên 2 lần nữa thì được kết quả 6.
Nhân 2 ma trận giống như là áp dụng transform 2 lần theo thứ tự phải trước trái sau. Nếu đổi thứ tự thì ma trận kết quả sẽ khác nhau. Ví dụ: nếu xoay 90 độ rồi lật sẽ khác với lật rồi xoay 90 độ.
Tích của 2 ma trận là tìm ra 2 vector cơ bản cho không gian mới biến đổi. Ví dụ M1 x M2 thì 2 cột của M2 là i và j đã được biến đổi. Nhân với M1 là áp dụng biến đổi đó với i và j, lấy i nhân M1 được cột trái và j nhân M1 được cột phải của ma trận kết quả.
Tích 2 ma trận là một composition. Muốn tìm vector được biến đổi bởi composition ta áp dụng 2 lần transform cho vector đó.
Transformation thực chất là function nhưng gọi vậy là để hình dung vector đang bị biến đổi (ánh xạ) trong không gian. Linear transformation (biến đổi tuyến tính) là biến đổi không gian sao cho các đường thẳng phải song song và cách đều nhau với gốc không đổi.
Dùng các điểm để dễ hình dung sự biến đổi này.
Matrix (ma trận) là sự biến đổi này trong không gian áp dụng vào các basis vector \(\hat{i}, \hat{j}\).
Phải giữ được 2 tính chất: - Biến đổi tuyến tính phải giữ được tính cộng. Cộng 2 vector rồi chuyển đổi phải bằng với tổng của 2 lần chuyển đổi vector. - Scale: nhân vector đã chuyển đổi bằng chuyển đổi tích của vector.
Khi nhân vector với ma trận là đang chuyển đổi vector đó sang không gian mới (không gian của ma trận đó).
Vì mọi vector đều được biểu diễn bằng basis vector \(\hat{i}, \hat{j}\) nên chỉ cần biết chúng được chuyển đổi ra sao là tìm được các vector cần chuyển đổi.
Để tính nhân vector [x, y] với ma trận, lấy x nhân với \(\hat{i}\) y nhân với \(\hat{j}\) rồi cộng x theo x y theo y là được vector mới.
Vector là các đại lượng với độ dài và hướng trong không gian. Không gian 2 chiều với trục hoành x, trục tung y, một vector được vẽ từ gốc toạ độ với toạ độ \(\vec{v} = (1, 2)\) thì 1 là độ dài trên trục x, 2 là độ dài trên trục y.
Cộng 2 vector lấy \(x_1 + y_1, x_2 + y_2\). Nhân vô hướng với số n thì lấy \(nx_1, ny_1\).
Basis vector là 2 vector được dùng làm gốc, các vector khác sẽ scale theo nó dựa vào một scalar. Scale nghĩa là co giãn hoặc thay đổi hướng vector. Scalar là các số nhân vào để scale vector.
Span là toàn bộ không gian các vector có thể bao phủ hệ trục toạ độ.
Linear combination kết hợp tuyến tính là sự kết hợp giữa 2 vector.
Nếu 2 vector độc lập tuyến tính nghĩa là chúng không cùng nằm trên một đường thẳng hoặc không là gốc toạ độ thì span của chúng là toàn bộ mặt phẳng 2 chiều của hệ trục toạ độ. Khi đó các tổ hợp tuyến tính của nó có thể chạm đến các điểm trên toàn hệ. Còn nếu phụ thuộc tuyến tính thì nó chỉ nằm trên một đường thẳng di chuyển lên xuống. Điểm tới của nó là tất cả các điểm trên đường thẳng.
Xét hệ 3D, thì span của 3 vector độc lập tuyến tính là toàn bộ không gian 3 chiều. Nếu có 1 vector phụ thuộc thì nó dư thừa và span là một mặt phẳng chứa 2 vector còn lại.
ˈɡlæm(ə)rəs
“My darling is one of the most glamorous women”
“Vợ tôi là một trong những người phụ nữ quyến rũ nhất hành tinh :))”
Nhưng dòng điện lại đi từ dương (+) sang âm (-). Đó là do vào năm 1750 Benjamin Franklin đã chọn đại hướng dòng điện như vậy. 🤷♂️
thường dùng để ám chỉ cho cả nhóm, đối lập với cá nhân individually. Đọc là kəˈlɛktəvli.
“The instruction codes that are stored in memory are often referred to collectively as code, and everything else as data.”
“Mã lệnh lưu trong bộ nhớ thường được nhắc chung là code, và mọi thứ khác là dữ liệu.”
có thể là danh từ dịch là ngoại vi. Đọc là pəˈrɪf(ə)rəl.
“Computers also include several input and output (I/O) devices, often call peripherals.”
“Máy tính cũng bao gồm vài loại thiết bị đầu vào và đầu ra (I/O), thường gọi là thiết bị ngoại vi.”
chỉ điều gì đó không chính xác, kiểu hườm hườm. Đọc là ˈrəfli.
“But they can roughly be divided into three categories:”
“Nhưng chúng có thể được chia tương đối (tạm) thành 3 loại:”
rất nhiều, không đếm được. Đọc là ˈmɪriəd.
“The modern computer is a complex assemblage of myriad components.”
“Máy tính hiện đại là một tập hợp phức tạp của vô số linh kiện.”
,influ'en∫əl có ảnh hưởng, có sức thuyết phục.
Ví dụ: “Steve Jobs was influential in technology.”
=> “Steve Jobs có tầm ảnh hưởng lớn lao đến công nghệ.”
Ở Mỹ thời Chiến tranh lạnh, lúc bấy giờ nỗi sợ Cộng Sản lan rộng với việc Liên Xô vừa cho nổ bom nguyên tử đầu tiên (1949). Nước Mỹ gắt gao tìm kiếm gián điệp để làm dịu đi sự yếu thế của mình.
Julius Rosenberg bị tình nghi tuồn thông tin bí mật cho Liên Xô. Ethel Rosenberg, vợ ông cũng lây theo dù chưa có bằng chứng rõ ràng. Cả 2 bị xét xử công khai rồi bị xử tử bằng ngồi ghế điện vào năm 1953.
Băn khoăn để chỉ trong lòng còn nhiều suy nghĩ chưa yên, phân vân chưa biết chọn điều gì còn bâng khuâng thiên về cảm xúc luyến tiếc, ngẩn ngơ, buồn nhớ không rõ ràng. Ví dụ:
“Tôi đang băn khoăn không biết nên làm gì với chiếc Macbook hư này.”
“Từ dạo xa cách, chiều nào con nhỏ cũng ngồi bâng khuâng bên hiên nhà.”
mang nghĩa là ngõ cụt, cả đen và bóng. Ví dụ khi đang đi trên đường thì thấy cuối đường bị chặn không còn đi được nữa thì là ngõ cụt hoặc khi một tình huống hay vấn đề gì không còn tiến triển hay đi xa hơn được nữa thì đó cũng là ngõ cụt. Ví dụ khi mình dịch sách Code:
“I’m afraid we must regard the Triple-Byte Accumulator as a dead end.”
“Tôi e là ta phải xem Bộ tích luỹ 3-Byte như là một ngõ cụt (điểm cuối).”
Nghĩa là không thể mở rộng hay cải tiến gì thêm với Bộ tích luỹ này nữa rồi.
lan toả, và đậm mùi. Dùng khi miêu tả một mùi nồng nàn bay vào mũi làm bạn nhận ra ngay. Cảm xúc hơi không phải khen lắm mà kiểu bất ngờ và ấn tượng. Ví dụ như:
“Tôi bước ngay vào nhà vệ sinh liền sau khi vợ đi ra là mũi ngửi sực nức mùi cứ*!”
dưới local có thể chạy bình thường nhưng khi deploy nếu chỉ chạy lệnh kamal deploy thì server vẫn chạy phiên bản Ruby cũ. Để cập nhật phiên bản mới trên server giống với local thì cần sửa mục:
# deploy.yml
builder:
arch: amd64
args:
RUBY_VERSION: 4.0.0 <~~ Sửa thành phiên bản mới
# Dockerfile
ARG RUBY_VERSION=4.0.0 <~~ Sửa thành phiên bản mới
Sau đó chạy lệnh kamal deploy --no-cache để build lại image mới và deploy app. Nguyên lý của Kamal là build Docker image → push lên registry → server pull về chạy. Server khi deploy hay dùng bản cache cho lẹ, nên buộc mình phải chạy --no-cache để build bản mới.
Trong quá trình chạy có thể sẽ gặp vài gem không hỗ trợ Ruby mới (4) thì bạn phải tự cài tay lại (bằng bundle update [tên gem]). Trường hợp của mình là gem ffi (1.17.4) và pg (1.6.3).
nghe không rõ, tỏ ý bất bình, không bằng lòng. Kiểu như muốn rên, rủa ai đó nhưng không dám nói to mà chỉ nhí nhí trong miệng.
“Mày còn đứng đó lầm bầm tao cho ăn thêm cán chổi nghe chưa!”
Trên là câu ví dụ mà hồi xưa tôi hay nghe mẹ nói lắm.
Tôi cóp nhặt những từ vựng này để làm giàu tiếng mẹ đẻ trong tôi rồi viết và lan truyền tới những ai đọc được. Chào mừng bài đầu tiên của chuyên mục Mỗi ngày một kiến thức (Today I learn).