Introduction
Ebook này sẽ bao gồm ghi chép về tech trong quá trình nghiên cứu. Công nghệ càng nhiều và việc ghi chép nó là một cách tốt để sau này có thể tra cứu dùng lại.
- Name:
Kitto - Email: `mr.bichkhe@gmail.com``
Termidology
Polkadot
Aptos
Sui
Solana
Trong bài học này chúng ta sẽ học cách để tạo ra một Dervice macro đơn giản nhất. Chúng ta sẽ hiểu rõ các bước để tạo ra một macro derive và có cái hình dung ban đầu về cách một dervie macro hoạt động. Chúng ta sẽ không đề cập cách để debug sủ dụng cargo expand cũng như học hết tất cả các cú pháp có thể có macro dạng này. Chúng ta cũng sẽ không bàn để attribute derive macro cũng như các khái niệm nâng cao về hygiene. Nó là sẽ thuộc về một bài tìm hiểu khác. Các bạn có thể tìm hiểu cuốn sách John Geet
Derive Macro là gì?
Đây là macro dạng procedular mà sử dụng với từ khoá derive(đối lập với declarative như function macro println!). Nó giống như một header. Eg: #[foo]
Một số macro quen thuộc như: Debug, Eq hay như Serialize or Desialize của serde crate
#![allow(unused)] fn main() { #[derive(Debug, Eq, Hash, Clone, PartialEq)] struct Foo {} }
Cách sử dụng
#![allow(unused)] fn main() { #[derive(DeriveMacroName)] struct Foo {} }
Khai báo trên đầu của struct
Cách nó hoạt động
Giải thích Giả sử chúng ta có một struct
#![allow(unused)] fn main() { struct Foo { bar: i32 } }
Macro sẽ parse struct này. Nó nhận struct này như đầu vào coin nó như dạng TokenStream (Chuỗi các token). Nó tìm cách để đưa thêm một số đoạn code nữa.
#![allow(unused)] fn main() { impl Bar for Foo { fn name() -> &'static str { "Foo" } } }
Cuối cùng nò regenerate (tạo lại) và cũng tạo đầu ra là TokenStream. Chuỗi này sẽ có dạng
#![allow(unused)] fn main() { struct Foo { bar: i32 } impl Bar for Foo { fn name() -> &'static str { "Foo" } } }
Khá là rõ ràng phải không nào.
Ví du với Debug
#![allow(unused)] fn main() { #[derive(Debug)] struct Foo { a: i32, } }
Bạn có thể nghĩ nó sẽ tương đương với
#![allow(unused)] fn main() { use std::fmt; struct Foo { a: i32, } impl fmt::Debug for Foo { fn fmt(&self, f: &mut fmt::Formatter) ->fmt::Result { write!(f, "Foo: {}", self.a) } } }
Nhưng thường là nó sẽ có nhiều cái phức tạp hơn.
Thực hành Mô tả bài toán: Giả sử chúng ta có một struct như sau
#![allow(unused)] fn main() { struct Foo { a: i32, b: bool, c: String, } let foo = Foo { a: 4, b: false, } println!("{}", foo.name()); // "Foo" println!("{:?}", field_names()); // ["a", "b"] }
Chúng ta muốn đầu ra sẽ là như sau:
#![allow(unused)] fn main() { struct Foo { a: i32, b: bool, } impl Foo { fn name() -> &'strict str{ "Foo" } fn field_names() -> Vec<&str> { vec!["a", "b"] } } }
Struct sẽ thực hiện thêm 2 hàm name và field_names trả về tên của struct và in ra tên các thuộc tính trong struct đó
Khởi tạo thư viện và cài đặt package cần thiết
Tạo một macro với tên là reflective-derive
#![allow(unused)] fn main() { cargo new --lib reflective-derive Add chỉ thị proc-macro [lib] proc-macro=true }
Thêm 2 thư viện sync và quote
cargo add sync quote
Tại sao chúng ta cần 2 thư viện này ?
TokenStream của struct có thể là như sau
#![allow(unused)] fn main() { | 0 | struct | | 1 | Foo | | 2 | { | | 3 | a | | 4 | : | | 5 | i32 | | 6 | , | | | ... | |.. | } | }
Khá khó để xử lý một token stream dạng này. Do đó chúng ta cần một thư viện có thể giúp chúng ta để biến đổi tới một struct. syn sẽ giúp chúng ta từ TokenStream tới dạng struct cây AST của cấu trúc dạng nhưDeriveInput như sau
#![allow(unused)] fn main() { pub struct DeriveInput { pub attrs: Vec<Attribute>, pub vis: Visibility, pub ident: Ident, pub generics: Generics, pub data: Data, } }
Trong đó ident
Còn quote sẽ giúp chúng ta biến đổi ngược lại.
Eg:
#![allow(unused)] fn main() { | 0 | struct | AST | 1 | Foo | [struct] | 2 | { | ident: "Foo" | 3 | a | visibility: private | 4 | : | --> ... | 5 | i32 | [field] [field] | 6 | , | ident: Some("a") ident: Some("a") | | ... | visibility:private visibility:private |.. | } | ... ... }
Tạo một hàm
#![allow(unused)] fn main() { use proc_macro::TokenStream; use sync::DeriveInput; #[proc_macro_derive(Reflective)] fn reflective_derive_macro(item: TokenStream) -> TokenStream { //parse let ast: DeriveInput = syn::parse(item).unwrap(); // generate impl_reflective_trait(ast); } }
Hàm này nhận đầu vào là TokenStream như mô tả ở trên và trả về cũng một TokenStream Chúng ta có thể đặt tên hàm là bất kỳ reflective_derive_macro #[proc_macro_derive(Reflective)] mô tả tên cúng cơm của nó. Bạn sẽ sử dụng Reflective khi sử dụng Sử dụng syn::parse để parse TokenStream này và trả về DeriveInput như chúng ta đề cập ở trên Thực hiên hàm impl_reflective_trait taọ hàm name()
#![allow(unused)] fn main() { fn impl_reflective_trait(ast: DeriveInput) -> TokenStream { // Lây thông tin của tên struct // Chúng ta sẽ có "Foo" let ident: Ident =ast.ident; // Nó là kiểu `Ident` chúng ta cần biến đổi tới một String let ident_str = ident.to_string(); // Sử dụng `quote!` để biến đổi từ DeriveInput tới `TokenStream` quote::quote!{ impl Reflective for #ident_str { fn name(&self) -> &'static str { ident_str } } }.into() } }
Giải thích nằm ở comment. Chúng ta sử dụng #
Thực hiện hàmimpl_reflective_traittaọ hàmfield_names() Trong DeriveInput chúng ta có trường data: Data
#![allow(unused)] fn main() { pub enum Data { Struct(DataStruct), Enum(DataEnum), Union(DataUnion), } pub struct DataStruct { pub struct_token: Struct, pub fields: Fields, pub semi_token: Option<Semi>, } }
Chúng ta có thể sử dụng để lấy thông tin của các fields trong một struct.
Như trên các bạn cũng có thể thấy rằng derive macro này cũng có thể đặ trước Enum, Union nữa
Lấy các field
#![allow(unused)] fn main() { fn impl_reflective_trait(ast: DeriveInput) -> TokenStream { ... // let field_idents: Vec<Ident> = match ast.data { syn::Data::Struct(data) => data.fields.into_iter().filter_map(|f|f.ident).collect(), sync::Data::Enum(_) => panic!("doesn't suport for enum"), sync::Data::Union(_) => panic!("doesn't suport for union"), } ... } }
Biến đổi Vec
#![allow(unused)] fn main() { fn impl_reflective_trait(ast: DeriveInput) -> TokenStream { ... // let field_idents: Vec<Ident> = match ast.data { syn::Data::Struct(data) => data.fields.into_iter().filter_map(|f|f.ident).collect(), sync::Data::Enum(_) => panic!("doesn't suport for enum"), sync::Data::Union(_) => panic!("doesn't suport for union"), } let field_idents_strs: Vec<String> = field_idents.iter().map(|i| i.to_string).collect(); ... } }
Tạo hàm field_name()
#![allow(unused)] fn main() { fn impl_reflective_trait(ast: DeriveInput) -> TokenStream { ... // let field_idents: Vec<Ident> = match ast.data { syn::Data::Struct(data) => data.fields.into_iter().filter_map(|f|f.ident).collect(), sync::Data::Enum(_) => panic!("doesn't suport for enum"), sync::Data::Union(_) => panic!("doesn't suport for union"), } let field_idents_strs: Vec<String> = field_idents.iter().map(|i| i.to_string).collect(); quote::quote! { impl Reflective for #ident_str { fn name(&self) -> &'static str { ident_str } fm field_names(&self) -> Vec<&'static str> { vec![#(#field_idents_strs), *] } } } ... } }
Khi lặp lại ta sử dụng cú pháp #(),*. Điều này nghĩa là có thể dạng lặp lại 1 hay nhiều lân a, a,b, Bên trong #() truyền biến dạng là một mảng
EKS Basic
Components
name: 'Test'
kind: "Test"
How to debug Service, Pod, Ingress Public
AWS - Handons
Cloudfront
Cách để dò ngôn ngữ đúng
- GIả sử chúng ta có 3 dịch vụ
- /en/index.html
- /vi/index.html
Chúng ta muốn là nếu như user đến từ Vietnamese sẽ định hướng tới. file /vi/index.html
Cách giải quyết:
- Sử dụng cloudfront lọc cái theo gemetetric
Cách để cấm một user từ một France truy nhập dịch vụ
Sử dụng Retrist content của Cloudfront
- Allow list
- Block list
Cloudfront > Distribution> Gegraphic
Cách để dự phòng một dịch vụ
Vấn đề: Cloud Front -----> Service 1 ----> Service 2
Nếu dịch vụ chết Serivce 1, nó sẽ trỏ đến Service 2 Distributions > Origins
Giải pháp:
- Sử dụng origin group trong cloudfront, nó cho phép có thể tạo một nhóm dịch vụ
- Tạo 1 nhóm gồm 2 service 1 and service 2
- Cloud front trỏ tới nhóm này
- Khi dịch vụ service 1 failed, nó sẽ tự động chuyển tới service
Cách để cấu hình để ALB chỉ cho phép traffic đến từ một Cloudfront
Giải pháp:
Bước 1: Vào Distribution (CloudFront) > Origins > Thêm header X-Custom-Secret: supersceret
Bước 2: Vào ALB để cấu hình với rule if header [X-Custom-Secret] == superscret sẽ forward tới target
Cách để S3 chỉ cho phép traffice từ Cloudfront
Sử dụng Bucket policy và điền Principles là địa chỉ của CloudFront Distribution (Gọi là OAI)
LoadBalancers
Kiến thức cần nhớ
- LB sẽ nằm trong một
VPC, nằm trong cácsubnet, cósecurity group(ALB SG) để cấu hìnhinboundvàoutbound - LB có
ruleđể cấu hình phân tải tới cáctarget group.Rulecó thể theoURL path,Hostname(URL /api /apiv2, hostname: example1.com, example 2) Rulecòn có thể làhost-header,http-request-method,path-pattern,source-ip,http-header,query-string- Nó có thể cấu hình
health checktới cáctarget. Hỗ trợ HTTP, HTTPS, TCP tuỳ mỗi loại - Có thể cấu hình để cùng
1 headerthì forward đến 1targetcụ thể (Sticky Sesion) - Cross-Zone Load blancing sẽ giups chia đều trên tất cả các
targets - Target group có thể
EC2 instances,ECS Tasks,Lambda functions,IP Addresses - Phân tải nên có trọng số
target group - Cần xác thực thì nó gọi tới Cognito để xác thực
- SNI: Server name Incidation: Có thể cấu hình nhiều SSL cert trên ALB, và nhiều target group. Khi request đến, nó tự biến dùng
certnào. - Tham số
connection drainingxác định thời gian để đợi để LB gọi tới các target group đểcheck health, từ 0-3600. 0 là disable đi
Daily English
16/09/2024
Lesson 21:
- advertisement: 3 bài quảng cáo
- boat: thuyền
- tour: chuyến thăm quan
- September: 2 tháng chin
- Aboslutely: 3, một cách tuyệt đôi
- nais: tuyền âm s
- throug: âm 0
- lôk ffor
- calender: 1 lịch cuốn
- left-hand side: bên tay trái
- choose: chọn, âm cuói
- date: âm t
- popular: phổ biến
- live music: lai muzik, nhạc sống âm 2,
- offline: 2, nhạc ngoại tuyênts
- view: Cái nhìn tầm nhỉ
- rate: tỷ lệ tốc độ, đánh giá, âm t cuói
- map: bản đồ
- on time: đúng giờ
- in time: kịp lúc
- easy: 1 dễ dàng
- reserveve: 1, zi ropự
Lesson 20
- guest: /gest 1/ khách hàng
- symphony: 1 sim fo ni/ nhạc giao hưởng
- orchestra: 1 dàn nhac, nhan nhạn
- perform: 2, biểu diễn, thực hiện
- performance: 2 , buổii biểu diễn, âm cuối là s
- box office: 1 phòng vé
- couple: 1 , cặp đội, âm k đầu
- a couple of time: Một đôi lần
- book: đặt chỗ
- recording : 2, bản ghi âm
- brochue: 3, tập quảng cáo
- another: 2, cái skhacsc,
- music:
- clasical: 1, cổ điển âm kl cuối
- venue: địa điểm
- stop by: 1 ghé quá
- detail: 2 chi tiết
- instead: 2, cái khác /in' sted/
- retail: 2, bán lẻ
- group: âm u dài
- maintenance:1, sự bao trì, âm s cuối
- mssage: 1, tin nhắn âm dz
- confirmation: 3, âm sh cuối, xác thực
Lesson 1
- fair: /fer/
- recuitt: 2,
- job fair: am dz
- flower: 1, ha
- notice: 1, /nou tis/
- a bit
- real: ri:l/
- smell
- bother: lam phien am
11/09/2024
Lesson 2:https://www.youtube.com/watch?v=9_ZdkZkWty4&list=PLBFnPBcibvEJi7Z-IztcX_77MxrWj9g-8&index=11
- crowded: /krao địt/ 1
- downtown: 2, trung tâm thành phố
- purchurse: 2 mua sắm
- always: 2 /alweiz/ âm z cuối
- champison : 1
- walk: đi bộ
- emppti : rỗng, trống
- way: đường đi
- people: 1
- by the way:
- suit: /su:t/
- shirt: âm sh
- lecture:
- closthes: /klouwdz/
- dont worry
- shopping mall: trung tâm thương mại
- extend: 2
- invitation: 3, sự lời mời explanation: 3
- stadium: 2, sân vân động
- encouragment: 3, sự khuyến khích
- ussually: 1 jiuzuali`
- especially: 2
Lesson 1: https://www.youtube.com/watch?v=A3yeOWgyOl4&list=PLBFnPBcibvEJi7Z-IztcX_77MxrWj9g-8&index=10
-
Percent: 2, phần trắm âm t cuối
-
increase: 2, tăng
-
passsenger: 1 hành khách, âm dz
-
domestic : 2, nội địa
-
still: vẫn còn
-
even higher: cao hơn nữa /evn hai o/
-
offer: 1
-
vaction: 2,
-
package: 1
-
to be interested in
-
partner: 1
-
budget hotel: 1, âm ^, khách sạn hbình dân
-
worth: đang giá, âm th cuối
-
operate: 1, điều hành vận hành
-
shipping: 2 âm shf
-
suggest: 2 dz
-
replace: 2, âm s cuối
-
equipment: 2, dụng cụ trang thiết bị
-
branch: âm ch cuối
-
sales figures: /seilz/ số liệu bán hàng âm z cuối từ 1
-
contract: hợp đồng
-
arrange: 2 sắp xếp
-
summer vaction packages
10/09/2024
m0d1fyth15
Lesson 4
- bookstore:
- customers:
- dramatic:
- marketing
- semester:
Lesson 3
- landscape: 1
- construct: 2
- behind: 2
- space: âm s cuối
- during : đua rình
- lunch break :
- outdoor: 1
- indoor: 2
- project: 1
- spring:
- winter:1
- cold: kould
- damage: 1, âm dz
- go over
- renovate: 1
- light
- fixture: thiết bị cố định
- parking garage: gara để xem
- recommend: 3
- delay: 2
- busy
- decrease: 2
- photagraph' 1
Lesson 2:
- client
- lunch
- quite
- atmosphere: 1
- food
- delious: 2, ngon
- over: 1
- talk
- report: 2
- compteletly: 2
- inform: 2
- list: danh sách liệt kê
- forget, forgot: 2, quên
- remind: 2, nhắc nhở
- demand: 2, đòi hỏi nhu cầu
- colleague: 1, đồng lnghiêp
- call: gọi cuộc gọi
- organize: 1
- know:
- everyon
- suppose
- data:
- wrong
- incorrect
- inaccurate: 2, không chính xác, không đúng
Lesson 1:
https://www.youtube.com/watch?v=5p_mTJYDJCM&list=PLBFnPBcibvEJi7Z-IztcX_77MxrWj9g-8&index=20
- suppose: 2, Cho là giả sử, âm z cuối
- explain:
- data: 1, du liệu
- wrong: sai nhầm
- incorrect: 3, không chính xác, âm t cuối
- version: 1, phiên bản, âm dz
- alright: 2, được rồi
- put together: 3, tập hợp lại
- explain: 2, giải thích
- imply: 2, ám chỉ, có ý
- misunderstand: 4, hiểu
- out of stock: hết hàng
- disatisfied: 2, không hài lòng
- occupied: 1 bị chiếm giữ,
- inaccurate: 2, không đúng
- monthly sales report:
- to be supposed to: được cho là phải, đáng lẽ phái
- I'm supposed to send it out this morning: Tôi đang lẽ phải gửi nó sáng nay
- I got a call fro
- I'll take care of that for you
- change: Thay đổi, âm dz
09/09/2024
Lesson 2
| Pronouunce | Nhấn mạnh âm | |||
|---|---|---|---|---|
| gift | ||||
| firm | ||||
| conrfm | 2 | |||
| praise | preize | 1 | ||
| employ | im'plo.i:/ | 2 | ||
| inquire | in'kwair | |||
| provide | provide | 2 | ||
| posible | ||||
| bar | thanh | |||
| favorite | yêu thích | |||
| shop | ||||
| actually | 1 | 1 | ||
| same | ||||
| request | 2 | 2 | ||
| review | 2 | 2 | ||
| product | 1 | |||
| inventory | 1 | |||
| supply | 2 | 2 | ||
| update | 2 | |||
| job opening | ||||
| grocercy | 1 | |||
| coupon | 'kupon' | 1 |
Lesson 1:
| Pronouunce | Meaning | |||
|---|---|---|---|---|
| wonder | ||||
| appointment | ||||
| in exchange | ||||
| supervisor | ||||
| schedule | ||||
| submit | ||||
| agree | ||||
| contact | ||||
| trade | ||||
| nottify | ||||
| cancel | ||||
| staff | ||||
| clean | ||||
| collaborate | ||||
| cover | ||||
| exchange | ||||
| fix | ||||
| right now | ||||
4. Nghe tiếng việt bật nhanh tiếng anh
- Sự trao đổi:
- notify: báo tin
- che phủ, vỏ bọc: cover
- cộng tác: colloborate
- sửa chữa: fix
- đào tạo: train
- buôn bán, giao dịch thương mại: trade
- đồng ý: agree
- ca làm việc: shift
- nhân viên: staff
- người giám sát: supervior
- tất nhiên rồi: of course
5. Luyện nghe từng câu
09/09/2024 - 09/10/2024: Month 1
Month 2 21/11 - 21/12
Bài 1: Could
Cách sử dụng could
-
Có thể sử dụng could với khả năng trong quá khứ Eg: I listened. I could heard something
-
Could có thể sử dụng với khả năng hiện tại hoặc tương lai
Eg 1:
-
What shall we do this evening? --> We could go to the cinema
-
I could stay with Julia when I go to Paris (Trong tương lai)
- Could có thể thể hiện một khả năng không thực tế
I am so tired. I could sleep for a week (Ngủ cả tuần là không thực tế)
- Could have: Nói về quá khứ (Có thể đã)
Tôi mệt và tôi có thể đã ngủ cả tuần
I was so tired. I could have slept for a week (Nói trong quá khứ) I am so tired. I could sleep for a week (Ngủ cả tuần là không thực tế, nói trong hiện tại)
could have: Nó có thể nhưng đã không xảy ra
Dave was lucky. He could have hurt himself when he fell but he's okie (Anh ấy không hề ngã)
-
I didn;t know that you wanted to go to the concert. I could have got you a ticket (Không hề mua, vì không biết trong quá khứ)
-
Could n't nói về một điều không có khả năng hiện tại
I could not live in a big city. I'd hate it .
Bài 2: Would
Tưởng tượng một tình huống hoặc hành động nào đó
I would be nice to buy a new car but we can;t afford it.
Sử dụng would trong câu thường có if
I'll stay a bit longger. I 've got plenty of time I 'd stay a bit longer, but i really have to go now (Tôi có thể ở lại đây thêm tý nữa nhưng phải đi bây giờ, so I can not stay longer)
Would n't do sthing: Từ chối để làm gì đó
I tried to warn him. But he wouldn't listen to me