CODE VN

CODE VN

1639036504

Giới thiệu về Hadoop cho người mới bắt đầu

Với sự ra đời của dữ liệu lớn và điện toán đám mây, nhu cầu lưu trữ và xử lý hiệu quả các tập dữ liệu lớn không ngừng tăng lên. Việc sử dụng một tài nguyên duy nhất để lưu trữ và xử lý là không khả thi do chi phí, lượng dữ liệu tuyệt đối được tạo ra và nguy cơ thất bại với khả năng mất dữ liệu có giá trị.

Đây là tình huống đã dẫn đến Hadoop, một nền tảng mã nguồn mở để lưu trữ phân tán và xử lý các tập dữ liệu lớn trong các cụm máy tính. Đối với tính toán phân tán, Hadoop sử dụng MapReduce và đối với lưu trữ phân tán, nó sử dụng Hệ thống tệp phân tán Hadoop (HDFS).

Các trường hợp sử dụng và khu vực ứng dụng

Hadoop chủ yếu được áp dụng trong các lĩnh vực có một lượng lớn dữ liệu cần xử lý và lưu trữ. Vì Hadoop sử dụng tính năng chia tỷ lệ ngang, nên nó có thể nhanh chóng mở rộng quy mô và thực hiện xử lý song song.

Các trường hợp sử dụng kinh doanh phổ biến và các ứng dụng của công nghệ này bao gồm:

Có thể tìm thấy nhiều ứng dụng trong thế giới thực hơn tại đây .

Tải xuống và thiết lập

Điều kiện tiên quyết cho quá trình này là phải cài đặt máy chủ openssh, Java và JDK trên máy của bạn.

Hướng dẫn này khám phá cách cài đặt trên Ubuntu . Để cài đặt trên Windows, hãy làm theo hướng dẫn này . Người dùng Mac có thể làm theo hướng dẫn này .

Dưới đây là các bước cần thực hiện khi cài đặt Hadoop:

Tạo người dùng hadoop và nhóm hadoop .

sudo addgroup hadoop
sudo adduser --ingroup hadoop hadoop

Chuyển người dùng sang người dùng hadoop mới được tạo.

sudo su- hadoop

Thiết lập và kiểm tra Khóa SSH không cần mật khẩu vì Hadoop yêu cầu quyền truy cập SSH để quản lý nút.

ssh-keygen -t rsa -P ""
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh localhost

Tải xuống Hadoop từ trang Apache chính thức . Sau đó, điều hướng đến tệp đã tải xuống của bạn, giải nén và di chuyển tệp đó vào usr/localthư mục thích hợp .

tar -xzvf   hadoop-3.3.0
sudo mv hadoop-3.3.0 /usr/local/hadoop

Cấp quyền sở hữu thư mục cho người dùng hadoop mà bạn đã tạo.

sudo chown -R hadoop:hadoop usr/local/hadoop

Lưu ý: Thư mục hadoop-3.3.0phụ thuộc vào phiên bản bạn tải xuống. Nó không cố định.

Để định cấu hình hệ thống của bạn cho Hadoop, hãy mở ~/.bashrctệp bằng lệnh cat ~/.bashrcvà thêm các dòng sau vào cuối. Sau khi hoàn tất, hãy lưu và đóng tệp

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/native"

Chạy ~/.bashrctệp bằng lệnh source ~/.bashrc. Tại thời điểm này, Hadoop đã được cài đặt.

Định cấu hình hadoop-env.shtệp của Hadoop để đặt biến JAVA_HOME . Để mở tệp, hãy chạy lệnh:

sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

Thêm dòng export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/. Đây thường là thư mục gốc để cài đặt Java.

Định cấu hình Hadoop core-site.xmlbằng cách thêm các dòng sau:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hdadmin/hdata</value>
</property>
</configuration>

Để mở tệp core-site.xml, hãy chạy lệnh:

sudo nano /usr/local/hadoop/etc/hadoop/core-site.xml

Định cấu hình Hadoop hdfs-site.xmlbằng cách thêm các dòng sau:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

Để mở hdfs-site.xmltệp, hãy chạy lệnh:

sudo nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml

Định cấu hình Hadoop mapred-site.xmlbằng cách sao chép mẫu hiện có mapred-site.xml.templatevà thêm các dòng sau:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

Để sao chép tệp mẫu thành tệp mới và chỉnh sửa, hãy chạy các lệnh:

cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml
sudo nano /usr/local/hadoop/etc/hadoop/mapred-site.xml

Định cấu hình Hadoop yarn-site.xmlbằng cách thêm các dòng sau

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

Để mở yarn-site.xmltệp, hãy chạy lệnh

sudo nano /usr/local/hadoop/etc/hadoop/yarn-site.xml

Bắt đầu dịch vụ Hadoop

Để khởi động cụm Hadoop và định dạng nút tên, hãy chạy lệnh:

hdfs namenode -format

Để bắt đầu dịch vụ HDFS:

start-dfs.sh

Để bắt đầu dịch vụ YARN:

start-yarn.sh

Để xác minh tất cả các dịch vụ đang chạy, hãy chạy lệnh jpsvà truy cập giao diện web Hadoop tại http: // localhost: 50070 . Giao diện trình quản lý tài nguyên có thể được tìm thấy tại http: // localhost: 8088 .

Phần kết luận

Hướng dẫn này cho bạn cảm nhận ban đầu tốt về Hadoop là gì và các trường hợp sử dụng của nó. Khi dữ liệu lớn ngày càng trở nên phổ biến, nhu cầu về các công nghệ như Hadoop và các kỹ sư dữ liệu lớn đang tăng với tốc độ nhanh.

What is GEEK

Buddha Community

CODE VN

CODE VN

1639036504

Giới thiệu về Hadoop cho người mới bắt đầu

Với sự ra đời của dữ liệu lớn và điện toán đám mây, nhu cầu lưu trữ và xử lý hiệu quả các tập dữ liệu lớn không ngừng tăng lên. Việc sử dụng một tài nguyên duy nhất để lưu trữ và xử lý là không khả thi do chi phí, lượng dữ liệu tuyệt đối được tạo ra và nguy cơ thất bại với khả năng mất dữ liệu có giá trị.

Đây là tình huống đã dẫn đến Hadoop, một nền tảng mã nguồn mở để lưu trữ phân tán và xử lý các tập dữ liệu lớn trong các cụm máy tính. Đối với tính toán phân tán, Hadoop sử dụng MapReduce và đối với lưu trữ phân tán, nó sử dụng Hệ thống tệp phân tán Hadoop (HDFS).

Các trường hợp sử dụng và khu vực ứng dụng

Hadoop chủ yếu được áp dụng trong các lĩnh vực có một lượng lớn dữ liệu cần xử lý và lưu trữ. Vì Hadoop sử dụng tính năng chia tỷ lệ ngang, nên nó có thể nhanh chóng mở rộng quy mô và thực hiện xử lý song song.

Các trường hợp sử dụng kinh doanh phổ biến và các ứng dụng của công nghệ này bao gồm:

Có thể tìm thấy nhiều ứng dụng trong thế giới thực hơn tại đây .

Tải xuống và thiết lập

Điều kiện tiên quyết cho quá trình này là phải cài đặt máy chủ openssh, Java và JDK trên máy của bạn.

Hướng dẫn này khám phá cách cài đặt trên Ubuntu . Để cài đặt trên Windows, hãy làm theo hướng dẫn này . Người dùng Mac có thể làm theo hướng dẫn này .

Dưới đây là các bước cần thực hiện khi cài đặt Hadoop:

Tạo người dùng hadoop và nhóm hadoop .

sudo addgroup hadoop
sudo adduser --ingroup hadoop hadoop

Chuyển người dùng sang người dùng hadoop mới được tạo.

sudo su- hadoop

Thiết lập và kiểm tra Khóa SSH không cần mật khẩu vì Hadoop yêu cầu quyền truy cập SSH để quản lý nút.

ssh-keygen -t rsa -P ""
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh localhost

Tải xuống Hadoop từ trang Apache chính thức . Sau đó, điều hướng đến tệp đã tải xuống của bạn, giải nén và di chuyển tệp đó vào usr/localthư mục thích hợp .

tar -xzvf   hadoop-3.3.0
sudo mv hadoop-3.3.0 /usr/local/hadoop

Cấp quyền sở hữu thư mục cho người dùng hadoop mà bạn đã tạo.

sudo chown -R hadoop:hadoop usr/local/hadoop

Lưu ý: Thư mục hadoop-3.3.0phụ thuộc vào phiên bản bạn tải xuống. Nó không cố định.

Để định cấu hình hệ thống của bạn cho Hadoop, hãy mở ~/.bashrctệp bằng lệnh cat ~/.bashrcvà thêm các dòng sau vào cuối. Sau khi hoàn tất, hãy lưu và đóng tệp

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/native"

Chạy ~/.bashrctệp bằng lệnh source ~/.bashrc. Tại thời điểm này, Hadoop đã được cài đặt.

Định cấu hình hadoop-env.shtệp của Hadoop để đặt biến JAVA_HOME . Để mở tệp, hãy chạy lệnh:

sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

Thêm dòng export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/. Đây thường là thư mục gốc để cài đặt Java.

Định cấu hình Hadoop core-site.xmlbằng cách thêm các dòng sau:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hdadmin/hdata</value>
</property>
</configuration>

Để mở tệp core-site.xml, hãy chạy lệnh:

sudo nano /usr/local/hadoop/etc/hadoop/core-site.xml

Định cấu hình Hadoop hdfs-site.xmlbằng cách thêm các dòng sau:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

Để mở hdfs-site.xmltệp, hãy chạy lệnh:

sudo nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml

Định cấu hình Hadoop mapred-site.xmlbằng cách sao chép mẫu hiện có mapred-site.xml.templatevà thêm các dòng sau:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

Để sao chép tệp mẫu thành tệp mới và chỉnh sửa, hãy chạy các lệnh:

cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml
sudo nano /usr/local/hadoop/etc/hadoop/mapred-site.xml

Định cấu hình Hadoop yarn-site.xmlbằng cách thêm các dòng sau

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

Để mở yarn-site.xmltệp, hãy chạy lệnh

sudo nano /usr/local/hadoop/etc/hadoop/yarn-site.xml

Bắt đầu dịch vụ Hadoop

Để khởi động cụm Hadoop và định dạng nút tên, hãy chạy lệnh:

hdfs namenode -format

Để bắt đầu dịch vụ HDFS:

start-dfs.sh

Để bắt đầu dịch vụ YARN:

start-yarn.sh

Để xác minh tất cả các dịch vụ đang chạy, hãy chạy lệnh jpsvà truy cập giao diện web Hadoop tại http: // localhost: 50070 . Giao diện trình quản lý tài nguyên có thể được tìm thấy tại http: // localhost: 8088 .

Phần kết luận

Hướng dẫn này cho bạn cảm nhận ban đầu tốt về Hadoop là gì và các trường hợp sử dụng của nó. Khi dữ liệu lớn ngày càng trở nên phổ biến, nhu cầu về các công nghệ như Hadoop và các kỹ sư dữ liệu lớn đang tăng với tốc độ nhanh.

CODE VN

CODE VN

1659170481

Giới thiệu về Spring WebClient cho người mới bắt đầu

Đây là một hướng dẫn chuyên sâu về tất cả những điều cơ bản của Spring 5 Web Client. Chúng ta sẽ bắt đầu bằng phần giới thiệu ngắn về WebClient trước khi đưa ra yêu cầu đầu tiên của chúng ta đối với điểm cuối Web. Ngoài ra, hướng dẫn này bắt đầu từ đầu và theo cách tiếp cận từng bước để làm rõ ràng các thành phần và cấu hình khác nhau của ứng dụng khách web.

Spring WebClient là gì?

Nói một cách đơn giản, Spring WebClient là một thành phần được sử dụng để thực hiện các cuộc gọi HTTP đến các dịch vụ khác. Nó là một phần của khuôn khổ phản ứng web của Spring, giúp xây dựng các ứng dụng phản ứng và không chặn.

Để thực hiện các yêu cầu HTTP, bạn có thể đã sử dụng Spring Rest Template, một mẫu đơn giản và luôn chặn ứng dụng khách web. Tuy nhiên, Spring đã thông báo rằng họ sẽ ngừng sử dụng RestTemplate trong tương lai gần để thay thế WebClient mới.

Ngoài ra, đang hoạt động, WebClient hỗ trợ các yêu cầu web không chặn bằng cách sử dụng các tính năng đầy đủ của thư viện Webflux của Spring. Quan trọng nhất, chúng ta cũng có thể sử dụng WebClient trong thời trang chặn, nơi mã sẽ đợi yêu cầu kết thúc trước khi tiếp tục phát triển. Có hỗ trợ cho các luồng phản ứng không chặn, ứng dụng khách web có thể quyết định đợi yêu cầu kết thúc hay tiếp tục các tác vụ khác.

Phụ thuộc WebClient

Spring WebClient có trong thư viện Webflux. Để sử dụng WebClient trong Spring Boot Project, chúng ta cần thêm phần phụ thuộc vào thư viện WebFlux. Giống như bất kỳ phụ thuộc Spring Boot nào khác, chúng ta phải thêm một phụ thuộc khởi động cho WebFlux (spring-boot-starter-webflux).

Maven phụ thuộc

Đối với các dự án đã xây dựng của Maven, hãy thêm phụ thuộc khởi động cho WebClient trong tệp pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Sự phụ thuộc Gradle

Hoặc, thêm sự phụ thuộc của người khởi động vào một dự án được xây dựng Gradle, thông qua tệp build.gradle.

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-webflux'
}

Xây dựng phiên bản WebClient

Việc xây dựng một phiên bản WebClient rất dễ dàng và linh hoạt. Đó là bởi vì WebClient cung cấp ba cách khác nhau để xây dựng một WebClient. Như vậy, chúng ta có thể linh hoạt sử dụng một cách thuận tiện nhất cho các trường hợp sử dụng của mình.

Phương pháp 1

Về cơ bản nhất, chúng ta có thể tạo cá thể WebClient bằng cách sử dụng phương thức nhà máy create () của nó .

WebClient webClient = WebClient.create();

Phiên bản Web Client này hiện có thể đưa ra yêu cầu, bằng cách cung cấp thêm chi tiết về phương thức HTTP và URL, v.v.

Phương pháp 2

Ngoài ra, một cách linh hoạt hơn là tạo một phiên bản Web Client bằng cách chỉ định url cơ sở của dịch vụ ngược dòng.

WebClient webClient = WebClient
    .create("http://localhost:9192");

Sử dụng cách này, chúng ta có thể tạo một WebClient chung cho mỗi dịch vụ ngược dòng.

@Bean
public WebClient webClient(){
    return WebClient
        .create("http://localhost:9192");
}

Tiếp theo, chúng ta có thể sử dụng trường hợp chung như vậy ở bất kỳ đâu để thực thi một tài nguyên cụ thể trên url cơ sở.

WebClient.ResponseSpec responseSpec =
    webClient
        .get()
        .uri("/users/" + userId)
        .retrieve();

Phương pháp 3

Cuối cùng, cách linh hoạt nhất để tạo một phiên bản WebClient là sử dụng trình tạo riêng của nó ( WebClient.Builder ). Trình xây dựng, là nơi thực hiện tất cả các cấu hình chung. Sau khi được tạo, chúng tôi có thể sử dụng lại trình tạo để khởi tạo nhiều phiên bản Web Client. Điều đó giúp chúng tôi tránh phải cấu hình lại tất cả các phiên bản máy khách.

Tạo WebClient Builder với các cấu hình phổ biến .

@Bean
public WebClient.Builder webClientBuilder() {
    return WebClient.builder()
        .baseUrl("http://localhost:9192")
        .defaultHeaders(header ->
            header.setBasicAuth(userName, password)
        )
        .defaultCookie(DEFAULT_COOKIE, COOKIE_VALUE);
}

Sau khi hoàn tất, chúng ta có thể sử dụng lại WebClient Builder để tạo một Web Client.

WebClient webClient = webClientBuilder.build();

Thực hiện các yêu cầu với WebClient

Như có thể thấy ở trên, chúng ta có thể xây dựng cá thể Spring WebClient theo nhiều cách. Sau khi được tạo, chúng ta có thể sử dụng phiên bản WebClient để thực hiện các yêu cầu HTTP GET, POST, PUT, v.v.

Phương thức HTTP

Ví dụ: tiếp theo là cấu hình cá thể WebClient để thực hiện yêu cầu ĐĂNG.

webClient.post()

Ngoài ra, chúng ta có thể sử dụng phương thức method () và chuyển phương thức HTTP mà chúng ta muốn sử dụng.

webClient.method(HttpMethod.POST)

URI

Bây giờ đã đến lúc chỉ định URI của điểm cuối đích. Lưu ý rằng chúng ta có thể chỉ định URL cơ sở trong khi tạo phiên bản WebClient và bây giờ chỉ có thể chuyển mã định danh tài nguyên.

Đầu tiên là một ví dụ về việc truyền một thể hiện của lớp java.net.URI.

webClient
    .post()
    .uri(URI.create("/users/" + userId))

Ngoài ra, chúng ta cũng có thể chuyển URI dưới dạng Chuỗi.

webClient
    .post()
    .uri("/users/" + userId)

Hoặc, chỉ định URI bằng cách sử dụng chức năng URIBuilder.

webClient
    .post()
    .uri(uriBuilder -> 
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))

Tiêu đề HTTP

Để thêm Tiêu đề HTTP vào yêu cầu, chúng ta có thể sử dụng phương thức header (). Hãy nhớ rằng, chúng ta có thể thêm tất cả các tiêu đề chung trong khi tạo phiên bản WebClient. Tuy nhiên, nếu có các tiêu đề cụ thể cho yêu cầu, chúng tôi có thể thêm chúng vào từng yêu cầu riêng biệt.

Ví dụ: thêm tiêu đề vào yêu cầu.

webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)

Ngoài ra, API cũng cung cấp các phương pháp gốc để xây dựng các tiêu đề chung. Ví dụ: sử dụng các phương pháp xuất xưởng tiêu đề để thêm các tiêu đề cụ thể.

webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .accept(MediaType.APPLICATION_JSON)

Nội dung yêu cầu

Tương tự, chúng ta có thể thêm nội dung yêu cầu vào Yêu cầu ứng dụng khách web. Ngoài ra, có nhiều cách để thêm nội dung yêu cầu vào các yêu cầu của Máy khách web.

Thứ nhất, cách đơn giản nhất là chỉ định phần thân yêu cầu bằng phương thức bodyValue ().

webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(userStr)
Code language: Java (java)

Hoặc, sử dụng phương thức body () để chỉ định nhà xuất bản và loại phần tử đã xuất bản.

webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .body(Mono.just(userObj), User.class);

Ngoài ra, đối với các tình huống nâng cao hơn, chúng ta có thể sử dụng BodyInserters . Bởi vì, nó cung cấp tính linh hoạt hơn về cách chúng tôi thêm nội dung vào các yêu cầu của mình (yêu cầu nhiều phần, dữ liệu biểu mẫu, v.v.).

Ví dụ: sử dụng BodyInserters để thêm nội dung yêu cầu từ nhà xuất bản.

webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .body(BodyInserters.fromPublisher(Mono.just(userObj)))

Thực hiện Yêu cầu

Cuối cùng, chúng tôi sẽ thực hiện yêu cầu và đọc phản hồi hoặc lỗi của máy chủ. Để làm điều đó, chúng ta có thể chỉ cần sử dụng phương thức truy xuất () và sau đó chuyển đổi phản hồi thành Mono hoặc Flux.

Ví dụ, sử dụng phương thức truy xuất () và phản hồi bí mật cho một Mono.

Mono<User> response = webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .body(BodyInserters.fromPublisher(Mono.just(userObj)))
    .retrieve()
    .bodyToMono(User.class);

Ngoài ra, chúng tôi có thể xử lý bất kỳ lỗi máy chủ hoặc máy khách nào bằng cách đính kèm phương thức onStatus () . Ví dụ: sử dụng phương thức onStatus () để ném ngoại lệ khi trạng thái HTTP phản hồi của máy chủ cho biết thất bại.

Mono<User> response = webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .body(BodyInserters.fromPublisher(Mono.just(userObj)))
    .retrieve()
    .onStatus(
        Predicate.not(HttpStatus::is2xxSuccessful), clientResponse ->
            error(new ApplicationException(ERROR_MSG))
    )
    .bodyToMono(User.class);

Ngoài ra, để xử lý phản hồi có kiểm soát hơn, chúng tôi có thể sử dụng trao đổi trong khi thực hiện yêu cầu. Ngoài ra, bằng cách sử dụng nó, chúng ta có tùy chọn chuyển đổi body thành Flux ( exchangeToFlux () ) hoặc Mono ( exchangeToMono () ).

Ví dụ về việc sử dụng exchangeToMono để đọc phản hồi và đảm bảo trạng thái nếu 200.

Mono<ClientResponse> response = webClient
    .post()
    .uri(uriBuilder ->
        uriBuilder.pathSegment("users", "{userId}")
            .build(userId))
    .contentType(MediaType.APPLICATION_JSON)
    .body(BodyInserters.fromPublisher(Mono.just(userObj)))
    .exchangeToMono(result -> {
        if (result.statusCode()
                .equals(HttpStatus.OK)) {
            return result.bodyToMono(User.class);
        } else if (result.statusCode()
                .is4xxClientError()) {
            return Mono.error(new ApplicationException(ERROR_MSG))
        }
    });

Trong hướng dẫn này, chúng tôi đã giới thiệu sơ lược về WebClient và các lợi ích của nó. Sau đó, chúng tôi đã làm theo cách tiếp cận từng bước để hiểu Cách thực hiện cuộc gọi HTTP bằng Spring Web Client. Để làm được điều đó, chúng tôi đã làm theo cách tiếp cận từng bước hoàn chỉnh để xây dựng WebClient từ đầu và định cấu hình nó để thực hiện yêu cầu, đọc phản hồi và cũng để xử lý lỗi. Để biết thêm về Spring & Spring Boot, vui lòng truy cập hướng dẫn về Spring.

Manh  Cuong

Manh Cuong

1647628560

Giới thiệu về Hashing trong Blockchain cho người mới bắt đầu

Trong bài đăng này, chúng ta sẽ tìm hiểu Hashing trong Blockchain là gì? Băm ảnh hưởng đến việc khai thác Bitcoin như thế nào?

Hashing hoặc (băm) là một thuật ngữ phổ biến khi thảo luận về công nghệ blockchain. Hashing đề cập đến việc chuyển đổi và tạo dữ liệu đầu vào có độ dài bất kỳ thành một chuỗi có kích thước cố định, được thực hiện bởi một thuật toán cụ thể. Cụ thể, thuật toán băm Bitcoin là SHA-256 hoặc Thuật toán băm bảo mật 256 bit.  Thuật toán này là một hàm mật mã một chiều vì dữ liệu gốc có thể được truy xuất thông qua giải mã.

Việc triển khai hàm băm mật mã có lợi để ngăn chặn các giao dịch gian lận, chi tiêu gấp đôi trong chuỗi khối và lưu trữ mật khẩu. Nhưng, băm Bitcoin là gì và nó phải làm gì khi đặt trong bối cảnh này? Tóm lại, đây là số duy nhất không trùng lặp theo thuật toán. Do đó, nó thường được sử dụng để xác minh tính xác thực của tệp. Để đặt nó trong ngữ cảnh, khi có sự thay đổi trong một tệp được băm, hàm băm của nó cũng sẽ tự động thay đổi. Và mỗi hàm băm tiếp theo được gắn với hàm băm trước đó, do đó đảm bảo tính nhất quán của tất cả các khối.

Hashing hoạt động như thế nào trong Blockchain?

Vậy thuật toán băm trong blockchain là gì và nó hoạt động như thế nào? Tóm lại, một thuật toán băm lấy vô số bit, thực hiện các phép tính trên chúng và xuất ra một số bit cố định. Bất kể độ dài của dữ liệu đầu vào là bao nhiêu, đầu ra sẽ luôn được điều chỉnh. Kết quả là, dữ liệu ban đầu được gọi là  đầu vào , và phép biến đổi cuối cùng được gọi là  hàm băm . Ngày nay, nhiều thuật toán băm chỉ khác nhau về cách xử lý thông tin.

Để hiểu đầy đủ về băm là gì, điều cần thiết đầu tiên là phải hiểu cấu trúc dữ liệu. Cấu trúc dữ liệu là một cách cụ thể để lưu trữ dữ liệu bao gồm hai yếu tố chính:  con trỏ và danh sách được liên kếtCon trỏ  là các biến tham chiếu đến các biến khác, vì vậy chúng hoạt động như các chỉ báo chỉ đường đến đúng vị trí. Bên cạnh đó, nó cung cấp địa chỉ của khối tiếp theo trong chuỗi. Mặt khác, danh sách được liên kết tạo nên một chuỗi các nút được kết nối với sự trợ giúp của con trỏ.

Nhờ băm trong chuỗi khối, mỗi khối được gán một mã định danh ban đầu, điều này sẽ kéo theo những hậu quả không thể đảo ngược khi thay đổi chuỗi khối. Khối được xác định bằng thông tin có trong tiêu đề của khối. Nó bao gồm các chi tiết như:

  • số phiên bản của blockchain
  • Dấu thời gian UNIX
  • con trỏ băm
  • nonce, đó là giá trị mà người khai thác cần để tạo một khối
  • một băm của một gốc Merkle

Tất cả các yếu tố này là cần thiết để tạo khối. Vì vậy, khi một băm xảy ra với blockchain, dữ liệu sẽ được chuyển đổi thành một chuỗi duy nhất trong một khối.

Làm thế nào để giải quyết một băm?

Để giải một hàm băm, nó bắt đầu bằng việc giải các bài toán phức tạp có chứa dữ liệu trong tiêu đề khối. Nhưng trước khi người khai thác bắt đầu quy trình, họ sẽ cần thực hiện quy trình thử-và-sai để quyết định chuỗi nào sẽ sử dụng làm nonce. Khi một nonce được xác định, những người khai thác sẽ tập trung vào nonce (một số chuỗi) có liên quan đến nội dung được băm của khối trước đó. Để một hàm băm được coi là thành công, hàm băm mới cần nhỏ hơn hoặc bằng hàm băm mục tiêu. Và đổi lại, người khai thác sẽ nhận được phần thưởng để thêm khối vào blockchain.

Mối quan hệ của bằng chứng công việc trong băm

Thuật toán Proof of Work (PoW) có tương quan với hàm băm blockchain vì thuật toán này rất hữu ích để xác nhận các giao dịch và tạo ra các khối mới cho chuỗi. 

PoW hoạt động như thế nào?

Phi tập trung là một thuộc tính quan trọng của blockchain, nhưng nó có khả năng bị tổn thương. Nếu một người tham gia muốn tải xuống một bản sao của chuỗi khối, thì làm thế nào người dùng khác có thể biết rằng chuỗi khối đó là chính xác? Giả sử có hàng nghìn máy tính trên mạng; Điều gì ngăn họ âm mưu với một người dùng mới bằng dữ liệu mà họ đã cùng nhau giả mạo?

Đó là khi thuật toán PoW xuất hiện. Nó cho phép những người tham gia mạng blockchain biết thông tin có thực sự là miễn phí hay không.

Lịch sử là tất cả mọi thứ trên web, nơi bạn cần biết ai chi tiền và ai nhận tiền. Trước đây, không thể đạt được sự đồng thuận hoàn toàn trong một mạng lưới phi tập trung mà không có sự kiểm soát của bên thứ ba. Hàm băm đã làm cho nó trở nên khả thi vì nó cung cấp một dấu vân tay kỹ thuật số duy nhất của một phần dữ liệu.

PoW trong thế giới tiền điện tử

Khái niệm PoW được thiết kế để chống lại các cuộc tấn công DDoS có thể làm đóng băng hệ thống và từ chối xử lý các yêu cầu của người dùng. PoW cũng chống lại thư rác và bảo vệ toàn bộ mạng một cách hiệu quả. Mặc dù đây không phải là một giải pháp lý tưởng cho vấn đề, nhưng khái niệm này vẫn tương đối hiệu quả.

Trong thế giới tiền điện tử, PoW bảo vệ tiền điện tử vì nó hỗ trợ các mạng phi tập trung. Một ví dụ đơn giản: người đó tạo một ví kỹ thuật số không được đồng bộ hóa với phần còn lại của mạng. Ngay sau khi anh ấy được kết nối, ví sẽ thay đổi trạng thái của nó thành 'đồng bộ hóa' khi nó bắt đầu truy cập vào blockchain.

Tại sao việc lừa dối mạng là không có lợi cho người khai thác?

Hash có ích để điều chỉnh hệ thống tốt hơn, nhưng nó đi kèm với một cái giá. Vì vậy, khi các thợ đào tạo một khối mới cho blockchain, họ phải cung cấp hai hàm băm cho mạng:

  1. Một hàm băm của tất cả các giao dịch trong khối.
  2. Một hàm băm chứng tỏ rằng những người khai thác đã dành một lượng năng lượng đáng kể để tạo ra khối.

Mặc dù hệ thống đang hoạt động tốt, nhưng khoản bồi thường cho các thợ đào là rất ít. Việc xem xét các nguồn lực dành cho việc tìm kiếm các hàm băm làm cho việc biến dạng dữ liệu trở nên không có lợi. Nhưng để làm được điều này, các thợ đào cần phải hoạt động trong một hệ thống giống như xổ số, nơi chỉ có thể có một người chiến thắng. Và không có gì đảm bảo để tìm thấy một hàm băm. 

Bên cạnh đó, sẽ mất nhiều thời gian để thực thi quá trình nếu sức mạnh của GPU và CPU yếu, trong khi chỉ những máy tính có thiết bị đắt tiền mới có thể xử lý được sức mạnh xử lý. Mặc dù vậy, những máy tính này có thể tiêu thụ rất nhiều điện, điều này làm cho toàn bộ quá trình không có lợi cho người khai thác tìm thấy một hàm băm hợp lệ cho một khối giao dịch không hợp lệ. Cuối cùng, không có ý nghĩa gì khi xác nhận khối “sai”, tuyên bố rằng tất cả các giao dịch đều hợp lệ và tiến hành băm. Phần còn lại của các máy tính trong mạng sẽ từ chối khối không hợp lệ, có nghĩa là thợ đào sẽ không nhận được phần thưởng.

Bằng chứng giao dịch

Khi gửi tiền điện tử, người dùng phải xác nhận hành động của ví của họ, điều này sẽ truyền tải các giao dịch đến chuỗi khối. Sau đó, các giao dịch sẽ được đưa vào nhóm giao dịch đang chờ xử lý, nơi chúng sẽ ở lại cho đến khi được người khai thác chọn. 

Các giao dịch kiểu này có thể được tích lũy trong một nhóm lớn hoặc các nhóm cục bộ nhỏ tách biệt. Các thợ đào chọn giao dịch từ các nhóm khai thác và xử lý chúng thành các khối mới. Khối này bao gồm các giao dịch đang chờ xác nhận với siêu dữ liệu bổ sung. Cuối cùng, mỗi người khai thác tạo thành một khối riêng biệt. Và các giao dịch giống nhau có thể nhập vào các khối của các thợ đào khác nhau. 

Người khai thác phải đảm bảo rằng mọi giao dịch nhất định đều đáp ứng các yêu cầu thực hiện. Trong trường hợp người gửi có đủ tài nguyên trên số dư, giao dịch sẽ trở nên hợp lệ và có thể được thêm vào khối. Để xử lý nhanh hơn, người gửi có thể tăng phí khai thác. Thông thường, các thợ đào tận dụng lợi thế của giá trị giao dịch cao hơn để chọn các giao dịch có lợi nhất; do đó, thời gian xử lý trở nên thấp hơn.

Mỗi giao dịch có hàm băm của nó được lưu trữ trong một cấu trúc giống như cây. Các hàm băm này cũng được băm để tạo thành gốc Merkle. Công nghệ này chứa thông tin về tất cả các giao dịch.

Các chức năng băm mật mã là gì?

Các hàm băm mật mã được đặc trưng bởi một số thuộc tính khiến chúng rất hữu ích khi được sử dụng trong lĩnh vực mật mã.

  1. Kết quả của một hàm băm luôn giống hệt nhau. Đặc tính này được gọi là tính  xác định . Bất kể số lần bạn nhập cùng một thông báo, kết quả đầu ra sẽ giống nhau sau khi áp dụng hàm băm. Tuy nhiên, sự thay đổi nhỏ nhất trong dữ liệu đầu vào ('Bài báo' thay vì 'Bài báo') sẽ thay đổi hoàn toàn kết quả.
  2. Nó có tính năng tính toán nhanh vì tốc độ thấp sẽ làm cho hệ thống hoạt động kém hiệu quả.
  3. Tính năng kháng hình ảnh trước trong các hàm băm làm cho việc xác định đầu vào từ giá trị băm không khả thi về mặt tính toán. Do đó, thợ đào chỉ có thể so sánh kết quả cho đến khi tìm thấy kết quả phù hợp.

Đơn vị tỷ lệ băm

Hashrate đề cập đến tổng sức mạnh tính toán của thiết bị khai thác liên quan đến việc khai thác tiền điện tử. Các đơn vị đo bao gồm:

  • Băm / giây (H / s)
  • Kilohash / giây (KH / s)
  • Megahash / giây (MH / s)
  • Gigahash / giây (GH / s)
  • Terahash/sec (TH/s)
  • Petahash / giây (PH / s)
  • Exahash / giây (EH / s)

Vì quá trình khai thác liên tục trở nên phức tạp hơn, nên hầu như không thể thấy các đơn vị 'băm trên giây' trong các mạng blockchain hiện đại. Ngày nay, các thiết bị có công suất lớn hơn là cần thiết để giải quyết các vấn đề như vậy, từ hàng chục megahashes mỗi giây.

Ví dụ: sức mạnh của bộ xử lý là 10 MH / s có nghĩa là nó có thể tạo ra 10 triệu tổ hợp số khác nhau trong một giây để tìm hàm băm phù hợp với tất cả các thông số do mạng thiết lập.

Tuy nhiên, có các yếu tố khác nhau để xác định tỷ lệ băm. Ngay cả việc lựa chọn một thuật toán khai thác cũng ảnh hưởng đến tham số. Điều quan trọng là phải biết cách các thiết bị khác phản ứng với các thuật toán khác nhau. Mặc dù một số trong số chúng cung cấp dung lượng tối đa với các mạng có thuật toán SHA (Bitcoin, Peercoin, v.v.), kết quả có thể kém hơn khi cùng một mạng sử dụng thuật toán Script.

Dữ liệu băm được bảo mật như thế nào?

Mọi khối đều chứa một hàm băm của khối trước đó (khối mẹ) ngoại trừ khối Genesis. Hãy tưởng tượng một chuỗi các khối với các băm của các khối cha. Nếu thông tin trong một trong các khối này bị thay đổi, nó sẽ ảnh hưởng đến tất cả các khối chuỗi khác. Tuy nhiên, khi mạng phát triển, việc thay đổi hàm băm trên tất cả các khối trở nên thực tế là không thể. Do đó, quá trình băm là cần thiết cho blockchain, đảm bảo tính duy nhất và độc đáo của từng phần tử của hệ thống.

Dữ liệu bất biến và đáng tin cậy là một trong những đặc tính cốt lõi của blockchain, làm cho nó có giá trị và mang lại tiềm năng to lớn cho blockchain. Thông tin luôn xác thực, do đó xác định tính toàn vẹn của blockchain.  

Làm thế nào để đo lường Hashrate của mạng Bitcoin?

Tỷ lệ băm Bitcoin đại diện cho sức mạnh tính toán tổng thể của tất cả các nút trên toàn thế giới, góp phần vào việc khai thác Bitcoin. Tuy nhiên, có vấn đề khi xác định nó là do các máy khai thác góp phần vào mạng thiếu nhận dạng và chúng chỉ giao tiếp với mạng sau khi tìm thấy một khối.

Tuy nhiên, tỷ lệ băm được ước tính hàng ngày bằng cách so sánh các khối được tìm thấy trong 24 giờ qua với số 144, là tỷ lệ tìm thấy khối dự kiến. Theo thuật toán, tốc độ khai thác phải giữ nguyên (600 giây). Theo cách này, công thức của sức mạnh băm Bitcoin như sau:  

Hashpower = ((khối tìm thấy trong 24 giờ / số khối dự kiến) x hoạt động) / 600

Tỷ lệ băm Bitcoin càng cao, tham số khai thác càng khó. Vì nó luôn được điều chỉnh để giữ cho nó phù hợp với công việc băm tổng thể. Việc điều chỉnh độ khó là điều cần thiết để bảo mật. Vì vậy, điều tự nhiên là giao thức tránh độc quyền. Cần phải duy trì tốc độ khai thác tiền điện tử giống nhau để tránh lạm phát. Nếu không, các thợ đào sẽ tạo ra nhiều Bitcoin nhanh hơn và tiền điện tử sẽ mất giá trị.

Băm ảnh hưởng đến việc khai thác Bitcoin như thế nào?

Việc khai thác vẫn được phân cấp bởi vì hai người khai thác đơn giản là không thể băm các khối giống nhau. Người khai thác nhận các giao dịch qua mạng theo một thứ tự khác. Bởi vì điều này và sở thích cá nhân về hoa hồng, mỗi người khai thác xử lý khối khác nhau một chút.

Mặc dù tất cả các khối có thể đã được xác thực chính xác, nhưng chỉ một khối có thể tham gia vào chuỗi khối tại một thời điểm. Tất cả các thợ đào sẽ phải tiếp tục băm cho đến khi họ tìm thấy một số tạo ra kết quả mà mạng đồng ý chấp nhận là hợp lệ khi được thêm vào khối của họ trong chuỗi khối.

Bên cạnh đó, mạng phải đảm bảo tạo ra một khối mới cứ sau mười phút để duy trì chính sách tài chính của Bitcoin. Mạng thực hiện điều này bằng cách điều chỉnh độ khó khai thác hai tuần một lần. Do đó, nếu các khối được xác thực quá nhanh do số lượng người khai thác mới tăng lên, mạng lưới sẽ tăng độ phức tạp để giảm lạm phát.

Vì băm chuỗi khối tự hào về tính ngẫu nhiên, ngay cả một người khai thác với máy tính mạnh nhất không phải lúc nào cũng giành chiến thắng. Khái niệm này tương tự như một trò chơi xổ số. Ngay cả người dùng có số lượng vé lớn nhất cũng có thể kiếm được nhiều cơ hội giành chiến thắng hơn, nhưng không có gì đảm bảo sẽ giành chiến thắng mọi lúc.

Nói chung, một người khai thác tạo ra một khối các giao dịch hợp lệ và sau đó chạy Proof of Work trên khối đó, với hy vọng tìm thấy hàm băm được đặt bởi các quy tắc mạng trước những người khai thác khác. Nếu quá trình thành công, khối này sẽ đi vào chuỗi khối và người khai thác sẽ nhận được phần thưởng. Thông số kỹ thuật phần cứng cũng quan trọng, vì vậy yếu tố này cũng cần được xem xét khi mua thiết bị khai thác.

Có phải băm chỉ áp dụng cho Bitcoin không?

Hashing là phần trung tâm và không thể thiếu của một blockchain khác. Nhiều loại tiền điện tử được hỗ trợ bởi khai thác, chẳng hạn như Litecoin hoặc Bitcoin Cash. Các blockchain khác vẫn sử dụng các thuật toán khai thác khác nhau. Tuy nhiên, ngày nay, nhiều thuật toán băm chỉ khác nhau về cách xử lý dữ liệu.

Tiêu thụ năng lượng Bitcoin so với Ethereum

Bitcoin vẫn là tiền điện tử cạn kiệt năng lượng nhất. Khi so sánh Ethereum và Bitcoin, sự đồng thuận Proof of Stake của Ethereum nhằm mục đích giảm 99% mức tiêu thụ năng lượng của nó. Trong khi đó, PoW của Bitcoin tiếp tục tăng, vượt quá tổng năng lượng tiêu thụ trên toàn Thụy Sĩ. Với việc chuyển sang ETH 2.0, mạng được hỗ trợ bởi trình xác thực thay vì thợ đào. Do đó, nó bền vững hơn và để lại ít khí thải carbon hơn cho môi trường. 

Kết luận

Công nghệ chuỗi khối đã trở thành những đổi mới có ảnh hưởng nhất trong thế kỷ qua, quyết định sự phát triển trong tương lai của công nghệ. Hashing là một chức năng mật mã đã hỗ trợ công nghệ này. Điều cần thiết là phải hiểu băm là gì và bản chất của công nghệ để khai thác trong một chuỗi khối và kiếm tiền từ nó.

Cảm ơn bạn đã đọc bài viết của mình. Nếu cảm thấy nó hữu ích, xin hãy chia sẻ cho những người khác.

CODE VN

CODE VN

1639138620

Giới thiệu về các mẫu Django cho người mới bắt đầu

Trong mô hình Django MTV, mẫu là lớp trình bày. Lớp này tương tác với người dùng, gửi các yêu cầu đến các khung nhìn và phản hồi cho người dùng.

Các mẫu Django xử lý HTML / CSS / JS. Tất cả kết xuất được xử lý trong các mẫu. Khác với các cấu trúc cơ bản của HTML / CSS / JS, Django đi kèm với ngôn ngữ tạo mẫu để hiển thị dữ liệu động dưới dạng mẫu. Trong hướng dẫn này, bạn sẽ tìm hiểu về các mẫu Django và các cấu trúc ngôn ngữ cần thiết để xây dựng một ứng dụng Django.

Tại sao lại có các mẫu Django

Mẫu Django là tài liệu văn bản hoặc chuỗi Python được đánh dấu sử dụng ngôn ngữ mẫu Django. Django giữ logic và mã tách biệt khỏi thiết kế. Cần biết rằng các mẫu Django không chứa mã nhúng của Python vào HTML.

Các mẫu Django tuân theo nguyên tắc thiết kế KHÔ (không lặp lại chính mình), nguyên tắc này yêu cầu các nhà phát triển không lặp lại trong khi thiết kế ứng dụng Django. Các mẫu Django sử dụng một số khái niệm khác, chẳng hạn như kế thừa mẫu, thẻ, biến, bộ lọc, nhận xét, v.v.

Cấu hình mẫu

Để định cấu hình hệ thống mẫu Django, hãy truy cập settings.pytệp và cập nhật DIRSđường dẫn của thư mục mẫu. Nói chung, templatesthư mục được tạo và giữ trong thư mục mẫu nơi manage.pytồn tại. Thư mục mẫu này chứa tất cả các mẫu bạn sẽ tạo trong các Ứng dụng Django khác nhau.

import os

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Ngoài ra, bạn có thể duy trì một thư mục mẫu cho từng ứng dụng riêng biệt. Nếu bạn đang duy trì khuôn mẫu cho mọi ứng dụng riêng biệt, bạn không cần phải cập nhật DIRStrong settings.py. Đảm bảo rằng ứng dụng của bạn được thêm INSTALLED_APPSvào settings.py.

Ngôn ngữ mẫu Django

Trong ngôn ngữ khuôn mẫu Django, cú pháp liên quan đến bốn cấu trúc chính.

1. Các biến

Các biến xuất ra giá trị từ ngữ cảnh. Bối cảnh nói chung là một dictđối tượng giống (ánh xạ tên biến với giá trị tương ứng của nó) được truyền từ các khung nhìn.

Cú pháp cơ bản là:

{{ variable_name }}

Ví dụ: nếu bạn kết xuất bộ ngữ cảnh như hình dưới đây ...

from django.shortcuts import render

def my_view(request):
    context = {
        "author": "Gaurav Singhal",
        "website": {
            "domain": "https://pluralsight.com",
            "views": 200
        },
        "odds": [1, 3, 5]
    }
    return render(request, "index.html", context)

... bạn có thể truy cập nó trong mẫu index.htmldưới dạng:

{{author}}
{{website.domain}}
{{website.views}}

2. Thẻ

Các thẻ cung cấp logic cho ngôn ngữ mẫu để hiển thị nội dung một cách logic.

Cú pháp cơ bản là:

{% tag_name %}

Thí dụ:

{% if user.is_authenticated %}Howdy, {{ user.username }}, How are you {% endif %}

Có một số thẻ được sử dụng trong các mẫu Một số trong số chúng là:

  • Nếu khác:
{% if condition %} 
	renders if body 
{% else %} 
    renders else body 
{% endif %}
  • Vòng lặp for
{% for odd in odds %}
{{odd}}
{% endfor %}
  • bao gồm

Điều này được sử dụng để tải một mẫu và hiển thị nó về ngữ cảnh hiện tại. Nó rất hữu ích để tạo một số thành phần riêng biệt, chẳng hạn như thanh điều hướng, chân trang, v.v., sau đó đưa chúng vào một số mẫu.

{% include template_name %}
  • khối

Điều này xác định khối sẽ được ghi đè bởi mẫu con. Bạn sẽ hiểu rõ hơn về các khối khi chúng ta thảo luận về kế thừa mẫu.

{% block content %}
{% endblock %}

Bạn có thể đọc thêm về các thẻ tích hợp trong tài liệu Django .

3. Bộ lọc

Bộ lọc được sử dụng để chuyển đổi giá trị của đối số biến và thẻ.

Nó có thể được sử dụng như:

{{ my_variable | filter }}

Ví dụ:

{{ my_date|date:"Y-m-d" }}

Bạn có thể đọc thêm về bộ lọc và một số bộ lọc tích hợp trong tài liệu Django .

4. Nhận xét

Bạn có thể dễ dàng thêm nhận xét trong các mẫu Django:

{# Comment here. It won't be rendered #}

Kế thừa Mẫu

Một trong những phần mạnh mẽ nhất của công cụ mẫu Django là kế thừa mẫu. Điều này cho phép bạn tạo một mẫu khung cơ sở chứa tất cả các phần tử cơ sở / chung và xác định các khối trong mẫu con / mẫu dẫn xuất sau khi mở rộng mẫu cơ sở. Nó dễ hiểu hơn trong thực tế. Đầu tiên chúng ta hãy tạo một base.html.

<html>
   <head>
      <title>
         {% block title %}Base title{% endblock %}
      </title>
        {% comment %} This Bootsrap css is added to all pages {% endcomment %}
      <link rel="stylesheet" href = "https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
   </head>
   <body>
    <p>
    Body content which remains in all the pages
    </p>
      {% block content %}
         Body content
      {% endblock %}
   </body>
</html>

Bây giờ hãy tạo một mẫu con và lưu nó dưới dạng index.html.

{% extends 'base.html' %}

{% block title %}
This is index title
{% endblock title %}

{% block content %}
Main content of index.html
{% endblock content %}

Bây giờ khi bạn kết xuất index.htmltừ các khung nhìn, bạn sẽ nhận được kết quả sau:

Body content which remains in all the pages

Main content of index.html

Kết luận

Mẫu Django xử lý việc truyền thông tin từ chế độ xem Django đến trình duyệt và được coi là khối xây dựng cơ bản của một ứng dụng Django động. Bạn có thể tham khảo tài liệu Django để tìm hiểu sâu về mẫu Django .

CODE VN

CODE VN

1641556925

Hướng dẫn Angular cho người mới bắt đầu | Giới thiệu về Angular

Angular là một mã nguồn mở và giúp chúng tôi xây dựng các ứng dụng động & một trang (SPA). Trong bài viết này, chúng tôi sẽ giới thiệu sơ qua về Angular.

Angular là gì?

Chủ đề này có thể giúp bạn hiểu về Angular: Angular là gì, những ưu điểm của nó và những gì bạn có thể mong đợi khi bắt đầu xây dựng các ứng dụng của mình.

Angular là một nền tảng phát triển, được xây dựng trên TypeScript. Là một nền tảng, Angular bao gồm:

  • Một khuôn khổ dựa trên thành phần để xây dựng các ứng dụng web có thể mở rộng
  • Một bộ sưu tập các thư viện được tích hợp tốt bao gồm nhiều tính năng, bao gồm định tuyến, quản lý biểu mẫu, giao tiếp máy khách-máy chủ, v.v.
  • Một bộ công cụ dành cho nhà phát triển để giúp bạn phát triển, xây dựng, kiểm tra và cập nhật mã của mình

Với Angular, bạn đang tận dụng một nền tảng có thể mở rộng quy mô từ các dự án của một nhà phát triển đơn lẻ đến các ứng dụng cấp doanh nghiệp. Angular được thiết kế để làm cho việc cập nhật trở nên đơn giản nhất có thể, vì vậy hãy tận dụng những phát triển mới nhất với mức nỗ lực tối thiểu. Hơn hết, hệ sinh thái Angular bao gồm một nhóm đa dạng hơn 1,7 triệu nhà phát triển, tác giả thư viện và người tạo nội dung.

Bắt đầu với Angular

Các tính năng của Angular

Angular được tải với các Tính năng được đóng gói mạnh mẽ. Một số tính năng được liệt kê bên dưới

  • Liên kết dữ liệu hai chiều
    Đây là tính năng thú vị nhất của Angular. Liên kết dữ liệu là tự động và nhanh chóng. các thay đổi được thực hiện trong Dạng xem được cập nhật tự động trong lớp thành phần và ngược lại
  • Hỗ trợ
    định tuyến mạnh mẽ Công cụ định tuyến mạnh mẽ Angular tải trang không đồng bộ trên cùng một trang cho phép chúng tôi tạo một Ứng dụng trang đơn.

  • Angular HTML biểu cảm cho phép chúng ta sử dụng các cấu trúc lập trình như điều kiện if, for vòng lặp, v.v. để hiển thị và kiểm soát cách các trang HTML.
  • Modular by Design
    Angular tuân theo thiết kế mô-đun. Bạn có thể tạo mô-đun Angular để tổ chức và quản lý cơ sở mã của chúng tôi tốt hơn
  • Hỗ trợ Back End tích hợp
    Angular có hỗ trợ tích hợp để giao tiếp với các máy chủ back-end và thực thi bất kỳ logic nghiệp vụ nào hoặc truy xuất dữ liệu
  • Active Community
    Angular được hỗ trợ bởi google và có một cộng đồng những người ủng hộ tích cực rất tốt. Điều này tạo ra rất nhiều khác biệt vì các truy vấn của bạn được giải quyết nhanh chóng.

Angular đã thay đổi hàng loạt từ AngularJS. Angular được thiết kế lại hoàn toàn từ đầu. Có rất nhiều khái niệm về angleJS đã thay đổi trong Angular.


Sự khác biệt chính giữa AngularJs và Angular

Hỗ trợ cho ES6

Angular được viết hoàn toàn bằng Typecript và đáp ứng đặc điểm kỹ thuật ECMAScript 6. Điều này có nghĩa là nó có hỗ trợ cho các mô-đun ES6, khung lớp, v.v.

Trong AngularJS, chúng tôi có Bộ điều khiển. Trong Angular Controllers được thay thế bằng Angular Components. Các bộ điều khiển và chế độ xem trong AngularJS được định nghĩa như sau

//View 
<body ng-controller=’appController’>     
    <h1>vm.message<h1> 
</body> 
 
//Controller angular.module(‘app’).controller(‘appController’,appcontroller) {     
    message=’Hello Angular’; 
}
 

Trong Angular, chúng tôi đang sử dụng Components. Thành phần đơn giản được hiển thị bên dưới được viết bằng Typecript.

import { Component } from '@angular/core'; 
 
@Component({     
    selector: 'app',     
    template: '<h1>{{message}} </h1>' 
}) 
export class AppComponent  {
      message: string=’Hello Angular’; 
}

Trong Angular, một thành phần đại diện cho một phần tử giao diện người dùng. Bạn có thể có nhiều thành phần như vậy trên một trang web. Mỗi thành phần độc lập với nhau và quản lý một phần của trang. Các thành phần có thể có thành phần con và thành phần mẹ.

Chỉ thị

AngularJS có rất nhiều chỉ thị. Một số chỉ thị được sử dụng nhiều nhất là ng-repeat&ng-if

<ul>     
    <li ng-repeat =customer in vm.customers> 
        {{customer.name}}     
    </li> 
</ul> 
<div ng-if=”vm.isVIP”>     <h3> VIP Customer </h3> </div>

Angular cũng có các chỉ thị, nhưng với một cú pháp khác. Nó có một *trước tên chỉ thị cho biết nó là một chỉ thị cấu trúc

<ul>     
    <li *ngFor =#customer of customers>         
        {{customer.name}}     
    </li> 
</ul> 
<div *ngIf=”vm.isVIP”> 
    <h3> VIP Customer </h3> 
</div>

Các chỉ thị kiểu như ng-style, ng-src & ng-href đều không còn nữa. Chúng hiện được thay thế bằng các phần tử HTML liên kết thuộc tính với các thuộc tính của lớp

Việc tạo các Chỉ thị tùy chỉnh được đơn giản hóa rất nhiều về mặt góc cạnh như thể hiện trong ví dụ bên dưới.

@Directive({     
   selector: '[MyDirective]' 
}) 
class MyDirective { }

Liên kết dữ liệu

Các liên kết dữ liệu góc mạnh mẽ vẫn giữ nguyên, với những thay đổi nhỏ về cú pháp.

Phép nội suy

//AngularJS   
<h3> {{vm.customer.Name}}</h3>  
 
//Angular 
<h3> {{customer.Name}}</h3>

Lưu ý rằng chúng tôi đã sử dụng VM bí danh bộ điều khiển để chỉ định phiên bản bộ điều khiển trong AngularJS. Trong Angular, ngữ cảnh được ngụ ý.

Ràng buộc một chiều

//AngularJS 
<h3> ng-bind=vm.customer.name></h3> 
 
//Angular 
<h3 [innerText]=”customer.name” ></h3>

Angular có thể liên kết với bất kỳ thuộc tính nào của phần tử HTML.

Sự kiện ràng buộc

//AngularJS 
<button ng-click=”vm.save()”>Save<button>  
 
//Angular 
<button (click)=”save()”>Save<button>

AngularJS sử dụng chỉ thị ngClick để liên kết với sự kiện. Trong Angular ngClick Chỉ thị bị loại bỏ. Bạn có thể liên kết trực tiếp với các sự kiện DOM

Ràng buộc hai chiều

//AngularJS 
<input ng-model=”vm.customer.name”>  
 
//Angular 
<input [(ng-model)]=”customer.name”> 

$ scopes đã hết

Angular không sử dụng $ scope nữa để gắn chế độ xem và bộ điều khiển.

AngularJS được sử dụng để chạy kiểm tra bẩn trên các đối tượng phạm vi để xem có bất kỳ thay đổi nào xảy ra hay không. Sau đó, nó kích hoạt những người theo dõi. Và sau đó nó được sử dụng để chạy lại kiểm tra độ bẩn một lần nữa.

Angular đang sử dụng zone.js để phát hiện các thay đổi. Zone.js áp dụng các bản vá cho tất cả các hoạt động không đồng bộ toàn cầu như sự kiện nhấp chuột, sự kiện bộ đếm thời gian, yêu cầu HTTP, v.v. Sau đó, nó sẽ tạo ra Angular, bất cứ khi nào thay đổi xảy ra trong Angular Application. Angular sau đó chạy phát hiện thay đổi cho toàn bộ ứng dụng

Bộ lọc được đổi tên thành Pipes

Trong AngularJS, chúng tôi đã sử dụng Bộ lọc và như hình dưới đây

<td>{{vn.customer.name | uppercase}}</td> 

Angular sử dụng cú pháp tương tự nhưng đặt tên chúng là đường ống

<td>{{customer.name | uppercase}}</td>

Bootstrap dành riêng cho nền tảng

Trong AngularJS, chúng tôi đã sử dụng chỉ thị ng-app trong HTML của mình, sau đó Angular sẽ khởi động và tự đính kèm ng-app

<body ng-app=’app’> </html> 

Việc khởi động trong Angular được thực hiện thông qua mã. Việc khởi động Angular không đơn giản như AngularJS. Đoạn mã mẫu bên dưới cho thấy cách ứng dụng Angular khởi động AppModule bằng cách sử dụng platformBrowserDynamic Module

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 
import {AppModule } from './app.module'; platformBrowserDynamic().bootstrapModule(AppModule); 

Bootstrap cũng dành riêng cho Nền tảng trong Angular. Bạn có thể có bootstrapper khác nhau cho ứng dụng web và thiết bị di động.


Dịch vụ

AngularJS có Dịch vụ, Nhà máy, Nhà cung cấp, Hằng số và giá trị, được sử dụng để tạo mã có thể sử dụng lại. Sau đó, chúng được đưa vào Bộ điều khiển để nó có thể sử dụng

Angular được thay đổi mạnh mẽ từ AngularJS ở nhiều khía cạnh và nó đã trở nên dễ dàng và nhanh hơn rất nhiều.