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 syncquote 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 # để thay thế biến trong quote! macro

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 tới Vector của các String

#![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ác subnet, có security group (ALB SG) để cấu hình inboundoutbound
  • LB có rule để cấu hình phân tải tới các target group. Rule có thể theo URL path, Hostname (URL /api /apiv2, hostname: example1.com, example 2)
  • Rule cò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 check tới các target. Hỗ trợ HTTP, HTTPS, TCP tuỳ mỗi loại
  • Có thể cấu hình để cùng 1 header thì forward đến 1 target cụ 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 cert nào.
  • Tham số connection draining xá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

PronouunceNhấn mạnh âm
gift
firm
conrfm2
praisepreize1
employim'plo.i:/2
inquirein'kwair
provideprovide2
posible
barthanh
favoriteyêu thích
shop
actually11
same
request22
review22
product1
inventory1
supply22
update2
job opening
grocercy1
coupon'kupon'1

Lesson 1:

PronouunceMeaning
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

Nói về việc xảy ra đều đặng trong quá khứ (giống used to)

Month 3