Lỗi webgl gặp sự cố không mong đợi năm 2024

In my last blog, I have given a quick guide on how to use Airflow in the most basic way. In today’s blog, I will be guiding you through the process of creating a simple ETL workflow from local database to data warehouse, using Airflow as the backend.

Show

E-T-L & Airflow

Extract – Transform – Load is a three-step process commonly seen in the context of data-centric projects. It is the process of aggregating data from various source to a centralized data warehouse so that the data can be analyzed later on. It is a crucial first part of the two parts featured in our LiMDa project (the second one being data refinement). Airflow is said to be built with ETL in mind, so it is a good candidate for ETL workflows of any scale.

Scenario

Given a database FL_Business with several tables that is used for the business of the client company. For simplicity, the scenario here is limited to operations on one table only: The client wishes to synchronize data from selected columns from the table orders, first to Google Cloud Storage bucket then to BigQuery. The client wants the system to run on Airflow 1.10.x. In this blog, firstly we deal with the full load problem, that is, to extract and load the whole table content to the data warehouse. The incremental load problem (daily synchronization) will be discussed in later blogs. Here’s the screenshot of the order table.

Lỗi webgl gặp sự cố không mong đợi năm 2024

The columns to be synchronized are:

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

7

Finding suitable operators

From the client’s demand, we can synchronize each meaningful table following a common series of tasks:

  1. Query meaningful columns from the table.
  2. Push the query result as a file to the pre-defined Google Cloud Storage bucket.
  3. Load the file as data to BigQuery.

In Airflow, to build a workflow, suitable operators must be used and upstream/downstream relationships must be specified. After researching, our team decided to compact the workflow to 2 steps:

  1. MySQL to Google Cloud Storage (Query + push result to GCS) (Extract/Transform)
  2. Google Cloud Storage to BigQuery (Load GCS to BQ) (Load)

The updated workflow allowed the team to use predefined operators from the package airflow.contrib.operators, removing the need to test operators as those operators are official and have been well-tested before release. Now the workflow graph should look like following:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Let’s code the DAG!

Now that we have the idea of how to solve this problem, let us get on to coding! First thing to do is to add Airflow connections for database, Google Cloud Platform and BigQuery:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Create a DAG file named etl_single_dag.py at the dag_folder as seen in my previous blog: Apache Airflow & DAGs by examples.

Here’s the SQL query:

query = """SELECT `id`, `ordered_at`, `user_id`,  
  `event_id`, `release_id`, `payment_method_id`,  
  `receive_method_id`, `total_ticket_quantity`, `temp_lot_status`,  
  `lot_status`, `fixed_total_price`, `payment_status`,  
  `payment_expire_at`, `payed_at`, `cancel_flg`, `canceled_at`,  
  `created_at`, `updated_at`  
FROM `orders`;"""

Define the dag object for the file. Kindly set the start_date to be the current date and the schedule_interval to None so that the DAG does not reschedule itself:

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

Let’s create the tasks inside the with dag statement. First is MySQLToGCS:

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

Then to GCSToBigQuery:

  from airflow.contrib.operators.gcs_to_bq import GoogleCloudStorageToBigQueryOperator  
  destination_project_dataset_table = "livand.limda_dev.fl_orders"  
  # define the BigQuery schema  
  schema_fields = [  
    {"name": "id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "ordered_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "user_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "event_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "release_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "receive_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "total_ticket_quantity", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "temp_lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "fixed_total_price", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "payment_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_expire_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "payed_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "cancel_flg", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "canceled_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "updated_at", "type": "TIMESTAMP", "mode": "NULLABLE"}  
  ]  
  fl_order_gcs_to_bq = GoogleCloudStorageToBigQueryOperator(  
      task_id="fl_order_gcs_to_bq",  
      bucket=bucket,  
      source_objects=[file_name],  
      source_format=export_format,  
      skip_leading_rows=1, # csv heading row  
      destination_project_dataset_table=destination_project_dataset_table,  
      schema_fields=schema_fields,  
      create_disposition="CREATE_IF_NEEDED",  
      write_disposition="WRITE_TRUNCATE",  
      google_cloud_storage_conn_id="fl_gcp",  
      bigquery_conn_id="fl_gcp"  
  )

Don’t forget to create a begin and an end task:

  from airflow.operators.dummy_operator import DummyOperator  
  begin = DummyOperator(task_id="begin")  
  end = DummyOperator(task_id="end")

Finally, remember to set the relationship of the tasks:

  begin >> fl_order_mysql_to_gcs >> fl_order_gcs_to_bq >> end

Now we can run the DAG in Airflow. Open the Airflow Web UI and fire up the Airflow Scheduler, then enable the DAG. You will have to manually trigger the DAG, however that shall not take too much effort and you should see the tasks run and succeed shortly.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Afterwards, the data is successfully synchronized to the data warehouse (BigQuery):

Lỗi webgl gặp sự cố không mong đợi năm 2024

Conclusion

In today’s blog, I have guided you through the process of setting up a simple DAG in an single-table ETL non-scheduled workflow. See you in later blogs about Airflow!

References

https://towardsdatascience.com/airflow-schedule-interval-101-bbdda31cc463


Giới thiệu Decorator pattern

April 26, 2021, 2:58 am

1. Vấn đề

Khi phát triển phần mềm việc thêm hành vi (method) cho object thường xảy ra. Để giải quyết vấn đề này ta có thể bổ sung hành vi cho object bằng cách thêm method vào class hoặc tạo 1 sub class có thêm method. Bổ sung method cho class thì chúng ta cần kiểm thử lại code cho cả class. Hơn nữa cách kế thừa cũng có nhược điểm là nó chỉ thêm hành vi tĩnh chứ không giúp object có để sử dụng hành vi mới trong quá trình chạy (dynamic).

2. Ví dụ

Để hiểu rõ hơn vấn đề chúng ta xem ví dụ về gửi thông báo đến user bên dưới.

Có 1 thư viện thông báo giúp gửi message tới user gọi là Notification Library và 1 Application sử dụng thư viện trên để gửi thông báo đến user trên máy tính.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Sau một thời gian sử dụng, user mong muốn ngoài việc gửi thông báo trên máy tính còn muốn nhận thông báo qua SMS, Facebook, Slack. Để bổ sung thêm 3 tính năng chúng ta tạo 3 subclass kế thừa từ thư viện Notifier như hình bên dưới.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Nhưng nếu làm như này chúng ta chỉ có thể notify chỉ có thể notify đến 1 trong 3 kiểu là SMS, Facebook, Slack. Nếu muốn thông báo đến nhóm 1 vài kênh cần thông báo như , ,

Bổ sung bằng cách mặc dù không phải sửa code nhưng sẽ bị lặp code và cây kế thừa trở nên phức tạp.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Một cách khác nữa là chúng ta thêm 3 method để bổ sung 3 tính năng: sendSMS, sendFacebook, sendSlack. Nếu thực hiện theo cách này thì sẽ đáp ứng được yêu cầu nhưng mà phải đi test lại toàn bộ các code liên quan Notifier.

3. Ý tưởng và giải pháp

Decorator là design pattern sẽ giúp chúng ta xử lý vấn đề trên. Ý tưởng của Decorator là thêm các hành vi mới cho object bằng cách đặt đối tượng bên trong các đối tượng cụ thể đã bao gồm các hành vi mới.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Thay vì sử dụng kế thừa để thêm hành vi vào object thì ta tạo một object mới chứa các hành vi mới và đặt đối object cần thêm hành vào object mới. class BaseDecorator sẽ class mới, nó dùng để chứa class cũ Notifier. Class SMSDecorator, FacebookDecorator và SlackDecorator là 3 class kế thừa từ BaseDecorator, ở method send mỗi class sẽ có thể gửi thông báo lên kênh của mình.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Áp dụng Decorator pattern này giúp ta vừa bổ sung thêm tính năng và cũng không cần sửa code( dẫn đến không cần test lại source code cũ). Class Application cũng không thay đổi, chúng ta chỉ muốn gửi thông báo trên kênh nào thì chỉ cần sử dụng thêm cờ kiểm tra ở phía client.

4. Cấu trúc của Decorator

Lỗi webgl gặp sự cố không mong đợi năm 2024

  • Component: interface chung cho cả đối tượng mới sẽ chứa đối tượng cũ và đối tượng cũ được chứa.
  • Concrete Component: là class của các đối tượng cũ cần được chứa.
  • Base Decorator: Cung cấp 1 tham chiếu đến Concrete Decorator và implement các method chung của Concrete Decorator.
  • Concrete Decorator: là các class bổ sung thêm hành vi mới cho, nó sẽ override lại các method của Base Decorator nếu cần.

5. Ứng dụng

  • Mẫu Decorator được ứng dụng trong thực thế khi cần bổ sung hành vi mới trong quá trình runtime mà không phá vỡ cấu trúc code hiện tại.
  • Khi việc bổ sung hành vi bằng kế thừa kiến chương trình phức tạp, khó phát triển.

Tài liệu tham khảo:

  • https://refactoring.guru/design-patterns/decorator
  • https://gpcoder.com/4574-huong-dan-java-design-pattern-decorator/

Tìm hiểu NGINX và Apache

April 26, 2021, 2:58 am

Lỗi webgl gặp sự cố không mong đợi năm 2024
I, Giới thiệu

NGINX và Apache là 2 web server (máy chủ web) phổ biến và đang được sử dụng rộng rãi hiện nay. Trước 2012 thì Apache chiếm ưu thế hơn do sự phát triển lâu đời , nhưng hiện nay NGINX cũng là sự lựa chọn máy chủ web tối ưu cho những website có lưu lượng truy cập cao. Sau khi đọc và tìm hiểu các website, blogs, tổng hợp các so sánh giữa NGINX và Apache dưới đây sẽ giúp bạn đọc có cái nhìn tổng quát nhất, đưa ra sự lựa chọn Web server phù hợp cho website của mình.

II, Khái niệm

1. Web server

Web server hay còn được gọi là máy chủ web, là một chương trình sử dụng giao thức HTTP (Hypertext Transfer Protocol), để cung cấp các file để tạo thành các trang của website cho người dùng, đáp ứng nhu cầu của họ (request), cuối cùng được phân phát tới thiết bị của user. Tóm lại máy chủ là nơi để chứa toàn bộ dữ liệu hoạt động trên internet mà nó được giao quyền quản lý.

2. Apache

– Apache ( Apache HTTP Server) là một server mã nguồn mở miễn phí và được sử dụng phổ biến hiện nay. – Mọi request sẽ được gửi đến server qua phương thức HTTP. – Apache chạy trên các hệ điều hành như Unix, Microsoft Windows, … – Apache đã phát triển một số phương pháp để cái thiện hiệu năng (chủ yếu là bộ nhớ RAM và độ trễ).

3. NGINX

Lỗi webgl gặp sự cố không mong đợi năm 2024
– Nginx là một máy chủ mã nguồn mở. – Mới ra đời, được dùng để phục vụ web HTTP, hiện được dùng để làm Reverse Proxy, Email Proxy (IMAP, POP3, SMTP) và một trình cân bằng tải (load balancer) và proxy ngược (reverse proxy) cho các máy chủ HTTP, TCP và UDP. – Nginx sử dụng kiến trúc không đồng bộ giúp tăng tốc độ, mở rộng tính năng và đáng tin cậy hơn. Đặc biệt là trong các tình huống có nội dung tĩnh hoặc nhiều request cùng lúc ( do có thể xử lí hàng ngìn kết nối cùng lúc ). – Được sinh ra để là tối ưu hóa hiệu suất theo quy mô lớn.

III, Cách hoạt động 1. Apache

Lỗi webgl gặp sự cố không mong đợi năm 2024

Các phương pháp xử lý yêu cầu của Apache có thể được cấu hình theo một trong 3 Multi-Processing module (MPMs) dưới đây:

  • Process model: Mặc định được cài đặt ở một chế độ Pre-fork mode, nghĩa là đã set trước một lượng processors nhất định, mỗi processor chỉ handle một request trong một mốc thời gian nhất định, bất kể là một php script hay là một file ảnh.
  • Worker Process: Tạo ra một quá trình điều khiển duy nhất có nhiệm vụ triển khai các tiến trình con. Mỗi tiến trình con sau đó tạo ra một số lượng cố định các thread, cũng như một listener thread. Các listener thread cho các kết nối và chuyển chúng đến một thread để xử lý khi chúng đến nơi.
  • Event model: giống với mô hình worker, nhưng nó tạo ra một listener thread mà lắng nghe cho các kết nối và chuyển chúng vào một worker thread để xử lý. MPM này xử lý các kết nối dài chạy hiệu quả hơn nhiều trên một thread duy nhất (KeepAlive xử lý).

2. Nginx

Lỗi webgl gặp sự cố không mong đợi năm 2024

Quy trình hoạt động: Khi có yêu cầu mở một website, trình duyệt sẽ liên lạc với server chứa website đó. Server thực hiện việc tìm kiếm file yêu cầu của website đó và gửi ngược về cho trình duyệt. Nginx hoạt động theo kiến trúc Asynchronous ( có thể xử lí đồng thời nhiều request cùng một lúc, số lượng request tùy thuộc vào system resource sẵn có) và Event Driven . Kiến trúc này là những Threads được quản lý trong một tiến trình, mỗi tiến trình hoạt động dựa vào các thực thể nhỏ hơn – Worker Connections.

Worker Process sẽ nhận các truy vấn từ Worker Connections và gửi các truy vấn đó đến Process cha – Master Process. Master Process sẽ trả lại kết quả cho những yêu cầu đó. Một Worker Connections có khả năng xử lý được 1024 yêu cầu tương tự nhau. Do đó, Nginx xử lý được hàng nghìn yêu cầu mà không gặp bất cứ khó khăn gì. Nginx luôn hiệu quả hơn khi hoạt động trên môi trường tìm kiếm, thương mại điện tử và Cloud Storage.

IV, Hiệu suất – Nội dung tĩnh: NGINX phục vụ nội dung tĩnh nhanh hơn nhiều so với Apache. – Nội dung động: Về mặt hiệu năng cho thấy kết quả tương tự, không có khác biệt.

V, Hệ điều hành hỗ trợ – Apache chạy trên tất cả các loại hệ thống Unix-like (Linux hoặc BSD) và hỗ trợ đầy đủ cho Microsoft Windows. – NGINX cũng chạy trên một số hệ thống Unix hiện đại và có một số hỗ trợ cho Windows, tuy nhiên hiệu suất không được mạnh bằng.

VI, Bảo mật

Cả Nginx và Apache đều rất coi trọng tính bảo mật trên trang web của mình. Cả hai máy chủ này định kỳ phát hành báo cáo bảo mật và những tư vấn, đảm bảo rằng khía cạnh bảo mật được tăng cường ở mọi cấp độ.

VII, Kết luận Cả Nginx web server và Apache web server đều là những điểm mạnh riêng. Với những tiêu chí ở trên sẽ giúp chọn được web server thích hợp cho website.

Tài liệu tham khảo:

NGINX và Apache – Đâu là Web Server tốt nhất ? (Ưu Nhược Điểm)

https://viblo.asia/p/so-sanh-nginx-va-apache-lua-chon-may-chu-web-server-phu-hop-cho-trang-web-cua-ban-Az45baOwlxY#_31-apache-la-gi–10 https://vncoder.vn/bai-viet/danh-gia-chi-tiet-nginx-va-apache-web-server-nao-la-tot-nhat- https://quantrimang.com/so-sanh-nginx-va-apache-166325

Custom Constructor Functions

April 27, 2021, 7:48 pm

Custom Constructor Functions

Ngoài việc khởi tạo một object trong javascript bằng object literal (var x = {}) pattern và các hàm tạo có sẵn (var x = new Object(), var y = new String(“name”) ), thì bạn có thể tạo ra một object bằng hàm khởi tạo tuỳ chỉnh của riêng bạn, Ví dụ sau là minh chứng :

var jonathan = new Person('Jonathan') jonathan.say() // I am Jonathan

Cách khởi tạo đối tượng này rất giống với việc tạo ra một đối tượng trong Java bằng cách sử dụng một lớp là Person. Cú pháp tương tự nhưng thực sự thì trong Javascript không có lớp và Person chỉ là một hàm.

Đây là cách hàm tạo Person được định nghĩa.

var Person = function(name) { this.name = name; this.say = function() {

return "I am " + this.name;  
} } Mỗi khi bạn gọi hàm khởi tạo với từ khoá new, vậy thì điều gì đã xảy ra:

  • Một object rỗng được tạo ra và được tham chiếu bởi biến this, kế thừa các prototype của hàm đó.
  • Thuộc tính(Properties) và phương thức(Method) sẽ được thêm vào đối tượng this này.
  • Đối tượng this sẽ được ngầm định trả về ở cuối hàm.

Quá trình trên có thể trông tương tự như sau:

var Person = function(name) { var this = {}; // khởi tạo một đối tượng sử dụng object literal this.name = name; // thêm thuộc tính cho đối tượng this.say() = function() {

 return "I am " + this.name;  
}; return this; } Phương thức say() trong hàm trên được thêm vào this. Vì vậy bất cứ khi nào ta gọi new Person() thì một hàm say() mới được tạo ta trong memory điều này là không cần thiết vì phương thức say() không thay đổi giữa các đối tượng Person được tạo ra.

Nên để tốt hơn ta sẽ chuyển những phương thức dùng chung này vào prototype :

Person.prototype.say = function () { return "I am " + this.name; };

Chúng ta hay nhớ những thành viên có thể tái sử dụng (reusable members), như phương thức thì nên chuyển vào prototype.

Trong ví dụ trên chúng ta có :

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

0

Đối tượng rỗng không thực sự là rỗng bởi vì nó đã có được những phương thức kế thừa từ Person prototype. Vì vậy chúng ta có thể làm được những điều tương tự như:

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

1

Constructor’s Return Values

Khi được gọi với từ khoá new, một hàm khởi tạo sẽ luôn trả về một object, mặc định sẽ là đối tượng được tham chiếu bởi this. Nếu bạn không thêm bất cứ thuộc tính nào vào trong nó thì một đối tượng rỗng được trả về. Đối tượng this luôn luôn được trả về kể cả bạn không return nó trong hàm tạo. Tuy nhiên bạn có thể trả về bất kỳ object nào mà bạn muốn như ví dụ sau:

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

2

Như ví dụ trên cho thấy bạn có thể return bất cứ gì bạn muốn miễn nó là đối tượng. Nếu bạn cố tình return thứ gì mà không phải đối tượng (string hay number, true, false) đều không gây ra lỗi nhưng chúng sẽ bị bỏ qua và đối tượng this sẽ được trả về thay thế.

Patterns for Enforcing new

Như các ví dụ ở trên, thì hàm tạo vẫn chỉ là các hàm nhưng được gọi với new. Như vậy thì điều gì sẽ xảy ra khi ta quên new khi gọi đến các hàm khởi tạo. Việc này sẽ không gây ra lỗi syntax hay lỗi trong quá trình runtime nhưng có thể dẫn đến lỗi logic trong code và kết quả không mong muốn. Đó là bởi vì khi bạn quên new thì this bên trong hàm tạo sẽ trỏ đến đối tượng toàn cục (object global) (Ở các trình duyệt thì sẽ trỏ đến windown )

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

3

Kết quả không mong muốn này đã được giải quyết ES5. Nhưng để không bị phụ thuộc thì bạn nên đảm bảo rằng hàm khởi tạo của bạn sẽ hoạt động như môt hàm bình thường kể cả khi không được gọi với new. Ví dụ :

Cách đơn giản nhất là quy ước đặt tên. Bạn nên viết in hoa chữa cái đầu tiên (Waffle) tên trong tên hàm khởi tạo còn viết thường (waffle) trong tên hàm bình thường.

Hoặc trong hàm hãy luôn trả về đối tượng mà bạn mong muốn thay vì để mặc định là this

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

4

Vấn đề với pattern này là liên kết đến prototype của các đối tượng bị mất. Bất kỳ phương thức nào bạn thêm vào Waffle() prototype đều không khả dụng cho các đối tượng được tạo ra.

Trên đây là một chút kiến thức mà mình khám phá được và cảm thấy thú vị trong cuốn sách JavaScript Pattern muốn chia sẻ đến với mọi người. Đây là một cuốn sách rất hay và còn rất nhiều thứ bổ ích trong cuốn sách, mình sẽ chia sẻ thêm những điều này trong quá trình mình châm cứu về cuốn sách này. Hãy đợi mình !!

Tài liệu tham khảo:

http://sd.blackball.lv/library/JavaScript_Patterns_%282010%29.pdf

Ví điện tử (cryptocurrency wallet) hoạt động như thế nào và lưu trữ cái gì ?

April 28, 2021, 11:35 pm

Hello anh em

Hôm nay vẫn là chủ đề về blockchain ạ

Mọi người vẫn thường nghe nói về blockchain là một cơ sở dữ liệu phân tán vậy thực chất cơ sở dữ liệu này lưu trữ ở đâu ? Ai sẽ là người thực hiện giao dịch chuyển coin giữa các ví khi không có server thì bài trước mình đã đề cập đến rồi mọi người có thể tham khảo https://labs.septeni-technology.jp/blockchain/bitcoin-duoc-chuyen-giua-cac-vi-nhu-the-nao-phi-giao-dich-bitcoin-se-di-ve-dau/

Vậy thì thực chất ví điện tử mà khi chúng ta sở hữu coin thì lưu trữ những cái gì ?

Hãy cùng nhau đi tìm hiểu ở blog này nhé, ví có thực sự như cái tên của nó là “ví” hay không?

Nghe đến “ví” chúng ta thường suy nghĩ đến việc lưu trữ tiền mà ở đây là coin giống tài khoản ngân hàng vậy lưu trữ số dư tài khoàn của bản thân và được ngân hàng kiểm soát số dư đó

Nếu hiểu nôm na mà không cần quan tâm quá nhiều thì có thể hiểu như thế cũng được (vào ví hiện số dư coin là ok)

Nhưng hiểu sâu xa hơn thì ví điện tử cryptocurrency thì có sự khác biệt với mấy cái tài khoản ngân hàng trên kia một chút

Thực chất việc tạo ra ví là tạo ra 2 key: private key và public key Khi tạo ra ví thì giống như đã gia nhập vào mạng block chain ví dụ như mạng ethereum, mạng binance smart chain …

Lỗi webgl gặp sự cố không mong đợi năm 2024

Public key: khoá công khai dùng để xác nhận số dư coin trong tài khoản và nhận coin Private key: dùng để xác nhận ký giao dịch chuyển tiền

Hơi lý thuyết 1 chút nhỉ ví dụ cho dễ hiểu nhé

Ông A có 1 ví lúc này ông A sẽ sở hữu 2 key là public key và private key gọi là public_key_a và private_key_a đi Tương tự ta có với ông B public_key_b và private_key_b

Quá trình chuyển coin từ ông A -> ông B khi ông A nhập public_key_b và ký (ký ở đây nghĩa là sở hữu private_key_a) xác nhận rằng chuyển tiền cho ông B Khi này 1 block sẽ được tạo ra (thợ đào sẽ thực hiện tạo ra block này) lưu chữ việc public_key_a đã chuyển sang public_key_b 1 số coin nào đấy và giờ đây chỉ có ông B mới có thể chuyển số coin này đi ví khác vì chỉ có ông B mới có private_key_a

Và trên mỗi ví thực chất không hề lưu số dư tài khoản mình như các tài khoản ngân hàng Nó lưu trữ đến dữ liệu của các block đã được các thợ đào tạo ra từ đó có thể truy suất được cái public key của mình đang lưu trữ nhưng coin nào số lượng bao nhiêu

Vậy thì câu hỏi đặt ra là mình có biết được số coin của ví khác không câu trả lời là có mình sẽ biết được số coin của ví khác khi biết public key của họ

Bạn có thể tra cứu trên bscscan với mạng binance smart chain https://bscscan.com/ , mạng ethereum với etherscan https://etherscan.io/

Kết luận: Việc tạo ra ví thực chất là tạo ra cặp key public key và private key khi thực hiện giao dịch sẽ tạo ra block lưu trữ dữ liệu số coin này đã chuyển từ public key này sang public key khác.

Tài liệu tham khảo https://en.wikipedia.org/wiki/Cryptocurrency_wallet

Tiền điện tử là gì? Coin và Token

April 28, 2021, 11:38 pm

Bài viết này sẽ giúp anh em hiểu kĩ hơn về bitcoin và tiền điện tử – tài sản mà anh em sẽ đầu tư vào khi tham gia thị trường crypto và thấy được sự khác biệt giữa các loại tiền điện tử với nhau, từ đó anh em biết được hướng đầu tư của mình là gì?

Ở đây mình muốn làm rõ với anh em, đầu tư vào bitcoin cũng có nghĩa là anh em đang đầu tư vào một loại tiền điện tử, chính vì vậy, bài viết này viết về tất cả các loại tiền điện tử nói chung để khi anh em có đầu tư bất cứ loại tiền điện tử khác thì các kiến thức ở đây vẫn có ích với anh em.

Lịch sử ra đời tiền điện từ là gì?

Trong những năm 90s khi công nghệ bắt đầu bùng nổ, con người đã liên tục nỗ lực để tạo ra tiền tệ kỹ thuật số, điển hình là những hệ thống như Flooz, Beenz và DigiCash. Những dự án này từng vang tiếng một thời trên thị trường nhưng cũng đã mau chóng đi vào dĩ vãng vì một số lý do như: lừa đảo, vấn đề tài chính, thậm chí là do mâu thuẫn nội bộ của công ty phát triển.

Đáng chú ý hơn cả, tất cả các hệ thống đương thời đều áp dụng cách tiếp cận “Bên thứ ba tin cậy”, tức là tồn tại các công ty đứng đằng sau hệ thống để xác nhận và xúc tiến các giao dịch. Vì vậy, sự sụp đổ của các công ty đồng nghĩa với sự biến mất của đồng tiền kỹ thuật số.

Mãi gần hai thập kỷ sau, một lập trình viên ẩn danh (hoặc là một nhóm lập trình) có bí danh Satoshi Nakamoto đã giới thiệu Bitcoin. Satoshi mô tả đây là một hệ thống “tiền điện tử ngang hàng ”. Hệ thống này hoàn toàn phi tập trung, thức là không có sự hiện diện của máy chủ hoặc bên kiểm soát thứ ba. Ý tưởng này giống với mạng lưới P2P dùng để chia sẻ dữ liệu.

Một trong những vấn đề quan trọng nhất mà bất kỳ mạng lưới thanh toán nào cũng phải giải quyết đó chính là “lặp chi” (double spending). Đây là một kỹ thuật lừa đảo bằng cách thực hiện hai giao dịch để chi tiêu cùng số dư của một tài khoản. Giải pháp truyền thống là dựa vào “bên thứ ba” – một máy chủ trung tâm – lưu giữ thông tin số dư và chi tiết giao dịch. Tuy nhiên, phương pháp này đòi hỏi người có thẩm quyền để giữ và kiểm soát thông tin cá nhân của bạn trong tay.

Trong một mạng lưới phi tập trung như Bitcoin, mỗi thành phần tham gia đều phải làm công việc này. Mọi thứ đều được vận hành qua Blockchain – một sổ cái công cộng ghi chép mọi giao dịch trong một mạng lưới mà bất cứ thành phần tham gia nào cũng có thể tiếp cận. Vì đó, mọi người trong mạng lưới có thể truy vấn số dư của tất cả các tài khoản.

Mọi giao dịch đều có dạng một tệp tin có chứa key công khai của người gửi và người nhận (các địa chỉ ví) và số lượng coin được dịch chuyển. Các giao dịch cũng cần được xác nhận bởi người gửi bằng một “mã khóa cá nhân” – private key. Tất cả những điều trên là lý thuyết căn bản của thuật toán crypto. Cuối cùng, giao dịch sẽ được đưa lên mạng lưới nhưng vẫn cần được xác nhận.

Trong mạng lưới tiền điện tử, chỉ có những thợ đào mới có thể xác nhận các giao dịch bằng cách giải các bài toán được mã hóa. Họ sẽ nhận các giao dịch, đánh dấu hợp lệ và phát tán ra toàn mạng lưới. Sau đó, mọi node của mạng lưới sẽ bổ sung vào cơ sở dữ liệu. Một khi giao dịch đã được xác nhận thì sẽ không thể xóa và đảo ngược quy trình. Thợ đào sẽ nhận được phần thưởng cộng với phí giao dịch.

Về cơ bản, mạng lưới tiền điện tử dựa vào sự đồng thuận tuyệt đối của tất cả các thành phần trong không gian để xác nhận tính hợp lệ của số dư và giao dịch. Nếu các node của mạng lưới không chấp nhận, hệ thống sẽ dừng hoạt động. Tuy nhiên, có rất nhiều luật lệ được xây dựng và lập trình vào trong hệ thống để giúp ngăn chặn rủi ro này.

Tiền điện tử có chứa tiền tố crypto chính là vì quy trình đồng thuận của cộng đồng được đảm bảo bởi một thuận toán crypto (mã hoá) an toàn. Cùng với những yếu tố đã được nêu trên, tiền điện tử trở thành một khái niệm khiến việc “đặt niềm tin vào bên thứ ba” trở nên hoàn toàn dư thừa.

Phân biệt tiền điện tử, tiền ảo và tiền mã hóa (crypto)

Tiền điện tử (tiền kỹ thuật số)

Hiểu một cách đơn giản, Tiền Điện Tử hay Tiền Kỹ Thuật Số (Digital Money) là cách thức thể hiện dưới dạng số hoá giá trị tiền pháp định của một quốc gia (ví dụ: đ, CNY, USD, EUR …). Đồng tiền này được đảm bảo bởi ngân hàng trung ương (NHTW) quốc gia đó hay các tổ chức tài chính chịu sự quản lý của NHTW.

Tại Việt Nam, Tiền Điện Tử đã và đang tồn tại trên thị trường dưới hai dạng thức chính gồm VÍ ĐIỆN TỬ và THẺ TRẢ TRƯỚC.

Tiền mã hóa (Tiền ảo)

Trong khi đó, Tiền Ảo hay còn gọi là Tiền Mã Hoá (Cryptocurrency) không phải là đồng tiền pháp định, không được phát hành hay bảo đảm bởi bất kỳ Chính phủ hay NHTW, cơ quan quản lý tiền tệ ở bất kỳ quốc gia nào. Nó có hoạt động phân tán và mang tính ẩn danh cao, không chịu sự quản lý và tiềm ẩn nhiều rủi ro.

Theo Tổ chức quốc tế về Tiêu chuẩn hoá (ISO), Tiền Ảo là tài sản ảo có tính chất tiền tệ tức có thể sử dụng nó làm phương tiện trao đổi hay một tài sản có giá trị trong một môi trường cụ thể.

Theo Quốc hội và Hội đồng của Liên minh Châu Âu (EU): “Tiền Ảo là thể hiện giá trị dưới dạng số. Giá trị này không được một ngân hàng trung ương hay một cơ quan nhà nước nào phát hành hay đảm bảo, nó không gắn liền với một đồng tiền pháp định nào và không có địa vị pháp lý của tiền tệ nhưng lại được chấp nhận bởi cá nhân hoặc pháp nhân như một phương tiện trao đổi. Nó có thể được chuyển đổi, lưu trữ hay giao dịch bằng phương thức điện tử”.

Trong bài viết này, mình sẽ dùng từ tiền điện tử để dễ dàng hơn cho anh em trong việc tìm hiểu nội dung bài viết.

Phân loại tiền điện tử

Anh em cùng mình tìm hiểu từng loại tiền điện tử hiện đang lưu hành trên thị trường để có cái nhìn tổng quan nhất cũng như nắm rõ tài sản mình dự định đầu tư hay đang nắm giữ thuộc loại nào để hiểu những tiềm năng của như rủi ro của nó.

Coin

Coin là gì?

Coin là loại tiền được ban hành và phát triển trên một blockchain riêng biệt và hoạt động độc lập. Coin ra đời với mục đích giải quyết các vấn đề thanh toán, tài chính, bảo mật, phát triển ứng dụng…của chính blockchain đó.

Mỗi blockchain chỉ có 1 coin duy nhất.

Ví dụ: BTC của Bitcoin Network có coin là BTC, Ether của Ethereum ngoài ra còn có Cardano, Stellar, NEO, Litecoin, IOTA,…

Phân loại coin

Hiện tại có 2 loại coin phổ biến là Bitcoin (Coin Cap) và Altcoin:

Bitcoin

Là tiền mã hóa đầu tiên được ban hành, và được xây dựng trên Bitcoin Network. Ký hiệu BTC, Được coi là coin đứng đầu trong các loại tiền mã hóa và có được Sự chấp nhận của công chúng cao nhất với:

  • Thanh khoản tốt nhất.
  • Khối lượng giao dịch trung bình lớn nhất.
  • Tiền mã hóa đứng đầu theo vốn hóa thị trường.

Altcoin

  • Từ Altcoin là từ ghép của Alternative (Thay thế) và Coin để tạo thành “altcoin”, dùng để chỉ tất cả các loại coin/token khác ngoài Bitcoin, được xây dựng nhằm mục đích thay thế cho Bitcoin.
  • Về mặt chức năng, hầu hết các Altcoin đều dựa trên Bitcoin và các chức năng cơ bản thì tương đối giống nhau.
  • Một số Altcoin phổ biến nhất (dựa trên vốn hóa thị trường) là Ethereum (Altcoin đứng thứ 2 và có nhiều triển vọng thay thế Bitcoin), Tether, Litecoin,…

Token

Token là gì?

  • Token là loại tiền được phát hành từ các dự án được xây dựng trên nền tảng Blockchain cụ thể. Nói cách khác, token được phát triển trên một nền tảng Blockchain của coin nào đó, như chúng ta thường thấy hầu hết các token sử dụng Blockchain của Ethereum theo tiêu chuẩn ERC-20. Ngoài ra, một số Token còn sử dụng nền tảng của Solana (SOL), Binance Smart Chain (BSC), Avalanche (AVAX) và cả Bitcoin.
  • Một số token khi dự án phát triển đủ mạnh sẽ hướng đến phát triển một nền tảng Blockchain riêng cho chính token đó và khi ấy Token này được xem như là Coin.

Trong token có một loại token đặc biệt, được sử dụng vô cùng phổ biến trong lĩnh vực crypto đó chính là stablecoin, anh em cùng tìm hiểu thêm với mình:

Stablecoin là gì?

Stablecoin là loại crypto được thiết kế với mục đích giảm thiểu tối đa sự ảnh hưởng của sự biến động giá (volatility).

Để làm được điều đó, giá trị của Stablecoin thường sẽ neo theo một loại tài sản có giá trị ổn định khác như tiền thật (fiat money), hàng hoá (vàng, bạc…) hoặc có thể là một đồng tiền điện tử khác.

Phân loại Stablecoin

Hiện tại, Stablecoin được phân làm 2 loại chính gồm: Thế chấp (Backed) và không thế chấp (Non-Backed).

Thế chấp (Backed)

  • Là loại stablecoin được thế chấp bằng 1 loại tài sản khác có giá trị tương đương với số lượng Stablecoin đã được phát hành ra ngoài thị trường.

Ba loại stablecoin được thế chấp phổ biến nhất là

  • Thế chấp bằng Fiat (Fiat-backed). Ví dụ: USDT, TUSD,.
  • Thế chấp bằng hàng hóa (Commodity-backed). Ví dụ: Digix gold tokens (dgx),…
  • Thế chấp bằng crypto khác (Crypto-backed). Ví dụ: OUSD, DAI, RSR…

Stablecoin không thế chấp (non-backed)

  • Đây là loại Stablecoin không được thế chấp bất kỳ loại tài sản nào, hoàn toàn nhờ vào thuật toán và hợp đồng thông minh để quản lý cung- cầu token tương tự như cách các ngân hàng trung ương đang làm với tiền fiat. Ví dụ: Basis Cash, Empty Set Dolla, …

Coin và Token khác nhau như thế nào?

Về mặt tính năng

  • Coin được coi như một phương tiện trao đổi và lưu trữ giá trị cho các mục đích thanh toán, đầu tư và phát triển của một dự án blockchain cụ thể, chính vì vậy mỗi blockchain chỉ có một loại coin nền tảng duy nhất.
  • Token sở hữu đủ các tính năng của một đồng coin thường được các dự án xây dựng trên blockchain nền tảng ban hành, đồng thời có thêm nhiều tiện ích tùy thuộc vào từng dự án.

Khác nhau về mặt kỹ thuật

  • Coin yêu cầu một nền tảng ví (Wallet) riêng và khi giao dịch gửi/nhận phí giao dịch sẽ trừ trực tiếp vào ví của coin đó.
  • Token thì không có ví riêng mà nó sử dụng ví của đồng coin nền tảng và phí giao dịch sẽ trừ vào coin nền tảng (ví dụ như Ethereum).

Nguồn: https://coin98.net/cryptocurrency-la-gi

Svelte – Sự lựa chọn thay thế cho React và Vue?

April 28, 2021, 11:38 pm

Chào các bạn! Gần đây mình có hay lượn lờ vào các trang benchmark để xem một loạt các so sánh giữa các framework, và mình thấy được 1 thằng khá ưu việt, vượt trên cả Angular, React hay Vue về điểm số. Đó là Svelte. Cùng xem qua những điểm số này nhé:

Lỗi webgl gặp sự cố không mong đợi năm 2024
Lỗi webgl gặp sự cố không mong đợi năm 2024

Dễ dàng thấy Svelte có các đánh giá đều nhỉnh hơn các framework khác, bạn có thể tham khảo thêm ở đây. Vậy cụ thể Svelte là gì và nó có gì khác biệt?

Svelte là gì?

Svelte (đọc nôm na là Sờ Veo) là một component framework mới nổi một vài năm gần đây, như React hoặc Vue, dùng để xây dựng giao diện người dùng nhưng theo 1 cách tiếp cận khác so với 2 thư viện kia.

  • React or Vue sử dụng DOM ảo, cho phép lập trình viên viết mã theo hướng declarative state-driven, việc đó khiến browser phải làm thêm việc là chuyển đổi các cấu trúc khai báo về dạng DOM operations, từ đó làm lãng phí frame cũng như thêm việc cho garbage collector.
  • Thay vào đó, Svelte giống như 1 trình biên dịch, nó “runs at build time”, chuyển đổi trực tiếp component của bạn thành 1 đoạn mã JavaScript trực tiếp update trên DOM. Svelte được đánh giá là lựa chọn hàng đầu để xây dựng 1 ứng dụng có hiệu suất tuyệt vời!

Đặc điểm của Svelte?

  1. 1. No virtual DOM

    Chúng ta bắt đầu đi từ câu hỏi: Virtual DOM có tác dụng gì?

    Lỗi webgl gặp sự cố không mong đợi năm 2024
    Virtual DOM nôm na giống như một bản sao của DOM, tác dụng của nó đơn giản là chỉ ra phần tử nào trên DOM thay đổi sau đó update. Cụ thể hơn ta đi vào cơ chế của virtual DOM trong React đó là Snapshots & Diffing. Khi một event hoặc một state làm thay đổi trạng thái ứng dụng của bạn, React sẽ cho phiên bản DOM hiện tại thành 1 Snapshot và so sánh nó với virtual DOM của hiện tại, lấy sự khác biệt để làm cơ chế update DOM. Thực sự virtual DOM rất nhanh, nhưng nó không làm DOM nhanh hơn. Dựa vào cơ chế Snapshots & Diffing, ta có thể thấy một vấn đề mà khi sử dụng cơ chế này tạo ra: đó là về Memory. DOM đã lớn, cơ chế này tạo ra 2 bản sao y hệt của DOM, điều đó sẽ ngốn không ít bộ nhớ trên trình duyệt của bạn. Thêm vào đó, Garbage collector sẽ phải làm việc để dọn đống rác cho bạn mỗi lần như thế
    Lỗi webgl gặp sự cố không mong đợi năm 2024
    . Svelte thì khác, nó không dùng DOM ảo mà sử dụng một biến

    import datetime from airflow.models import dag default_args = {

     "start_date": datetime.datetime(2021, 4, 13)  
    
    } with dag.DAG(
     dag_id="fl_orders_db_sync",  
     schedule_interval=None,  
     default_args=default_args  
    
    ) as _dag:

    8 để lưu vết lại, tận dụng Javascript label, không tốn kém như proxies hay accessors như trong Vue hay React. Toàn bộ code của bạn được đưa về Javascript thuần sau lần build và đưa lên browser, không cơ chế trung gian, sẽ chỉ nhanh và nhanh! Chắc cũng hơi khó hiểu, mình sẽ so sánh các cơ chế Reactive của React, Vue và Svelte trong một blog khác!

    Lỗi webgl gặp sự cố không mong đợi năm 2024

    1. Write less code

      Đã code thì phải có bug! Đó là chuyện đương nhiên! Tuy nhiên, càng giảm thiểu số dòng code thì ứng dụng của bạn càng trở nên tối ưu, giả thời gian phát triển. Ngắn gọn nhưng phải đi đôi với dễ hiểu, Svelte có được cả hai điều đó:

      Lỗi webgl gặp sự cố không mong đợi năm 2024
      Thử “Hello world!” với Svelte Mã Svelte không chỉ đơn giản, ngắn gọn mà lại vô cùng dễ hiểu. Để chứng minh, ta thử so sánh cùng đoạn code cùng chức năng với React và Vue:
      Lỗi webgl gặp sự cố không mong đợi năm 2024
      Đoạn mã Svelte.
      Lỗi webgl gặp sự cố không mong đợi năm 2024
      Đoạn mã React.
      Lỗi webgl gặp sự cố không mong đợi năm 2024
      Đoạn mã Vue. Cần tới 442 ký tự trong React, Vue cần 263 ký tự, trong khi Svelte chỉ cần 145 ký tự. Thực sự đoạn mã Svelte ngắn gọn hơn so với React hơn 3 lần! – Một khác biệt nữa của Svelte so với React hay Vue đó là Svelte cho phép Multi top-level elements thay vì single top element như trong React (bọc element bằng

      import datetime from airflow.models import dag default_args = {

       "start_date": datetime.datetime(2021, 4, 13)  
      
      } with dag.DAG(
       dag_id="fl_orders_db_sync",  
       schedule_interval=None,  
       default_args=default_args  
      
      ) as _dag:

      9 hay

       from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
       from airflow.models import Variable  
       bucket = "limda_dev"  
       file_name = "fl/orders.csv"  
       export_format = "csv"  
       fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
           task_id="fl_order_mysql_to_gcs",  
           mysql_conn_id="fl_business_db",  
           sql=query,  
           bucket=bucket,  
           filename=file_name,  
           export_format=export_format  
       )  
      
    2. hay Vue (
       from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
       from airflow.models import Variable  
       bucket = "limda_dev"  
       file_name = "fl/orders.csv"  
       export_format = "csv"  
       fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
           task_id="fl_order_mysql_to_gcs",  
           mysql_conn_id="fl_business_db",  
           sql=query,  
           bucket=bucket,  
           filename=file_name,  
           export_format=export_format  
       )  
      
      1), điều mà Rich Harris – Tác giả của Svelte cho là không cần thiết.
    3. Truly reactive Trái tim của Svelte chính là một “powerful system of reactivity” với vai trò giữ cho DOM được đồng bộ với trạng thái ứng dụng. “Không cần tới các thư viện phức tạp bên ngoài để quản lý state, Svelte mang reactivity lên chính Javascript” – đó là khẩu hiệu được Svelte đưa ra! Reactive là đặc điểm không phải bàn cãi của các Frontend framework mới, điều này cũng không có gì đáng ngạc nhiên đối với Svelte.

Lời Kết

Svelte dù mới nổi lên những năm trở lại đây nhưng đã có hơn 46k star trên github. Có nên sử dụng Svelte cho những dự án sắp tới? Mình nghĩ nó sẽ hợp với những dự án cá nhân hoặc những người có đam mê khám phá những công nghệ mới, bởi cộng đồng còn chưa đông đảo so với React và Vue, những thư viện support cũng ít hơn, các tool CLI, devtool còn sơ khai và chưa ổn định. Mình tạm kết ở đây, thân ái và hẹn gặp lại!

Debug React

April 28, 2021, 11:38 pm

Khi viết bất kì một chương trình nào thì việc có bug là một điểu không thể tránh khỏi và việc debug là không thể thiếu đổi với một developer. Khi học khoá học react trên udemy thì mình thấy có phần hướng dẫn debug cho framework này. Sau đây mình xin viết lại những gì mình hiểu về phần này

  1. Console Đây là một cách thông dụng để gỡ lỗi ứng dụng là: Console (console.log, console.warn, console.error). Sau đó, chạy ứng đụng trên trình duyệt để kiểm tra trạng thái ứng dụng trong phần trình kiểm tra, chẳng hạn, bạn sẽ làm console.log(count)
    Lỗi webgl gặp sự cố không mong đợi năm 2024
    Phương pháp này được thực hiện một cách nhanh chóng và cho ta thấy được toàn cảnh của ứng dụng nên đây cũng làm một trong số những nguyên nhân mà nó được sử dụng phổ biến và nhiều người biết đến nhất
  2. React Developer Tools Một tiện ích mở rộng dành cho các trình duyệt: Chrome , Firefox triển khai chức năng gỡ lỗi dành riêng cho React để công cuộc debug trở nên dễ dàng hơn : React Developer Tools Bước 1 – Cài đặt Tiện ích mở rộng Nhấp vào nút Thêm vào Chrome . Sau đó nhấp vào nút Thêm tiện ích mở rộng để xác nhận:
    Lỗi webgl gặp sự cố không mong đợi năm 2024
    Chrome sẽ cài đặt tiện ích mở rộng và một thông báo thành công và một biểu tượng mới sẽ xuất hiện ở góc trên bên phải của trình duyệt bên cạnh thanh địa chỉ:
    Lỗi webgl gặp sự cố không mong đợi năm 2024
    Nếu biểu tượng không xuất hiện, bạn có thể thêm nó bằng cách nhấp vào mảnh ghép, sau đó nhấp vào biểu tượng đinh ghim bằng Công cụ dành cho nhà phát triển React:
    Lỗi webgl gặp sự cố không mong đợi năm 2024
    Bước 2 – Sử dụng Sau khi cài đặt thành công , mở ứng dụng trên trình duyệt và bạn sẽ tìm thấy 2 bảng điều khiển mới: Components và Profiler . Components Nó cho phép bạn xem cấu trúc phần tử ứng dụng và trạng thái được liên kết với nó. Nếu bạn chọn bất kỳ thành phần nào trong cây, bảng điều khiển bên phải sẽ hiển thị cho bạn một tham chiếu đến Components cha và các props được chuyển đến nó:
    Lỗi webgl gặp sự cố không mong đợi năm 2024
    
    
    Profiler Nó cho phép ghi lại một tương tác trong ứng dụng và xem điều gì sẽ xảy ra.

Mình xin phép được kết thúc bài viết tại đây. Đây là lần đầu mình viết Blog nên còn rất nhiều sai sót rất mong nhận được sự góp ý thêm từ mọi người để mình cải thiện trong lần tới ạ


Adapter Pattern

April 28, 2021, 11:39 pm

Structural Pattern (nhóm cấu trúc) : các giải pháp giúp chúng ta sử dụng đối tượng (objects) và các lớp (classes) trong các cấu trúc lớn hơn nhưng vẫn đảm bảo được sự linh hoạt và hiệu quả của code .

Nhóm này gồm 7 mẫu thông dụng: * Adapter * Bridge * Composite * Decorator * Facade * Flyweight * Proxy Hôm nay mình sẽ cùng các bạn tìm hiểu đôi chút về Adapter nha


1. Đặt vấn đề :

Giả sử hệ thống hiện tại của bạn cần làm việc với 1 thư viện mới, nhưng thiết kế của interface đấy lại khác hoàn toàn và không hề tương thích với hệ thống của bạn vấn đề khi bạn không muốn giải quyết vấn đề này qua việc sửa đổi code của hệ thống và dĩ nhiên là không thể thay đổi code của thư viện rồi. Giờ làm gì nhỉ?

Lỗi webgl gặp sự cố không mong đợi năm 2024
.ʕʘ‿ʘʔ.
Lỗi webgl gặp sự cố không mong đợi năm 2024

Giải pháp lúc này chính là ADAPTER, lúc này nó sẽ như người đứng giữa nhận request từ hệ thống của bạn và convert chúng tương thích với thư viện mới.

Lỗi webgl gặp sự cố không mong đợi năm 2024
Lỗi webgl gặp sự cố không mong đợi năm 2024


2. Adapter là gì ?

Adapter chính xác là gì nhỉ ? {•̃̾_•̃̾}

“Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.”

Adapter có nhiệm vụ “chuyển đổi interface của một class thành một interface khác mà client mong đợi”. Adapter cho phép các lớp không tương thích về interface có thể làm việc cùng nhau.

  • Adapter còn có tên gọi khác là Wrapper

Lí thuyết là thế nhưng nói đơn giản dễ hiểu thì nó chính là ví dụ kinh điển sau đây:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Đây chắc hẳn là Adapter mà chúng ta thường gặp nhất

Khi bạn sử dụng ổ điện thông dụng ở nhiều quốc gia khác nhau sẽ khác nhau. Ở Việt Nam thường sử dụng ổ cắm điện có hai chân, trong khi một số thiết bị điện như laptop, điện thoại, tivi… lại có phích cắm 3 chân, đặc biệt là châu Âu, Mỹ là ba chân, như vậy chúng ta cần một bộ chuyển từ ba chân sang hai chân để có thể hoạt động được.

Ngoài ra, chúng ta có thể tìm thấy điều này trong cách sử dụng thẻ nhớ. Khi thiết bị của bạn không có đầu đọc thẻ nhớ tích hợp, bạn phải sử dụng bộ điều hợp để chuyển đổi dạng dữ liệu đầu vào có thể đọc được trên thiết bị nhận

Đó là 1 vài ví dụ trong thực tế về Adapter giờ chúng ta xem tiếp Adapter có gì nào ᕙ(⇀‸↼‶)ᕗ


2. Cách thức hoạt động của Adapter

Tiếp nhận các request từ Client và chuyển đổi chúng trở nên tương thích với interface mới.

  • Client: Sử dụng các đối tượng có interface Target.
  • Target: Interface chứa các chức năng được sử dụng bởi Client (domain specific). (°ロ°)
    Lỗi webgl gặp sự cố không mong đợi năm 2024
  • Adaptee : Đây là lớp mà bạn muốn lớp Client sử dụng, nhưng hiện tại giao diện của nó không phù hợp .
  • Adapter: Đây là lớp trung gian, thực hiện việc chuyển đổi giao diện cho Adaptee và kết nối Adaptee với Client.

3. Class Adapter & Object Adapter

  • Class Adapter

Lỗi webgl gặp sự cố không mong đợi năm 2024

Đây là một cách tiếp cận ít được sử dụng do nó còn nhiều hạn chế. Theo cách này, các lớp con (sub-classes) của class ‘Adapter’ => ‘Target’ và ‘Adaptee’. Class Adapter ghi đè các phương thức trong ‘Target’ interface để có thể dễ dàng nhận các request mà không cần sửa đổi => class Adapter sử dụng kế thừa để implement code.

  • Object Adapter

Lỗi webgl gặp sự cố không mong đợi năm 2024

Phương pháp tiếp cận này sử dụng Composion để implement ‘Adapter’ và ‘Adaptee’ đồng thời sử dụng mối quan hệ kế thừa giữa ‘Adapter’ và ’Target’. Lúc này, class Adapter sẽ giữ một instance của Adaptee như một class variable. Khi Client truy cập Adapter thông qua phương thức bị ghi đè (overriden) của Target interface, nó sử dụng phương thức của Adaptee để chuyển đổi và gửi thông báo, đồng thời ủy quyền(delegates) yêu cầu ban đầu cho ‘Adaptee’.

⇒ Object Adapter được sử dụng nhiều hơn Class Adapter

<(‘ .’ )>


4. Khi nào sử dụng đến Adapter

¯\(©¿©) /¯

  • Khi cần kết nối hai hệ thống không tương thích interface.
  • Khi cần giao tiếp với một API bên ngoài.

5. Kết

Adapter Pattern là một trong những mẫu lập trình thú vị vì nó khá quen thuộc với chúng ta và có tần suất sử dụng khá nhiều trong code, việc kết nối các hệ thống với nhau là điều hết sức bình thường và nó cũng luôn thay đổi. Nhưng không vấn đề gì, Adapter Pattern đã giải quyết một cách triệt để vấn đề này.

( ͡° ͜ʖ ( ͡° ͜ʖ ( ͡° ͜ʖ ( ͡° ͜ʖ ͡°) ͜ʖ ͡°)ʖ ͡°)ʖ ͡°)


Lỗi webgl gặp sự cố không mong đợi năm 2024
Cảm ơn mọi người đã đọc hết chia sẻ của mình nha.
Lỗi webgl gặp sự cố không mong đợi năm 2024

Google BigQuery và thực hành cơ bản

April 28, 2021, 11:40 pm

Google BigQuery (GBQ) cho phép bạn thu thập dữ liệu từ các nguồn khác nhau và phân tích dữ liệu đó bằng cách sử dụng các truy vấn SQL. Bigquery có khả năng mở rộng và dễ sử dụng, cho phép các nhà phát triển và doanh nghiệp khai thác các phân tích dữ liệu mạnh mẽ theo yêu cầu. Nếu bạn từng biết hay tìm hiểu về BigQuery, chắc hẳn là bạn cũng đã biết về những ưu điểm vượt trội của BigQuery so với các data warehouse khác như:

  • Serverless: Hoàn toàn trên cloud và đã được cấu hình sẵn, tự động scale – đáp ứng data tăng/giảm. Mọi thứ luôn sẵn sàng để bạn sử dụng.
  • Lưu trữ và truy vấn gần như không giới hạn, đến hàng petabyte.

Các loại dữ liệu được hỗ trợ trong Google BigQuery:

  • Dữ liệu từ cloud storage hoặc file local. Các định dạng bản ghi được support như: Avro, CSV or JSON.
  • Dữ liệu exports từ Firestore và Datastore.
  • Dữ liệu từ các Dịch vụ khác của Google như Google Ads Manager và Google Analytics
  • Streaming
  • Các câu lệnh DML (Data Manipulation Language)

Load Data into BigQuery

  1. Tạo dataset

Trước khi tải lên bất kỳ dữ liệu nào, chúng ta cần tạo dataset và table trong Google BigQuery. Để thực hiện việc này, trên trang chủ BigQuery, hãy chọn resource mà bạn muốn tạo dataset. Tiếp theo chúng ta sẽ tạo một dataset bằng cách click CREATE DATASET (dataset trong GBQ giống như database trong MySQL).

Lỗi webgl gặp sự cố không mong đợi năm 2024

Đặt tên Dataset ID tuỳ theo ý thích của mình, (ví dụ: Q4T), Data location chọn là default sau đó Create dataset để tạo.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Ta đã tạo xong một dataset có tên là Q4T, tiếp theo ta sẽ tạo các table cho dataset đó là hoàn thiện việc tạo dữ liệu cho dataset.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Để chuẩn bị dữ liệu để đưa lên GBQ thì chúng ta có thể lấy từ rất nhiều nguồn khác nhau như đã nói ở trên, ví dụ 1 file csv như bên dưới:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Điền các thông tin table, field và tùy chọn advanced option với Header rows to skip là 1

Lỗi webgl gặp sự cố không mong đợi năm 2024

Sau khi tạo table ta có dataset như hình dưới:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Nào, vậy chúng ta cùng xem truy vấn ở Google BigQuery như thế nào nhé!

  • * Với GBQ khi bạn gõ xong câu truy vấn thì hệ thống thông báo khối lượng cần xử lý, ví dụ hình dưới là 3.5KB , bởi GBQ sẽ tính phí trên khối lượng cần xử lý đấy. Bạn sẽ được miễn phí 1TB mỗi tháng, ngoài ra bạn phải trả phí là $5.00/1TB (vì là dịch vụ serverless nên chúng ta chỉ phải trả phí sau khi thực hiện câu truy vấn)
    • Bạn có thể format lại câu truy vấn theo “chuẩn” bằng cách click More -> Format query

Lỗi webgl gặp sự cố không mong đợi năm 2024

Tương tự, bạn có thể thực hiện với file json, avro.

Ngoài ra chúng ta có thể sử dụng bq command-line, client libraries để tải dữ liệu lên từ dữ liệu nguồn local

  • Sử dụng bq command-line

Chúng ta sử dụng bq load command theo cú pháp:

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

5

Trong đó:

  • * LOCATION: nơi bạn muốn đặt vị trí, ví dụ sử dụng GBQ ở khu vực Tokyo thì LOCATION là asia-northeast1
    • FORMAT: CSV, AVRO, PARQUET, ORC, hoặc NEWLINE_DELIMITED_JSON.
    • project_id: id project
    • dataset: tên dataset đã tồn tại
    • table: tên bảng muốn đưa dữ liệu vào
    • path_to_source: đường dẫn đến local file
    • schema: 1 schema hợp lệ

Tham khảo thêm tại đây

  • Sử dụng client libraries (Ví dụ ở đây sử dụng nodejs)

Đầu tiên, ta cần cung cấp authentication credentials thông qua biến môi trường GOOGLE_APPLICATION_CREDENTIALS

export GOOGLE_APPLICATION_CREDENTIALS\=“

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

2”

với

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

2 là đường dẫn của tệp JSON có chứa khóa tài khoản dịch vụ của bạn.

import datetime  
from airflow.models import dag  
default_args = {  
  "start_date": datetime.datetime(2021, 4, 13)  
}  
with dag.DAG(  
  dag_id="fl_orders_db_sync",  
  schedule_interval=None,  
  default_args=default_args  
) as _dag:

6

Ở đây, mình load data vào table2, đây là kết quả sau khi sử dụng client libraries

Lỗi webgl gặp sự cố không mong đợi năm 2024

Trên đây là phần thực hành cơ bản để upload data lên GBQ, với GBQ còn rất nhiều thứ hay ho nữa, mọi người cùng theo dõi blog tiếp theo của team về GBQ nhé!

“Sức mạnh của ngôn từ”– Một vài lát cắt

May 5, 2021, 8:10 pm

Có một anh chàng nọ đi khám bệnh, sau khi làm tất cả các xét nghiệm cần thiết anh đang chờ đợi để gặp bác sĩ và mong được nghe bác sĩ tư vấn. Vào phòng, anh đưa cho bác sĩ kết quả xét nghiệm của mình và lắng nghe bác sĩ chuẩn đoán bệnh. 10 phút trôi qua thật nhanh, ra đến cổng bệnh viện anh vẫn chưa hiểu cụ thể mình nên làm gì? có lựa chọn nào khác cho cách điều trị của mình hay không? Đó là tình trạng chung của chúng ta khi đi khám bệnh, có một vài lí do dẫn đến việc này. Một là, chúng ta tự ti về khả năng của mình với các bác sĩ nên không dám hỏi gì. Hai là, chúng ta quá sợ sệt bác sĩ nên cũng không dám hỏi vì sợ bị mắng. Ba là, chúng ta chẳng biết hỏi cái gì, vì không có kỹ năng hỏi. Bốn là, vô vàn những lí do hợp lý khác, nhưng tựu chung lại là chúng ta không tự tin và không có kỹ năng hỏi.

“Sức mạnh của ngôn từ” gợi ý cho bạn 8 câu hỏi quan trọng bạn cần đặt ra với bác sĩ:

Lỗi webgl gặp sự cố không mong đợi năm 2024

1. Bác sĩ nghĩ thế nào về bệnh tình của tôi?

Hãy yêu cầu bác sĩ giải thích cặn kẽ về bệnh tình của bạn. Đừng ngại yêu cầu họ diễn giải những thuật ngữ y khoa hoặc những vấn đề chuyên môn nếu bạn không hiểu. Bạn có thể ghi chép lại để tra cứu sau nêu bạn muốn tìm hiểu cặn kẽ hơn.

2. Tôi có thể lựa chọn phương án điều trị nào cho trường hợp của tôi?

Có nhiều phương án bao giờ cũng tốt hơn chỉ có một phương án, đôi lúc khi bạn hỏi như vậy sẽ giúp cho bác sĩ đưa ra được nhiều phương án hơn và biết đâu lại có phương án tối ưu và tốt hơn cho bệnh của bạn. Sau khi bác sĩ đưa ra các phương án, có thể hỏi tiếp

  • Tôi có lựa chọn nào khác không?
  • Các phương pháp điều trị này khác nhau thế nào?
  • Bác sĩ thấy phương pháp nào là hiệu quả nhất và tại sao?

3. Phương pháp này có tác dụng với tôi như thế nào?

4. Quá trình điều trị ra sao?

Nếu bác sĩ có nhiều thời gian, đặc biệt các bác sĩ ở bệnh viện tư thường sẽ nói cho bạn chi tiết từng bước điều gì để bạn biết nếu như bạn đặt câu hỏi này.

5. Các rủi ro có thể xảy ra?

Biết trước những rủi ro có thể gặp phải sẽ giúp bạn sẵn sàng với những tình huống xấu nhất có thể xảy ra và có phương án với nó.

6. Điều gì sẽ xảy ra nếu tôi tạm thời không làm gì?

Nếu bạn chưa sẵn sàng cho việc điều trị, câu hỏi này sẽ giúp bạn biết rằng bạn có thể trì hoãn việc điều trị một khoảng thời gian hay không.

7. Chi phí cho cuộc điều trị này là bao nhiêu?

Chí phí điều trị cũng là vấn đề mà chúng ta cần phải quan tâm, liệu bảo hiểm có thể chi trả hết chi phí không? Nếu bảo hiểm không chi trả thì bạn sẽ phải trả bao nhiêu, bạn cần biết để chuẩn bị sẵn tâm lý cũng như kinh phí cho việc điều trị.

8. Bác sĩ nghĩ thế nào nếu tôi tư vấn thêm từ một bác sĩ khác?

Trong trường hợp bạn vẫn còn lăn tăn về bệnh tình của mình, bạn hoàn toàn có thể nhờ tư vấn của một bác sĩ khác.

Với 8 câu hỏi, sau khi được nghe bác sĩ trả lời, bạn sẽ có cảm giác nắm được vận mệnh của mình, và cuộc sống của mình sẽ do mình quyết định chứ không còn phụ thuộc vào ai cả. Cảm giác đầy sức mạnh đúng không? Hãy tự tin và hỏi bác sĩ những điều mà bạn tin rằng mình cần và nên được biết.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Vẫn anh chàng kia, anh thường xuyên nhận được dịch vụ kém hay sản phẩm kém chất lượng, và lần nào cũng vậy anh cho rằng số phận của mình thật hẩm hiu khi thường xuyên nhận được đồ không đúng như kì vọng mặc dù anh đã trả tiền rất cao. Có bao giờ anh nghĩ rằng việc anh nhận được những dịch vụ, sản phẩm không tốt đó là do anh chứ không phải số phận của anh không nhỉ? Nếu có lúc nào nghĩ đến anh nên làm theo công thức sau:

Công thức ABC trong nghệ thuật phàn nàn để được phục vụ tốt hơn

A (Assert your rights ) Khẳng định quyền được nhận hàng hoá dịch vụ tốt:

Là người trả tiền để mua hàng hoá hay sử dụng dịch vụ, bạn hoàn toàn có quyền lên tiếng bảo vệ quyền lợi của mình và phàn nàn trong trường hợp:

  • Hàng hoá bị hư hỏng hoặc không được giao hàng đúng hẹn
  • Nhân viên nhà hàng thô lỗ, không sẵn sàng phục vụ hoặc bất cẩn
  • Các món ăn không được làm theo yêu cầu
  • Cửa hàng không bán những sản phẩm đúng như họ đã quảng cáo.

Nếu bạn cảm thấy căng thẳng khi thực hiện quyền khách hàng, hãy ghi nhớ những điều sau:

  • Bạn không bao giờ chấp nhận những dịch vụ yếu kém và bạn cần khẳng định điều đó trước hết với chính bạn.
  • Bạn có quyền phàn nàn về những dịch vụ tồi tệ mà bạn nhận được.
  • Nếu bạn cương quyết yêu cầu nhà cung cấp đáp ứng những gì bạn muốn, trong hầu hết các trường hợp, bạn sẽ được thoả mãn.
  • Phàn nàn một cách cứng rắn không có nghĩa bạn là người hung hăng – điều đó chỉ chứng tỏ cho mọi người thấy rằng bạn sẵn sàng lên tiếng để bảo vệ quyền lợi của mình.

B (Be calm) – Bình tĩnh, lịch sự và thân thiện, nhưng cứng rắn

Việc lớn tiếng với một nhân viên phục vụ nhà hàng thô lỗ, một nhân viên bất cẩn hay một nhân viên dịch vụ khách hàng lơ là ít khi mang lại một kết quả tốt đẹp. Trong nhiều trường hợp, một thái độ mềm mỏng, từ tốn lại hiệu quả hơn rất nhiều. Sau đây là một vài gợi ý giúp bạn giữ được bình tĩnh khi phản ứng trước những sự việc không hay:

  • Luôn luôn hỏi tên, lặp lại và viết tên của người mà bạn đang nói chuyện.
  • Giữ giọng nói ôn hoà
  • Không xưng hô với người đối diện bằng từ ngữ thô tục
  • Giữ nụ cười trên gương mặt
  • Kiên nhẫn xem người đối diện xử lý lời phàn nàn của bạn như thế nào trước khi có những động thái cứng rắn hơn. Nếu họ làm ngơ hoặc thô lỗ với bạn, bạn hãy nói: “Tôi muốn nói chuyện với quản lý của anh/ chị. Vui lòng cho tôi biết tên của ông ấy/ bà ấy là gì?”

C (Clarify the problem) – Giải thích sự cố và nêu rõ kỳ vọng của bạn.

Nếu muốn lời phàn nàn của bạn có tác dụng, bạn không nên “buộc tội” người đã làm bạn phật ý khi chưa có căn cứ cụ thể hoặc không nên đưa ra những nhận xét ác ý về dịch vụ của họ. Thay vì vậy, bạn hãy tưởng thuật sự việc một cách rõ ràng để người quản lý hoặc người có trách nhiệm có thể giải quyết vấn đề.

Việc áp dụng công thức ABC sẽ giúp bạn được phục vụ tốt hơn trong hầu hết các lần, và nếu như bạn thường xuyên phàn nàn về dịch vụ bạn nhận được không đúng như yêu cầu của bạn, thì chắc chắn lần sau các bạn sẽ nhận được đúng thứ mình mong muốn, vì chắc chắn rằng đơn vị cung cấp dịch vụ sẽ không muốn lại được nghe bạn phàn nàn lần nữa.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Lại là anh chàng kia, nhưng không phải vấn đề của anh ấy, mà vấn đề của Sếp anh ấy. Sếp anh ấy thường xuyên giao việc cho anh và cả những đồng nghiệp của anh, nhưng chẳng đưa ra bất cứ lời chỉ dẫn nào về thời hạn hoàn thành, nội dung công việc, hay những người có thể trợ giúp. Việc này làm cho anh loay hoay mãi mới hoàn thành nhưng cuối cùng chất lượng công việc vẫn không như Sếp mong muốn. Vậy thì mỗi khi giao việc mới cho nhân viên, Sếp của anh nên suy nghĩ và đặt 3 câu hỏi sau:

1. Liệu nhiệm vụ mới này có ảnh hưởng đến thời hạn hoàn thành công việc anh/chị đã được giao không?

Nếu câu trả lời là “Có”, thì tất cả tuỳ thuộc vào quyết định của bạn. Hãy cân nhắc xem nên gia hạn thời gian cho họ hay giúp họ hoàn thành nhiệm vụ. Giao việc chất chồng mà không có sự điều chỉnh rất dễ dẫn đến sự căng thẳng và bất bình giữa các nhân viên.

2. Anh/chị còn thắc mắc gì về nội dung công việc được giao cũng như thời hạn hoàn thành không?

Xác định rõ mục tiêu và thời hạn cần thiết hoàn thành công việc được giao sẽ mang lại kết quả tốt hơn. Khi giao việc hãy đưa ra một vài ví dụ hoặc nói rõ những gì bạn muốn. Tiếp theo, đừng quên hỏi họ đã nắm vững yêu cầu của công việc chưa, sau đó chú ý quan sát và hỏi xem quỹ thời gian như vậy có hợp lý hay không để không làm ảnh hưởng đến các công việc khác của họ.

3. Anh/chị cần những hỗ trợ gì để hoàn thành công việc này?

Hãy đảm bảo rằng nhân viên của bạn có đủ phương tiện, nguồn tài liệu cần thiết, sự hỗ trợ cũng như quỹ thời gian thích hợp để có thể thực hiện tốt công việc của mình. Nếu không khả năng họ hoàn thành công việc một cách đúng đắn và đúng kế hoạch sẽ rất mong manh.

Ngoài ra, đừng quên nói lời cảm ơn, chẳng hạn: Cảm ơn anh/ chị . Tôi đánh giá cao việc anh/ chị nhận công việc này.

Lỗi webgl gặp sự cố không mong đợi năm 2024
Là ông Sếp, ông rất thích nói trước toàn bộ nhân viên, nhưng mỗi lần ông nói thì chủ đề cứ miên man chẳng hiểu mục đích là gì, ông làm cho người nghe cảm thấy chán nản và dần dần chẳng ai còn muốn nghe ông nói hay ông chia sẻ bất cứ điều gì nữa. Lời khuyên cho ông Sếp này là hãy trả lời 6 câu hỏi sau đây trước khi diễn thuyết:

1. Mục đích của bài diễn thuyết là gì?

2. Tựa đề hoặc chủ đề của bài diễn thuyết là gì?

3. Thành phần khán thính giả tham dự gồm những ai và họ biết được những gì về chủ đề mà bạn sẽ nói đến?

4. Bài diễn thuyết của bạn đem lại lợi ích gì cho người nghe?

5. Những điểm chính mà bạn muốn đề cập đến là gì?

6. Bạn muốn khán thính giả làm gì sau khi kết thúc bài diễn thuyết?

Một bài diễn thuyết hay giống như một chiếc đầm dạ hội của phụ nữ, nó phải đủ dài để bao phủ toàn bộ chủ đề và đủ ngắn để mọi người thấy hấp dẫn – R.A. Butler

P/S:

1. Các nhân vật trên đều là hư cấu với mục đích làm cho bài review về cuốn sách “Sức mạnh của ngôn từ” trở nên hấp dẫn và lôi cuốn hơn.

2. Ai nên đọc cuốn sách này? Nếu bạn gặp một hoặc một số trong những vấn đề của anh chàng, hay sếp của anh ta ở trên kia thì bạn nên đọc cuốn sách này.

3. Cuốn sách này có dễ đọc không? Cuốn sách này không dễ đọc, đặc biệt là những chương đầu, cá nhân mình đánh giá là không hấp dẫn, tuy nhiên các chương phía sau đọc sẽ thú vị hơn và gần với thực tế cuộc sống hơn.

Giới thiệu một vài thư viện Front-end nổi bật trên GitHub

May 9, 2021, 7:38 pm

1. Three.js

Lỗi webgl gặp sự cố không mong đợi năm 2024

Được vote hơn 68 nghìn sao trên github, thư viện này là một cách tốt để tạo 3D animation trên trình duyệt. Thư viện này cung cấp renderer cho , , CSS3D và WebGL, nó giúp chúng ta tạo ra những trải nghiệm tương tác phong phú trên nhiều thiết bị và trình duyệt. Lần đầu xuất hiện vào tháng 4-2010, đến nay thư viện này vẫn đang được phát triển bởi hơn 1000 người đóng góp.

GitHub: https://github.com/mrdoob/three.js/

Demo: https://codesandbox.io/s/laptop-spring-q23sw?fontsize=14&hidenavigation=1&theme=dark

2. Sweet Alert 2

Lỗi webgl gặp sự cố không mong đợi năm 2024

Sweet alert là một sự thay thế tuyệt vời cho “alert” của JavaScript.

GitHub: https://github.com/sweetalert2/sweetalert2

Demo: https://sweetalert2.github.io/

3. Anime.js

Với hơn 38k sao, Anime là một thư viện animation JavaScript hoạt động tốt với CSS Properties, chuyển đổi CSS, attribute cho SVG hay DOM, và các JavaScript Objects. Thư viện này giúp bạn gắn chuỗi các properties của animation, đồng bộ hóa nhiều instance cùng nhau, tạo timeline,…

GitHub: https://github.com/juliangarnier/anime

Demo: https://animejs.com/

4. Hover
Lỗi webgl gặp sự cố không mong đợi năm 2024

Hover cung cấp bộ sưu tập gồm những effect dạng hover tạo bởi CSS để áp dụng vào links, button, logo, svg, image và những thứ khác.

GitHub: https://github.com/IanLunn/Hover

Demo: http://ianlunn.github.io/Hover/

5. Type.js

Lỗi webgl gặp sự cố không mong đợi năm 2024

Thư viện này được vote 10 nghìn sao, cho phép bạn tạo animation đánh chữ cho các chuỗi ký tự với tốc độ tuỳ chọn.

GitHub: https://github.com/mattboldt/typed.js

Demo: http://mattboldt.github.io/typed.js/

6. Scroll Reveal

Lỗi webgl gặp sự cố không mong đợi năm 2024

Với gần 20 nghìn sao trên github thư viện này cung cấp animation scroll dễ dàng cho web và trình duyệt mobile, hiển thị mọi thứ khi scroll bằng animation. Nó cũng hỗ trợ nhiều loại effect đẹp đẽ, thậm chí cho phép bạn định nghĩa animation bằng ngôn ngữ tự nhiên.

GitHub: https://github.com/jlmakes/scrollreveal

Demo: https://scrollrevealjs.org/

7. Tagify
Lỗi webgl gặp sự cố không mong đợi năm 2024

Hỗ trợ chuyển đổi 1 field nhập hay một text-area thành Tags theo cách dễ dàng, có thể tùy chỉnh, với hiệu suất và code ngắn gọn.

GitHub: https://github.com/yairEO/tagify

Demo: https://yaireo.github.io/tagify/

8. css.gg

Lỗi webgl gặp sự cố không mong đợi năm 2024

Một thư viện mã nguồn mở với hơn 700 Pure CSS, SVG & Figma UI Icons, có thể dùng trong SVG Sprite, styled-components (React), NPM và API.

GitHub: https://github.com/astrit/css.gg

Demo: https://css.gg/app

9. React Content Loader

Lỗi webgl gặp sự cố không mong đợi năm 2024

Một thư viện với hơn 10 nghìn sao, dễ dàng tạo các thành phần placeholder loading, thay thế việc tải thông thường và mang lại trải nghiệm tốt hơn cho người dùng. Hỗ trợ HTML React, React Native, Vue và Vanilla JS.

GitHub: https://github.com/danilowoz/react-content-loader

Demo: https://skeletonreact.com/

10. Simple Icons

Gần 2000 icon SVG của các thương hiệu phổ biến

GitHub: https://github.com/simple-icons/simple-icons

Demo: https://simpleicons.org/

11. Plotly
Lỗi webgl gặp sự cố không mong đợi năm 2024

Đây là library JavaScript dùng để minh họa. Có thể tạo ra hàng chục loại biểu đồ và ảnh minh họa, bao gồm biểu đồ chỉ số, biểu đồ 3D , SVG, …

GitHub: https://github.com/plotly/plotly.js

Demo: https://plotly.com/javascript

12. Chroma.js

Lỗi webgl gặp sự cố không mong đợi năm 2024

Chroma là một thư viện JavaScript dùng cho các loại chuyển đổi màu và thang màu sắc.

GitHub: https://github.com/gka/chroma.js

Demo: https://tutsplus.github.io/how-to-manipulate-colors-in-javascript-using-chroma.js/

13. Animate.css

Lỗi webgl gặp sự cố không mong đợi năm 2024

Với 70k sao trên github, Animate.css là một trong những thư viện Animation CSS nhỏ gọn và dễ sử dụng. Hỗ trợ rất nhiều hiệu ứng rung lắc, lật, zoom in, zoom out….

GitHub: https://github.com/daneden/animate.css

Demo: https://animate.style/

14. fullPage

Lỗi webgl gặp sự cố không mong đợi năm 2024

Một thư viện đơn giản và dễ sử dụng tạo các trang web fullscreen scrolling (còn được gọi là các trang web single page hoặc one page sites) và thêm landscape sliders bên trong các phần của trang web.

GitHub: https://github.com/alvarotrigo/fullPage.js

Demo: https://codepen.io/alvarotrigo/pen/NxyPPp

15. tui.chart

Lỗi webgl gặp sự cố không mong đợi năm 2024

Thư viện này được update liên tục đồng thời tài liệu khá đầy đủ, đơn giản dễ dùng phù hợp với các nhu cầu cơ bản. Hỗ trợ đầy đủ các loại biểu đồ thường dùng, hỗ trợ cho React và Vue, có tính năng nổi bật đi kèm như responsive và zoomable. Tooltip có tích hợp sẵn tính năng export ra file csv, png, xls, jpeg.

GitHub: https://github.com/nhn/tui.chart

Demo: https://codesandbox.io/s/sad-colden-ivx8v?file=/src/App.js

Tài liệu tham khảo

  • https://iainfreestone.hashnode.dev/10-trending-projects-on-github-for-web-developers-12th-march-2021
  • https://www.codeinwp.com/blog/best-javascript-animation-libraries/

React Component Lifecycle

May 9, 2021, 7:39 pm

Xin chào tất cả các bạn. Trong phase lần này của internal dev training, nhóm mình có đăng ký nghiên cứu, tìm hiểu về React – một library rất nổi tiếng dùng để code front-end. Thật sự thì với khối lượng kiến thức rất nhiều của React thì sau 1 tháng ngắn ngủi bọn mình cũng không thể tìm hiểu hết được. Tuy nhiên, ít nhiều thì mình cũng đã nắm bắt được một chút về kiến thức cơ bản của React. Vì vậy trong bài ngày hôm nay mình cũng xin giới thiệu về 1 phần kiến thức đó – chính là một khái niệm quen thuộc trong React: Component Lifecycle.

Component Lifecycle

Dưới đây là chính là biểu đồ cơ bản một lifecycle hoàn chỉnh của 1 component:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Một vòng đời(lifecycle) của một component trong React được chia thành 3 giai đoạn là : – Mounting – Updating – Unmount Sau đây chúng ta sẽ lần lượt đi sâu hơn về 3 giai đoạn này cũng như các method phổ biến của từng giai đoạn nhé.

Mounting

Có thể hiểu đơn giản mounting là làm cho component của bạn hiển thị trên màn hình :))))) Và với mỗi component thì việc mounting sẽ chỉ xảy ra đúng 1 lần duy nhất. Theo như biểu đồ ở trên thì các bạn có thể thấy là sẽ có 3 phương thức chính trong giai đoạn này. Các phương thức này sẽ lần lượt được gọi khi một thể hiện của một component được tạo và insert vào DOM. Chúng bao gồm: – Constructor() : được gọi trước khi component được mount. Có thể hiểu theo cách khác là component trước khi vào DOM bằng

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

4 thì phương thức này sẽ được gọi. Lưu ý là chúng ta không nên gọi hàm

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

5 trong phương thức này vì nó chưa có DOM nào để tương tác cả. – Render() : là phương thức duy nhất bắt buộc phải có trong class component và nên là pure – không thay đổi state của component VD:

Lỗi webgl gặp sự cố không mong đợi năm 2024

– ComponentDidMount(): là phương thức sẽ được gọi sau khi render component, ở đây cũng là nơi thực hiện các hàm AJAX, DOM hay update state sẽ được thực thi tại đây. Phương thức này cũng được kết nối với các Framework khác hay database. Chúng ta sẽ đặt hàm

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

5 ở đây để tương tác vì Component đã được insert vào DOM.

VD:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Updating

Update sẽ xảy ra khi có sự thay đổi ở state và prop. Đây cũng là giai đoạn duy nhất có thể xảy ra nhiều lần. Update sẽ gồm 2 phương thức thông dụng được gọi lần lượt là

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

4 và

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

8.

Phương thức

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

8 sẽ được gọi ngay sau khi việc update xảy ra chứ không được gọi cho việc khởi tạo render.

VD:

Lỗi webgl gặp sự cố không mong đợi năm 2024

Sử dụng phương thức này như là một cách để thao tác trên DOM khi component đã được update. Đây cũng là nơi để xử lí các network request miễn là có sự so sánh giữa các prop hiện tại và các prop trước đó.

Bạn có thể gọi hàm

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

5 ngày lập tức trong phương thức

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

8 nhưng hãy lưu ý là phải bọc nó trong 1 điều kiện nào đó, nếu không hàm này có thể dẫn đến 1 vòng lặp vô hạn.

Unmount

Quá trình unmount xảy ra khi component bị remove khỏi DOM, hay nói một cách khác là hàm

  from airflow.contrib.operators.gcs_to_bq import GoogleCloudStorageToBigQueryOperator  
  destination_project_dataset_table = "livand.limda_dev.fl_orders"  
  # define the BigQuery schema  
  schema_fields = [  
    {"name": "id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "ordered_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "user_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "event_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "release_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "receive_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "total_ticket_quantity", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "temp_lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "fixed_total_price", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "payment_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_expire_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "payed_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "cancel_flg", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "canceled_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "updated_at", "type": "TIMESTAMP", "mode": "NULLABLE"}  
  ]  
  fl_order_gcs_to_bq = GoogleCloudStorageToBigQueryOperator(  
      task_id="fl_order_gcs_to_bq",  
      bucket=bucket,  
      source_objects=[file_name],  
      source_format=export_format,  
      skip_leading_rows=1, # csv heading row  
      destination_project_dataset_table=destination_project_dataset_table,  
      schema_fields=schema_fields,  
      create_disposition="CREATE_IF_NEEDED",  
      write_disposition="WRITE_TRUNCATE",  
      google_cloud_storage_conn_id="fl_gcp",  
      bigquery_conn_id="fl_gcp"  
  )

2 sẽ được gọi khi render ra không có component nào hoặc người dùng chuyển hướng trang web.

  from airflow.contrib.operators.gcs_to_bq import GoogleCloudStorageToBigQueryOperator  
  destination_project_dataset_table = "livand.limda_dev.fl_orders"  
  # define the BigQuery schema  
  schema_fields = [  
    {"name": "id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "ordered_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "user_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "event_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "release_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "receive_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "total_ticket_quantity", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "temp_lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "fixed_total_price", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "payment_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_expire_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "payed_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "cancel_flg", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "canceled_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "updated_at", "type": "TIMESTAMP", "mode": "NULLABLE"}  
  ]  
  fl_order_gcs_to_bq = GoogleCloudStorageToBigQueryOperator(  
      task_id="fl_order_gcs_to_bq",  
      bucket=bucket,  
      source_objects=[file_name],  
      source_format=export_format,  
      skip_leading_rows=1, # csv heading row  
      destination_project_dataset_table=destination_project_dataset_table,  
      schema_fields=schema_fields,  
      create_disposition="CREATE_IF_NEEDED",  
      write_disposition="WRITE_TRUNCATE",  
      google_cloud_storage_conn_id="fl_gcp",  
      bigquery_conn_id="fl_gcp"  
  )

3 sẽ được gọi ngay lập tức trước khi component bị unmount và phá huỷ. Bạn có thể thực hiện các hành động dọn dẹp như dừng timer hay cancel request network tại đây.

Bạn cũng không nên gọi hàm

  from airflow.contrib.operators.mysql_to_gcs import MySqlToGoogleCloudStorageOperator  
  from airflow.models import Variable  
  bucket = "limda_dev"  
  file_name = "fl/orders.csv"  
  export_format = "csv"  
  fl_order_mysql_to_gcs = MySqlToGoogleCloudStorageOperator(  
      task_id="fl_order_mysql_to_gcs",  
      mysql_conn_id="fl_business_db",  
      sql=query,  
      bucket=bucket,  
      filename=file_name,  
      export_format=export_format  
  )

5 ở trong phương thức

  from airflow.contrib.operators.gcs_to_bq import GoogleCloudStorageToBigQueryOperator  
  destination_project_dataset_table = "livand.limda_dev.fl_orders"  
  # define the BigQuery schema  
  schema_fields = [  
    {"name": "id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "ordered_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "user_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "event_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "release_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "receive_method_id", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "total_ticket_quantity", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "temp_lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "lot_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "fixed_total_price", "type": "INT64", "mode": "REQUIRED"},  
    {"name": "payment_status", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "payment_expire_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "payed_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "cancel_flg", "type": "STRING", "mode": "REQUIRED"},  
    {"name": "canceled_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE"},  
    {"name": "updated_at", "type": "TIMESTAMP", "mode": "NULLABLE"}  
  ]  
  fl_order_gcs_to_bq = GoogleCloudStorageToBigQueryOperator(  
      task_id="fl_order_gcs_to_bq",  
      bucket=bucket,  
      source_objects=[file_name],  
      source_format=export_format,  
      skip_leading_rows=1, # csv heading row  
      destination_project_dataset_table=destination_project_dataset_table,  
      schema_fields=schema_fields,  
      create_disposition="CREATE_IF_NEEDED",  
      write_disposition="WRITE_TRUNCATE",  
      google_cloud_storage_conn_id="fl_gcp",  
      bigquery_conn_id="fl_gcp"  
  )

3 bởi vì khi một thể hiện của 1 component bị unmount thì nó sẽ không bao giờ có thể mount lại được nữa.

Kết luận

Vậy là qua nội dung bài ngày hôm nay, mình đã giới thiệu và chia sẻ cho mọi người kiến thức mình đã học được. Hi vọng qua bài viết này, mọi người cũng có thể hình dung và hiểu thêm về một vòng đời của component. Vì lượng kiến thức có hạn nên chắc chắn không tránh khỏi sai sót, rất mong mọi người bỏ qua cũng như chỉ bảo thêm. Cuối cùng xin cảm ơn mọi người vì đã đọc bài ạ.

Reference

https://reactjs.org/docs/react-component.html

Mình đã bị BẺ CONG khi tới Flinters

May 13, 2021, 2:15 am

YES !!! Các bạn không đọc nhầm đâu, mình đã bị bẻ cong các cậu ạ. Lại còn bị bẻ trước khi thử việc cơ.

Chuyện là ở bài blog trước chắc các bạn cũng biết mình đã trúng tuyển công ty Ấn Độ lương hơn 50 củ. Đường tới công ty Ấn của mình là một đường thẳng nhưng vì gặp Flinters mà rẽ ngang.

Ban đầu mình đi phỏng vấn vì tò mò, mình có cu em tên @tung_dk lần nào đi ăn cũng khoe về công ty của em ấy, nào là cấp Macbook, môi trường thân thiện, vui vẻ, nhiều clb, thời gian làm việc linh hoạt, đồ ăn thức uống ngập mồm và đặc biệt là RẤT NHIỀU MÌ TÔM.

Ở Flinters có rất nhiều anh em chiến hữu mà mình từng làm việc cùng, vào sinh ra tử cùng nhau vài dự án cùng nhau ở công ty cũ : @bang_nh, @tung_dk, @huy_dx

Ngoài ra bản thân cũng là một người ham vui có trách nhiệm, đã đồng ý đi phỏng vấn thì sẽ đi vì sẽ học hỏi được nhiều điều.

Ngày đầu đi phỏng vấn vòng 2, ngay khi bắt đầu người phỏng vấn mình là anh Tuấn đẹp trai. Vừa pass phỏng vấn của một công ty khác nên mình khá tự tin về phần tech của mình, tớ tự tin là anh Tuấn hỏi tới đâu cũng trả lời được hết. Nhất là giờ các anh Manager một số công ty họ phải dành nhiều thời gian cho công tác quản lý, không có nhiều thời gian nghiên cứu công nghệ mới đâu. Nhưng thật bất ngờ, Manager của Flinters lại là người có kiến thức tech đỉnh của chóp. NodeJS, Express, React Hooks, Golang, Python, nhạc nào anh cũng hỏi được, mà câu nào cũng đòi hỏi kiến thức thực tế đã từng làm qua thật sự rồi mới trả lời được chứ không phải chỉ thuần lí thuyết.

Đại khái buổi phỏng vấn của mình tóm gọn như thế này :

Lỗi webgl gặp sự cố không mong đợi năm 2024

Mình chỉ trả lời được khoảng 90% câu hỏi về tech…

Anh Tuấn có nhiều câu hỏi rất hay. Thi thoảng đang tập trung suy nghĩ câu hỏi Python thì anh lại chuyển qua hỏi tiếp về Giáo dục công dân cho mình bớt căng thẳng: – Em nghĩ sao về việc các bạn cấp 3 của em, học dốt hơn em nhưng giờ lại thành công hơn em? – Nhà bọn nó giàu sẵn anh ơiiiiii, có mấy thằng học dốt nhưng nhà giàu sẵn, hoặc có thằng thì chui được vào 1 cái chạn to. Gia đình vợ mua nhà mua xe, giao cho chức tổng giám đốc làm. Sáng ngủ dậy chỉ cần thở với đếm tiền chứ bọn nó tài cán gì đâuuuuuu

Lỗi webgl gặp sự cố không mong đợi năm 2024
Đấy là nhân cách thứ hai của mình nói thế, chứ mình thì hôm đấy mình nói thế này: – Em thấy điều đó là hết sức bình thường thôi ạ. Đôi khi là sau này lên đại học họ mới tìm thấy đam mê của mình rồi một lòng theo đuổi đam mê ấy. Giống như em. Tới năm 2 em mới nhận ra đam mê của mình sau lần đầu dành cả buổi tối chỉ để code được 1 nhập xuất, cái cảm giác làm được một điều gì đó bằng code khiến em phấn khích cực kì. Tới bây giờ em vẫn chưa bao giờ quên cảm giác ấy. Ngoài ra việc các bạn thành công hơn cũng là động lực để em phát triển bản thân tốt hơn, nhìn nhận lại tại sao bản thân mình chưa được tốt và còn thiếu điều gì. Học hỏi từ những bạn giỏi hơn cũng là một cách hay ạ. Các bạn giàu và thành công em còn có người để mà vay tiền

Mình thề với anh em, với kinh nghiệm 12 năm 10 phảy Giáo dục công dân, mình tự tin mình được 10/10 trên buổi phỏng vấn. THẾ NHƯNG, sau câu trả lời trên, mặt anh Tuấn chợt nghiêm lại. Anh gấp chiếc macbook lại, rồi nhẹ nhàng nói :

– Em có muốn hỏi gì anh không?

Mình bắt đầu chia sẻ thật với anh rằng mình được nhận ở một công ty với một mức lương rất tốt. Mình cũng đã tìm hiểu range lương của Flinters và biết chắc chắn deal của bên kia về mức lương thì tốt hơn. Nhưng Flinters qua cuộc nói chuyện của anh Tuấn ̶v̶̶à̶ ̶s̶̶ự̶ ̶q̶̶u̶̶ả̶̶n̶̶g̶ ̶c̶̶á̶̶o̶ ̶n̶̶h̶̶i̶̶ệ̶̶t̶ ̶t̶̶ì̶̶̶n̶̶h̶ ̶v̶̶ề̶ ̶F̶̶l̶̶i̶̶n̶̶t̶̶e̶̶r̶̶s̶ ̶c̶̶ủ̶̶a̶ ̶K̶̶h̶̶ắ̶̶c̶ ̶T̶̶ù̶̶n̶̶g̶ ̶đ̶̶ể̶ ̶l̶̶ấ̶̶y̶ ̶1̶̶0̶ ̶c̶̶ủ̶ mình thấy đây là một công ty TRONG MƠ về môi trường làm việc, các phong trào, câu lạc bộ… Một nơi mà hiếm có chỗ nào có thể khiến bạn có thể trải nghiệm lần thứ 2 trong đời. Bản thân mình đã đi qua 3 4 công ty, ở đâu cũng có sự ngột ngạt nhất định, nhưng mình không cảm nhận được điều đó ở nơi đây. Đặc biệt ở Flinters có bạn HR rất xinh nữa \=))

Anh Tuấn không thuyết phục mình về Flinters, anh chỉ nói về những trải nghiệm của anh khi còn ở tuổi mình. Anh ấy hiểu sự phân vân của mình và nói bản thân mình biết rõ nhất câu trả lời. Anh tâm sự bản thân cũng từng rời Flinters rồi quay lại. Ai rồi cũng phải bị cắm sừng về Flinters thôi.

Buổi phỏng vấn đó mình và anh Tuấn đã nói chuyện với nhau suốt hơn 2 tiếng. Chưa bao giờ mình thấy thời gian trôi nhanh tới vậy.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Tối hôm đó, mình về vắt chân lên trán suy nghĩ mãi. Nếu nhận lương cao mà cứ lủi thủi 1 mình sáng làm chiều hay một nơi làm việc RẤT NHIỀU MÌ TÔM.

Mình đã chọn Flinters vì ở đây có môi trường làm việc thoải mái và có anh em. Mình thực sự muốn làm việc cùng các anh em chiến hữu thêm một lần nữa. Thực ra còn vì ở Flinters có rất nhiều mì tôm ngon. Mục tiêu của mình là cống hiến thật nhiều và trở thành MVP của năm. Hi vọng một ngày nào đó khi đọc lại bài blog này, mình sẽ mỉm cười vì bản thân đã làm được.

MAKE FLINTERS GREAT AGAIN !!!

Về Flinters, mình tự nhủ sẽ lập tức tham gia tất cả các hoạt động : Đá bóng, điện tử, gây dựng lại clb Boardgame, văn nghệ, tổ chức sự kiện, thi code, thi viết blog, học tiếng Nhật… Ở đâu có tiếng gáy cười, ở đó có Hoàng Anh.

“Làm việc hết sức, vui chơi hết mình”

Yêu Flinters.

70 Rules of SEPTENI-Hinerankai (phần 6)

May 13, 2021, 2:27 am

Nối tiếp phần trước, xin giới thiệu tới các bạn nguyên tắc số 12, 13 trong số 70 nguyên tắc được đúc kết qua cả quá trình khởi nghiệp và đưa Septeni Group trở thành tập đoàn hàng đầu Nhật Bản về lĩnh vực quảng cáo internet của nhà sáng lập công ty – ngài Nanamura Mamoru.

Chương 2: “Leader” rule

— Để thay đổi công ty, hãy thay đổi vũ khí của bản thân

Lỗi webgl gặp sự cố không mong đợi năm 2024

Nguyên tắc số 12: Nếu muốn thay đổi công ty, thì phải thay đổi vũ khí của bản thân

Ông Kazuo Inamori phía Kyocera đã từng tham dự buổi phát biểu của ngài Konosuke Matsushita, lúc đó ngài Konosuke Matsushita đã chia sẻ rằng “Người lãnh đạo cần tích lũy cả nguồn vốn lẫn nhân lực để xây nên những “con đập” đề phòng trường hợp bất trắc.” Lập tức, trong hội trường có người đặt câu hỏi “Làm thế nào để xây nên những “con đập?” Ngài Konosuke Matsushita trả lời sau 1 thoáng suy nghĩ: “Để xây được thì trước tiên phải có mong muốn làm việc đó”. Mặc dù có một vài tiếng cười tỏ ý thất vọng nhưng lời khuyên của ngài Matsushita đã giúp ông Inamori mở mang đầu óc.

Có rất nhiều nhà lãnh đạo mong muốn thay đổi công ty khi việc kinh doanh gặp khó khăn. Nhưng liệu có mấy ai trong số đó thực sự nghiêm túc nghĩ sẽ thay đổi công ty? Hơn nữa, liệu bản thân những người lãnh đạo đã sẵn sàng “vũ khí” để đương đầu với những thay đổi hay chưa? Cũng không khỏi bất ngờ khi có nhiều người miệng thì nói “Muốn làm công ty lớn mạnh lên” nhưng thực ra lại nghĩ rằng “Chỉ cần duy trì cuộc sống tạm tạm là được rồi, không cần thiết phải vất vả để làm gì to tát cả.”

Tôi thì nghĩ là ý chí tiến thủ không phải là yếu tố bắt buộc đối với mỗi nhà kinh doanh. Chỉ cần đi trên một lộ trình chậm rãi vừa phải cũng đã là tốt rồi. Việc ưu tiên tính ổn định của công ty cũng là một phương thức vận hành của nhà quản lý.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Bản thân tôi trước khi lập nghiệp đã nghĩ “muốn xây dựng một công ty tầm 20-30 người” nhưng không ngờ công ty đã lớn mạnh tới mức hàng nghìn người như bây giờ. Tôi đã từng nghĩ “bản thân mình có thể sống hạnh phúc đã là tốt lắm rồi”.

Nhưng khi công ty ngày một phát triển nhờ sự cố gắng của mỗi nhân viên thì tôi lại muốn làm sao để không chỉ bản thân mình mà các nhân viên cũng cảm thấy hạnh phúc. Tiếp đến, tôi còn muốn đem đến hạnh phúc cho gia đình của nhân viên, khách hàng và cả gia đình của khách hàng nữa. Để làm được điều đó tôi nhận thức rõ ràng là cần phải đưa công ty lên sàn, phải làm cho công ty liên tục phát triển, phải kết hợp “vũ khí” của bản thân với “vũ khí” của công ty để cùng nhau lớn mạnh và trưởng thành.

Xin phép được mượn lời của Matsushita san, nếu muốn thay đổi công ty thì điều quan trọng là bản thân những người lãnh đạo phải luôn tâm niệm rằng sẽ phải thay đổi. Khi có mong muốn thay đổi và bản thân cũng chấp nhận đương đầu với những đổi thay thì công ty sẽ trưởng thành và có thể bước lên những tầm cao mới.

Tuy rằng hiếm nhưng cũng có trường hợp mô hình kinh doanh trở lên tốt hơn, thời thế thuận lợi hơn và “vũ khí” của người lãnh đạo không còn sắc bén như “vũ khí” của công ty nữa. Nếu cảm thấy “bản thân không thể theo kịp (tốc độ tăng trưởng của công ty)” thì nên nhanh chóng thay thế giám đốc, bổ nhiệm người có đủ khả năng thúc đẩy hơn nữa hoạt động kinh doanh hiện tại. Đó cũng là biểu hiện của khát khao “thay đổi công ty”.

Để thay đổi công ty, cần thay đổi “vũ khí” của người lãnh đạo. Yêu cầu đặt ra là phải trở thành người lãnh đạo phù hợp với công ty, bao gồm cả việc kiểm soát bản thân một cách khắt khe.

Nguyên tắc số 13: Tạo ra một tổ chức khiến người khác phải nghĩ “Mình muốn được đứng trên sân khấu này”

Trong vận hành công ty, vai trò của người leader là gì?

Nhắc đến nhạc kịch, ta nghĩ ngay đến imperial theatre, nhắc đến trình diễn live, ta nghĩ tới Nihonbudoukan, nhắc đến Kabuki, ta lại nghĩ tới Kabuki-za theater ở Ginza. Ở nước ngoài cũng vậy, có Broadway, Las Vegas hay Opera house, đối với mỗi người đi theo con đường nghệ thuật thì đều có một nơi gọi là “sân khấu mơ ước”.

Vậy rốt cuộc thì điều gì sẽ khiến thế hệ trẻ có suy nghĩ “Một ngày nào đấy mình muốn được đứng trên sân khấu đó”? Tôi nghĩ nó nằm ở tài nghệ khiến người khác bị thu hút bởi sự độc đáo được sinh ra từ lịch sử và bối cảnh hình thành nên “sân khấu” đó.

Xin phép mượn lời cố sáng lập công ty chế tác Horiba – ông Horiba Masao: hoạt động kinh doanh và hoạt động trình diễn rất giống nhau. Người quản lý, nhà lãnh đạo là đạo diễn, nhân viên là các diễn viên, còn các quan khách quan sát và đánh giá chính là các cổ đông. Vì vậy, những nhà đạo diễn, những người chỉ đạo phải chuẩn bị một sân khấu (công ty) phù hợp khiến cho diễn viên cảm thấy rằng “Mình muốn được đứng trên sân khấu này”, cũng như khiến cho các quan khách suy nghĩ rằng “Mình muốn được xem vở diễn này”.

Lỗi webgl gặp sự cố không mong đợi năm 2024

Đối với doanh nghiệp, để tạo được sân chơi nơi mọi người muốn tham gia thì đương nhiên phải cải tiến nội dung bên trong, chẳng hạn như: thông qua business đó sẽ mang lại giá trị gì cho xã hội, hay doanh nghiệp sẽ trưởng thành ra sao…

Không chỉ vậy, cùng với sự phát triển, tôi nghĩ việc quan tâm đến hình thức bên ngoài cũng cần thiết. Cho dù có sử dụng giữ gìn đến đâu đi nữa thì một sân khấu nếu đơn thuần chỉ bảo tồn năm này qua năm khác sẽ không thể trở thành sân khấu lý tưởng, giống như sân khấu Kabuki luôn phải “thay áo mới” cho hợp thời hay là như rạp Las Vegas luôn lắp đặt thiết bị tân tiến nhất. Các nhà hát nổi tiếng khác cũng vậy.

Septeni từ khi khởi nghiệp đến nay đã trải qua 9 lần di chuyển văn phòng. Do mỗi lần chuyển văn phòng mất rất nhiều chi phí, khâu chuẩn bị và việc dọn dẹp sau đó cũng mất rất nhiều công sức nên nếu có thể thì chắc hẳn là ai cũng muốn tránh. Tuy nhiên, vì muốn tạo ra sân chơi lý tưởng hơn nên việc di chuyển vẫn tiếp tục diễn ra.

Văn phòng mà công ty đặt trụ sở khi mới thành lập ở Yoyogi là một tòa nhà cũ được xây dựng vào năm 1964. Người nào không biết thì có lẽ sẽ không tin rằng một chỗ như vậy mà cũng có công ty. Trong số những người đến phỏng vấn, có những người không thấy biển tên công ty ở lối vào nên đã ra về và không vào phỏng vấn nữa.

Có người nói rằng “Không thể đánh giá một người hay một công ty qua hình thức bên ngoài” nhưng dù sao ấn tượng từ hình thức cũng ảnh hưởng rất lớn đến suy nghĩ của bản thân, rằng “sân khấu” ấy liệu có phải là nơi mình mơ ước hay không. Cũng không quá lời khi nói rằng chúng tôi chuyển văn phòng nhằm thu hút được nhiều người mong muốn làm việc cho công ty, cũng giống như việc các diễn viên ưu tú mong muốn được biểu diễn trên những sân khấu tốt hơn.

Tất nhiên là trong số những người đã làm việc cùng tôi thì cũng có những người đã nghỉ việc. Tuy nhiên, việc làm sao để những người này thấy rằng “Septeni quả thật rất tốt”, “thật muốn quay trở lại Septeni” sau khi so sánh với công ty khác là trách nhiệm của ban lãnh đạo mà đi đầu là người quản lý.