logo
Tiếp thị số, xử lý dữ liệu và lập trình
Nếu compiler không làm cho lập trình viên thấy rõ lỗi của họ là gì, thì đó là lỗi của Rust, không phải của họ
Initializing search
    GitHub
    • Nơi này là nơi nào
    • ✍️Lập trình
    • 👏Sản phẩm
    • 📊Tổ chức, phân tích dữ liệu
    • 🔊Tiếp thị số
    • 🔠Ký tự, văn bản. Quản lý, viết và xuất bản nội dung
    • 🖥️Mạng máy tính
    GitHub
    • Nơi này là nơi nào
    • ✍️Lập trình
        • GH action phải clone về trước
        • Lifecycle script
        • Làm quen Deno Deploy cho người mới
      • Cloud, webhook, API
        • API đưa thông tin là thụ động. Webhook đưa thông tin chủ động
        • Cloud bản chất là đi thuê local của người khác
        • RESTful là REST không có hypermedia
        • Tất cả web service là API, nhưng nó khác với web API của JS
            • Các API thường dùng cho PHP
            • Facebook API
            • Fb hạn chế rất nhiều API để tránh việc làm nhái page
            • me/accounts liệt kê tất cả các page mình quản lý
            • Collection
            • GraphiQL
            • Ký tự phi ASCII trong tên field hoặc database sẽ được transliterate sang tiếng Anh khi dùng GraphQL API
            • Type với database là một. App với space là một
              • Chạy trên Node 22
              • Chỉ cho chạy tối đa 1 giây
              • Cung cấp 2 biến args và context
              • Dùng fibery script management để viết được trên IDE của mình
              • When you get an entity object, by default, only the primitive fields and any to one relations are included in the fields returned. If you want to get the collection fields (to many relations) you have to query specifically for them.
            • Build service object
          • Bởi vì AES đã trở thành tiêu chuẩn rộng rãi, nên các CPU đã được thiết kế cho riêng nó để giảm thiểu việc chạy lỗi cũng như bị tấn công
          • Khoá là một chuỗi bit, không phải là các ký tự ASCII
          • Mã hoá từng khối ký tự một sẽ khó đoán hơn việc mã hoá từng ký tự một
          • Phép thay thế tăng độ hỗn loạn. Phép hoán vị tăng độ khuếch tán
          • Trước đây các trình duyệt có tạo API Crypto. Sau này được chuẩn hoá thì dùng SubtleCrypto
          • Việc tạo ra hỗn loạn và khuếch tán giúp giảm khả năng bị dò ra khoá trong trường hợp một bản rõ đã bị lộ
          • Véc tơ khởi tạo (iv) dùng để đảm bảo những bản rõ giống nhau không tạo ra bản mã giống nhau
          • Which are meant to be input by users and verified by matching, secret keys are usually read from storage and are an active part of an algorithm to decrypt the protected information.
            • DES muốn an toàn thì phải chạy lâu
            • Hệ mã đối xứng dùng chung khoá cho cả lúc mã hoá và giải mã. Hệ mã bất đối xứng có khoá để mã hoá và giải mã khác nhau
            • Khoá là một chuỗi bit, không phải là các ký tự ASCII
            • Khoá one time pad không thể bị bẻ, nhưng khóa cần được chia sẻ trước, có độ dài tối thiểu bằng bản rõ và chỉ được dùng một lần
            • Mã hoá từng khối ký tự một sẽ khó đoán hơn việc mã hoá từng ký tự một
            • Phép thay thế tăng độ hỗn loạn. Phép hoán vị tăng độ khuếch tán
            • Việc tạo ra hỗn loạn và khuếch tán giúp giảm khả năng bị dò ra khoá trong trường hợp một bản rõ đã bị lộ
            • Véc tơ khởi tạo (iv) dùng để đảm bảo những bản rõ giống nhau không tạo ra bản mã giống nhau
              • Hàm một chiều là hàm giúp sinh ra một bài toán khó giải từ lời giải của nó
              • P là các bài toán giải được trong thời gian đa thức. NP là các bài toán kiểm tra lời giải được trong thời gian đa thức
              • Độ an toàn của khoá bây giờ không nằm ở việc giữ bí mật của khoá, mà ở việc rất khó để giải mã
          • OAuth, access token
            • Client là ứng dụng muốn truy cập vào dữ liệu của người dùng
            • OAuth là cách để cấp quyền truy cập dữ liệu mà người dùng không phải cấp mật khẩu
            • OAuth định nghĩa cách token được truyền, JWT định nghĩa cách token được định dạng
            • Redirect URI là nơi máy xác thực trả xác thực
            • Scope là những phạm vi của các dữ liệu mà ứng dụng được truy cập
            • ❓OAuth là cấp phép cho ai, token là cấp phép được làm cái gì
              • Client gửi token truy cập đến máy cấp quyền để được truy cập tài nguyên
              • Client nào có thông tin xác thực thì sẽ được nhận token truy cập từ máy chủ cấp quyền
              • Khi token truy cập hết hạn, client gửi refresh token đến máy chủ cấp quyền để được cấp token truy cập mới
              • Một token truy cập có thể truy cập được một vài API với những quyền nhất định trong một khoảng thời gian nhất định
              • Auth không phải là xác thực (authenticate), mà là cấp phép (authorize)
              • Client ID là để máy cấp quyền biết client nào là client nào, còn client secret là để nó đảm bảo rằng client này chính là client đó
              • Mật khẩu, vân tay, 2FA, SSO là những cách để người dùng xác thực (authentication)
              • Thông tin xác thực (credential) bao gồm client ID và client secret
              • Việc kiểm tra xem người dùng được phép truy cập dữ liệu ở mức độ nào được gọi là cấp phép (authorization)
          • Endpoint
          • GraphQL phù hợp cho app điện thoại, gRPC phù hợp khi cần tốc độ cao với ít tài nguyên
          • Node là một vật thể có ID riêng. Edge là vật thể liên kết giữa các node. Field là thuộc tính của vật thể
          • Node với edge được gọi chung là endpoint
        • Prettier là để làm cho dễ nhìn. Linter là để hạn chế dính bug khi dự án mở rộng
        • Docker
          • Container chỉ là một process
          • Container là phù du
          • Có vẻ như ngày xưa engine với daemon là một
          • Docker Desktop tạo ra một máy ảo để chạy docker engine
          • Engine bao gồm CLI client, API và deamon
          • Image là template để chạy container
          • Mỗi một dòng trong dockerfile sẽ tương ứng với một step khi dựng image
          • Nếu dựng lại image mà đánh tag giống nhau thì image cũ sẽ thành dangling image
          • Việc dựng image được thiết lập qua dockerfile
          • Volume là cách để đồng bộ dữ liệu giữa máy chủ và máy ảo
          • Exec để chạy lệnh cho một container đang chạy
          • Bấm F12 để biết thêm thông tin về biến
          • Các biểu tượng dùng trong VS Code
          • Dùng snippet để viết tắt code
          • Giao diện VS Code
          • Hằng là xanh lợt, biến là xanh đậm
          • Language server là thứ khiến cho IDE hỗ trợ tốt hơn việc lập trình
          • Nhiều người có thể cùng chỉnh sửa cùng lúc như Google Docs
          • Mở code
          • Plugin hay cho người mới
          • VS Code chỉ là code editor, không phải IDE
          • VS Code nhiều khi không tìm hết file được do tên quá dài
          • Video hướng dẫn
          • Vim
          • Launch.json dùng để thiết lập debugger
          • Setting.json giúp tuỳ chỉnh thiết lập theo ý mình
          • Đường dẫn trong launch.json là cwd
        • Log, test, debug
          • Dùng test khi muốn biết code chạy có đúng không. Dùng debug khi muốn biết code chạy sai chỗ nào
          • Dễ xem kết quả các giá trị trong console debug hơn là ở Variables
          • Debugger
            • Dùng logpoint thay cho console.log() khi debug
            • Không cần viết hàm quản lý debug khi đã có logpoint
            • Launch vs attach
          • Log
            • Cấp độ log DEBUG hoặc TRACE hiển thị ở console.log trên môi trường local, WARN hoặc INFO ở các công cụ quản lí log, FATAL hoặc ERROR đến một kênh mà dev có thể nhận ra và xử lí kịp thời
            • Ngoài console.log còn nhiều loại log khác
            • Console.log chỉ hiển thị nội dung tại thời điểm vật thể được xem, chứ không phải vào lúc lệnh được thực thi
            • defaultTextFormatter và ansiColorFormatter không dành cho console
            • Lý do thấy test trước bất tiện
            • Test trong VS Code
            • Tổng quan về kiểm thử phần mềm
            • Unit test
        • Bạn không cần dùng GUI
          • Biến môi trường giúp ta điền những giá trị lặp đi lặp lại nhanh hơn
          • PATH là đường dẫn mặc định tới những tập tin nhị phân (binary)
          • env của người dùng được ưu tiên hơn env của hệ thống. Nhưng với biến path thì ngược lại
          • Chương trình = Cấu trúc dữ liệu + thuật toán
          • Chương trình là một đoạn mã được lưu trên ổ đĩa. Tiến trình là khi đoạn mã đó được nạp vào RAM và được CPU đọc
          • CUDA giúp phần mềm nghĩ rằng tất cả phần cứng đều giống nhau, và làm phần cứng nghĩ rằng tất cả phần mềm đều giống nhau
          • MBR chỉ được chứa tối đa 4 phân vùng chính. Các phân vùng còn lại phải là logical
          • Subcomand không có gạch (VD: `deno help`). Flag có gạch (VD: `deno --help`)
          • Shell là cái vỏ bảo vệ nhân của hệ điều hành
          • Terminal là cái chương trình để làm việc với shell
          • Terminal, console, shell và command line thường được dùng lẫn lộn với nhau
            • contains là giống hoàn toàn. match mới là giống một nửa
            • Các lệnh PowerShell thường dùng
            • Dùng Where Object nhanh hơn dùng Filter
            • Dùng toán tử hay hơn dùng phương thức ở chỗ nếu toán hạng là một mảng thì nó sẽ lọc mảng đó luôn
            • Khi nhận dữ liệu, PowerShell mặc định giải mã ký tự bằng OEM chứ không phải UTF 8
            • PowerShell là một ngôn ngữ shell
            • Profile
            • Windows Terminal có thể được kích hoạt trong Explorer
            • Cmd vẫn được dùng để chạy exe
            • cmdlet dùng định dạng Verb Noun
            • powershell.exe, PowerShell 5, Windows PowerShell là một. pwsh.exe, PowerShell 6, PowerShell Core là một
          • Các chương trình trên Linux hướng đến việc làm tốt đúng một nhiệm vụ duy nhất, và làm tốt việc làm cùng nhau
          • Dùng chương trình Linux cho người không biết gì về nó
          • Nên cài Linux hay dùng WSL
          • Các lệnh để chạy khi cài win mới
          • Local app data
          • Windows rất lằng nhằng trong việc thiết lập cấu hình
            • Windows không ship phiên bản dotnet Core mới nhất để tránh việc dotnet phải hỗ trợ phiên bản Windows đó cho tới khi nào phiên bản đó bị chính thức ngừng hỗ trợ
          • Cách các đường dẫn ở những nơi khác nhau xử lý dấu cách và ký tự phi ASCII
          • Dùng absolute path cho lành
          • Hệ điều hành trông như có vẻ dùng được đường dẫn Unicode, nhưng thực ra chúng chỉ là ASCII
          • Những chương trình cũ sẽ dễ gặp vấn đề về dấu cách hơn những chương trình mới
          • Sự khác biệt giữa Windows và Android, Mac trong tên file
          • Việc có khoảng trắng trong tên file sẽ khiến việc xử lý code phức tạp hơn
          • Pwd là thư mục mà tiến trình sẽ chạy. cwd là thư mục mà mình đang ở đó
          • Đường dẫn đến tệp ngoài trong một script phụ thuộc vào cwd, không phải đường dẫn tới script mình đang viết
      • Khái niệm cơ bản và nguyên lý lập trình
          • 4 đặc điểm của lập trình hướng vật thể
          • Biến là dữ liệu, hàm là thuật toán. Biến là danh từ, hàm là động từ
          • Biểu thức (expression) là những thứ trả lại một giá trị nào đó
          • Hoạt động trung tâm của lập trình hướng vật thể là phân loại
          • Map, dictionary, associative array, hash, hash table là những cái tên cho cùng một thứ
          • Nên để dư một dấu phẩy ở phần tử cuối cùng khi tạo vật thể hoặc mảng
          • Việc hiển thị nội dung dữ liệu như thế nào là do công cụ quyết định, không phải ngôn ngữ quyết định
            • Callback là những hàm được dùng như đối số của hàm khác và đã xác định sẵn đối số truyền vào cho nó rồi
            • Giao diện là cái khuôn của phương thức
            • Hàm cũng là vật thể
            • Hàm vô danh, hàm mũi tên, lambda là những cái tên khác nhau cho cùng một thứ
            • Việc tách một khối code thành một hàm khiến cho việc đọc từng dòng trở thành đọc từng bước
            • F(a)(b) để gọi hàm f(a) có chứa hàm con f1(b)
            • Ý tưởng của lập trình hướng vật thể là gom nhiều hàm và dữ liệu vào trong một đơn vị gọi là vật thể
            • Để tránh phụ thuộc lòng vòng (circular dependency) có thể dùng hàm
            • API là giao diện của một chương trình
            • Giao diện là cách để sử dụng vật thể mà không cần biết bên trong nó có gì
            • Khi import một hàm thì cả file chứa hàm đó sẽ được chạy. Các import của file đó cũng sẽ chạy theo, dù là để import vào một hàm khác mình không import
            • Nên tách bạch code hỗ trợ cho client và server vào những mô đun khác nhau
            • Package và library là những cái tên khác nhau cho cùng một thứ
            • Việc dùng export chính là đang tạo API. API là các vật thể được export
            • Chưa rõ lý do vì sao lại dịch object ra thành đối tượng chứ không phải vật thể
            • Dùng lớp khi ta có logic nghiệp vụ thực sự cần được thực thi. Dùng giao diện để tạo ràng buộc kiểu cho biến
            • Không cần biết vật thể chứa dữ liệu gì, chỉ cần quan tâm nó làm được gì
            • Lớp là một cái khuôn để tạo các vật thể cho nhanh
            • Thay vì ta thao túng trực tiếp dữ liệu, ta điều khiển vật thể qua phần giao tiếp của nó với bên ngoài
            • Thuộc tính nguyên thủy là những thuộc tính có sẵn mình không cần tạo
            • Việc đóng gói (encapsulation) giúp ta không cần quan tâm vật thể lưu dữ liệu thế nào, mà chỉ cần quan tâm tới thuộc tính và phương thức của nó
            • Vật thể là dạng dữ liệu có những thuộc tính thành phần
            • Vật thể ngoài tự nhiên không chứa hướng dẫn để sử dụng nó. Vật thể trong máy tính có hướng dẫn sử dụng nó
              • Mảng giống vật thể nhưng tất cả các thuộc tính đều là số. Từ điển giống vật thể nhưng tất cả các thuộc tính đều là chuỗi
              • Những vật thể đơn giản dùng để tra cứu dữ liệu theo từ khoá gọi là từ điển
              • Nếu tất cả thuộc tính của vật thể đều đơn giản, và vật thể được dùng để tra cứu dữ liệu theo từ khoá chứ không phải là để thao tác và thay đổi thuộc tính bằng phương thức, thì nó được gọi là từ điển
              • Các vật thể tương tác với nhau qua phương thức và không trực tiếp làm thay đổi giá trị của nhau
              • Phương thức cho ta biết mình có thể làm gì với vật thể
              • Phương thức là một thuộc tính của vật thể
              • Phương thức phải gắn lên một vật thể cụ thể nào đó để có tác dụng
              • This, self là cách để nói rằng hành động mà phương thức sẽ làm sẽ phải gắn lên một vật thể cụ thể của lớp, thứ mà bây giờ chưa được tạo ra
          • Compile time là lúc chuyển từ ngôn ngữ lập trình mà người hiểu sang ngôn ngữ máy chỉ có máy mới hiểu. Runtime là lúc máy chạy mã máy
          • Kiểu động là kiểu được kiểm tra vào lúc chạy. Kiểu tĩnh là kiểu được kiểm tra lúc biên dịch (trước lúc chạy)
          • Kiểu động làm cho việc học lập trình dễ hơn. Kiểu yếu giúp ngôn ngữ được tự do ép kiểu để đoán ý người dùng dễ hơn
          • Lỗi runtime là lỗi logic, khi chạy mới thấy. Lỗi compile time là lỗi cú pháp, khi biên dịch là thấy ngay
          • Ngôn ngữ và động cơ thường trùng tên
          • Sự xuất hiện của language server giúp ta có thể bắt kiểu trước cả lúc biên dịch cho những ngôn ngữ chỉ bắt kiểu lúc chạy
          • Thường mọi người dùng compile time đồng nghĩa với devtime
          • Thời điểm xét kiểu quyết định độ động tĩnh của nó. Cách kiểu được xét quyết định độ mạnh yếu của nó
            • Code giống như các nốt nhạc, động cơ giống như nhạc công, còn môi trường thực thi giống như nhạc cụ
            • Runtime là lúc chạy, runtime environment là môi trường thực thi. Nhưng nhiều lúc runtime environment được gọi tắt là runtime
        • Nguyên lý
          • Bộ nguyên lý SOLID giúp phần mềm dễ bảo trì, dễ mở rộng
          • Cái trừu tượng không nên phụ thuộc vào những cái cụ thể mà những cái cụ thể nên phụ thuộc vào cái trừu tượng
          • Mẫu thiết kế (design pattern) là những giải pháp cho những vấn đề thường gặp trong lập trình mà nhiều thế hệ lập trình viên đã đúc kết và chứng minh tính hiệu quả của nó
          • Người mới lập trình thường hỏi nên dùng cú pháp, thư viện, hay ngôn ngữ nào. Lập trình viên nhiều kinh nghiệm thường tập trung vào các khái niệm trừu tượng
          • Quy trình viết tài liệu
          • Singleton hay được dùng trong các trình quản lý plugin
          • While familiarity is a perfectly fine reason, it is really a bad sign if it is the only reason
          • Đường cú pháp là những loại cú pháp giúp việc đọc dễ dàng hơn. Muối cú pháp là những loại cú pháp giúp việc viết sai trở nên khó khăn hơn
            • Dạng vật thể thường là tiện cho người, dạng mảng thường là tiện cho máy
            • Mảng các vật thể và mảng các mảng
            • Mặc dù mảng lưu giữ thứ tự, nhưng nhiều khi ta không quan tâm đến thứ tự đó cho lắm
            • Việc biến đổi dữ liệu chủ yếu là để người dùng đọc cho tiện, và để máy kiểm tra dữ liệu
            • API ổn định khác với API sẵn sàng cho việc tạo sản phẩm
            • Giao diện lập trình (programing interface) khác với giao diện người dùng (user interface)
            • Giao diện và giao thức đều là những thứ các bên cần tuân thủ để sự giao tiếp được diễn ra, nhưng giao diện nhấn mạnh vào mô hình dữ liệu, còn giao thức nhấn mạnh vào các quy tắc và thủ tục trong quá trình truyền và trao đổi dữ liệu
            • Giao diện người dùng, logic, dữ liệu là 3 thành phần cơ bản cho một chương trình. Mỗi thành phần này có mục tiêu khác nhau, kỹ thuật xử lý khác nhau. Không thể trộn lẫn lộn với nhau được.
            • Model không biết đến View, View không biết đến Controller
            • Cyclomatic complexity đánh giá độ phức tạp khi viết kiểm thử. Cognitive complexity đánh giá độ phức tạp trong việc đọc
            • Các lý do làm tăng cyclomatic complexity
            • Có những đoạn code có cùng cyclomatic complexity nhưng lại khác cognitive complexity
            • Mỗi đường cơ sở trong biểu đồ dòng tương ứng với một testcase
            • Thay vì dùng số nút và cạnh để tính độ phức tạp chu trình, hãy đếm số miền bị chia ra
            • Mỗi lớp, hàm, mô đun chỉ đảm nhiệm một nhiệm vụ xác định
            • Sự couple dễ được sinh ra khi muốn xử lý các dữ liệu giống nhau về chức năng và na ná nhau về cấu trúc và cách xử lý
            • Tránh dùng hàm lồng để làm giảm sự couple
            • Việc chia các lệnh trong kịch bản thành các hàm nhỏ hơn sẽ giúp dễ bắt lỗi hơn
          • Đặt tên biến, viết comment
            • Block comment dành cho việc giải thích ý tưởng của code, viết doc. Line comment để debug hoặc hướng dẫn editor đọc code của mình (directive)
            • Bản thân việc lập trình bằng ngôn ngữ bậc cao đã là một dạng comment
            • Comment có thể cho thông tin sai, nhưng code thì không
            • Comment cũng có bug, nhưng không giống như code, không có chương trình nào hỗ trợ debug được nó
            • Hãy viết code sao cho mình khỏi comment
            • Nên dùng comment để giải thích về thuật toán, các đánh đổi trong việc ra quyết định hoặc dẫn nguồn
            • Quy ước đặt tên biến
            • Thay vì comment, hãy document. Thay vì giải thích cách code hoạt động, hãy hướng dẫn cách sử dụng nó
            • Việc đặt tên không có tiền tố gì sẽ tiện khi nó thường được dùng thường xuyên ở những nơi khác, ở trong một danh sách, hoặc khi dùng để liệt kê các thuộc tính
        • Các ký tự đặc biệt trong các ngôn ngữ khác nhau
        • Ngoài ngôn ngữ lập trình thì còn có ngôn ngữ đánh dấu và ngôn ngữ scripting, ngôn ngữ shell
          • AutoHotKey
            • AutoHotkey combines 3 concepts into 1 built in basic object type
            • Dùng sleep ở đầu loop tốt hơn là ở cuối loop
            • Rust
              • Crate là file, package là tập hợp nhiều crate
              • Mỗi lần refactor là một cực hình
              • Rust phù hợp khi code đã ổn định rồi
              • Viết chương trình bằng Rust giống như sống trong mối quan hệ bạo hành
              • Cargo giống npm hay pip
            • JS dùng {} cho vật thể, Python dùng nó cho từ điển và tập hợp
            • JavaScript và Python là 2 ngôn ngữ điển hình cho việc dùng nguyên mẫu (prototype)
            • Khác biệt giữa JS và Python
            • Map trong JS tương đương với dictionary trong Python
            • Trong JS, console.log() sẽ hiển thị toàn bộ nội dung vật thể mà không phải làm gì. Trong Python, print() sẽ chỉ hiển thị nội dung vật thể nếu str () đã được định nghĩa
            • Từ điển dùng để chứa và thao tác với dữ liệu, trong khi JSON về bản chất dùng để mã hóa và giải mã dữ liệu
            • Ở JS, nếu một biến có giá trị là một chuỗi JSON thì nó sẽ được hiểu là vật thể. Ở Python, nó được hiểu là từ điển
              • Bundler dùng để gom hết tất cả các script lại vào làm một
              • Cái tên ECMAScript là để tránh bị Oracle kiện
              • Lịch sử phát triển của JavaScript
              • Namespace thực ra chỉ là các mô đun có sẵn
              • strict mode là chế độ code nghiêm ngặt, bắt buộc lập trình viên phải tuân thủ theo quy tắc mà JS đưa ra
                • Biến được so sánh với nhau bằng địa chỉ bộ nhớ, không phải giá trị thực sự của biến
                • Biến được tạo mà không có từ khoá khai báo (var, let, const) luôn là biến toàn cục, kể cả khi được tạo trong hàm
                • Có 2 loại kiểu: kiểu nguyên thuỷ và kiểu tham chiếu
                • Dùng export default cho lớp, hàm của component, và export thường cho những thứ còn lại
                • Khi một hàm được gọi với từ khoá new, nó sẽ được dùng như một constructor
                • Vì JS bắt cả lỗi đoán được và không bắt được, nên khi xử lý lỗi thì tốt nhất là trả về một kết quả
                  • Nếu không dùng hàm bất đồng bộ để gọi tiến trình khác, thì JS sẽ tiếp tục chạy các lệnh sau đó mà không chờ tiến trình chạy xong
                  • Sự bất đồng bộ có tính lây lan. Bất kỳ hàm nào gọi hàm bất đồng bộ đều trở thành hàm bất đồng bộ
                  • Promise
                    • Chạy nhiều promise song song và tuần tự
                    • Promise chỉ là một vật thể để việc lập trình được tiện hơn, không phải là một tính năng mà những phiên bản JS trước không làm được
                    • Promise được sinh ra là để không phải dùng if lồng quá nhiều
                      • Khi resolve được gọi, vật thể promise sẽ cập nhật kết quả trả về từ resolve, và hàm được dùng làm đối số đầu tiên của then sẽ được chạy
                      • resolve, reject là hai hàm được JS cung cấp sẵn để làm đối số cho hàm thực thi
                      • Đối số của Promise là một hàm. Nó được gọi là hàm thực thi (executor)
                      • Hàm được dùng làm đối số đầu tiên của then sẽ chạy khi hàm resolve được gọi. Hàm được dùng làm đối số thứ hai của then sẽ chạy khi hàm reject được gọi
                      • Kết quả của promise chỉ có thể được lấy ở trong then, và phải ở dạng hàm
                      • Nếu có nhiều then nối với nhau là bởi vì trong promise có promise khác
                      • Vật thể promise có 2 thuộc tính là state và result, và 3 phương thức là then, catch, và finally
                      • Để lấy được giá trị state và result của promise, cần dùng các phương thức then và catch
                    • Dùng await trong filter sẽ chẳng filter được gì
                    • Await với async là cách để viết hàm bất đồng bộ với tư duy khi viết hàm tuần tự
                  • JSON.stringify(new Error()) trả về một vật thể rỗng
                  • MBR dùng cho BIOS, GPT dùng cho UEFI
                  • Number(undefined) === NaN. Number(null) === 0
                  • String(x) giống x.tostring(), nhưng không gây ra lỗi nếu x là null hoặc undefined
                  • URL.toString() hoặc URL.href() sẽ luôn thêm dấu chéo vào sau
                  • object Object xảy ra khi một vật thể bị chuyển sang dạng chuỗi
                • Sự kiện
                  • Mọi sự kiện đều capture và target, nhưng không phải sự kiện nào cũng bubble
                  • Dùng null khi chắc chắn là người dùng chắc chắn nói là không có giá trị cho việc đó. Còn lại dùng undefined
                  • Khi dùng `||` cho `0`, `''`, `NaN` thì kết quả sẽ là `false`. Với `??`, chúng sẽ trả về `true`
                  • Luôn dùng ===. Nếu không có lý do hợp lý thì đừng dùng ==
                  • Mọi phép so sánh với NaN đều trả về false
                  • typeof NaN === number
                  • Đáng lẽ typeof null phải là 'null'. Nhưng nó lại trả về là 'object' vì đây là một bug lúc JS mới được viết, và việc sửa nó sẽ làm hỏng nhiều script
                  • Các hàm thường dùng cho mảng
                  • Dùng dấu cách cho tên thuộc tính cũng được, nhưng lúc destructure thì phải gõ nhiều sẽ mệt. Tốt nhất là không dùng dấu cách rồi lúc hiển thị viết lại cho đẹp
                  • Nếu cần tạo một mảng mới từ mảng cũ thì dùng map() tiện hơn dùng for
                  • For...in chỉ lấy vị trí trong mảng. for...of lấy giá trị ở vị trí đó
                  • Value, writable, enumerable, configurable là các thuộc tính của các thuộc tính
                • Các chương trình dùng Electron ngốn RAM
                • Những hàm của môi trường thực thi không chạy được trên trình duyệt
                • Node với Deno là những môi trường thực thi của JavaScript
                • Trong JavaScript, khi nói đến runtime thường mọi người chỉ nghĩ đến Node hoặc Deno, và đối lập với trình duyệt. Dù tất cả đều không phải là runtime mà là runtime environment
                • Vì Node, Deno viết trên V8 chứ không phải Gecko, nên chỉ có Chrome mới debug được chứ Firefox thì không
                • Web API là những API được trình duyệt cung cấp, không phải của động cơ
                  • Cứ 4kb thì tạo thành một read unit, chứ không phải là một lần chạy lệnh
                  • Deno đã loại bỏ bundler vì sự khác biệt giữa mong đợi của người dùng và của Deno
                  • Dùng Array.fromAsync để việc lấy dữ liệu từ KV không phải chờ tải về hết rồi mới bắt đầu lọc
                  • Nếu không chỉ định phiên bản mô đun thì thỉnh thoảng phải xoá cache để đảm bảo lấy được phiên bản mới nhất
                  • Sau một thập kỷ phát triển, tác giả của Node đã viết Deno để khắc phục những thiếu sót của Node
                  • Thay vì phải tìm hiểu về awesome JS, có thể xem các thư viện std
                  • deno info giúp thấy chỗ script được chuyển sang JS
                  • Cần thiết lập esm cho Node trước khi chạy
                  • npm, pnpm, yarn là các chương trình quản lý package cho Node
                  • Npx là một gói mở rộng của npm giúp việc cài đặt dễ dàng hơn
                  • package.json dùng để thiết lập Node.js
                • Buffer và stream
                • Request.json() và Response.json() tương đương với JSON.parse(). Việc không dùng nó tương đương với việc dùng JSON.string()
                • VanillaJS chỉ là JS bình thường
                • Esbuild
                  • Các quy chuẩn thời gian trong ISO và RFC
                  • Giờ UTC là giờ luôn giống nhau ở bất cứ nơi đâu. Nó là phiên bản sau của giờ GMT
                  • Instant nhấn mạnh về thời điểm. ZonedDateTime nhấn mạnh về vị trí địa lý
                  • Temporal được sinh ra để giải quyết các rắc rối của Date
                  • Đa số code ở backend thì chỉ cần thời gian ở định dạng ISO, nhưng code ở frontend thì cần ở định dạng địa phương
              • TypeScript
                • Branding là một thủ thuật để tạo kiểu cho kiểu
                • /// cung cấp chỉ dẫn cho TS
                • Các ký hiệu trong TS
                • Index signature giúp khai báo kiểu của tên thuộc tính và giá trị của nó trong vật thể, dù không biết vật thể đó có cấu trúc thế nào
                • Index signature và record là các cách khai báo kiểu vật thể
                • Nếu dữ liệu không nhất thiết ở dạng vật thể thì type gọn hơn và linh hoạt hơn. Nếu đã xác định dữ liệu cần ở dạng vật thể thì interface sẽ thể hiện tốt ý tưởng của người viết hơn
                • Nếu một thứ kêu như con vịt và đi như con vịt, thì nó là con vịt
                • TypeScript cung cấp kiểu cho JavaScript
                • is là để hàm kiểm tra ra boolean có thể dùng cho if
                • Satisfied là để kiểm tra xem dữ liệu mình nhập bằng tay có thoả kiểu hay không
                • Void là kết quả của những hàm không trả kết quả nào
                  • Generic là biến dành cho kiểu
                  • Generic là cách để giữ được tính chung chung mà vẫn không bị mất thông tin
                  • Generic là tính từ, không phải danh từ
                  • DefinitelyTyped là nơi tổng hợp kiểu cho các thư viện viết thuận JS
                  • Dùng string ts để bắt kiểu cho chuỗi được tốt hơn
                  • Dùng ts reset để sửa những lỗi kỳ lạ của TS
                  • Người mới học TS thì nên cài extension Total TypeScript để bớt sợ
                  • TS chỉ có thể bắt lỗi kiểu dữ liệu trong lúc viết code. Zod giúp bắt lỗi kiểu do người dùng trả về
                  • Thay vì dùng Copilot để gợi ý code, có thể dùng 30 seconds of TypeScript
                  • Dts hoặc siroc dùng để khởi tạo dự án mà không tốn quá nhiều thời gian config
                  • tsc là TypeScript compiler, là thứ dịch TypeScript sang JavaScript
                  • Tsconfig
                  • type fest cung cấp thêm các kiểu cho TS
            • Python
              • Exception
              • IPython
              • Jupyter notebook giúp chạy lệnh theo từng ô kèm diễn giải
              • Không thể thay đổi tuple một khi đã được tạo ra
              • Những phương thức có hai dấu gạch dưới hai bên được gọi là dunder (double underscore)
              • Tuple là mảng nhưng không thay đổi được số lượng phần tử
              • init () chỉ tạo giá trị cho lớp. new () mới thực sự là hàm tạo
              • init .py nói cho Python biết folder chứa nó là một package
              • Elif là để phân biệt else thuộc if nào
              • shell=True cần cho
                • Nếu lớp không định nghĩa cả repr () và str () thì kết quả trả về có dạng main .Class name object at 0x1025c4ed0
                • Trong REPL, gọi trực tiếp vật thể ra thì kết quả là repr (). Nếu dùng print thì kết quả là str ()
                • repr () trả về mô tả chi tiết để người lập trình bảo trì và sửa lỗi. str () trả về mô tả đơn giản cho người dùng sử dụng
                • Khi chạy Python trong VS Code, thư mục được chạy không phải là thư mục chứa script
                • Nên cài Python bằng bộ cài tải từ website nếu muốn lập trình
                • Tên mô đun Python sẽ được dùng làm identifier. Identifier không được có dấu cách
                • Việc cài phiên bản mới không xoá phiên bản cũ đi khiến cho người mới hay bị lẫn lộn phiên bản
                • pip là chương trình quản lý package của Python
                • py là chương trình hỗ trợ việc quản lý phiên bản trên Windows
                • Venv tạo môi trường ảo để tránh trường hợp chồng chéo các gói và xung đột phiên bản giữa các thư viện
                  • Anaconda giống như một fork Python có bổ sung thêm nhiều công cụ cho khoa học dữ liệu
                  • Conda là trình quản lý thư viện, không chỉ của Python mà còn của các ngôn ngữ khác
                  • Với những người chỉ cần dùng Python để làm dữ liệu chứ không lập trình, chỉ cần cài Anaconda là đủ. Không cần và không nên cài Python riêng
                  • venv chỉ tạo môi trường ảo cho phiên bản hiện tại. Miniconda tạo môi trường ảo cho nhiều phiên bản
          • Ý đồ thiết kế
            • Các ngôn ngữ lập trình tiến hoá dần để trở thành Lisp
            • Mọi ngôn ngữ bậc cao đều là đường cú pháp của hợp ngữ
            • Ngôn ngữ dựa trên lớp định nghĩa hàm dựng và các thuộc tính của lớp trước khi tạo vật thể. Ngôn ngữ dựa trên nguyên mẫu thì tạo vật thể trước rồi mới định nghĩa các thuộc tính của nó
            • Nếu compiler không làm cho lập trình viên thấy rõ lỗi của họ là gì, thì đó là lỗi của Rust, không phải của họ
            • TypeScript là để thêm kiểu vào một ngôn ngữ từ đầu đã không muốn có kiểu. Rust được sinh ra với ý định có kiểu ngay từ đầu
              • JS là lập trình dựa trên prototype, Java là lập trình dựa trên lớp
              • JavaScript cố gắng đoán ý định của người viết chứ không báo lỗi
              • JavaScript vốn được sinh ra để chạy trên trình duyệt và không được dùng để làm việc với lượng code lớn
              • Python tách bạch từ điển và vật thể ngay từ đầu, còn JS mãi về sau mới có từ điển
              • Python tập trung vào việc cung cấp một ngôn ngữ lập trình tổng quát, dễ đọc và dễ viết
      • Web
        • Render phía máy chủ nhanh và SEO tốt. Render phía người dùng phù hợp cho những ứng dụng cần tương tác nhiều
        • Framework
          • Nói cho đến cùng thì trang web chỉ là form
          • Route là code viết cho server. Island là code viết cho client
          • So sánh Single Page App (SPA) vs Progressive Web App (PWA)
          • UI là kết quả của state và data. State nằm ở client, data nằm ở server
          • Ý nghĩa tên các thư mục trong một dự án web
            • Component hàm không có trạng thái (stateless). Component lớp có trạng thái (stateful)
            • Component là những hàm hoặc lớp trả về một khối JSX
            • Dùng fetch dạng promise chứ đừng await trong component
            • Không có async component vì hiệu suất quá tệ
            • Những hàm được export default và được viết hoa ký tự đầu tiên là component
            • Nếu truyền HTML làm giá trị biến thì cần dùng dangerouslySetInnerHTML, nếu không thì sẽ bị mã hoá hết
            • Render là quá trình chuyển đổi dữ liệu và code sang HTML
              • JSX là cách để viết JS như thể viết HTML
              • Phải viết JSX trong .jsx hoặc .tsx
              • Props giúp việc thêm property cho DOM giống như thêm attribute cho HTML
              • Props là viết tắt của property, nghĩa gốc là tài sản. Tài sản của cha mẹ thì con dùng được, nhưng tài sản của con thì cha mẹ không đụng được
              • Props là đối số đầu tiên của hàm component, dùng để truyền giá trị các thuộc tính của nó
              • Key là một thuộc tính đặc biệt của vật thể props để việc render được hiệu quả hơn
            • Fresh dùng Preact cho UI
            • Fresh và Astro đều cung cấp khả năng render island lần đầu tại server và những lần sau tại client
            • Fresh đối với Preact cũng giống như Next.js đối với React. React với Preact cung cấp khả năng render (làm framework), còn Fresh hay Next xử lý những thứ còn lại (làm meta framework)
            • JS là để tăng trải nghiệm người dùng. Framework là để tăng trải nghiệm lập trình viên
            • Lịch sử phát triển framework JavaScript
            • Next.js, Remix, Gatsby là những framework mà chính React giới thiệu là nên dùng
            • Preact chỉ là một thư viện render. Nó không có biết gì về server hay routing cả
            • React nên được alias thành preact/compat
            • React được sinh ra để làm việc với trạng thái
            • Form
            • Ở Preact, onInput sẽ kích hoạt ngay trong lúc nhập, còn onChange chỉ kích hoạt khi người dùng đổi focus
            • Component nằm trong thư mục island sẽ được render lần đầu ở server, còn những lần sau đều ở client
            • Các hàm được môi trường thực thi cung cấp không hoạt động được ở island
            • Island là những component ở trong thư mục islands
            • Island với partial hydration là một
            • Khi một vật thể được đổ dữ liệu vào, nó được gọi là được tưới nước
            • Mỗi khi state thay đổi thì islands được render lại
            • State giúp cập nhật dữ liệu mà không cần tải lại trang
              • Giá trị trả về của useContext() là giá trị được truyền vào thuộc tính value của provider
              • createContext() nằm ngoài global, useContext() nằm trong component
              • useContext() là cách để không phải dùng Consumer
              • Đối số của createContext() quyết định kiểu của value của Context.Provider
              • Chính vì setState render lại cả component, nên với những file component muốn tách ra nhiều hàm độc lập, và state
              • Các hàm set của hook sẽ kích hoạt việc render lại component nơi nó được khai báo
              • Cách dùng useEffect với useState
              • Dùng setState gọn hơn signal nếu không phải truyền setter qua nhiều hàm khác nhau
              • Không dùng mảng hoặc vật thể trong setState được
              • Phải viết hook trong component. Không viết trong loop hoặc if được
              • Trong useEffect chỉ dùng được promise, không dùng async được
              • useEffect được sinh ra là để side effect không tự động chạy mỗi khi component được render
              • Signal chỉ render lại mỗi phần tử HTML chứa giá trị của nó
              • Signal giúp giải quyết các vấn đề do useState hoặc Context tạo ra
              • Effect khác computed ở chỗ một cái có return, một cái không có return
            • Có một số hàm ở server sẽ không serialize được
            • Khi có một yêu cầu tới một route, handler được gọi trước, sau đó tới component
            • Kết quả được trả về ctx.render(arg) của handler sẽ được truyền lại vào props.data của component
            • Nếu viết handler dưới dạng vật thể thì chỉ những phương thức là động từ HTTP mới được dùng. Nếu viết dưới dạng hàm thì cái hàm đó sẽ trở thành handler luôn
            • Route cần có ít nhất một handler hoặc một component
            • Route không bao giờ được gửi đến client. Island được chạy ở cả server và client
            • Serialize là cách duy nhất để truyền dữ liệu từ server tới client và ngược lại
          • Cache là dữ liệu đã được tải trước để giúp giảm thời gian tải trang
          • Cookie lưu thông tin cá nhân để server nhận dạng được ai với ai. Giống như bệnh viện dùng sổ khám bệnh để biết mình là ai và đã được điều trị thế nào
          • Worker là một tính năng của trình duyệt
            • CORS là để trình duyệt bảo vệ người dùng, không phải để bảo vệ máy chủ
            • Nếu tạo CORS proxy thì chỉ trả về đúng HTML thôi, đừng xử lý gì trên đó hết
            • Same origin policy ngăn chặn việc script ở tab này điều khiển tab kia
            • DOM là kết quả của việc phân tích cú pháp một tài liệu HTML cộng với
            • DOM property khác HTML attribute
            • HTML parser, DOM parser, trình duyệt
            • Nếu không có DOM, JS sẽ không có bất cứ mô hình hoặc ý niệm nào về trang web, tài liệu HTML, SVG và các thành phần khác
          • Khoa học máy tính
            • MDN chất lượng hơn W3School
          • CodeAnalogies
          • Google Support
          • IBM
          • MDN
          • Phạm Đình Khánh
          • Real Python
          • Refactoring.Guru
          • Stack Overflow
          • Tự ngẫm nghĩ, trải nghiệm
          • Viblo
          • Wikipedia
          • freeCodeCamp
          • Tuhocict
      • Template tạo vault và website mới
      • `core`, `kernel`, `engine`
        • Hướng dẫn sử dụng Trấn Kỳ
          • 1.1 Cài đặt PowerShell, Deno, Python, Git, VS Code
          • 1.2 Lấy code
          • 1.3 Tải code
        • 2. Thiết lập chương trình
          • Sử dụng main.ts
          • Sử dụng tranky.py
          • Thiết lập trên Fibery
          • 3.1 Mô hình xử lý dữ liệu
          • Chiều, từ và nhãn
          • Ý nghĩa của biểu thức regex trong hàm lọcDữLiệuCầnTựĐộngNhậnDạng()
          • Ý nghĩa của biểu thức regex trong hàm lọcSốTiền()
          • Chạy chương trình định kỳ
          • Chỉnh launch.json
          • Sử dụng Docker
      • Đối ⊷ thoại
        • Xác định bài đăng giống nhau
        • Thử nhanh
    • 📊Tổ chức, phân tích dữ liệu
      • Việc lưu dữ liệu ở các công cụ khác nhau tạo thành các đảo thông tin
      • ❓Tại sao không cho người chưa biết gì về công nghệ thông tin bắt đầu bằng việc học cơ sở dữ liệu trước thay vì học lập trình?
        • Các chương trình ứng dụng không giao tiếp trực tiếp với CSDL mà qua một trung gian gọi là hệ quản trị cơ sở dữ liệu
        • DBMS cấu trúc những cách ta tổ chức và tương tác với mọi dữ liệu được lưu trữ
        • Excel không phù hợp cho việc lập cơ sở dữ liệu
        • File Google Docs không thực sự là file
        • Ứng dụng quản lý là một dạng giao diện giữa người dùng và cơ sở dữ liệu
      • Phân tích dữ liệu
        • Cách để AI không bị ảo giác là kêu nó viết query cho Wikidata
        • Numpy và Pandas
        • Python và R
          • Concept map, knowledge graph
          • The Semantic Web is essentially a distributed objects framework
          • Thế mạnh của RDF triplestore là tạo ra những liên kết mới không có sẵn lúc nhập vào
        • Phân tích xu hướng, NLP
          • Các công cụ lắng nghe xã hội có sẵn giống như một ảnh chụp màn hình nhanh về những gì đang diễn ra
          • Feature Extraction, Text Representation, Text Extraction, Text Vectorization là những cái tên khác nhau cho cùng một thứ
          • Gensim tập trung vào mô hình chủ đề
          • Không giám sát nghĩa là giả định rằng người huấn luyện không có giả định nào
          • Mô hình trích chọn từ
          • Tổng quan về mô hình chủ đề
          • Tổng quan về xử lý tiếng Việt
          • Về mặt toán học thì AI không có gì thú vị. Việc thay đổi trọng số thú vị hơn
          • Xử lý ngôn ngữ tự nhiên chính là một công cụ nghĩ
            • Bản chất của mô hình chủ đề là tô màu cho văn bản và từ
            • Mô hình bản chất là một phép biến đổi không gian vector
            • Mô hình chủ đề rất hữu dụng cho việc diễn giải
            • SVD ban đầu là để tìm ra một phép xoay không gian mà vẫn giữ nguyên tích vô hướng của các vector
            • Tf idf giúp xác định độ quan trọng của một từ trong một văn bản trong bộ văn bản
            • Tf idf mạnh hơn count vector
            • Bộ từ trong dictionary sẽ quyết định bộ vector
            • Túi từ không phân biệt được những câu có cùng các từ bởi nó không phân biệt thứ tự trước sau của các từ trong một câu
            • Việc biểu diễn các từ dưới dạng các vector one hot chỉ đáp ứng được khả năng huấn luyện mà chưa phản ảnh được mối liên hệ về mặt ngữ nghĩa của các từ
            • Việc vector hoá các văn bản là để máy tính có thể xử lý được
            • Độ tương đồng của hai vector chính là tích vô hướng vừa nó
            • Code chạy trên Linux hoặc WSL
            • Collection là những sản phẩm đầu ra, bao gồm các mô hình chủ đề và minh hoạ tương tác có thể dùng trực tiếp
            • Diễn giải mô hình WhatEvery1Says
          • Hệ mã đối xứng dùng chung khoá cho cả lúc mã hoá và giải mã. Hệ mã bất đối xứng có khoá để mã hoá và giải mã khác nhau
          • Nếu xem ma trận giống như dãy số thì cũng giống như xem sách giống như dãy chữ
          • Phép cộng và phép nhân thể hiện sức mạnh của dữ liệu. Phép trừ và phép chia thể hiện tương quan dữ liệu
          • Việc xử lý toán cho việc xử lý đồ hoạ, cơ học chất lỏng, và AI là khá giống nhau
            • Khi các xác suất độc lập với nhau thì dùng phép nhân
            • Phương sai được chuộng dùng hơn độ lệch chuẩn vì nó dễ tính hơn
            • Phương sai, độ lệch chuẩn là để biết mức độ phân tán của dữ liệu so với giá trị trung bình
            • Độ lệch chuẩn có chữ chuẩn trong tên vì nó dùng đúng đơn vị đo. Phương sai có nghĩa là độ lệch được bình phương.
      • Định dạng dữ liệu
        • Dữ liệu bán cấu trúc là dữ liệu cấu trúc không theo dạng bảng
        • Không nên phân chia dữ liệu có cấu trúc và dữ liệu bán cấu trúc, mà nên phân chia là dữ liệu có cấu trúc dạng bảng và dữ liệu có cấu trúc không phải dạng bảng
        • Parser là chương trình để biến dữ liệu dạng chữ thành dữ liệu có cấu trúc
          • Ngôn ngữ đánh dấu
            • Chữ ML trong HTML, XML, YAML, TOML là viết tắt của markup language
            • Ngôn ngữ đánh dấu mạnh có thể sử dụng cho dữ liệu có cấu trúc vì spec của nó có nói rõ dữ liệu nên được lưu thế nào
            • RDF có thể được biểu diễn bằng JSON LD
            • XML là dạng dữ liệu bán cấu trúc
          • Dữ liệu dưới dạng cơ sở dữ liệu đảm bảo các bên tham gia nhập dữ liệu cùng một định dạng
          • Mở rộng quy mô bằng việc nâng cấp RAM, CPU dễ hơn với SQL. Mở rộng quy mô bằng việc chạy cùng lúc nhiều máy dễ hơn với NoSQL
          • Việc phân loại SQL và NoSQL giống như việc phân loại người dị tính hợp giới và người không dị tính hợp giới, hoặc phân loại người Kinh và người không Kinh
            • Giao diện block cho phép người dùng linh hoạt hơn mà vẫn giữ được sự cấu trúc
            • Khó có thể copy dữ liệu dạng block giữa các app khác nhau
              • JSON Schema dùng để đảm bảo file JSON được viết đúng
              • JSON hữu ích trong việc truyền dữ liệu vì nó hướng đến việc trở thành phần giao của các ngôn ngữ, chứ không phải phần hợp của chúng
              • JSON không cho phép để dư dấu phẩy, không có comment, thuộc tính phải được đóng trong ngoặc kép
              • JSON là cách để biểu diễn vật thể ra chữ, chứ tự nó không phải là vật thể
              • Chuyển từ YAML sang JSON
              • YAML thì để con người dễ đọc, còn JSON là để máy dễ đọc
              • YAML được sinh ra để con người đọc và viết metadata một cách dễ dàng
      • Kinh nghiệm
      • Rút gọn link
      • SEO
      • Thiết kế web
      • Tiếp thị số
        • Có những người mình mong họ like nhưng họ lại không phải là người mình cần
        • Có vẻ như để bài viết dưới dạng link hay dạng ảnh thì fb cũng đều phân phối như nhau
        • Quảng cáo trên Facebook
        • Seeding
        • Share bài từ page thì thấy được số tương tác trên Facebook
        • Tất cả like, share từ các phiên bản URL khác nhau sẽ được đổ hết về og:url
        • Subdomain m, l, lm
        • Để biết được bài đăng của mình tiếp cận được bao nhiêu người, vào Business Suite
        • ❓Vai trò của các chỉ số trên Facebook trong phân tích web
        • Chiến dịch là sản phẩm
        • Client side tracking thiếu chính xác
        • Có thể có tới 40% người dùng dùng adblock. Số độc giả rành công nghệ có thể lên tới 58%
        • Dự án là sản phẩm
        • Google Marketing Platform
        • Google Search Console chỉ lưu dữ liệu trong 16 tháng
        • Google Search Console dùng để biết thiên hạ đang google web mình thế nào
        • Link referrer không hiện đầy đủ mà chỉ có tên miền vì URL có thể chứa thông tin cá nhân
        • Screaming Frog giúp phân tích một trang web
        • Web analytics đã thay đổi trong nhiều năm qua
        • Google Analytics
          • Chỉ cần dùng một measurement ID cho các subdomain
          • Google Analytics dùng cookie để theo dõi hoạt động
          • Nếu web có ít người sử dụng thì một số dữ liệu sẽ bị giấu đi để đảm bảo tính riêng tư cho người dùng
            • Các URL dài có thể là organic traffic chứ không phải direct traffic
            • Các organic branded traffic nên được xem như là direct traffic
            • GA xem zalo, wordpress, stackexchange là social
            • Nếu medium không có gì đặc biệt thì cứ để trống để google tự phân loại
            • Referral channel group bao gồm organic social trong đó
            • Social về bản chất là referral, nhưng được tách ra để phân tích sâu hơn
          • App điện thoại có thể trở thành data stream, nhưng không thể trở thành destination
          • Các dữ liệu cần xử lý chung một chỗ cần được đổ về cùng một property
          • Các tag có thể thêm vào
          • Destination ID cho GA trùng với Measurement ID của web data stream
          • Destination là nơi nhận dữ liệu của Google tag
          • Google tag đổ dữ liệu về Google Analytics, không phải Google Tag Manager
          • Google tag, global site tag, gtag là những cái tên khác nhau cho đoạn script theo dõi người dùng của Google Analytics
          • Một Google tag có thể có nhiều ID
          • Một tag có thể có nhiều destination, nhưng một destination chỉ thuộc về một tag
          • Nên cài Google tag trong Google Tag Manager thay vì cài trực tiếp trên web hoặc qua plugin
          • ❓Measurement ID của web data stream chính là Google tag ID
            • Container
            • Data layer cho phép thay đổi URL mà không làm GA nghĩ rằng mình đã đổi sang trang khác
            • Data layer tập trung mọi dữ liệu lại vào một chỗ rồi truyền đến container
            • Google Tag Manager là một trình quản lý các mã JavaScript được gắn vào web
            • Workspace
            • Để kích hoạt một tag trước tất cả các tag khác, chọn ❝Initialization – All Pages❞
            • A client is a Tag Manager resource type that intercepts certain types of incoming HTTP requests and generates events that are passed to a destination, like Google Analytics 4
            • Only one client can claim an incoming request, but there can be multiple clients trying to claim the same request
        • JSON LD là một cách để tạo schema
        • Open Graph chuyên cho việc chia sẻ trên mạng xã hội. Schema chuyên cho việc tìm kiếm trên Google
        • Open Graph và Schema.org là từ vựng. JSON LD, RDFa và Microdata là ngữ pháp
        • Nếu không thể làm web nhanh hơn, hãy làm thao tác cuối cùng của người dùng trên web nhanh hơn
      • Tự động hoá trình duyệt
        • Thử kiếm backend API trước rồi mới phải đi cào bằng frontend
          • Gần như mọi lệnh đều là async, vì nó phải giao tiếp với trình duyệt
          • Playwright chuyên cho việc kiểm thử và do Microsoft viết. Puppeteer do Google viết
          • Puppeteer
          • Locator chỉ xác định chiến lược để tìm đến element chứ không đi tìm ngay
          • locator không cần tới await vì nó chỉ báo là mình sẽ chọn element nào, chứ chưa thực sự chọn nó. Khi nào có hành động cụ thể thì mới thực sự chọn
          • Remote Control được sinh ra để giải quyết vấn đề Same Origin Policy
          • Selenium bao gồm IDE, Remote Control, WebDriver và Grid. Selenium 1 thực ra là Remote Control. Selenium 2 thực ra là Remote Control có thêm WebDriver
        • Ngôn ngữ scripting sinh ra là để xử lý văn bản, không nhấn mạnh về kiểu, khai báo
        • Sẽ không có bug nếu không có spec
          • Cây cú pháp trừu tượng (AST) là kết quả của việc phân tích cú pháp một tài liệu có đánh dấu
              • Parser biến văn bản thành cây cú pháp, transformer biến đổi cây cú pháp, compiler biến cây cú pháp thành văn bản
                • Processor tự động freeze khi parse, run, runSync, stringify, process, hoặc processSync được gọi
                • remark là unified có remarkParse và remarkStringify
                • Unified, remark là các processor
                • Text của một element nằm trong children
                • Mdast dùng khi muốn thao tác trực tiếp trên cây cú pháp
                • Unist là một đặc tả cho cây cú pháp. mdast là sự triển khai (implement) của unist lên markdown
                • Để tìm node phù hợp, dùng unist util visit, không phải dùng unist util filter
              • Dùng +, để bật tắt tính năng của extension
              • Filter giúp thay đổi AST
              • Nếu không được ghi rõ ràng thì pandoc sẽ mặc định đầu vào là markdown, đầu ra là HTML, với phương thức mã hoá UTF 8
              • Reader biến văn bản thành cây cú pháp, filter biến đổi cây cú pháp, writer biến cây cú pháp thành văn bản
            • Article dùng cho những nội dung độc lập, chứ không nhất định phải là một bài viết dài
            • Dùng XHTML sẽ tốt hơn là dùng HTML
            • Dùng tag ngữ nghĩa thay vì dùng div
            • HTML giống như từng thành phần trong bộ đồ như quần, áo, nón, giày. CSS giống như màu sắc, kích thước của quần, áo. JS là thứ giúp thay đổi màu sắc, kích thước của quần, áo
            • Khi chỉnh CSS mà thấy không thay đổi, thử xoá cache xem
            • Property nghĩa gốc là tài sản. Attribute nghĩa gốc là thêm vào
              • Có 4 loại vật thể (4 lớp): Tag, NavigableString, BeautifulSoup, và Comment
              • NavigableString là những chữ có trong tag
              • Tag là từ điển
              • Find() chỉ kiếm tag đầu tiên, find all() mới kiếm tất cả các tag
            • Markdown có rất nhiều phiên bản khác nhau
            • Markdown hướng tới việc dễ đọc. AsciiDoc hướng tới việc dễ viết
            • Markdown phiên bản gốc rất mù mờ, vì tác giả của nó không ngờ rằng nó lại được phổ biến đến vậy
            • Nhiều người vẫn nghĩ là bảng hoặc danh sách chọn (checklist) là có trong Markdown chuẩn, trong khi thực ra nó là phiên bản của GitHub
              • Plugin ezlinks vừa nhiều lỗi vừa không cần thiết
              • Python Markdown là để tuỳ chỉnh các tính năng thường gặp. Python Markdown Extensions là để mở rộng các cách đánh dấu mới
              • py obsidianmd gặp lỗi khi chuyển từ ALL sang FRONTMATTER
          • Cần escape regex
          • Không dùng \b ngay sau ký tự unicode được
          • Lazy quantifier chỉ lười về bên phải, chứ không lười về bên trái
          • Regex giúp tìm kiếm những chuỗi phức tạp
          • Tự học regex
            • Dùng regex.exec() với while dễ vào vòng lặp vô hạn
            • Dùng regex.test(string) trực tiếp ngay trong if có thể ra sai
            • Kinh nghiệm bắt regex các thông tin từ một hồ sơ xuất từ PDF
            • Regex.exec(), regex.test() thay đổi kết quả sau những lần gọi mới
          • Bộ gõ tiếng Việt
          • Tiếng Việt có 2 cách đặt dấu thanh, căn cứ vào thẩm mỹ hoặc vào ngữ âm
          • Lý thuyết Unicode
            • Không gian mã là không gian chứa tất cả các điểm mã của Unicode
            • Kể cả khi viết nội dung bằng ngôn ngữ khác thì số ký tự ASCII vẫn nhiều hơn nhiều so với số ký tự phi ASCII
            • Những số bắt đầu bằng 0x là những số hex
            • Tuỳ vào phương thức mã hoá mà mỗi ký tự Unicode sẽ được biểu diễn bởi 1 4 đơn vị mã, 1 2 đơn vị mã, hoặc chỉ một đơn vị mã duy nhất
            • Điểm mã liên quan đến việc con người đánh số thứ tự của ký tự thế nào. Đơn vị mã liên quan đến việc máy tính dùng phương thức nào để biết tìm ký tự đó ở đâu
              • Các ký tự ASCII có 1 điểm mã
              • Cách máy tính hiểu ký tự khác với cách con người hiểu ký tự. Tốt nhất là nên dùng điểm mã khi nói về ký tự máy tính
              • Mỗi điểm mã được biểu diễn dưới dạng U+XXYYYY
              • UTF là cách thức để chuyển đổi từ điểm mã sang hệ nhị phân
              • Unicode chia thành 17 plane, mỗi plane chứa 65,536 (= 16⁴) điểm mã
              • Điểm mã không phải là cách để máy tính lưu ký tự
        • Tạo bản đồ
        • Sắp chữ
          • MathJax
          • WYSIWYM cho phép ta chỉ tập trung vào việc viết nội dung, nhưng đồng thời lại đảm bảo rằng ta sẽ không gặp những lỗi về hình thức mà không biết sửa thế nào
            • CSL và bib là các định dạng lưu trữ trích dẫn khác nhau
            • Juris M dựa trên Zotero và tập trung hơn vào việc đa ngôn ngữ và cho ngành luật
          • TeX
              • LaTeX aims to separate the user from having to make decisions about typography and layout, ConTeXt aims to provide an easy interface to advanced typography features.
              • LaTeX đối với TeX cũng giống như jQuery đối với JavaScript
              • Macro dùng để viết tắt
              • TeX dùng cho máy in. LaTeX dùng cho tác giả
              • TeX là ngôn ngữ hoàn chỉnh. LaTeX là ngôn ngữ cho lĩnh vực chuyên biệt
              • TeX là ngôn ngữ lập trình cho việc sắp chữ. LaTeX là các macro để việc định dạng được thân thiện hơn
              • BiBTeX khó làm việc với unicode
              • Biber và BibTeX là các bộ máy để đọc tệp bib
              • Gói biblatex giúp Biber có thể hiểu được các lệnh của BibTeX
              • Tệp bib thường hay được gọi là tệp bibtex, nhưng đó là cái tên cũ được thừa hưởng từ động cơ BibTex, và bây giờ nên được nhìn nhận là không còn liên quan gì đến nhau cả
              • TeX là động cơ gốc và chỉ xuất được DVI. pdfTeX, XeTeX, LuaTeX là các động cơ cải tiến từ TeX và xuất được PDF
              • pdfTeX, pdfLaTeX không hỗ trợ unicode tốt bằng LuaTex, LuaLaTex, XeTex, XeLaTex
          • Cài PangoCairo trước khi dùng unicode trong Graphviz
        • Chỉnh link distance nhỏ nhất và link force lớn nhất để thấy rõ từng cụm nút
        • Mẹo dùng Git với Obsidian
        • Nên dùng H1 hoặc YAML title làm tiêu đề hơn là filename
        • Obsidian dùng CodeMirror
        • Obsidian dùng ES5
        • Winmerge
        • Ưu tiên dùng API của Obsidian hơn là của Node
        • Dataview
          • this liệt kê tất cả những dữ liệu mà Dataview đọc được
        • Aira
        • Có sự xung đột giữa logical document structure, compelling visual layout, và intuitive interaction trong việc thiết kế bao trùm
        • Muốn trang nào làm trang chủ thì để tên là index.html
        • Web tĩnh
          • Các template engine và processor sẽ kiếm trong thư mục includes
          • Dùng extra head để thêm HTML chứ không chèn trực tiếp vào markdown
          • Theme thực chất là plugin có remote
          • Tất cả các đường dẫn đều bắt đầu từ src
          • Tất cả mọi thứ đều phải ở trong thư mục src
          • Bất cứ một tệp nào trong overrides sẽ thay thế tệp ở theme gốc
          • Main.html là template
          • Main.html mở rộng base.html
          • Nội dung của một website WordPress được lưu trữ trong cơ sở dữ liệu dạng bảng
          • Nội dung trong cơ sở dữ liệu được PHP hiển thị thành HTML
          • PHP là một ngôn ngữ lập trình cho web
          • WordPress là một hệ thống quản lý nội dung
          • WordPress viết trên nền PHP
          • WordPress.org là phần mềm mã nguồn mở. WordPress.com là dịch vụ hosting
          • phpMyAdmin là GUI để dùng MySQL
        • Real time collaboration isn't necessary in most cases, but asynchronous collaboration
        • Syncthing dành cho đồng bộ dữ liệu giữa các thiết bị của cùng một người. Git chuyên cho việc hợp tác làm việc giữa nhiều người
        • Git
          • Các lệnh Git thường dùng
          • Các lỗi Git thường gặp
          • Có thể xem Git là một dạng xích khối
          • Facebook chuyển sang Mercurial vì nhóm phát triển Git năm 2012 không mặn mà với monorepo
          • Git giúp ta du hành thời gian
          • Git được sinh ra để giải quyết nhu cầu của Linus, một người viết nhân hệ điều hành
          • Real time collaboration isn't necessary in most cases, but asynchronous collaboration
          • Tất cả những gì Git làm chỉ để làm một việc là điều khiển các đồ thị
            • Blob, tree, commit và annotated tag là các object chính
            • Bản chất của Git chỉ là những cặp giá trị key – value
            • Commitist và treeist
            • Các commit được nối với nhau bằng hash
            • Có thể hiểu blob là hash của một tệp, tree là hash của một thư mục, còn commit thực ra chỉ là hash của cả thư mục tổng
            • Có thể xem nội dung file với hash là như nhau. Nhưng file thì có thể có kích thước vô cùng lớn, còn hash thì luôn chỉ có 40 ký tự
            • Key là hash của object, value là nội dung object
            • Lệnh sứ là các lệnh dành cho người dùng. Lệnh ống nước là các lệnh lõi để dùng kèm với các lệnh Unix khác
              • Cái nào có ref thì `git gc` sẽ không đụng tới
              • Có 2 chỗ để lưu ref: `.git/refs` và `.git/packed-refs`
              • ~ và ^ là để chỉ các commit trước đó
              • Ref là hệ thống đặt tên các object
              • Git reflog giúp xem lại các ref không có trong lịch sử commit
              • git reflog là phao cứu sinh cho những lỗi lầm khi dùng Git
                • @ là viết tắt của HEAD
                • HEAD là commit hiện tại
                • Trạng thái mất đầu (detached HEAD) là khi HEAD chỉ trực tiếp vào commit chứ không phải vào nhánh
            • Origin, upstream là những cái tên thường dùng cho remote
            • Pull không lấy file mới về, mà lấy commit mới về
            • Git không biết gì về folder
            • Khi amend, rebase, push force thì author date vẫn giữ nguyên, còn commit date mới cập nhật
            • Reset soft dùng để gộp nhiều commit lại với nhau. Reset hard dùng để xoá bỏ những gì đã ghi sau commit được chọn
            • Thứ ta đang trực tiếp chỉnh sửa mà ta tưởng là dữ liệu của mình thực chất là thứ được vay mượn từ commit
            • Việc commit giúp ta phá code mà không sợ gì, giống như có đồ bảo hộ rồi thì tha hồ nghịch điện cao thế
            • Git status giúp xem những file nào đã được vào stage
            • Pathspecs giúp chọn đường dẫn một cách linh hoạt và tinh tế hơn
              • Stage, cache, index là những cái tên khác nhau cho cùng một thứ
              • Untracked, staged, unchanged và unstaged là 4 trạng thái chính của một file
              • git add A làm cho index giống như ở working directory. git commit am chỉ áp dụng cho những file đã có sẵn trong index
              • Chỉ có duy nhất stash mới nhất là có ref, tất cả các stash còn lại thì không
              • Stash cung cấp các lệnh dễ chịu hơn cho những lưu trữ tạm thời, dù về mặt kỹ thuật thì dùng commit và branch có nhiều ưu điểm hơn
              • Stash không lưu file chưa được stage
              • Stash là một commit, có cha là commit HEAD và mẹ là commit từ index
            • 2 chấm và 3 chấm trong log và diff
            • Cây lịch sử có thể được dùng như là bản lưu những gì đã diễn ra, hoặc là một câu chuyện kể về chúng
            • Ls files chỉ làm việc với index
              • Diff does not take into account untracked files
              • git diff chỉ so sánh working tree với index, không phải HEAD. Muốn so sánh với HEAD phải dùng git diff HEAD
              • Git diff thường dùng
              • Git log all chỉ hiện những commit nào tiếp cận được từ một ref
              • Git log giúp xem lịch sử các commit
            • Fast forward
            • Git tag
            • Khi viết tính năng mới nên tạo branch mới
              • Khi merge, ours là branch hiện tại. Khi rebase, theirs là branch hiện tại
              • Merge dùng để bảo lưu sự song song của các thay đổi đã xảy ra trên code. Rebase dùng để đảm bảo cây lịch sử phản ánh sự tuần tự trong quá trình thay đổi code của mình
              • Rebase thích hợp khi phải merge nhiều branch, do nó làm cây lịch sử gọn hơn
              • git merge B nên được hiểu là git merge A with B. git rebase A nên được hiểu là git rebase B to A
          • Bấm dấu . để mở VS Code bản web ngay trên GitHub
          • GitHub Page không nhận ra các thư mục có dash phía trước, chỉ đọc được trong docs
          • Template và fork
          • Tạo nhánh mới khi tạo PR sẽ dễ quản lý hơn
          • Website GitHub giống như là để teamview máy tính của GitHub
          • Hướng dẫn đồng bộ dữ liệu với Android
          • Nếu có xung đột thì tệp có thời điểm chỉnh sửa cũ hơn sẽ được đổi tên và được xem là gây xung đột
          • Ảnh lưu trên kho trên điện thoại sẽ được thấy trong gallery ảnh
    • 🖥️Mạng máy tính
      • Server là cái máy. Host là cái dịch vụ cung cấp cái máy đó và những thứ liên quan tới nó
      • Server nên được dịch là máy phục vụ hơn là máy chủ
        • Giao thức là cách để các bên nhận và gửi dữ liệu hiểu nhau
        • OSI là mô hình khái niệm, TCPIP là mô hình implement
          • HTTP là ngôn ngữ để trình duyệt và webserver nói chuyện với nhau
          • Request là thứ client gửi cho server. Response là thứ server gửi cho client
          • Request và respond HTTP chỉ là một tệp văn bản
          • Trình duyệt chỉ gửi yêu cầu và nhận phản hồi ở dạng HTTP
          • DDNS cách để không cần phải biết IP của mình là gì mà vẫn có thể truy cập được, kể cả khi nó thay đổi không báo trước
          • DHCP giúp thiết bị có được những thông số cần thiết để kết nối mạng
          • DNS giúp chuyển tên miền mà con người hiểu được thành IP mà máy tính hiểu được
          • DNS sẽ đi hỏi các root nameserver
          • Default gateway là IP của router
          • IP mọi người thường sử dụng là IP động
          • MAC không thay đổi được, còn IP thì thay đổi được
          • Subnet mask là độ lớn của host network
          • Switch là cái bưu điện. Mọi thư từ đều được gửi đến đó chứ không gửi đến địa chỉ người nhận
          • TCP và UDP đều là các giao thức để hiểu từng bit. UDP đơn giản hơn, nhưng TCP bảo mật hơn
          • TCP, một giao thức đáng tin cậy, được xây dựng trên IP, một giao thức không đáng tin cậy
            • Internet tuân theo định luật Postel
            • NAT khiến các thiết bị chỉ có thể nói chứ không thể nghe
            • NAT là cách để ta vẫn còn có thể dùng IPv4 dù số lượng thiết bị đã vượt xa số địa chỉ từ năm 2022
            • NAT là lý do khiến cho mọi nỗ lực giải trung tâm hoá internet bị phá hỏng
          • CA là nhà cung cấp chứng chỉ số cho TLS
          • Các trình duyệt bây giờ đều bắt buộc phải có SSL mới xem là an toàn, dù không có nó thì cũng chẳng có vấn đề gì
          • SSL và TLS tạo một ống bảo vệ cho HTTP
          • TLS là một phiên bản cải tiến của SSL, nhưng mọi người vẫn quen gọi nó là SSL
            • Nếu GitHub Page không issue SSL được, thử xoá tên miền rồi thêm lại vào xem
            • Nếu không dùng proxy của CloudFlare thì sẽ không dùng TLS của nó
            • TLS của CloudFlare khác với TLS của host
            • Universal SSL chỉ hỗ trợ tới tên miền phụ cấp 1
            • Universal SSL là TLS mặc định của CloudFlare
        • Apache, Nginx là những web server phổ biến
        • CDN tạo ra điểm truy cập gần nhất dựa vào vị trí địa lý của người dùng, để thời gian tải web không chịu ảnh hưởng bởi việc nó được đặt ở đâu
        • CNAME là
        • Cloudflare đóng vai trò là một proxy và CDN
        • Cpanel là
        • Edge là sự kết hợp giữa CDN và serverless
        • Proxy làm trung gian để client lấy dữ liệu từ server
        • Reverse proxy chủ yếu bảo vệ server. Forward proxy chủ yếu bảo vệ client
        • Server là phần mềm cung cấp dữ liệu cho phần mềm khác. Client là phần mềm đòi hỏi phần mềm khác cung cấp dữ liệu cho mình
        • Serverless là loại server tự khởi động mỗi lần có người truy cập thay vì luôn trực sẵn chờ người truy cập
        • 127.0.0.1 và localhost là một
        • Mọi URL đều là URI
        • Origin là sự kết hợp của protocol, hostname và port
        • Port là số hiệu của chương trình cụ thể được nhận gói tin
        • Tên miền có thể có dấu hoặc emoji được
        • How The URL Was Built
        • URL đẹp thì chỉ dùng trên server được, chứ không cho file system được
        • URN giống như tên người, còn URL giống như địa chỉ nhà
        • Với tên miền có dấu thì VirusTotal sẽ nghĩ là có virus nên không cấp chứng chỉ
        • Www thực ra chỉ là một tên miền thứ cấp như bao tên miền thứ cấp bình thường khác

    Nếu compiler không làm cho lập trình viên thấy rõ lỗi của họ là gì, thì đó là lỗi của Rust, không phải của họ

    Nguồn::
    Compile time là lúc chuyển từ ngôn ngữ lập trình mà người hiểu sang ngôn ngữ máy chỉ có máy mới hiểu. Runtime là lúc máy chạy mã máy
    Viết chương trình bằng Rust giống như sống trong mối quan hệ bạo hành

    2 tháng 5, 2025 2 tháng 5, 2025
    Made with Material for MkDocs