Bài 4: Tạo file bat để hỗ trợ đồng bộ Local và Remix IDE trong Ethereum Blockchain


bài 3, Các bạn đã biết cách đồng bộ mã nguồn Local và Remix IDE trong Ethereum Blockchain. Tuy nhiên vì mã lệnh khá phức tạp và khó nhớ nên sẽ làm chúng ta mất thời gian khi mỗi lần lập trình muốn đồng bộ lại mất thời gian tìm kiếm lại các câu lệnh. Vì vậy bài này Tui hướng dẫn các bạn cách tạo file bat để khi đồng bộ bạn chỉ cần nhấp double click vào file bat là có thể thực hiện.

Các bước đơn giản như sau:

Ta đồng bộ dữ liệu trong thư mục: D:/SmartContract/HelloWorld

Bạn có thể đồng bộ D:/SmartContract nếu như trong D:/SmartContract có nhiều Project. Khi đồng bộ nó sẽ nạp toàn bộ project trong local lên Remix IDE và ngược lại

Bước 1: Tạo file bat

Ở bất kỳ nơi đâu trong máy tính bạn tạo file bat như sau: Bấm chuột phải/ chọn New / Chọn Text Document như hình bên dưới

Lúc này file “New Text Document.txt” được tạo ra như dưới đây:

Ta mở file này lên và gõ lệnh:

remixd -s D:/SmartContract/HelloWorld --remix-ide https://remix.ethereum.org

Lệnh trên sẽ giúp đồng bộ vào project HelloWorld trong thư mục SmartContract

Nếu bạn muốn đồng bộ toàn bộ các Project trong D:/SmartContract thì gõ lệnh:

remixd -s D:/SmartContract --remix-ide https://remix.ethereum.org

Xem hình minh họa:

Sau khi gõ lệnh xong, bạn nhấn Ctrl+S để lưu file

Sau khi lưu file, bạn đóng file và ra ngoài đổi tên file: “New Text Document.txt” thành “dongbo.bat”, dĩ nhiên đặt tên gì cũng được miễn đuôi file là .bat

Bước 2: Tạo shortcut cho file dongbo.bat

Nếu bạn lưu dongbo.bat ngoài desktop thì không cần tạo shortcut, tuy nhiên lập trình viên ít ai lưu dữ liệu ngoài desktop, mà chúng ta thường lưu trong các thư mục ở ổ đĩa D.

Tạo shortcut ngoài desktop để giúp thao tác cho lẹ khỏi mất công đi tìm vì ta hàng ngày lập trình nó.

Bạn bấm chuột phải vào dongbo.bat/chọn send to / chọn Desktop (Create shortcut) như hình bên dưới

Như vậy shortcut sẽ được tạo cho dongbo.bat

Bước 3 – Test đồng bộ.

Bạn chạy shortcut ở ngoài desktop đã tạo ở bước 2 (hoặc chạy trực tiếp file bat ở nơi bạn đã tạo).

Chương trình sẽ tiến hành chạy dịch vụ đồng bộ và thông bao như dưới đây

Bây giờ bạn vào https://remix.ethereum.org/ và chọn kết nối localhost (như đã hướng dẫn ở bài số 3) Ta sẽ có kết quả như hình dưới đây:

Như vậy Tui đã hướng dẫn xong cách tạo file bat để mỗi lần lập trình bạn chỉ cần chạy file này là nó tự động tạo dịch vụ đồng bộ mà bạn không cần phải nhớ các lệnh phức tạp của nó

Nếu như bạn muốn đồng bộ qua thư mục khác thì tạo 1 filebat mới hoặc bạn sửa ngay chính file bat cũ bằng cách bấm Chuột phải vào file .bat rồi chọn edit sau đó tiến hành đổi thư mục khác nếu muốn.

Chúc các bạn thành công và tiết kiệm được thời gian khi làm thao tác đồng bộ.

Bài 3: Đồng bộ mã nguồn giữa máy Local và Remix IDE trong Ethereum Blockchain


Chúng Ta tiếp tục chuỗi các bài học về ngôn ngữ Solidity để lập trình Smart Contract trong Ethereum Blockchain, với công cụ lập trình Remix IDE được biên dịch và chạy trên máy ảo Ethereum (Ethereum Virtual Machine – EVM).

Trong 2 bài trước Tui đã hướng dẫn các Bạn cách sử dụng công cụ Remix IDE, cấu trúc của công cụ cũng như chức năng của chúng và đã thử nghiệm 1 bài HelloWorld để các bạn biết được cách coding cũng như biên dịch và deploy 1 smart contract trong công cụ này. Tuy nhiên ở 2 bài đó thì mã nguồn chỉ được lưu tạm trên trình duyệt nếu có cookie thì nó cũng lưu tạm thời thôi, tức là có thể mất toàn bộ mã nguồn.

Trong bài này Tui sẽ hướng dẫn các Bạn cách thức đồng bộ mã nguồn giữa máy Local và Remix IDE, tức là khi ta lập trình trên Ethereum Blockchain thì mọi thao tác thay đổi mã nguồn, hay cấu hình trong workspace sẽ được lưu về máy Local. Và các ngày hôm sau các Bạn có thể kết nối rồi phục hồi lại mã nguồn trong Local lên Ethereum Blockchain để tiếp tục coding.

Chúng ta làm các bước sau.

Bước 1: Cài đặt NPM(node package manager).

NMP là viết tắt của Node package manager là một công cụ tạo và quản lý các thư viện lập trình Javascript cho Node.js.

Trước khi cài NPM thì bạn kiểm tra xem máy tính mình đã từng có NPM, nếu chưa có thì cài đặt.

lệnh kiểm tra như sau:

npm -version

Xem hình Tui chụp dưới đây nếu ra được version như của Tui tức là máy tính của bạn đã có rồi (hoặc gõ 2 dấu trừ đằng trước version):

Nếu nó báo không nhận ra thì ta cần cài NodeJS, NMP được tích hợp sẵn khi bạn cài NodeJS

Chi tiết về cài đặt và lập trình NodeJS các bạn xem tại danh sách các bài Blog mà Tui đã viết trước đây:

Cụ thể bạn xem 2 bài trong danh sách NodeJS, gồm:

Sau khi cài đặt thành công NodeJS thì tốt nhất khởi động lại máy rồi mở lại command line để test NPM, nếu nó ra kết quả như của Tui là thành công. Còn vẫn chưa được thì có thể do nghiệp khá nặng, cần chọn lại ngày giờ và phiên bản cài đặt.

Bước 2: Cài đặt remixd daemon

Để hệ thống truy suất được tới local file từ Remix IDE-Ethereum Blockchain thì ta cần cài remixd daemon

Cách cài đặt như sau:

Trong commandline gõ lệnh:

npm install -g @remix-project/remixd

Xem hình minh họa:

Gõ lệnh như trên rồi nhấn phím Enter:

Chờ remixd cài đặt….

màn hình trên đã thông báo hoàn tất quá trình cài đặt, bây giờ ta kiểm tra version của nó để xác thực rằng remixd được cài thành công hay không.

viết lệnh như sau:

remixd --version

Xem hình minh họa:

Như vậy đã cài remixd thành công.

Bước 3: Chạy remixd daemon

Xem lại bài ví dụ Smart Contract ở bài số 2

Bạn thấy Workspaces là HelloWorld không? Workspaces này chỉ được lưu trên Ethereum Blockchain, ở máy Local chúng ta nó không hề biết Workspaces này.

Giả sử trong ổ D:/ bạn tạo thư mục tên là HelloWorld để đồng bộ (dĩ nhiên là tên gì cũng được). Trong bài này, Tui tạo thư mục cha tên là SmartContract rồi bên trong nó có thư mục HelloWorld (Còn bạn thích để kiểu gì cũng được, nhưng trong case này Tui muốn hướng dẫn thêm 1 số lệnh cơ bản trong command line như trỏ thư mục nên mới cố tình làm vậy để Bạn có thểm kiến thức):

D:/SmartContract/HelloWorld

Bạn viết các lệnh trong commandline để di chuyển tới thư mục SmartContract, xem minh họa:

Sau đó dùng lệnh tổng quát sau để chạy remixd daemon

remixd -s <absolute-path-to-the-shared-folder> --remix-ide https://remix.ethereum.org

Như vậy trong trường hợp này thì Tui sẽ viết:

remixd -s HelloWorld --remix-ide https://remix.ethereum.org

Xem hình minh họa:

Nhấn enter và chờ cho chương trình chạy:

Như vậy đã chạy remixd daemon thành công.

Lưu ý nếu bạn tạo thư mục là ThanhHandsome thì phải đổi cái HelloWorld thành ThanhHandsome

Bước 4 – Kết nối local để đồng bộ mã nguồn.

Sau khi đã chạy remixd daemon thành công, từ Remix IDE Ethereum Blockchain ta làm như sau:

Từ mục Workspaces, Ta chọn -connect to localhost- như hình trên, màn hình sau sẽ xuất hiện:

Ta bấm “Connect”, và chờ Remix IDE kết nối, dưới đây là màn hình kết nối thành công:

Lúc này Bạn cũng có thể quay lại commandline chỗ remixd daemon chạy thì cũng thấy nó thông báo “setup notifications for HelloWorld”:

Tui chụp màn hình so sánh giữa Local và Ethereum để bạn xem:

Hiện tại Local vẫn trống trơn vì ta chưa code gì cả.

Bây giờ Tui thử tạo trên Remix Ethereum 1 thư mục “Lucy”:

Bạn thấy đó, ngay lập tức thư mục Lucy ở Ethereum sẽ được đồng bộ về ngày máy local

Và bây giờ trong máy Local, thêm 1 thư mục Jerry

Trường hợp này thì Ethereum chưa đồng bộ ngay (có thể sẽ dùng các lệnh hoặc version sau). Mà ta reload lại trang và kết nối lại localhost để xem nó tự đồng bộ (bạn reload page và làm lại bước kết nối là nó tự đồng bộ). xem hình:

Tiếp theo ta thử viết 1 Solidity Smart Contract trong thư mục Lucy, đặt tên FirstSmartContract.sol:

Lúc này ở Local nó cũng tự động đồng bộ mã nguồn từ Ethereum về cho bạn.

Code FirstSmartContract.sol:

pragma solidity >=0.7.0 <0.9.0;
contract FirstSmartContract
{
    uint256 balance;
    
    function setBalance(uint256 x) public {
        balance = x;
    }
    function getBalance() public view returns(uint256){
        return balance;
    }
}

Bây giờ ta tiến hành biên dịch xem như thế nào:

Trong local thư mục artifacts sẽ được tạo ra với 2 file json:

Và dĩ nhiên nó cũng đồng bộ từ Ethereum, ta xem lại cấu trúc thư mục:

Bây giờ ta vào mục Deploy (nhớ click chọn vào file FirstSmartContract.sol trước nhé):

Các bước test như bài 2, các bạn tự thử nhé.

Như vậy tới đây Tui đã hướng dẫn xong cách thức đồng bộ dữ liệu Local-Remix IDE Ethereum Blockchain. Điều này là quan trọng vì ta cần bảo trì mã nguồn. Và có thể dùng các công cụ lập trình Solidity khác để lập trình sau đó đồng bộ code sau khi có internet.

Bài học sau Tui sẽ minh họa cách tạo 1 Coin và thử giao dịch chuyển tiền qua lại giữa các ví trong Ethereum Blockchain, sau đó sẽ đi sâu vào hướng dẫn ngôn ngữ lập trình Solidity, Bạn cần có kiến thức về Solidity thì mới có nền tảng mà lập trình Smart Contract. Vì nó dùng Solidity để lập trình. Không vội

Chúc các bạn thành công.

Bài 2: Tạo và chạy Smart Contract đầu tiên trong Ethereum Blockchain


bài 1 các bạn đã biết cách sử dụng công cụ Remix IDE để lập trình Smart Contract trong Ethereum Blockchain. Trong bài này Tui sẽ hướng dẫn cách tạo 1 Smart Contract đầu tiên và biên dịch, deploy nó như thế nào.

Muốn thay đổi thế giới thì trước tiên Bạn phải xin chào thế giới, vì vậy ta tạo một workspace tên là “HelloWorld” như dưới đây: (Thực ra ta không thể đổi được thế giới này đâu, hồi còn trẻ trâu Tui cũng muốn đổi này đổi kia, nhưng từ khi cưới Vợ và đặc biệt lúc có Em Bé, Tui còn không có cơ hội đổi kênh Youtube huống chi đòi đổi thế giới, thay đổi được chính bản thân mình cho nó tốt lên là may lắm rồi).

Ta đặt tên như hình dưới đây rồi bấm nút OK:

Sau khi bấm nút OK ta có kết quả:

Mặc định Remix Ethereum IDE sẽ tạo cho bạn cấu trúc thư mục và các tập tin Contract mẫu như trên.

Bây giờ ta tạo 1 file .sol (Contract viết bằng ngôn ngữ lập trình Solidity).

Đặt tên là FirstSmartContract nó tự ra đuôi FirstSmartContract.sol:

Kết quả sau khi nhấn phím Enter:

Bây giờ ta code như sau, cách code Solidity nó tương tự như java, python…. dĩ nhiên có những điểm khác vì nó chuyên biệt cho Smart Contract. Tui sẽ sắp xếp thời gian viết các blog hướng dẫn về Solidity ở các bài tiếp theo để phục vụ tốt cho việc viết các dự án liên quan tới Smart Contract.

Ở bài này thì cứ làm theo như Tui viết cho nó có cảm giác trước đã

Mã lệnh Contract của FirstSmartContract ở trên gồm có thuộc tính balance và các phương thức setBalance để thay đổi giá trị của balance, phương thức getBalance để truy suất giá trị của balance.

Coding như sau:

pragma solidity >=0.7.0 <0.9.0;
contract FirstSmartContract
{
    uint256 balance;
    
    function setBalance(uint256 x) public {
        balance = x;
    }
    function getBalance() public view returns(uint256){
        return balance;
    }
}

Khi ta viết sai cú pháp thì chương trình sẽ tự động báo lỗi, lúc này ta sẽ không biết dịch được, ví dụ Tui cố tình sửa 1 xíu cho nó báo lỗi thì bạn sẽ thấy hình ảnh sau:

Ở trên không có biến x2 nhưng Tui vẫn khai báo, dãna tới nó bị lỗi có nút màu đỏ. lúc này không biên dịch được.

OK, giờ bạn sửa lại cho nó đúng để chúng ta vào bước biên dịch:

Theo hình trên, để biên dịch ta làm theo cá bước:

1. Chọn Solidity compiler

2. Chọn compiler mới nhất

3. Chọn ngôn ngữ lập trình là Solidity

4. Chọn Ethereum Virtual Machine (EVM), để mặc định

5. Nhấn compile FirstSmartContract.sol

Ta xem kế quả:

Sau khi biên dịch thành công, ta vào mục Deploy & Run transactions như hình dưới đây:

Như vậy các bạn cần làm các bước trong mục Deploy & run transactions như sau:

1. Chọn Deploy & Run transactions

2. Chọn Enviroment là JavaScript VM (London). ở đây có 1 danh sách tùy chọn

3. Chọn Account Ethereum, cũng có nhiều tùy chọn

4. Chọn Gas limit

5. Chọn Contract mà mình muốn deploy, khi biên dịch nhiều contract thì nó hiển thị danh sách ở đây

6. Nhấn Deploy

Sau khi nhấn Deploy ta xem kết quả:

Khi nhấn vào mũi tên để xem chi tiết, ta có màn hình dưới đây, các phương thức (các giao tác) được hiển thị để cho ta tương tác:

Ví dụ bây giờ ta setBalance là 500000000, chi tiết thao tác xem hình:

Bước 1: nhập giá trị cho giao tác setBalance

Bước 2: nhấn nút setBalance

Bước 3: chi tiết transaction thực hiện, ta có thể xem

Tiếp theo để kiểm tra giao tác setBalance có làm thay đổi giá trị của balance hay không, ta thử nghiệm giao tác getBalance:

Như vậy là tới đây ta đã hoàn tất việc Code một Smart Contract cũng như cách biên dịch và deploy, run nó như thế nào.

Bài tiếp theo Tui sẽ hướng dẫn các bạn đồng bộ những gì mình lập trình trên Remix Ethereum IDE về máy local của mình để lưu trữu cũng như bảo trì code.

Code FirstSmartContract.so tải ở đây:

https://www.mediafire.com/file/b0vix0rrt44qygn/FirstSmartContract.sol/file

Chúc các bạn thành công

Bài 1: Sử dụng Remix IDE để lập trình Smart Contract trong Ethereum Blockchain


Ethereum tạo ra một số ngôn ngữ để hỗ trợ các dự án liên quan tới Blockchain. Trong đó có Solidity là ngôn ngữ được tạo ra với sứ mệnh chính là viết các dự án về Smart Contract. Ngoài ra hãng cũng phát triển IDE Remix rất nổi tiếng và tiện lợi trong quá trình lập trình cũng như biên dịch và test thử nghiệm các Contract (giới thiệu Smart Contract của Ethereum ở đây: https://docs.soliditylang.org/en/v0.8.7/introduction-to-smart-contracts.html)

Bài này Tui sẽ hướng dẫn các bạn cách sử dụng Remix IDE để lập trình và biên dịch các Contract mặc định online trên hệ thống https://remix.ethereum.org/. Ở bài sau Tui sẽ hướng dẫn các bạn cách tạo một Smart Contract hoàn toàn mới cũng như cách kết nối đồng bộ nó về máy Local.

Lần đầu truy cập vào https://remix.ethereum.org/ ta có giao diện mặc định như bên dưới đây cùng với 1 dự án Smart Contract mẫu(Mặc định màn hình đen thui vậy kệ nó, Tui sẽ hướng dẫn bạn chỉnh theme sau)

Giao diện của từng mục như sau:

Mục 1 – Màn hình Home:

Khi bạn chọn mục màn hình home thì giao diện hiển thị như bên dưới, nó có thể chứ danh sách cấu trúc dự án, hoặc các hướng dẫn, các giới thiệu về plugins, hay các thao tác trên file, thư mục và các tài nguyên.

Mục 2 – Tổ chức mãn nguồn:

Khi nhấn vào mục này ta sẽ thấy cấu trúc thư mục như hình bên, ta bấm vào thư mục để xổ các tập tin mã nguồn ra. Muốn thao tác trên nó như: thêm, xóa, sửa tập tin thư mục thì bấm chuột phải vào nó sẽ xổ ra menu cho chọn. Các tập tin mã nguồn mặc định có phần mở rộng là .sol

Mục 3 – trình biên dịch Solidity

Thường khi ta coding xong 1 Contract nếu nó không báo lỗi thì vào đây biên dịch để sử dụng cho bước triển khai và chạy giao dịch.

Mục 4 – Triển khai và chạy giao dịch:

Sau khi mục 3 ta đã biên dịch thanh công thì qua mục 4 này để deploy nó, chi tiết như hình bên dưới

Chi tiết quá trình biên dịch trong mục 3 và chi tiết deploy trong mục 4 cũng được hiển thị trong mục 9.

Mục 5- Quản lý Plugin

Trong quá trình triển khai phần mềm Smart Contract sẽ có những lúc ta phải dùng thêm các thư viện ngoài, ta cần vào đây để cài đặt như hình minh họa bên dưới.

Mục 6-7 quản lý thư mục dự án và cấu trúc dự án

ở mục này ta có thể tạo các Workspaces mới, thêm , sửa, xóa tập tin và thư mục như hình bên dưới.

Tên tập tin nếu nó là Contract thì đuôi mặc định là .sol

Mục 8 – viết mã nguồn:

Ta nhấn vào từng tập tin .sol để lập trình contract như hình bên dưới.

Dĩ nhiên nó là 1 ngôn ngữ lập trình Solidity, bạn phải biết về nó. Tui sẽ tranh thủ ra khóa học hướng dẫn sau. Tạm thời bạn có thể học bản Tiếng Anh tại đây: https://docs.soliditylang.org/en/v0.8.7/index.html

Mục 9 như đã nói là nơi hiển thị chi tiết các tương tác khi biên dịch, deploy.

Mục 10 là settings để thay đổi các cấu hình cũng như giao diện

Như vậy tới đây Tui đã hướng dẫn xong cách sử dụng Remix – Ethereum IDE để lập trình các phần mềm về Smart Contract. Các bạn về cơ bản đã biết được ý nghĩa của từng thành phần.

Bài tiếp hteo Tui sẽ hướng dẫn các bạn cách tạo mới 1 Contract hoàn toàn cũng như biết cách biên dịch, deploy và thử nghiệm 1 số giao tác ngay trên hệ thống của Ethereum Blockchain.

Hẹn gặp ở bài thứ 2, đó là bài “Tạo First Smart Contract”.

Chúc các bạn thành công

Full khóa học lập trình cơ sở dữ liệu với Java


Để học được khóa Lập trình Cơ sở dữ liệu với Java này bắt buộc các bạn phải có kiến thức về lập trình hướng đối tượng với Java trước. Trong chương trình tặng 14 khóa học khi cung cấp minh chứng ủng hộ quỹ vaccine của Chính Phủ Tui đã tặng các bạn rồi, bây giờ Tui tặng thêm khóa Lập trình cơ sở dữ liệu với Java, Khóa này Tui publish trên youtube các bạn tham khảo.

Muốn học khóa lập trình hướng đối tượng với thì đăng ký học Java OOP tại đây.

hoặc muốn học các khóa khác thì vào https://unica.vn/?aff=11929 tìm Trần Duy Thanh, rồi chọn Khóa học phù hợp

Ngoài ra Tui có viết các bài Blog khá chi tiết về Java Backend, các bạn có thể tham khảo tại đây:

https://duythanhcse.wordpress.com/java/java-backend/

Các câu hỏi về lập trình vui lòng vào public group:
https://www.facebook.com/groups/communityuni/

Chương trình học cụ thể của Khóa này như sau:

Khóa học cung cấp kiến thức nâng cao của ngôn ngữ lập trình java .
-Xử lý giao diện
-Tiếp cận được 4 loại hệ cơ sở dữ liệu phổ biến: Microsoft Access, Microsoft SQL Server, MySQL và Oracle.
-Nắm chắc các kiến thức về JDBC như truy vấn, cập nhật, xóa dữ liệu…
-Tiếp cận được JPA để nâng cao hiệu suất lập trình cơ sở dữ liệu với Java
-Sau khi hoàn thành khóa học, có thể tự viết được dự án liên quan tới quản trị cơ sở dữ liệu.

Học liệu: Bao gồm Slide từng bài học và source code của từng bài học, tải ở đây.

Full link khóa học Lập trình cơ sở dữ liệu với Java trên Youtube:

Số lượng Video: 63

Thời lượng: 24 giờ 33 phút

Dung lượng: 55.9 GB Full HD

Video theo từng bài học:

STTBài họcLink học
Chương ILập trình Java OOP (đã tặng) 
  https://unica.vn/lap-trinh-java-trong-4-tuan?aff=11929  (đã tặng)
Chương 2Lập trình xử lý giao diện cơ bản trong java 
Bài 1Giới thiệu gói Swing, lớp JFrame,Jpanel Link học
Bài 2Các loại Layout Manager quan trọng thường dùng  Link học
Bài 3o        JLabel
o        JTextField
o        JButton
– Các kỹ thuật gán sự kiện
  Link học
Bài 4o        Cách tạo Border, Border Title
o        JTextArea, JScrollPane
o        JCheckBox, JradioButton, ButtonGroup
  Link học
Bài 5o        JCombobox, JList (demo trên dữ liệu cơ sở và đối tượng)  Link học
Bài 6Project thực tế  Link học
Chương 3Lập trình xử lý giao diện nâng cao trong java 
Bài 1o        Split Panes, Jtable  Link học
Bài 2JTree  Link học
Bài 3o        JMenuBar
o        ContextMenu
o        JToolbar
  Link học
Bài 4o JTabbedPane  Link học
Bài 5Các loại Dialog thường dùng  JoptionPane, JFileChooser…  Link học
Bài 6Project thực tế  Link học
Chương 4Lập trình Cơ sở dữ liệu với Microsoft Access 
Bài 1Giới thiệu về Microsoft Access  Link học
Bài 2Cách kết nối Microsoft Access bằng ucanaccess  Link học
Bài 3Sử dụng Statement để truy vấn dữ liệu trong Microsoft Access  Link học
Bài 4Sử dụng Statement để thêm mới dữ liệu trong Microsoft Access  Link học
Bài 5Sử dụng Statement để thay đổi dữ liệu trong Microsoft Access  Link học
Bài 6Sử dụng Statement để xóa bỏ dữ liệu trong Microsoft Access  Link học
Bài 7Sử dụng PreparedStatement để truy vấn dữ liệu trong Microsoft Access  Link học
Bài 8Sử dụng PreparedStatement  để thêm mới dữ liệu trong Microsoft Access  Link học
Bài 9Sử dụng PreparedStatement  để thay đổi dữ liệu trong Microsoft Access  Link học
Bài 10Sử dụng PreparedStatement  để xóa bỏ dữ liệu trong Microsoft Access  Link học
Bài 11Project thực tế  Link học
Chương 5Lập trình Cơ sở dữ liệu với Microsoft SQL Server 
Bài 1Giới thiệu về hệ quản trị cơ sở dữ liệu Microsoft SQL Server  Link học
Bài 2Cách kết nối Microsoft SQL Server bằng SqlJDBC  Link học
Bài 3Sử dụng Statement để truy vấn dữ liệu trong Microsoft SQL Server  Link học
Bài 4Sử dụng Statement để thêm mới dữ liệu trong Microsoft SQL Server  Link học
Bài 5Sử dụng Statement để thay đổi dữ liệu trong Microsoft SQL Server  Link học
Bài 6Sử dụng Statement để xóa bỏ dữ liệu trong Microsoft SQL Server  Link học
Bài 7Sử dụng PreparedStatement để truy vấn dữ liệu trong Microsoft SQL Server  Link học
Bài 8Sử dụng PreparedStatement  để thêm mới dữ liệu trong Microsoft SQL Server  Link học
Bài 9Sử dụng PreparedStatement  để thay đổi dữ liệu trong Microsoft SQL Server  Link học
Bài 10Sử dụng PreparedStatement  để xóa bỏ dữ liệu trong Microsoft SQL Server  Link học
Bài 11Sử dụng CallableStatement để truy suất Store Procedure trong Microsoft SQL Server  Link học
Bài 12Project thực tế  Link học
Chương 6Lập trình Cơ sở dữ liệu với MySQL 
Bài 1Giới thiệu về hệ quản trị cơ sở dữ liệu MysQL  Link học
Bài 2Cách kết nối MySQL bằng MySql JDBC  Link học
Bài 3Sử dụng Statement để truy vấn dữ liệu trong MySql  Link học
Bài 4Sử dụng Statement để thêm mới dữ liệu trong MySql  Link học
Bài 5Sử dụng Statement để thay đổi dữ liệu trong MySql  Link học
Bài 6Sử dụng Statement để xóa bỏ dữ liệu trong MySql  Link học
Bài 7Sử dụng PreparedStatement để truy vấn dữ liệu trong MySql  Link học
Bài 8Sử dụng PreparedStatement  để thêm mới dữ liệu trong MySql  Link học
Bài 9Sử dụng PreparedStatement  để thay đổi dữ liệu trong MySql  Link học
Bài 10Sử dụng PreparedStatement  để xóa bỏ dữ liệu trong MySql  Link học
Bài 11Project thực tế  Link học
Chương 7Lập trình Cơ sở dữ liệu với Oracle 
Bài 1Giới thiệu về hệ quản trị cơ sở dữ liệu Oracle  Link học
Bài 2Cách kết nối Oracle bằng oJDBC7  Link học
Bài 3Sử dụng Statement để truy vấn dữ liệu trong Oracle  Link học
Bài 4Sử dụng Statement để thêm mới dữ liệu trong Oracle  Link học
Bài 5Sử dụng Statement để thay đổi dữ liệu trong Oracle  Link học
Bài 6Sử dụng Statement để xóa bỏ dữ liệu trong Oracle  Link học
Bài 7Sử dụng PreparedStatement để truy vấn dữ liệu trong Oracle  Link học
Bài 8Sử dụng PreparedStatement  để thêm mới dữ liệu trong Oracle  Link học
Bài 9Sử dụng PreparedStatement  để thay đổi dữ liệu trong Oracle  Link học
Bài 10Sử dụng PreparedStatement  để xóa bỏ dữ liệu trong Oracle  Link học
Bài 11Project thực tế  Link học
Chương 8Lập trình cơ sở dữ liệu với JPA 
Bài 1Giới thiệu JPA(Java Persistence API)  Link học
Bài 2Triển khai dự án quản lý Khách hàng bằng Hibernate-JPA (trên hệ cơ sở dữ liệu SQL Server)  Link học
Chương 9Giới thiệu về Windowbuilder Pro Eclipse 
Bài 1Cách cài đặt plug in Windowbuilder Pro cho Eclipse  Link học
Bài 2Cách sử dụng gói Windowbuilder Pro Eclipse  Link học
Chương 10Tổng kết khóa học 
Bài 1Kết xuất dự án ra file jar  Link học

Ngoài ra Tui có viết các bài Blog khá chi tiết về Java Backend, các bạn có thể tham khảo tại đây: https://duythanhcse.wordpress.com/java/java-backend/

Tặng 14 khóa học lập trình khi cung cấp minh chứng Ủng hộ Quỹ Vắc-xin phòng chống Covid-19


Chương trình tặng 14 khóa học đã kết thúc vận động trong 7 ngày(ngày kết thúc là 31/08/2021)

👉Tổng Số người ủng hộ quỹ Vaccine của Chính Phủ: 283🧑‍

👉Tổng Số mã kích hoạt khóa học đã gửi tới mọi người: 3.962

👉Tổng giá trị Khóa học đã gửi tới mọi người: 💸1.981.000.000 VNĐ

🥰Danh sách tổng hợp 283 người ủng hộ quỹ Vaccine của Chính Phủ xem tại đây (Tui xóa Email, số tiền):

================================

Nhà nước vẫn đang cần sự chung tay giúp sức của mọi người. Đây là kênh thông tin chính thức của Chính Phủ:

Cổng thông tin điện tử Quỹ vắc-xin phòng chống Covid-19 kêu gọi đồng bào tham gia ủng hộ cho “Quỹ vắc-xin phòng chống Covid-19” của Chính phủ để phục vụ cho hoạt động mua, nhập khẩu, nghiên cứu, sản xuất vắc-xin trong nước và sử dụng vắc-xin phòng Covid-19 cho người dân.

Mọi sự ủng hộ của người dân xin gửi vào tài khoản “Quỹ vắc-xin phòng chống Covid-19” bằng cách nhập đầy đủ thông tin trong link dưới đây của chính phủ:

https://quyvacxincovid19.gov.vn/

================================

Chương trình tặng 14 khóa học lập trình khi cung cấp minh chứng Ủng hộ Quỹ Vắc-xin phòng chống Covid-19 (không quan tâm số tiền đóng góp).

Chương trình tặng khóa học sẽ kết thúc vào ngày 31/08/2021

Minh chứng ủng hộ phải từ ngày 25/08/2021 tới ngày 31/08/2021

Cổng thông tin điện tử Quỹ vắc-xin phòng chống Covid-19 kêu gọi đồng bào tham gia ủng hộ cho “Quỹ vắc-xin phòng chống Covid-19” của Chính phủ để phục vụ cho hoạt động mua, nhập khẩu, nghiên cứu, sản xuất vắc-xin trong nước và sử dụng vắc-xin phòng Covid-19 cho người dân.

Mọi sự ủng hộ của người dân xin gửi vào tài khoản “Quỹ vắc-xin phòng chống Covid-19” bằng cách nhập đầy đủ thông tin trong link dưới đây của chính phủ:

https://quyvacxincovid19.gov.vn/

Các bạn cần chụp hình minh chứng và submit tại đây, Tui sẽ check cuối ngày để gửi:

Bạn cần đăng nhập gmail của bạn để upload được File, vì cần tính xác thực tránh gian dối:

https://docs.google.com/forms/d/e/1FAIpQLSceeRfmkgZwEBCNVL6kStBwi2FL1kF2dDGJOL8oC3cz9PvnHg/viewform

Khi các bạn cung cấp minh chứng, Tui tặng ngay 14 khoa học online. Các khóa bao gồm:

1)C++:

https://unica.vn/thanh-thao-c-qua-108-bai-hoc?aff=11929
2)CTDL tập 1:

https://unica.vn/cau-truc-du-lieu-va-giai-thuat-tap-1?aff=11929
3)CTDL tập 2:

https://unica.vn/cau-truc-du-lieu-giai-thuat-tap-2?aff=11929
4) Java oop

https://unica.vn/lap-trinh-java-trong-4-tuan?aff=11929
5) android cơ bản

https://unica.vn/la-p-tri-nh-android-co-ban?aff=11929
6) Android nâng cao:

https://unica.vn/la-p-tri-nh-android-nang-cao?aff=11929
7) Web API

https://unica.vn/lap-trinh-restful-webservice-trong-6-tuan?aff=11929

8) C# cơ bản:

https://unica.vn/toan-tap-ngon-ngu-lap-trinh-c?aff=11929
9) C# nâng cao:

https://unica.vn/lap-trinh-winform-voi-c-10-ung-dung?aff=11929
10) Tăng tốc lập trình với LINQ:

https://unica.vn/lap-trinh-linq-toan-tap?aff=11929

11) Lập trình Kotlin:

https://unica.vn/lap-trinh-android-toan-tap-voi-kotlin?aff=11929

12) Lập trình Python cơ bản

https://unica.vn/lam-chu-python-trong-4-tuan?aff=11929

13) Lập trình Zalo SDK:

https://unica.vn/lap-trinh-zalo-voi-android-sdk?aff=11929

14) Thành thạo Excel qua giải đề thi:

https://unica.vn/thanh-thao-excel-qua-giai-de-thi?aff=11929


Tích hợp Trí Tuệ Nhân Tạo Rasa để làm Web Chatbot


Ở bài trước, “Cài đặt platform Trí tuệ nhân tạo Rasa trên Windows” Tui đã hướng dẫn rất chi tiết từng bước để các bạn có thể cài đăt được platform Trí tuệ nhân tạo Rasa trên Windows.

Tiếp tục bài này Tui hướng dẫn các bạn làm thế nào để tích hợp Trí tuệ nhân tạo Rasa vào hệ thống Website của mình. Cụ thể ta sẽ làm 1 Chatbot Web dạng cơ bản như thế này:

Bạn để ý thường chatbot nó sẽ tương tác ở góc phải dưới cùng mỗi màn hình Web. Ta sẽ làm tương tự như vậy. Dĩ nhiên ở bài này chỉ là mới demo sơ sơ để ngó xem con server RASA do chính ta build trên máy local nó có hoạt động để giúp ta làm Chatbot như trên hay không. Còn các kịch bản để làm ra các Product thực tế thì ta cần nhiều thời gian để xây dựng các kịch bản dựa trên các tài liệu mà Rasa cung cấp. Tuy nhiên, về cơ bản kỹ thuật build Chatbot nó sẽ như vậy.

Chúng ta bắt đầu nhé (lưu ý nếu chưa làm bài Cài đặt platform Trí tuệ nhân tạo Rasa trên Windows thì không được máu me làm tiếp). Không được tỏ vẻ nguy hiểm khi chưa cài đặt được Platform này.

Trong ổ D (bạn không có thì tạo ổ khác, nhưng nếu dân lập trình mà chỉ có 1 ổ C thì Tui nghĩ bạn cần phải thức tỉnh lương tri, lập tức tạo thêm 1 ổ logic D).

Tạo thư mục sau trong ổ D: D:/Rasa/webchatbot

Sau đó mở Anaconda prompt lên để di chuyển lệnh vào thư mục này. Xem hình và gõ theo:

Sau đó activate rasa_install_demo bằng lệnh:

conda activate rasa_install_demo

Xem hình minh họa:

Gõ lệnh cho đúng như trên rồi nhấn enter(Lưu ý ở bài trước bạn đặt tên gì thì lấy tên đó nha. Vì bài trước Tui đặt là rasa_install_demo nên bài này Tui lấy tên này).

Sau khi Nhấn Enter, xem hình kết quả:

Như vậy nó đã được activated.

(rasa_install_demo) D:/Rasa/webchatbot>

Bây giờ ta thử Kiểm tra version của Rasa, gõ lệnh:

rasa --version

xem hình gõ lệnh:

Gõ Enter, xem kết quả:

Màn hình trên cho ta biết các thông số về phiên bản con AI Rasa.

tiếp theo: Khởi tạo Rasa bằng cách gõ lệnh:

rasa init

Xem hình:

Nhấn Enter, xem kết quả:

Ở màn hình trên là hỏi ta Tạo nơi lưu trữ dự án, vì đang trỏ lệnh ở D:/rasa/webchatbot nên ta nhấn enter luôn để tạo mặc định. Xem kết quả:

Nó hỏi có train một model lúc khởi tạo không, ta chọn Y.

và chờ nó thực hiện:

Chờ tiếp thôi chứ biết sao giờ…

Tùy vào độ ốm yếu của máy mà bạn thấy màn hình dưới đây lâu hay mau

Tạm thời bài này ta chưa xử lý giọng nói, nên ta nhập n rồi nhấn enter, và chờ nó thực hiện tiếp:

Như vậy nó đã tạo ra dự án cho bạn, vào thư mục để kiểm tra.

Vào ổ D bạn sẽ thấy dự án được tạo ra như dưới đây (nếu không thấy thì có thể nghiệp mình còn nặng, cần sống tử tế hơn và phải cấu hình lại từ bài học 1):

Như vậy tới đây bạn có thể dùng Mở Visual Studio, hay Visual Code, hay bất kỳ trình Dev Editor cái gì cũng được, quen cái nào sài cái đó. Tui trước giờ mê bác BillGate nền toàn sài đồ của Bác ấy không.

Vậy mở Visual Studio 2019 nhé (ở bài 1 các bạn cũng đã gặp).

Từ Visual Studio. Chọn “Open a local folder“, chọn thư mục của dự án :

Bấm “Select Folder”

Kết quả mở trong Visual Studio:

Bây giờ mở file “credentials.yml” và chỉnh sửa:

Dòng 20 đến 23 mở nó ra:

Sửa chỗ này:

socketio:
  user_message_evt: 
  bot_message_evt: 
  session_persistence: 

Thành:

socketio:
  user_message_evt: user_uttered
  bot_message_evt: bot_uttered
  session_persistence: true

Xem hình:

Bây giờ tạo một trang index.html, trang này để tích hợp AI RASA vào để làm tool chatbot:

Bấm chuột phải vào dự án / chọn Add/ chọn New File:

Lúc này trong mục Solution sẽ ra 1 tên file cho ta, ta sử nó thành: Index.html

xem hình:

Bây giờ ta code HTML, Javascript cho Index.html như sau:

Chưa biết gì về HTML cơ bản thì xem 29 Video clip về HTML Tui quay ở đây đủ sài: https://www.youtube.com/watch?v=i4UH1T4Fkos&list=PLmEUE4MG8_b6MO1o3KcWnqsBscWMGnf5Y



    <div id="webchat" />

    
    !(function () {
            let e = document.createElement("script"),
                t = document.head || document.getElementsByTagName("head")[0];
            (e.src =
                "https://cdn.jsdelivr.net/npm/rasa-webchat@1.x.x/lib/index.js"),
                // Replace 1.x.x with the version that you want
                (e.async = !0),
                (e.onload = () =&gt; {
                    window.WebChat.default(
                        {
                            initPayload:'/greet',
                            customData: { language: "en" },
                            socketUrl: "http://localhost:5005",
                            // add other props here
                        },
                        null
                    );
                }),
                t.insertBefore(e, t.firstChild);
        })();
    


ở trên:

socketUrl: "http://localhost:5005"

Nghĩa là ta muốn start 1 con AI RASA server ở cổng 5005

Bây giờ ta quay lại Anaconda gõ lệnh sau để start con AI RASA server này:

rasa run -m models --enable-api --cors "*"

Xem hình:

Chờ nó chạy và xem kết quả:

Như vậy nó đã start RASA server tại http://localhost:5005

Ta có thể kiểm tra :

Như vậy sau khi kiểm tra trên trình duyệt thì rõ ràng con Server AI Rasa đã chạy thành công.

Để chạy Web Index.html thử nghiệp Chatbot ta:

Có thể mở trình duyệt bất kỳ lên. Ví dụ là Chrome chẳng hạn

Rồi gõ đường dẫn: D:/Rasa/webchatbot/index.html Vào trình duyệt, xem kết quả:

Góc phải dưới cùng bạn thấy biểu tượng chát không? Nhấn vào nó rồi thử nghiệm:

Như vậy tới đây Tui đã hướng dẫn xong các bước rất chi tiết để tích hợp trí tuệ nhân tạo RASA vào hệ thống Web để làm Chatbot. Nó hay ở chỗ là mình tự build được local (và tự đây ta có thể để lên private cloud hoặc public cloud).

Tui sẽ sắp xếp thời gian để viết các hướng dẫn liên quan tới tạo kịch bản của chatbot, cũng như cách deploy nó lên Cloud như thế nào. Dĩ nhiên Tui rất bận, các bạn đừng ngồi chờ, hay cố gắng tự tìm hiểu trước.

Source code và file cấu hình mà Tui làm trong máy của Tui, bạn có thể tải ở đây:

https://www.mediafire.com/file/ty1u5jl7hwtmh4r/webchatbot.rar/file

Chúc các bạn thành công!

Cài đặt platform Trí tuệ nhân tạo Rasa trên Windows


Rasa là một trong các nền tảng Trí Tuệ Nhân Tạo mã nguồn mở cho hạng mục hội thoại hàng đầu hiện nay, nó hỗ trợ cho các cuộc trò chuyện được cá nhân hóa trên quy mô lớn. Có thể tích hợp vào nhiều nền tảng khác nhau. Việc ứng dụng nó vào công việc Tư vấn, Giáo dục, Kinh doanh… sẽ rất hiệu quả.

Trang chủ AI Rasa https://rasa.com/

Image source: SpaceO

Chúng ta có thể build Rasa trên private cloud hay public cloud.

Bài này Tui sẽ hướng dẫn các bạn chi tiết từng bước cách cài đặt con AI Rasa trên Windows 64bit như thế nào.

Bước 0:

Bạn nên cài đặt Visual Studio 2019, cách cài đặt chi tiết Tui có hướng dẫn ở đây:

Có thể RASA không cần cài đặt visual 2019, nhưng tôi nghĩ bạn nên cài đặt nó vì nó sài một số thư viện liên quan.

Sau đó cài Python 3.8. Link cài đặt ở đây:

https://www.python.org/downloads/release/python-380/

Bước 1:

Sau khi cài xong Visual Studio 2019 và Python 3.8. Ta tiến hành cài đặt thư viện hỗ trợ visual C++

Link download thư viện hỗ trợ visual C++ ở đây:

https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0

khi vào link trên, bạn sẽ thấy giao diện hiển thị như dưới đây:

Ta bấm vào link file VC_redist.x64.exe để tải, dung lượng khoảng 24.578 KB

Double Click vào VC_redist.x64.exe để cài đặt.

Check “I agree to the license terms and conditions” và sau đó click install

Ta chờ cho nó cài đặt hoàn tất, sau đó nhấn nút Restart để khởi động lại máy:

Bước 2:

Sau khi khởi động máy xong, ta tiến hành cài Anaconda.

Ta vào link: https://docs.anaconda.com/anaconda/install/windows/

Màn hình dưới đây xuất hiện:

Ta nhấn vào link download the Anaconda installer ở trên.

Sau đó nó sẽ hiển thị phiên bản để tải, bạn chọn Download:

Chọn thư mục để lưu Anaconda installer:

Click save và chờ nó tải….

Ở trên là đã tải hoàn tất.

Giờ ta Click vào file Anaconda vừa tải về để install.

Click Next để tiếp tục

Click I agree để đồng ý cài.

Check All users và click Next

Chọn nơi cài đặt (để mặc định như trên OK) rồi bấm Next

Checked 2 lựa chọn ở trên rồi bấm Install.

Ta chờ cho nó cài đặt khi nào tới màn hình Completed dưới đây thì bấm Next:

Nhấn Next màn hình sau sẽ xuất hiện:

Tiếp tục nhấn Next

Nhấn Finish để hoàn tất quá trình cài đặt Anaconda.

Bước 3:

Cài đặt Rasa.

Ta mở màn hình Anaconda Prompt

Trong màn hình start, tìm anaconda rồi chọn Anaconda Prompt, nhấn Enter, màn hình lệnh Anaconda sẽ xuất hiện như dưới đây:

Bước 3.1: Tạo rasa_install_demo (dĩ nhiên bạn có thể đặt tên khác)

Gõ lệnh sau vào dấu nhắc lệnh của prompt:

conda create --name rasa_install_demo  python==3.8

xem hình:

Nhấn phím Enter để hệ thống thực hiện:

Chờ nó thực hiện tiếp…, sau đó nó hiện thị ra màn hình dưới đây:

y và nhấn enter, chờ nó cài đặt tiếp:

Tiếp tục chờ cho tới khi nó ra màn hình sau:

Như vậy bước tạo rasa_install_demo đã hoàn tất.

Bước 3.2: Activate rasa_install_demo 

Dùng lệnh sau:

conda activate rasa_install_demo

Xem hình:

Gõ lệnh xong thì nhấn enter để activate

Như vậy đã activate thành công. Bạn chú ý nó xuất hiện:

(rasa_install_demo) C:\Users\thanh>

Bước 3.3: Cài đặt ujson

gõ lệnh sau:

conda install ujson

Xem hình:

Gõ lệnh xong thì nhấn enter để cài đặt:

Ta nhập y rồi gõ enter:

Nhấn enter để cài đặt, chờ nó cài hoàn tất, dưới đây là màn hình sau khi cài ujson thành công:

Bước 3.4: Cài đặt tensorflow

Dùng lệnh sau:

conda install tensorflow

Xem hình:

Nhấn Enter và chờ nó cài đặt:

Tiếp tục chờ….

Thấy màn hình trên xuất hiện thì nhập y và nhấn enter.

Tiếp tục chờ…

Màn hình trên xuất hiện tức là đã hoàn tất bước cài đặt Tensorflow.

Bước 3.5: Đây là bước thực sự cài đặt rasa

gõ lệnh sau:

pip install rasa

Xem hình:

Sau khi gõ lệnh, nhấn Enter để tiến hành cài rasa.

Tiếp tục chờ trong hạnh phúc….

Chờ tiếp thôi, chứ biết làm sao bây giờ….

Màn hình trên xuất hiện tức là đã hoàn tất bước cài đặt rasa.

Chưa đâu, phải double check lại để chắc chắn rằng đã cài đặt xong rasa. Nghiệp nặng hay nhẹ nó nằm ở bước double check.

Bước 3.6: Double check để đảm bảo rằng rasa đã cài hoàn tất và không bị lỗi.

dùng lệnh sau:

rasa -h

Xem hình:

Gõ lệnh xong thì nhấn Enter để double check.

Nếu màn hình sau xuất hiện tức là bạn đã thực sự cài đặt con AI Rasa thành công:

Chúc mừng bạn đã làm tới bước này.

Các bài sau nếu có thời gian Tui sẽ hướng dẫn sách thức sử dụng hệ thống Rasa để làm quen với nền tảng trí tuệ nhân tạo mà Rasa đã hỗ trợ. Ta có thể tự build sản phẩm riêng của mình về hệ thống chatbot dựa trên nền tảng AI của Rasa.

See you then!

Viết phần mềm ChatBot dùng OpenAI


Ở bài “Cách đăng ký và sử dụng OpenAI” Tui đã hướng dẫn các bạn cách thức đăng ký, chờ email mời và cách sử dụng hệ thống online của OpenAI cũng như cách dùng PostMan làm công cụ test API của OpenAI với token lấy được từ hệ thống. Các bước xét duyệt khoảng 2 tuần nên bạn kiên nhẫn chờ đợi.

Bài này Tui sẽ hướng dẫn các bạn cách xây dựng 1 phần mềm Mobile ChatBot sử dụng OpenAI mà bạn đăng ký được. Tui sẽ để TOKEN của Tui ở trên này trong vòng 2 tuần, sau đó sẽ deactived nó đi. Mục đích giúp các bạn test được phần mềm ChatBot trước khi bạn nhận được thư mời của OpenAI.

Giao diện và tương tác như sau:

Các bước chi tiết làm như sau (lưu ý nếu chưa có tí kiến thức gì về Android thì đừng máu me làm bài này nha.). Một số bài Android 2020 Tui viết blog ở đây https://duythanhcse.wordpress.com/lap-trinh-di-dong/lap-trinh-android-2020/,

hoặc đăng ký học Android qua Video chi tiết từ cơ bản tới nâng cao ở đây: Android cơ bản + Android nâng cao.

Group FB hỗ trợ học: https://www.facebook.com/groups/communityuni/

Khởi động Android Studio:

Chọn nút “New Project” ở bên trên:

Trong nhóm Phone and Tablet chọn Empty Activity và bấm next.

Tên dự án: OpenAIChatBot
Package: tranduythanh.com.openaichatbot
Nơi lưu trữ: D:\OpenAI\OpenAIChatBot
Language: chọn java
Minimum SDK chọn API 26
Sau đó nhấn Finish để tạo Project.

Chúng ta sẽ làm dự án này với các cấu trúc class như bên dưới (Tui sẽ hướng dẫn chi tiết từng phần):

Trước tiết ta sẽ thiết kế giao diện cho màn hình chính:

Ta thiết kế cho MainLayout.xml như sau:

Bên trên giao diện là 1 RecyclerView, bên dưới là ô nhập dữ liệu chát và nút gửi.

Cấu trúc XML như sau:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvMessageData"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="@dimen/margin_h4"
        app:layout_constraintBottom_toTopOf="@+id/llChatBox"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/txtOpenAIStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margin_h5"
        android:text="OpenAI đang trả lời..."
        android:textSize="@dimen/text_size_h5"
        android:textStyle="italic"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/llChatBox"
        app:layout_constraintLeft_toLeftOf="parent" />

    <LinearLayout
        android:id="@+id/llChatBox"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margin_h5"
        android:background="@drawable/rounded_rectangle_sent_message"
        android:gravity="center_vertical"
        android:minHeight="48dp"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <EditText
            android:id="@+id/edtChatBox"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:hint="Enter message"
            android:maxLines="6" />

        <ImageView
            android:id="@+id/imgChatBoxSend"
            android:layout_width="@dimen/box_width"
            android:layout_height="@dimen/box_width"
            android:layout_gravity="center_vertical"
            android:layout_margin="@dimen/margin_h4"
            android:background="@drawable/ic_send"
            android:contentDescription="@string/description_image_view"
            android:gravity="center"
            android:scaleType="fitCenter"
            android:textAllCaps="false"
            android:textSize="@dimen/textsize_36"
            app:tint="@color/purple500" />

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Lưu ý cần bổ sung thêm 1 số cấu hình trong resource, cụ thể:

Hiệu chỉnh “colors.xml” như sau:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="purple500">#9C27B0</color>
    <color name="black200">#eeeeee</color>
</resources>

Hiệu chỉnh “dimens.xml” như sau:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="box_width">90dp</dimen>
    <dimen name="textsize_36">36dp</dimen>
    <dimen name="margin_h0">24dp</dimen>
    <dimen name="margin_h1">20dp</dimen>
    <dimen name="margin_h2">16dp</dimen>
    <dimen name="margin_h3">12dp</dimen>
    <dimen name="margin_h4">8dp</dimen>
    <dimen name="margin_h5">4dp</dimen>
    <dimen name="text_size_h5">13sp</dimen>
</resources>

Hiệu chỉnh “strings.xml” như sau:

<resources>
    <string name="app_name">OpenAIChatBot</string>
    <string name="description_image_view">OpenAI Image Description</string>
</resources>

Trong drawble có cấu trúc:

File default_image.png:

File ic_send.png:

File logo_robot.png:

File rounded_rectangle.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <stroke android:width="0.5dp" android:color="@color/purple500"/>
    <corners
        android:radius="20dp">
    </corners>
</shape>

File rounded_rectangle_fill.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <!-- View background color -->
    <solid
        android:color="@color/purple500" >
    </solid>

    <!-- The radius makes the corners rounded -->
    <corners
        android:radius="20dp">
    </corners>
</shape>

File rounded_rectangle_sent_message.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <!-- View background color -->
    <solid android:color="@color/black200"></solid>

    <!-- The radius makes the corners rounded -->
    <corners android:radius="30dp"></corners>
</shape>

Tiếp theo tạo package tranduythanh.com.api để lưu lớp OpenAI:

Nội dung của lớp OpenAI như sau:

package tranduythanh.com.api;

public class OpenAI {
    public static String API="https://api.openai.com/v1/engines/davinci/completions";
    public static String TOKEN="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";
    public static String METHOD="POST";
    public static String CONTENT_TYPE="Application/json";
}

Ở trên Tui định nghĩa API là api của OpenAI cung cấp, TOKEN(bạn thay bằng cái của bạn khi đăng ký thành công, Tui để tạm đây 2 tuần cho bạn test sau đó Tui sẽ deactived nó), Method là POST theo đặc tả, và Content_Type là json.

Tiếp theo tạo package tranduythanh.com.util để lưu lớp AppUtil:

Cấu trúc lớp AppUtil như sau:

package tranduythanh.com.util;

import android.text.format.DateFormat;

import java.util.Calendar;
import java.util.Locale;

public class AppUtil {
    public static String getTimeFormat(long timeStamp) {
        try {
            Calendar cal = Calendar.getInstance(Locale.US);
            cal.setTimeInMillis(timeStamp);
            String date = DateFormat.format("HH:mm", cal).toString();
            return date;
        } catch (Exception e) {
        }
        return "";
    }

}

Lớp này có hàm getTimeFormat đề đưa time dạng long qua String để người dùng dễ nhìn.

Tiếp theo tạo package tranduythanh.com.model để lưu các lớp sau:

TypeTalking Ở đây là 1 Enum, Tui tạo ra để đánh dấu đâu là tin nhắn của người dùng, đâu là tin nhắn của OpenAI.

Nó có cấu trúc sau:

package tranduythanh.com.model;

public enum TypeTalking {
    OPENAI,
    HUMAN
}

MessageData, OpenAIInput, OpenAIOuput bắt buộc phải theo cấu trúc kết quả của hệ thống. Và có chỉnh sửa thêm chút đỉnh để hỗ trợ cho việc coding được nhanh chóng và dễ dàng.

Ta quan sát lại cấu trúc của API lúc gọi mà ta thử nghiệm trong PostMan (bài trước):

Mục 8. Data Json là phần Input đầu vào cho API, Tui tạo lớp OpenAIInput :

package tranduythanh.com.model;

import java.io.Serializable;

public class OpenAIInput implements Serializable {
    private String prompt;

    public OpenAIInput() {
    }

    public OpenAIInput(String prompt) {
        this.prompt = prompt;
    }

    public String getPrompt() {
        return prompt;
    }

    public void setPrompt(String prompt) {
        this.prompt = prompt;
    }
}

Mục 10. Kết quả nó có 2 thành phần:

cục bự ở ngoài là OpenAIOuput. Cục bên trong chỗ mảng choices là MessageData (Tui thiết kế để nó vừa dùng cho con OpenAI và cho người dùng lúc tương tác).

Xem cấu trúc của OpenAIOutput:

package tranduythanh.com.model;

import java.io.Serializable;
import java.util.ArrayList;

public class OpenAIOutput  implements Serializable {
    private String id;
    private String object;
    private long created;
    private String model;
    private ArrayList<MessageData> choices;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getObject() {
        return object;
    }

    public void setObject(String object) {
        this.object = object;
    }

    public long getCreated() {
        return created;
    }

    public void setCreated(long created) {
        this.created = created;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public ArrayList<MessageData> getChoices() {
        return choices;
    }

    public void setChoices(ArrayList<MessageData> choices) {
        this.choices = choices;
    }
}

Mảng choices, Tui thiết kế từng phần tử của nó là MessageData. Mấy bài này là liên quan cấu trúc GSON mà các bạn được học:

Bài 61: Cách đưa định dạng JSon về Java class bằng GSon

Bài 62: Cách đưa định dạng JSon về Java class bằng GSon (tiếp 1)

Bài 63: Cách đưa định dạng JSon về Java class bằng GSon (tiếp 2)

Cấu trúc của MessageData:

package tranduythanh.com.model;

public class MessageData {
    private String text;
    private int index;
    private String logprobs;
    private String finish_reason;

    private TypeTalking typeTalking;
    private long created;
    private String userName;


    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getLogprobs() {
        return logprobs;
    }

    public void setLogprobs(String logprobs) {
        this.logprobs = logprobs;
    }

    public String getFinish_reason() {
        return finish_reason;
    }

    public void setFinish_reason(String finish_reason) {
        this.finish_reason = finish_reason;
    }

    public TypeTalking getTypeTalking() {
        return typeTalking;
    }

    public void setTypeTalking(TypeTalking typeTalking) {
        this.typeTalking = typeTalking;
    }

    public long getCreated() {
        return created;
    }

    public void setCreated(long created) {
        this.created = created;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

Tiếp theo ta cần phần tích giao diện dành cho nội dung người gửi và nội dung của OpenAI trả về:

Đầu tiên là giao diện nội dung gửi đi của người dùng:

Cấu trúc của “item_chatbox_message_sent.xml” như sau:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="8dp">

    <TextView
        android:id="@+id/txtPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:background="@drawable/rounded_rectangle_fill"
        android:maxWidth="240dp"
        android:padding="8dp"
        android:text="hello, hello!"
        android:textColor="#ffffff"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/txtSendTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="4dp"
        android:text="11:40"
        android:textSize="10sp"
        app:layout_constraintBottom_toBottomOf="@+id/txtPrompt"
        app:layout_constraintRight_toLeftOf="@+id/txtPrompt" />

</androidx.constraintlayout.widget.ConstraintLayout>

Tiếp theo giao diện của con OpenAI trả về:

Cấu trúc của item_chatbox_message_received.xml như sau:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="8dp">

    <ImageView
        android:id="@+id/imgAvatar"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:contentDescription="@string/description_image_view"
        android:src="@drawable/logo_robot"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/txtName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:text="Open AI"
        android:textSize="12sp"
        app:layout_constraintLeft_toRightOf="@+id/imgAvatar"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:background="@drawable/rounded_rectangle"
        android:id="@+id/txtText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="4dp"
        android:maxWidth="240dp"
        android:padding="8dp"
        android:text="hi man, how are you?"
        android:textColor="@color/purple500"
        app:layout_constraintLeft_toRightOf="@+id/imgAvatar"
        app:layout_constraintTop_toBottomOf="@+id/txtName" />

    <TextView
        android:id="@+id/txtCreated"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="4dp"
        android:text="11:40"
        android:textSize="10sp"
        app:layout_constraintBottom_toBottomOf="@+id/txtText"
        app:layout_constraintLeft_toRightOf="@+id/txtText" />

</androidx.constraintlayout.widget.ConstraintLayout>

Sau đó ta sẽ viêt Adapter cho các giao diện này như sau:

Bạn nhìn vào màu đỏ và màu xanh của các mũi tên để biết được chức năng và sự liên quan giữa Code, xml và giao diện khi chạy.

Coding của MessageDataAdapter như sau (Tui ko đủ thời gian để giải thích chi tiết từng hàm, các bạn dựa vào tên hàm mà suy luận, vì như Tui đã nói chưa có kiến thức gì về Android thì đừng máu me làm bài này):

package tranduythanh.com.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;


import java.util.List;

import tranduythanh.com.model.MessageData;
import tranduythanh.com.model.TypeTalking;
import tranduythanh.com.openaichatbot.R;
import tranduythanh.com.util.AppUtil;


public class MessageDataAdapter extends RecyclerView.Adapter {

    private static final int VIEW_TYPE_MESSAGE_SENT = 1;
    private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;

    private Context context;
    private List<MessageData> messageDataList;

    public MessageDataAdapter(Context context, List<MessageData> messageList) {
        this.context = context;
        this.messageDataList = messageList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;

        if (viewType == VIEW_TYPE_MESSAGE_SENT) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_chatbox_message_sent, parent, false);
            return new SentMessageHolder(view);
        } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_chatbox_message_received, parent, false);
            ImageView imageView=view.findViewById(R.id.imgAvatar);

            return new ReceivedMessageHolder(view);
        }

        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        MessageData message = messageDataList.get(position);

        switch (holder.getItemViewType()) {
            case VIEW_TYPE_MESSAGE_SENT:
                ((SentMessageHolder) holder).bind(message);
                break;
            case VIEW_TYPE_MESSAGE_RECEIVED:
                ((ReceivedMessageHolder) holder).bind(message);
        }
    }

    @Override
    public int getItemCount() {
        return messageDataList != null ? messageDataList.size() : 0;
    }

    @Override
    public int getItemViewType(int position) {
        MessageData message =  messageDataList.get(position);

        if (message.getTypeTalking()== TypeTalking.HUMAN) {
            // If the current user is the sender of the message
            return VIEW_TYPE_MESSAGE_SENT;
        } else {
            // If some other user sent the message
            return VIEW_TYPE_MESSAGE_RECEIVED;
        }
    }
    //Lớp này dùng để hiển thị giao diện và dữ liệu do người dùng hỏi OpenAI
    class SentMessageHolder extends RecyclerView.ViewHolder {
        private View view;
        TextView txtPrompt;
        TextView txtSendTime;

        SentMessageHolder(@NonNull View itemView) {
            super(itemView);
            view = itemView;
            txtPrompt=view.findViewById(R.id.txtPrompt);
            txtSendTime=view.findViewById(R.id.txtSendTime);
        }

        void bind(MessageData message) {
            txtPrompt.setText(message.getText());

            // Format the stored timestamp into a readable String using method.
            txtSendTime.setText(AppUtil.getTimeFormat(message.getCreated()));
        }
    }
    //Lớp này dùng để hiển thị giao diện và dữ liệu khi nhận được kết quả trả về từ OpenAI
    class ReceivedMessageHolder extends RecyclerView.ViewHolder {
        private View view;
        TextView txtName;
        TextView txtText;
        TextView txtCreated;

        ReceivedMessageHolder(@NonNull View itemView) {
            super(itemView);
            view = itemView;
            txtName=view.findViewById(R.id.txtName);

            txtText=view.findViewById(R.id.txtText);

            txtCreated=view.findViewById(R.id.txtCreated);
        }

        void bind(MessageData message) {
            txtName.setText(message.getUserName());
            txtText.setText(message.getText());
            txtCreated.setText(AppUtil.getTimeFormat(message.getCreated()));
         }
    }
}

Tiếp theo tới coding cho MainActivity:

Trước khi code cho MainActivity thì cần bổ sung GSon cho nó. Trong buid.gradle thêm implementation ‘com.google.code.gson:gson:2.8.6’

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    implementation 'com.google.code.gson:gson:2.8.6'
}

Tiếp tục vào AndroidManifest cấp quyền internet, và 1 số cấu hình:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tranduythanh.com.openaichatbot">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.OpenAIChatBot">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Ok, bây giờ ta có thể quay lại MainActivity để coding chính:

package tranduythanh.com.openaichatbot;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

import tranduythanh.com.adapter.MessageDataAdapter;
import tranduythanh.com.api.OpenAI;
import tranduythanh.com.model.MessageData;
import tranduythanh.com.model.OpenAIInput;
import tranduythanh.com.model.OpenAIOutput;
import tranduythanh.com.model.TypeTalking;

public class MainActivity extends AppCompatActivity{
    private static final String TAG = MainActivity.class.getSimpleName();
    RecyclerView rvMessageData;
    EditText edtChatBox;
    TextView txtOpenAIStatus;
    ImageView imgChatBoxSend;

    private MessageDataAdapter messageDataAdapter;
    private List<MessageData> messageList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addControls();
        addEvents();
    }

    private void addControls() {
        edtChatBox=findViewById(R.id.edtChatBox);
        rvMessageData=findViewById(R.id.rvMessageData);
        txtOpenAIStatus=findViewById(R.id.txtOpenAIStatus);
        imgChatBoxSend=findViewById(R.id.imgChatBoxSend);

        messageList = new ArrayList<>();

        messageDataAdapter = new MessageDataAdapter(this, messageList);
        rvMessageData.setLayoutManager(new LinearLayoutManager(this));
        rvMessageData.setAdapter(messageDataAdapter);
    }

    private void addEvents() {
        imgChatBoxSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               processSendMessage();
            }
        });
    }

    private void processSendMessage() {
        String message = edtChatBox.getText().toString();
        if (message.isEmpty()) {
            Toast.makeText(this, "Nhập nội dung.", Toast.LENGTH_SHORT).show();
            return;
        }
        sendMessageByMe(message);
    }

    private void sendMessageByMe(String msg) {
        //Khi người dùng nhấn nút send
        //ta khởi tạo MessageData
        //và gán TypeTalking.HUMAN
        MessageData userMessage = new MessageData();
        userMessage.setUserName("Trần Duy Thanh");
        userMessage.setTypeTalking(TypeTalking.HUMAN);

        userMessage.setCreated(System.currentTimeMillis());
        userMessage.setText(msg);

        messageList.add(userMessage);
        //Cập nhật lại giao diện
        refreshMessageList();
        edtChatBox.setText("");
        //gửi thông tin này cho OpenAI
        getMessageByOpenAI(msg);
    }

    private void getMessageByOpenAI(String msg) {
        txtOpenAIStatus.setVisibility(View.VISIBLE);
        //dùng AsyncTask để tạo tiểu trình
        AsyncTask<OpenAIInput,Void, OpenAIOutput> task=new AsyncTask<OpenAIInput, Void, OpenAIOutput>() {
            @Override
            protected OpenAIOutput doInBackground(OpenAIInput... openAIInputs) {
                try {
                    //gọi HttpURLConnection
                    //và coding như bên dưới đây:
                    URL url = new URL(OpenAI.API);
                    HttpURLConnection conn =(HttpURLConnection) url.openConnection();
                    conn.setRequestProperty("Authorization","Bearer "+OpenAI.TOKEN);
                    conn.setRequestProperty("Content-Type",OpenAI.CONTENT_TYPE);
                    conn.setRequestMethod(OpenAI.METHOD);
                    conn.setDoOutput(true);
                    OpenAIInput aiInput=openAIInputs[0];
                    String myData=new Gson().toJson(aiInput);
                    conn.getOutputStream().write(myData.getBytes());
                    InputStream responseBody = conn.getInputStream();
                    InputStreamReader responseBodyReader =
                            new InputStreamReader(responseBody, StandardCharsets.UTF_8);
                    //lấy dữ liệu trả về là OpenAIOutput
                    OpenAIOutput data= new Gson().fromJson(responseBodyReader, OpenAIOutput.class);
                    return data;
                }
                catch (Exception ex)
                {
                    Log.e(TAG,ex.toString());
                }
                return null;
            }

            @Override
            protected void onPostExecute(OpenAIOutput openAIOutput) {
                super.onPostExecute(openAIOutput);
                if(openAIOutput!=null)
                {
                    if(openAIOutput.getChoices()!=null)
                    {
                        //nếu có dữ liệu, ta lấy phần tử đầu tiên trong mảng choices
                        MessageData openAIMessage=openAIOutput.getChoices().get(0);
                        //cập nhật lại tên
                        openAIMessage.setUserName("OpenAI");
                        //cập nhật lại loại OpenAI để show box cho đúng
                        openAIMessage.setTypeTalking(TypeTalking.OPENAI);
                        //cập nhật thời gian để show
                        openAIMessage.setCreated(openAIOutput.getCreated());
                        messageList.add(openAIMessage);
                        //cập nhật giao diện
                        refreshMessageList();

                        txtOpenAIStatus.setVisibility(View.INVISIBLE);
                    }
                }
            }
        };
        //Kích hoạt tiểu trình:
        OpenAIInput input=new OpenAIInput(msg);
        task.execute(input);
    }
    private void refreshMessageList() {
        messageDataAdapter.notifyDataSetChanged();

        rvMessageData.scrollToPosition(messageList.size() - 1);
    }

}

Như vậy là mọi thứ chúng ta đã coding xong.

Giờ chạy phần mềm để test. Ta có kết quả :

Coding các bạn có thể tải ở đây (tuy nhiên Các bạn nên cố gắng coding theo từng bước mà Tui đã hướng dẫn). bài này chạy hoàn chỉnh nên code cẩn thận là thành công thôi.

https://www.mediafire.com/file/qiqs13bm4nh1xoh/OpenAIChatBot.rar/file

Có câu hỏi nào thì vào group này hỏi: https://www.facebook.com/groups/communityuni/

Lưu ý group này người lớn nhiều, chuyên gia nhiều. Khi hỏi phải có đầu có đuôi, và lịch sự.

Chúc các bạn thành công.

Cách đăng ký và sử dụng OpenAI


OpenAI là một hệ thống hỗ trợ phát triển Các dự án Trí tuệ nhân tạo mở và miễn phí(* tui để dấu *)

Với góc độ lập trình viên, hay công ty để ứng dụng các API của OpenAI vào việc phát triển các phần mềm liên quan tới Trí Tuệ Nhân tạo thì nó cũng là một trong những lựa chọn tuyệt vời.

Với Sinh Viên, nhà nghiên cứu thì nó cũng là 1 platform giúp ta thí nghiệm các tính năng liên quan tới trí tuệ nhân tạo một cách miễn phí, khá thuận lợi.

Trong bài này Tui sẽ hướng dẫn các bạn cách thức đăng ký và sử dụng OpenAI bằng cách dùng Postman để thử nghiệm API của OpenAI.

Các bài sau nếu có thời gian, chúng ta thử build các ứng dụng riêng có tích hợp các API này (có thể là trên Web, desktop, mobile…). Có thể dùng Python, java… để xử lý

OpenAI hỗ trợ các API thuộc các nhóm sau:

Còn nhiều tính năng trong: https://beta.openai.com/examples

Đây là trang chủ của OpenAI:

https://openai.com (trang chủ)

https://openai.com/api/login/ (trang đăng nhập, có thể bấm signup để đăng ký)

Lưu ý ta chỉ có thể đăng ký thành công khi được gửi email mời (Tức là không thể khơi khơi nhào vào đăng ký).

nếu không được mời, thì khi đăng ký xong ta sẽ nhận thông báo:

The account you signed up with does not yet have an invite.

Thường OpenAI sẽ chờ ta nhập thông tin và tiến hành các bước xét duyệt (khoảng 2 tuần). Với Sinh Viên, nhà nghiên cứu ta có thể vào form sau cho lẹ (sau này họ đổi thì đổi lại link) để nhận được email mời:

https://share.hsforms.com/1b-BEAq_qQpKcfFGKwwuhxA4sk30

Bạn cần cung cấp đầy đủ các thông tin ở trên

Sau đó bấm Submit và chờ OpenAI xét duyệt.

Sau khi xét duyệt nếu thành công thì bạn sẽ được nhận 1 email như sau (dĩ nhiên tiêu đề Email có thể khác):

Ở trên bạn bấm vào “Create Account” để tạo tài khoản. Các bước tạo đơn giản nên Tui không chụp (dùng ngay tài khoản gmail để đăng ký và đăng nhập cho lẹ).

Sau khi tạo tài khoản và đăng nhập thành công ta có giao diện sau:

Bây giờ vào mục Examples, chọn Q&A để trải nghiệm:

https://beta.openai.com/playground/p/default-qa

ở trên là 1 số ví dụ, có thể dùng bằng nhiều ngôn ngữ khác nhau kể cả Tiếng Việt.

Bây giờ Tui hướng dẫn các bạn cách lấy API để test bằng Post Man. Từ hướng dẫn này bạn có thể tự viết một App riêng để trải nghiệm.

Nhấn vào Personal -> sau đó chọn “View API keys“:

Màn hình quản lý API keys hiển thị như dưới đây:

Bạn có thể tạo, copy, xóa, xem thời gian sử dụng.

bây giờ copy 1 key nào đó nha.

Sử dụng API sau:

https://api.openai.com/v1/engines/davinci/completions

method: post

Authorization chọn Bearer Token

body chọn raw json nha:

{“prompt”: “cho tôi biết Thủ đô của nước Việt Nam”}

Xem hình minh họa trong PostMan:

Như vậy Tui đã hướng dẫn xong cách đăng ký, sử dụng online API cũng như lấy token để test Postman. Là minh họa rõ ràng, đơn giản dễ hiểu cho các bạn có thể sử dụng nó ở các app riêng của mình.

Chúc các bạn thành công

%d bloggers like this: